Skip to content

Commit 68712f2

Browse files
authored
Merge branch 'main' into mcommey/tomcat-jvm-metrics-format
2 parents c68b551 + 5efb6c4 commit 68712f2

19 files changed

Lines changed: 493 additions & 40 deletions

cmd/workload-discovery/discovery.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/aws/amazon-cloudwatch-agent/internal/detector/filter"
2222
"github.com/aws/amazon-cloudwatch-agent/internal/detector/java"
2323
"github.com/aws/amazon-cloudwatch-agent/internal/detector/nvidia"
24+
"github.com/aws/amazon-cloudwatch-agent/internal/detector/postgresql"
2425
"github.com/aws/amazon-cloudwatch-agent/internal/detector/util"
2526
"github.com/aws/amazon-cloudwatch-agent/tool/paths"
2627
)
@@ -47,6 +48,7 @@ func NewDiscoverer(cfg Config, logger *slog.Logger) *Discoverer {
4748
logger: logger,
4849
processDetectors: []detector.ProcessDetector{
4950
java.NewDetector(logger, filters.Process.Name),
51+
postgresql.NewDetector(logger),
5052
},
5153
deviceDetectors: []detector.DeviceDetector{
5254
nvidia.NewDetector(logger),

go.mod

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ require (
314314
github.com/Azure/go-autorest/autorest/adal v0.9.23 // indirect
315315
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect
316316
github.com/Code-Hex/go-generics-cache v1.5.1 // indirect
317-
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect
317+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect
318318
github.com/IBM/sarama v1.45.1 // indirect
319319
github.com/Microsoft/go-winio v0.6.2 // indirect
320320
github.com/Microsoft/hcsshim v0.12.9 // indirect
@@ -362,7 +362,7 @@ require (
362362
github.com/cespare/xxhash/v2 v2.3.0 // indirect
363363
github.com/cloudwego/base64x v0.1.4 // indirect
364364
github.com/cloudwego/iasm v0.2.0 // indirect
365-
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
365+
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
366366
github.com/containerd/cgroups/v3 v3.0.3 // indirect
367367
github.com/containerd/containerd/api v1.8.0 // indirect
368368
github.com/containerd/errdefs v1.0.0 // indirect
@@ -389,8 +389,8 @@ require (
389389
github.com/elastic/go-grok v0.3.1 // indirect
390390
github.com/elastic/lunes v0.1.0 // indirect
391391
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
392-
github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect
393-
github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect
392+
github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect
393+
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
394394
github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect
395395
github.com/expr-lang/expr v1.17.7 // indirect
396396
github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect
@@ -658,16 +658,16 @@ require (
658658
golang.org/x/arch v0.8.0 // indirect
659659
golang.org/x/crypto v0.52.0 // indirect
660660
golang.org/x/mod v0.35.0 // indirect
661-
golang.org/x/oauth2 v0.35.0 // indirect
661+
golang.org/x/oauth2 v0.36.0 // indirect
662662
golang.org/x/term v0.43.0 // indirect
663663
golang.org/x/time v0.11.0 // indirect
664664
golang.org/x/tools v0.44.0 // indirect
665665
gonum.org/v1/gonum v0.17.0 // indirect
666666
google.golang.org/api v0.226.0 // indirect
667667
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect
668-
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 // indirect
669-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 // indirect
670-
google.golang.org/grpc v1.80.0 // indirect
668+
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 // indirect
669+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect
670+
google.golang.org/grpc v1.82.1 // indirect
671671
google.golang.org/protobuf v1.36.11 // indirect
672672
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
673673
gopkg.in/inf.v0 v0.9.1 // indirect

go.sum

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEU
142142
github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw=
143143
github.com/DataDog/go-sqllexer v0.1.3 h1:Kl2T6QVndMEZqQSY8rkoltYP+LVNaA54N+EwAMc9N5w=
144144
github.com/DataDog/go-sqllexer v0.1.3/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc=
145-
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 h1:DHa2U07rk8syqvCge0QIGMCE1WxGj9njT44GH7zNJLQ=
146-
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
145+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc=
146+
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4=
147147
github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
148148
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
149149
github.com/IBM/sarama v1.45.1 h1:nY30XqYpqyXOXSNoe2XCgjj9jklGM1Ye94ierUb1jQ0=
@@ -448,8 +448,8 @@ github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQ
448448
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
449449
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
450450
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
451-
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
452-
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
451+
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik=
452+
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
453453
github.com/collectd/go-collectd v0.4.0 h1:0u1GXChSSlMw+riTADhcWwTjugckVWxjQHJi7Zj2Xe4=
454454
github.com/collectd/go-collectd v0.4.0/go.mod h1:xQe/Em/Q9IrN5ifWOvK5ZP2vMIB4KlsIA550yYzhkpY=
455455
github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
@@ -560,11 +560,11 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
560560
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
561561
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
562562
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
563-
github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=
564-
github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=
563+
github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ=
564+
github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A=
565565
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
566-
github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4=
567-
github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA=
566+
github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds=
567+
github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0=
568568
github.com/euank/go-kmsg-parser v2.0.0+incompatible h1:cHD53+PLQuuQyLZeriD1V/esuG4MuU0Pjs5y6iknohY=
569569
github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw=
570570
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
@@ -2063,8 +2063,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr
20632063
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
20642064
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
20652065
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
2066-
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
2067-
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
2066+
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
2067+
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
20682068
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
20692069
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
20702070
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -2348,10 +2348,10 @@ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxH
23482348
google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
23492349
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU=
23502350
google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4=
2351-
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9 h1:VPWxll4HlMw1Vs/qXtN7BvhZqsS9cdAittCNvVENElA=
2352-
google.golang.org/genproto/googleapis/api v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:7QBABkRtR8z+TEnmXTqIqwJLlzrZKVfAUm7tY3yGv0M=
2353-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9 h1:m8qni9SQFH0tJc1X0vmnpw/0t+AImlSvp30sEupozUg=
2354-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260401024825-9d38bb4040a9/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
2351+
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478 h1:yQugLulqltosq0B/f8l4w9VryjV+N/5gcW0jQ3N8Qec=
2352+
google.golang.org/genproto/googleapis/api v0.0.0-20260414002931-afd174a4e478/go.mod h1:C6ADNqOxbgdUUeRTU+LCHDPB9ttAMCTff6auwCVa4uc=
2353+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=
2354+
google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
23552355
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
23562356
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
23572357
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -2371,8 +2371,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
23712371
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
23722372
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
23732373
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
2374-
google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
2375-
google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
2374+
google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE=
2375+
google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA=
23762376
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
23772377
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
23782378
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

internal/detector/metadata.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const (
3030
CategoryKafkaBroker Category = "KAFKA/BROKER"
3131
CategoryKafkaClient Category = "KAFKA/CLIENT"
3232
CategoryNvidiaGPU Category = "NVIDIA_GPU"
33+
CategoryPostgreSQL Category = "POSTGRESQL"
3334
)
3435

3536
// Status represents whether the resource requires more actions before telemetry is available.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# PostgreSQL Process Detector
2+
3+
Detects PostgreSQL database server processes running on the system.
4+
5+
## Overview
6+
7+
The PostgreSQL detector identifies PostgreSQL server instances by checking for the `postgres` executable name. It is used by the `workload-discovery` command to automatically discover PostgreSQL workloads.
8+
9+
## Detection Method
10+
11+
The detector examines the executable path of each process and checks if the base name is `postgres`.
12+
13+
## Status Results
14+
- `READY`: PostgreSQL process detected with a port (explicit via `-p` flag or `PGPORT`, otherwise defaults to 5432).
15+
16+
## Sample Metadata Result
17+
```json
18+
{
19+
"categories": ["POSTGRESQL"],
20+
"name": "postgresql",
21+
"status": "READY",
22+
"telemetryPort": 5432
23+
}
24+
```
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package extract
5+
6+
import (
7+
"context"
8+
"strconv"
9+
"strings"
10+
11+
"github.com/aws/amazon-cloudwatch-agent/internal/detector"
12+
"github.com/aws/amazon-cloudwatch-agent/internal/detector/util"
13+
)
14+
15+
const (
16+
portFlag = "-p"
17+
portEnvVar = "PGPORT"
18+
defaultPostgresPort = 5432
19+
)
20+
21+
type portExtractor struct {
22+
subExtractors []detector.PortExtractor
23+
}
24+
25+
// NewPortExtractor creates a port extractor that attempts to find the PostgreSQL port
26+
// from command line arguments (-p flag) or environment variables (PGPORT).
27+
// Falls back to the default PostgreSQL port 5432.
28+
func NewPortExtractor() detector.PortExtractor {
29+
return &portExtractor{
30+
subExtractors: []detector.PortExtractor{
31+
&cmdlinePortExtractor{},
32+
&envPortExtractor{},
33+
},
34+
}
35+
}
36+
37+
func (e *portExtractor) Extract(ctx context.Context, process detector.Process) (int, error) {
38+
for _, sub := range e.subExtractors {
39+
port, err := sub.Extract(ctx, process)
40+
if err == nil {
41+
return port, nil
42+
}
43+
}
44+
return defaultPostgresPort, nil
45+
}
46+
47+
// cmdlinePortExtractor extracts port from -p flag
48+
type cmdlinePortExtractor struct{}
49+
50+
func (e *cmdlinePortExtractor) Extract(ctx context.Context, process detector.Process) (int, error) {
51+
args, err := process.CmdlineSliceWithContext(ctx)
52+
if err != nil {
53+
return 0, err
54+
}
55+
56+
for i, arg := range args {
57+
if arg == portFlag && i+1 < len(args) {
58+
port, err := strconv.Atoi(args[i+1])
59+
if err == nil && util.IsValidPort(port) {
60+
return port, nil
61+
}
62+
}
63+
if strings.HasPrefix(arg, portFlag) && len(arg) > len(portFlag) {
64+
port, err := strconv.Atoi(arg[len(portFlag):])
65+
if err == nil && util.IsValidPort(port) {
66+
return port, nil
67+
}
68+
}
69+
}
70+
71+
return 0, detector.ErrExtractPort
72+
}
73+
74+
// envPortExtractor extracts port from PGPORT environment variable
75+
type envPortExtractor struct{}
76+
77+
func (e *envPortExtractor) Extract(ctx context.Context, process detector.Process) (int, error) {
78+
env, err := process.EnvironWithContext(ctx)
79+
if err != nil {
80+
return 0, err
81+
}
82+
83+
for _, entry := range env {
84+
parts := strings.SplitN(entry, "=", 2)
85+
if len(parts) == 2 && parts[0] == portEnvVar {
86+
port, err := strconv.Atoi(strings.TrimSpace(parts[1]))
87+
if err == nil && util.IsValidPort(port) {
88+
return port, nil
89+
}
90+
}
91+
}
92+
93+
return 0, detector.ErrExtractPort
94+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package extract
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
13+
"github.com/aws/amazon-cloudwatch-agent/internal/detector/detectortest"
14+
)
15+
16+
func TestPortExtractor(t *testing.T) {
17+
ctx := context.Background()
18+
extractor := NewPortExtractor()
19+
20+
tests := map[string]struct {
21+
setup func(*detectortest.MockProcess)
22+
wantPort int
23+
}{
24+
"Success/PortFromFlag": {
25+
setup: func(mp *detectortest.MockProcess) {
26+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres", "-p", "5433"}, nil)
27+
},
28+
wantPort: 5433,
29+
},
30+
"Success/PortFromFlagNoSpace": {
31+
setup: func(mp *detectortest.MockProcess) {
32+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres", "-p5434"}, nil)
33+
},
34+
wantPort: 5434,
35+
},
36+
"Success/PortFromEnv": {
37+
setup: func(mp *detectortest.MockProcess) {
38+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres"}, nil)
39+
mp.On("EnvironWithContext", ctx).Return([]string{"PATH=/usr/bin", "PGPORT=5435"}, nil)
40+
},
41+
wantPort: 5435,
42+
},
43+
// cmdline is tried first; when it finds a port, env is never called
44+
"Success/CmdlineTakesPrecedence": {
45+
setup: func(mp *detectortest.MockProcess) {
46+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres", "-p", "5433"}, nil)
47+
},
48+
wantPort: 5433,
49+
},
50+
"Success/DefaultPort": {
51+
setup: func(mp *detectortest.MockProcess) {
52+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres"}, nil)
53+
mp.On("EnvironWithContext", ctx).Return([]string{"PATH=/usr/bin"}, nil)
54+
},
55+
wantPort: 5432,
56+
},
57+
"Success/DefaultPortWithOtherFlags": {
58+
setup: func(mp *detectortest.MockProcess) {
59+
mp.On("CmdlineSliceWithContext", ctx).Return([]string{"postgres", "-D", "/var/lib/postgresql/data"}, nil)
60+
mp.On("EnvironWithContext", ctx).Return([]string{}, nil)
61+
},
62+
wantPort: 5432,
63+
},
64+
"Success/DefaultOnAllSourcesFail": {
65+
setup: func(mp *detectortest.MockProcess) {
66+
mp.On("CmdlineSliceWithContext", ctx).Return(nil, assert.AnError)
67+
mp.On("EnvironWithContext", ctx).Return(nil, assert.AnError)
68+
},
69+
wantPort: 5432,
70+
},
71+
}
72+
73+
for name, tt := range tests {
74+
t.Run(name, func(t *testing.T) {
75+
mp := new(detectortest.MockProcess)
76+
tt.setup(mp)
77+
78+
port, err := extractor.Extract(ctx, mp)
79+
80+
require.NoError(t, err)
81+
assert.Equal(t, tt.wantPort, port)
82+
mp.AssertExpectations(t)
83+
})
84+
}
85+
}

0 commit comments

Comments
 (0)