diff --git a/cfg/envconfig/envconfig.go b/cfg/envconfig/envconfig.go index 2677bdae12d..0cb5ace687e 100644 --- a/cfg/envconfig/envconfig.go +++ b/cfg/envconfig/envconfig.go @@ -26,6 +26,7 @@ const ( RunInContainer = "RUN_IN_CONTAINER" RunAsHostProcessContainer = "RUN_AS_HOST_PROCESS_CONTAINER" RunInAWS = "RUN_IN_AWS" + RunInAKS = "RUN_IN_AKS" RunWithIRSA = "RUN_WITH_IRSA" RunWithSELinux = "RUN_WITH_SELINUX" RunInROSA = "RUN_IN_ROSA" @@ -89,6 +90,11 @@ func IsRunningInROSA() bool { return os.Getenv(RunInROSA) == TrueValue } +// IsRunningInAKS reports whether RUN_IN_AKS is set (by the AKS Helm chart) so AKS is detected without a metadata probe. +func IsRunningInAKS() bool { + return os.Getenv(RunInAKS) == TrueValue +} + func GetLogsBackpressureMode() string { return os.Getenv(CWAgentLogsBackpressureMode) } diff --git a/go.mod b/go.mod index 850a246203a..88721719613 100644 --- a/go.mod +++ b/go.mod @@ -9,66 +9,67 @@ replace collectd.org v0.4.0 => github.com/collectd/go-collectd v0.4.0 // Replace with https://github.com/amazon-contributing/opentelemetry-collector-contrib, there are no requirements for all receivers/processors/exporters // to be all replaced since there are some changes that will always be from upstream replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/routingconnector => github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsxrayexporter => github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260629153525-3b0a252e5908 ) replace ( - github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260617204523-70530ca095f9 + github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/awsproxy => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidctokenextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/oidctokenextension v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension => github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260629153525-3b0a252e5908 ) replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutilv2 => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutilv2 => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/containerinsight => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/cwlogs => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/k8s => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/metrics => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/proxy => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/xray => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/k8sconfig => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/kubelet => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/metadataproviders => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sqlquery => github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260629153525-3b0a252e5908 ) replace ( // For clear resource attributes after copy functionality https://github.com/amazon-contributing/opentelemetry-collector-contrib/pull/148 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260629153525-3b0a252e5908 // Replace with contrib to revert upstream change https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/20519 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus => github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260629153525-3b0a252e5908 ) replace ( - github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws => github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260617204523-70530ca095f9 - github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 => github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260617204523-70530ca095f9 + github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws => github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260629153525-3b0a252e5908 + github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 => github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260629153525-3b0a252e5908 ) replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributestocontextprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsattributelimitprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributestocontextprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsattributelimitprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor => github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260629153525-3b0a252e5908 ) replace ( - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsefareceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260617204523-70530ca095f9 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260617204523-70530ca095f9 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsefareceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/awsxrayreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jmxreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/postgresqlreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260629153525-3b0a252e5908 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver => github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260629153525-3b0a252e5908 ) // Temporary fix, pending PR https://github.com/shirou/gopsutil/pull/957 @@ -139,7 +140,7 @@ require ( github.com/json-iterator/go v1.1.12 github.com/kardianos/service v1.2.1 // Keep this pinned to v1.2.1. v1.2.2 causes the agent to not register as a service on Windows github.com/knadh/koanf v1.5.0 - github.com/knadh/koanf/v2 v2.3.2 + github.com/knadh/koanf/v2 v2.3.4 github.com/kr/pretty v0.3.1 github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c github.com/oklog/run v1.1.0 @@ -156,6 +157,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension v0.124.1 github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.124.1 github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver v0.124.1 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidctokenextension v0.124.1 github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.124.1 github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension v0.124.1 github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage v0.124.1 @@ -468,7 +470,7 @@ require ( github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/go-version v1.8.0 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec // indirect github.com/hashicorp/serf v0.10.1 // indirect diff --git a/go.sum b/go.sum index fc79dc53f64..2a9dd03657c 100644 --- a/go.sum +++ b/go.sum @@ -202,86 +202,88 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vS github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483 h1:J8HaD+Zpfi1gcel3HCKpoHHEsrcuRrZlSnx7R9SCf5I= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU= -github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260617204523-70530ca095f9 h1:BmqAg9/80IM4kWSv/sRNMOJe60MGpbT6YDiv0lnZTg8= -github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260617204523-70530ca095f9/go.mod h1:27Lstfad+LlHk17mhMuZh0vCAZcZxo3iwnE19aY/n7I= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260617204523-70530ca095f9 h1:ufqXnld+yUQilcSWi7I76biYBt1bz1sxCEoG3WiVMOI= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260617204523-70530ca095f9/go.mod h1:7IC5iRiEVjkl3gQkyGF54WJrvAPNwRPp88JmYlPszu8= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260617204523-70530ca095f9 h1:tQIvwArUrAr3KJ+ptrdtYhoJVqQdndgIo/yS3pqrbXs= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260617204523-70530ca095f9/go.mod h1:3CyMeKLU/pTjhm0qL4WEbYtq4/IaHJsOF8e7WiweXJQ= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260617204523-70530ca095f9 h1:uMWxXJSbWwg0AOIfCsxV13xNp91+u0CyxZCvI+hPeRc= -github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260617204523-70530ca095f9/go.mod h1:Jm0k76CRZ1uR0B6kFHYlLPe7AxWJu69aIrCQiygTBFg= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260617204523-70530ca095f9 h1:l0fkhH1tfvEFez45FEbimOP2mH6oGo82qJ6h8kYdZrA= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260617204523-70530ca095f9/go.mod h1:9MisC4YKCPC4y2iYH4qqnrEILf25HSSaPRQMuUpcgjA= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260617204523-70530ca095f9 h1:9WlmMVSuzLVH36YuQx5zEJQ2+VFHoyekfH6PAB0uvv0= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260617204523-70530ca095f9/go.mod h1:KQqi2/SDM6SveSbJmH7yE2ZJrcwvQEsq8fGgj7J42oI= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260617204523-70530ca095f9 h1:KM3MCxYh5wszurH+cCsxgnRoDNWoSJUtrVavmzPghH8= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260617204523-70530ca095f9/go.mod h1:tAN1C96iJCDwxl9qMnno54d6sQwxHAVSYdpDJjc6bbY= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260617204523-70530ca095f9 h1:XDdiplV9Vm/ajOQrglZC8SwtDB7ZUuLHXrkP7S6q8/w= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260617204523-70530ca095f9/go.mod h1:2JFFL30N2NI5N8LbjcLWXYTsoDMDYbwItyZ9ntp8++E= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260617204523-70530ca095f9 h1:zC597TKjmPODTzlSA1Vf6hUl+oQaaZ836JypPr1dDrU= -github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260617204523-70530ca095f9/go.mod h1:T+KX7lUiH1rbWkTq1ZB2ku94qf1qI70SbA0r5ZW/+XA= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260617204523-70530ca095f9 h1:v2tkQyJyjeQrOxUUgudYjSedZ2sHhqt0wIVj3LgmsfQ= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260617204523-70530ca095f9/go.mod h1:RkX+mCTIbF0RTiqXFe0Wo6a1w0cULc23osRU5IRmqVQ= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260617204523-70530ca095f9 h1:hETuHCryDPmcEYGneGPoArX1M9ToJJXgJecxq/x1uyo= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260617204523-70530ca095f9/go.mod h1:eu7CU/WFl6msRQ6TKTkEljdUPVhs47LoY+IB8KOXVaE= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260617204523-70530ca095f9 h1:P6rAUvAsnvczZRD2EBRay68F2Ccc0Wo2KIzGG03mwfs= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260617204523-70530ca095f9/go.mod h1:DwMzm9PGyRRVkekICZdCOHt/kf6A/z9YQ7G2DqspJ4g= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260617204523-70530ca095f9 h1:kijsTXJqm5a0fFEwEjHVuNu10vyDzZJKWVCszXSjK8E= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260617204523-70530ca095f9/go.mod h1:TFjXft/gNwEk5EIrNz3glFCx6mMbJNgORAnpKunDw4Y= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260617204523-70530ca095f9 h1:0mbgsvsDP43ZW347bKTcjS0cnPIdGpeynFdCIvDXWTA= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260617204523-70530ca095f9/go.mod h1:g0K7XRwXDigDe6QLvoUwCFglvzBZYepLDq3JGcYc8t0= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260617204523-70530ca095f9 h1:TEJfVXHm+0pnp8NDWP6t1AF4vclBx1UWd5fTwsjSN3Q= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260617204523-70530ca095f9/go.mod h1:AYAFBvDLMHLC5jJCIfUtfmLAzUdwlkBk8IyZ42ZKAco= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260617204523-70530ca095f9 h1:ood1l4+hxWgziSaRMFMGiXtJKW7nnoLHMexC+HywEwc= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260617204523-70530ca095f9/go.mod h1:CYuz358AgDWlVFiv0YUtttDPwz4F01dXLLmyFlGBcSI= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260617204523-70530ca095f9 h1:LWOZs60MwGDdFHvOf9CPQOK78ZqgCCTfk2f2+CW4wsA= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260617204523-70530ca095f9/go.mod h1:zK0mPhzOwJJBAIV0reGIlm3UB0QlOrEqZYRTYGB2vt4= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260617204523-70530ca095f9 h1:mThkV1q4AcMpnOh/CoBPai8TpUVL04bWV4nhaPnDsuY= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260617204523-70530ca095f9/go.mod h1:6IoOrz1DvWaBT8+aGFZ1UznDfXKu35/ifj/sk28EQbQ= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260617204523-70530ca095f9 h1:Ys4v53PQ8IyxCMbexDanTJKhvom2xSgoyZMfiyKS7vI= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260617204523-70530ca095f9/go.mod h1:ie5XUZZf62AI/Is0cBsCNnab4tLow1FCQZlvJPei2EU= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260617204523-70530ca095f9 h1:0EAwF4Xd2b9m926uQbzn5+lphcd5O8jLIGyM3NEjh2U= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260617204523-70530ca095f9/go.mod h1:N2GwwIf7QhML2Lcdh3UCMxWCK4uViTUa+gx2as1sfo8= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260617204523-70530ca095f9 h1:rIOZJqt1Nn6eiJaAiJhtAnkqAGCnTOZWui7lhwF5lz8= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260617204523-70530ca095f9/go.mod h1:YnKeE9wRjdoReCSbDK5JRqVmusZNRyG/dG2R04WbWCQ= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260617204523-70530ca095f9 h1:urtBXQQwDY4cjIWULyDqHQ1H5TvD4YaqVsFj/mm6vCI= -github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260617204523-70530ca095f9/go.mod h1:ONQIjCIQvfNkzG3d3tHa8Unen0sx1HXv/T3t+J6Dg30= -github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260617204523-70530ca095f9 h1:E6zIfMbsPK4zAGiHX72dmsfc/aERjpOkdZRP0+Gd8BY= -github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260617204523-70530ca095f9/go.mod h1:jGegGUX4PViU3gFU/dPvLUXuXC8GRiY9EYRpJhlczZA= -github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260617204523-70530ca095f9 h1:30+3TVd4HahKPlNeCSr2NckA/GPoEFVUfSQjtzY6XTo= -github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260617204523-70530ca095f9/go.mod h1:OJDM0SubQwycFghb9NhWv6DqlhmMUxbToFVxtCTPku8= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260617204523-70530ca095f9 h1:Hw+3czZCSsYP2LmM4Ygd1RRXgDyQ3Y5bLePvM7bTwfM= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260617204523-70530ca095f9/go.mod h1:xrcHPb5eq5BblbNj64IpYqv295gwzpSUPgih7Dyo65E= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260617204523-70530ca095f9 h1:qVcxDdUoxuojYz0aKfcqcph68uJ6e4vg09vw6Ny31/g= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260617204523-70530ca095f9/go.mod h1:2SjHFWsA3UKr7N4IOP5ph0inaZtn6bteD9DitRAASEc= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260617204523-70530ca095f9 h1:NQZNvDzn45uuXEvh0dUL4Qn4bUKGo7P+mR6Bbah9k5g= -github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260617204523-70530ca095f9/go.mod h1:mfl6tGXnVyT0+nga+Oml7bMNWKempeGTtL+5Vs2LzHA= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260617204523-70530ca095f9 h1:WyJu+VMGbDGhVFX4kBc8Gi145vFKQyjZ95iv7OVHCkY= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260617204523-70530ca095f9/go.mod h1:LkMDqpRrHT2MNeobnhdNZbY8JrDVFbL08dr/Ayd3JIk= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260617204523-70530ca095f9 h1:jrF9190gXrAsXegt+yFBR917PiYwqmbINuKLse0ybgc= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260617204523-70530ca095f9/go.mod h1:OFDM1K0I68jJO8s5S0+5xDwnqscnRnYmYgZxA8bbhic= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260617204523-70530ca095f9 h1:K3ORYKE6xlRBRTb8YqxaRnsyHw2E1XfDX4e82UjaakA= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260617204523-70530ca095f9/go.mod h1:Gf1ZUZY1Lszko2Uq/Oc25Wl1gSwXNa2tGiJM66/H7Gc= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260617204523-70530ca095f9 h1:CugY/0kXZlkH4OPhY4bG/OI0uLleWQ09CqpuVaSQkrE= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260617204523-70530ca095f9/go.mod h1:MhLjAHeQxgPyj1yyEAqTFfcU/U9tp4yLWYUV4f+xwYw= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260617204523-70530ca095f9 h1:Lxgg4P1eRHaNdol4DwZOp9o0Nq4jCx9CgZysLc94d+M= -github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260617204523-70530ca095f9/go.mod h1:BsyajnM+KIXy6wlP7NCfWf8tEFAIIG4RmK2zbb3k8Vo= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260617204523-70530ca095f9 h1:6oOPCF1jYi/h2dXzoOPdCRHyVdAai83noscWzsOzMFY= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:zFCrWSeArOUe0UgX0XUli3ECGUOZ9BKD7AM+kpbaIv8= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260617204523-70530ca095f9 h1:ufPbWsmxk6lZYw0VlBzwcwUCAAQnmvXmNY2HXnSr6nk= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:7FA4owN95eAy2RD/7IOC5d1be2P0DyZT7nOQZruwtls= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260617204523-70530ca095f9 h1:0Le06UclFhOpvUHrEzxIuark3fhXvM52RrRuXcX1BC4= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:P04h4k7pXBfr/ZzKZTf3lA389OtLMOV4VVv5lYEsHng= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260617204523-70530ca095f9 h1:mJGGom1uSTyvXvxNZR7GOyaeLI0hfIlRvT4ArwPd4C8= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:O5EpYcUzu+RgVImSc2DdwZ5EztdHPmwpHfuaA2WLh1Y= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260617204523-70530ca095f9 h1:6sN6qnEJHVeDo72pZg8U3TWmFm3zROzPCuKWAYUtMzI= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:gNDpUc9eYHKy9YqGYK8toPIo3QZKdYQFLnaVQDA32A0= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260617204523-70530ca095f9 h1:R4Ems+YMAXLtsEZwRXw8/cf1NkrzHQsc25WPdYbUaTM= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:wQV77sHJJdUMIvbJna8LjlNb0omEdiVSrwQnoVAlTMM= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260617204523-70530ca095f9 h1:ZLP3mZHMXzUjiXxXFVI9Z5LtU25qT13Qajz84mna/LY= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:gSxi2fY+T8mNzlaU7qOEnaXTcKfhIpijDSyeCu5GOYo= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260617204523-70530ca095f9 h1:p0HB9BwhUdkaI0ALIb3hYxi7oCTDsGUuGadeM3R36AM= -github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260617204523-70530ca095f9/go.mod h1:pa2WwKwnYyS/Wviu8P/uCm7JmtrxtB+IG1f8+b+VJF0= +github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260629153525-3b0a252e5908 h1:lkb5AAxuruGmsjyUo0w5PXtqu8DRyOxu3Ws1GHfj7gg= +github.com/amazon-contributing/opentelemetry-collector-contrib/connector/routingconnector v0.0.0-20260629153525-3b0a252e5908/go.mod h1:27Lstfad+LlHk17mhMuZh0vCAZcZxo3iwnE19aY/n7I= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260629153525-3b0a252e5908 h1:fQy+39IkDqj8GGUJfcrTBLRfLK3GepJ66TqIEn48d0U= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awscloudwatchlogsexporter v0.0.0-20260629153525-3b0a252e5908/go.mod h1:7IC5iRiEVjkl3gQkyGF54WJrvAPNwRPp88JmYlPszu8= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260629153525-3b0a252e5908 h1:Rs6GR6I5VZMM/A6s4okmoHbpIqQNX1RJZAAWDQSIXbA= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsemfexporter v0.0.0-20260629153525-3b0a252e5908/go.mod h1:3CyMeKLU/pTjhm0qL4WEbYtq4/IaHJsOF8e7WiweXJQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260629153525-3b0a252e5908 h1:6VrFHTmZOtNNqKP9340q/jFEEBzdJXGsyE0kWi4cThs= +github.com/amazon-contributing/opentelemetry-collector-contrib/exporter/awsxrayexporter v0.0.0-20260629153525-3b0a252e5908/go.mod h1:Jm0k76CRZ1uR0B6kFHYlLPe7AxWJu69aIrCQiygTBFg= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260629153525-3b0a252e5908 h1:6bqd8nxF4Md+PQ7ViCaym603Y70ylqAUmuoqHB8Vl38= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awscloudwatchlogsprovisionerextension v0.0.0-20260629153525-3b0a252e5908/go.mod h1:9MisC4YKCPC4y2iYH4qqnrEILf25HSSaPRQMuUpcgjA= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260629153525-3b0a252e5908 h1:2GmHLxknJ32Ie6zS1dJHITYUT3WWm6dyNKFrzwy6cPs= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsmiddleware v0.0.0-20260629153525-3b0a252e5908/go.mod h1:KQqi2/SDM6SveSbJmH7yE2ZJrcwvQEsq8fGgj7J42oI= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260629153525-3b0a252e5908 h1:1lyGj8eF6of9duz2k42bNNh2uBL1GAfVXYvpx43uZiQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/awsproxy v0.0.0-20260629153525-3b0a252e5908/go.mod h1:tAN1C96iJCDwxl9qMnno54d6sQwxHAVSYdpDJjc6bbY= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260629153525-3b0a252e5908 h1:zHnjS+U7w9ePE9viBFyfRS14o0+NCMF9S6qudYkhPBI= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/headerssetterextension v0.0.0-20260629153525-3b0a252e5908/go.mod h1:2JFFL30N2NI5N8LbjcLWXYTsoDMDYbwItyZ9ntp8++E= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/oidctokenextension v0.0.0-20260629153525-3b0a252e5908 h1:bCp1HeIDvvv+cFFx+21kjF8yzAyQZRNW6Gnu+dN8fzA= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/oidctokenextension v0.0.0-20260629153525-3b0a252e5908/go.mod h1:TE6yrCGcu1zdBdOa/8yMLWSNr8cMGGFht6S/bml2FuY= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260629153525-3b0a252e5908 h1:KtTC/8ySv+pH9IBO0PkwWXcgshAqaZL5TbaKNCrueFU= +github.com/amazon-contributing/opentelemetry-collector-contrib/extension/sigv4authextension v0.0.0-20260629153525-3b0a252e5908/go.mod h1:T+KX7lUiH1rbWkTq1ZB2ku94qf1qI70SbA0r5ZW/+XA= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260629153525-3b0a252e5908 h1:xrtYAF8betlpuL3C4Kp6lGu0kkzBShfKrSd64D5AACQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutil v0.0.0-20260629153525-3b0a252e5908/go.mod h1:RkX+mCTIbF0RTiqXFe0Wo6a1w0cULc23osRU5IRmqVQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260629153525-3b0a252e5908 h1:M759RK6Sz8p4s3yd2rjyk2SmJIuCtYDUSTboeNi8Rno= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/awsutilv2 v0.0.0-20260629153525-3b0a252e5908/go.mod h1:eu7CU/WFl6msRQ6TKTkEljdUPVhs47LoY+IB8KOXVaE= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260629153525-3b0a252e5908 h1:j0tnXUmxhHHxpxo/EH4mP1uT+dUUE5Xk1Htp6zYy9gA= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/containerinsight v0.0.0-20260629153525-3b0a252e5908/go.mod h1:DwMzm9PGyRRVkekICZdCOHt/kf6A/z9YQ7G2DqspJ4g= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260629153525-3b0a252e5908 h1:o0z6OwK/4ZwL5tg1OGvBcyYxLn+miMt2Cxh9xoR4VAw= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/cwlogs v0.0.0-20260629153525-3b0a252e5908/go.mod h1:TFjXft/gNwEk5EIrNz3glFCx6mMbJNgORAnpKunDw4Y= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260629153525-3b0a252e5908 h1:pt3RQjSs42TCGw06GrCZB7WtdfPsz3SInFBds1LZB2I= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/k8s v0.0.0-20260629153525-3b0a252e5908/go.mod h1:g0K7XRwXDigDe6QLvoUwCFglvzBZYepLDq3JGcYc8t0= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260629153525-3b0a252e5908 h1:xKDbrCXTH0XTPJteLhoWgdN9yvgJyBU4AOr57wvw+uA= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/metrics v0.0.0-20260629153525-3b0a252e5908/go.mod h1:AYAFBvDLMHLC5jJCIfUtfmLAzUdwlkBk8IyZ42ZKAco= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260629153525-3b0a252e5908 h1:1lntX57OdzK8ma4UR5Gfl38gTX+J5rMjqG0uOqiGo4k= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/proxy v0.0.0-20260629153525-3b0a252e5908/go.mod h1:CYuz358AgDWlVFiv0YUtttDPwz4F01dXLLmyFlGBcSI= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260629153525-3b0a252e5908 h1:bSeQ+D7dVHcy9LbYc2HI772TQZM7O28y0udPILWzQJQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/aws/xray v0.0.0-20260629153525-3b0a252e5908/go.mod h1:zK0mPhzOwJJBAIV0reGIlm3UB0QlOrEqZYRTYGB2vt4= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260629153525-3b0a252e5908 h1:fKByOgsC95F3ASkomQN6u7+XD8qS3xAvYhCwdQSpWKs= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/coreinternal v0.0.0-20260629153525-3b0a252e5908/go.mod h1:6IoOrz1DvWaBT8+aGFZ1UznDfXKu35/ifj/sk28EQbQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260629153525-3b0a252e5908 h1:k+UnYnvF1r1FjVBg93HfCBmQmDJh2yf8holB6U11nPs= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/k8sconfig v0.0.0-20260629153525-3b0a252e5908/go.mod h1:ie5XUZZf62AI/Is0cBsCNnab4tLow1FCQZlvJPei2EU= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260629153525-3b0a252e5908 h1:TioOmiFaadWekjCoWng5mz+t7WxUmSDwesLviaYShYU= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/kubelet v0.0.0-20260629153525-3b0a252e5908/go.mod h1:N2GwwIf7QhML2Lcdh3UCMxWCK4uViTUa+gx2as1sfo8= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260629153525-3b0a252e5908 h1:ppBCGt++1F9fDSY8NdEZzps6pS1xIQe6jRahEnQKXBY= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/metadataproviders v0.0.0-20260629153525-3b0a252e5908/go.mod h1:YnKeE9wRjdoReCSbDK5JRqVmusZNRyG/dG2R04WbWCQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260629153525-3b0a252e5908 h1:GNm9xQITDG3DWtQpdLnkDjyIX8YkVqDzUenVequtebE= +github.com/amazon-contributing/opentelemetry-collector-contrib/internal/sqlquery v0.0.0-20260629153525-3b0a252e5908/go.mod h1:ONQIjCIQvfNkzG3d3tHa8Unen0sx1HXv/T3t+J6Dg30= +github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260629153525-3b0a252e5908 h1:m3i9Z4nUMwy2mUODr7CpStuSdKPfoZn/bDzthHZjEHQ= +github.com/amazon-contributing/opentelemetry-collector-contrib/override/aws v0.0.0-20260629153525-3b0a252e5908/go.mod h1:jGegGUX4PViU3gFU/dPvLUXuXC8GRiY9EYRpJhlczZA= +github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260629153525-3b0a252e5908 h1:NxzsfJNt60uLx82meHROGregHIr7fIrXq5j714hq99I= +github.com/amazon-contributing/opentelemetry-collector-contrib/override/awsv2 v0.0.0-20260629153525-3b0a252e5908/go.mod h1:OJDM0SubQwycFghb9NhWv6DqlhmMUxbToFVxtCTPku8= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260629153525-3b0a252e5908 h1:I7ObUsREis+y8T+WHoxqntzCFVaU6otdPziepzRiX8M= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.0.0-20260629153525-3b0a252e5908/go.mod h1:xrcHPb5eq5BblbNj64IpYqv295gwzpSUPgih7Dyo65E= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260629153525-3b0a252e5908 h1:rYTKknn7ta4R8IoaVIDi0jgrZ+GEsIqIGiqREkyAv6U= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/stanza v0.0.0-20260629153525-3b0a252e5908/go.mod h1:2SjHFWsA3UKr7N4IOP5ph0inaZtn6bteD9DitRAASEc= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260629153525-3b0a252e5908 h1:hhXF2cCkacnn7iQCLPCWpGNdYa8U9xEy7gPqpFfP+aA= +github.com/amazon-contributing/opentelemetry-collector-contrib/pkg/translator/prometheus v0.0.0-20260629153525-3b0a252e5908/go.mod h1:mfl6tGXnVyT0+nga+Oml7bMNWKempeGTtL+5Vs2LzHA= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260629153525-3b0a252e5908 h1:945CVmvzn7KF78RbebNY3o2v9W+Si6vLUc//CM9kDU0= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/attributestocontextprocessor v0.0.0-20260629153525-3b0a252e5908/go.mod h1:LkMDqpRrHT2MNeobnhdNZbY8JrDVFbL08dr/Ayd3JIk= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260629153525-3b0a252e5908 h1:YtL4P58iZie6V6DgZN6eNNu/gra9QXDutvynzQsCrE4= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsattributelimitprocessor v0.0.0-20260629153525-3b0a252e5908/go.mod h1:OFDM1K0I68jJO8s5S0+5xDwnqscnRnYmYgZxA8bbhic= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260629153525-3b0a252e5908 h1:QP1gKF1MrnexytSAWQZTHcFvu7BmEVSd09mrKlQjLHc= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/awsdevicepodcorrelationprocessor v0.0.0-20260629153525-3b0a252e5908/go.mod h1:Gf1ZUZY1Lszko2Uq/Oc25Wl1gSwXNa2tGiJM66/H7Gc= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260629153525-3b0a252e5908 h1:/L93QtbKhH5Gy5xLBDP5LWvsvbdO54P0JsETEaRH8UE= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.0.0-20260629153525-3b0a252e5908/go.mod h1:MhLjAHeQxgPyj1yyEAqTFfcU/U9tp4yLWYUV4f+xwYw= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260629153525-3b0a252e5908 h1:+3LWUJslxDCm35ks9CYrNmM0tv34MZm4RzAW6k3Woq8= +github.com/amazon-contributing/opentelemetry-collector-contrib/processor/resourcedetectionprocessor v0.0.0-20260629153525-3b0a252e5908/go.mod h1:BsyajnM+KIXy6wlP7NCfWf8tEFAIIG4RmK2zbb3k8Vo= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260629153525-3b0a252e5908 h1:rBx2JWhXlD4fYhjeXplG+OpVBbGHSCnaJBzxFCRqI3o= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:zFCrWSeArOUe0UgX0XUli3ECGUOZ9BKD7AM+kpbaIv8= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260629153525-3b0a252e5908 h1:AoJ8YhrBoWWVXhr2u+x/MMy5Aw9J5s6fipccxYZqDbg= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awscontainerinsightskueuereceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:7FA4owN95eAy2RD/7IOC5d1be2P0DyZT7nOQZruwtls= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260629153525-3b0a252e5908 h1:eyeKmaWfv9wLKTjzIWEZ/0vePK6sfX+9vSwGL1genTY= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsefareceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:P04h4k7pXBfr/ZzKZTf3lA389OtLMOV4VVv5lYEsHng= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260629153525-3b0a252e5908 h1:oAt+b3fIHNAsEn4KI1UVQlDQzOfx2R+GCTDjz/uA1Pc= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsekshyperpodreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:O5EpYcUzu+RgVImSc2DdwZ5EztdHPmwpHfuaA2WLh1Y= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260629153525-3b0a252e5908 h1:Gq/xFzqPiscZuYghGad8PFJm4po5FFDCgkR6RBXqgy4= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/awsxrayreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:gNDpUc9eYHKy9YqGYK8toPIo3QZKdYQFLnaVQDA32A0= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260629153525-3b0a252e5908 h1:weXQal9EqnmzhLqFYkOekx3xBtI70O3ZlhaN1SED0Ag= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/jmxreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:wQV77sHJJdUMIvbJna8LjlNb0omEdiVSrwQnoVAlTMM= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260629153525-3b0a252e5908 h1:VA9sQrbWV2AGqviF1uplR62N8YXpax/DFi04lyu7hqg= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/postgresqlreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:gSxi2fY+T8mNzlaU7qOEnaXTcKfhIpijDSyeCu5GOYo= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260629153525-3b0a252e5908 h1:HovegqSrtha9jIg+G+ZWEhYX1dc4mGqHetoE6gOkqEw= +github.com/amazon-contributing/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.0.0-20260629153525-3b0a252e5908/go.mod h1:pa2WwKwnYyS/Wviu8P/uCm7JmtrxtB+IG1f8+b+VJF0= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9 h1:FXrPTd8Rdlc94dKccl7KPmdmIbVh/OjelJ8/vgMRzcQ= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9/go.mod h1:eliMa/PW+RDr2QLWRmLH1R1ZA4RInpmvOzDDXtaIZkc= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= @@ -909,8 +911,8 @@ github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= -github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -1060,8 +1062,8 @@ github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kK github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= -github.com/knadh/koanf/v2 v2.3.2 h1:Ee6tuzQYFwcZXQpc2MiVeC6qHMandf5SMUJJNoFp/c4= -github.com/knadh/koanf/v2 v2.3.2/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= +github.com/knadh/koanf/v2 v2.3.4 h1:fnynNSDlujWE+v83hAp8wKr/cdoxHLO0629SN+U8Urc= +github.com/knadh/koanf/v2 v2.3.4/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= diff --git a/service/defaultcomponents/components.go b/service/defaultcomponents/components.go index 62818f1898d..7ba2346894d 100644 --- a/service/defaultcomponents/components.go +++ b/service/defaultcomponents/components.go @@ -17,6 +17,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/extension/headerssetterextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/observer/ecsobserver" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidctokenextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/sigv4authextension" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage/filestorage" @@ -187,6 +188,7 @@ func Factories() (otelcol.Factories, error) { ecsobserver.NewFactory(), filestorage.NewFactory(), healthcheckextension.NewFactory(), + oidctokenextension.NewFactory(), pprofextension.NewFactory(), sigv4authextension.NewFactory(), zpagesextension.NewFactory(), diff --git a/service/defaultcomponents/components_test.go b/service/defaultcomponents/components_test.go index 88137236ea6..1ea217dfa83 100644 --- a/service/defaultcomponents/components_test.go +++ b/service/defaultcomponents/components_test.go @@ -126,6 +126,7 @@ func TestComponents(t *testing.T) { "health_check", "k8smetadata", "nodemetadatacache", + "oidctoken", "pprof", "server", "sigv4auth", diff --git a/tool/paths/paths.go b/tool/paths/paths.go index 1c77da707ca..6702dd3254e 100644 --- a/tool/paths/paths.go +++ b/tool/paths/paths.go @@ -11,6 +11,7 @@ const ( ENV = "env-config.json" AGENT_LOG_FILE = "amazon-cloudwatch-agent.log" JMXJarName = "opentelemetry-jmx-metrics.jar" + OIDCToken = ".oidc-token" ) var ( @@ -24,4 +25,5 @@ var ( TranslatorBinaryPath string AgentBinaryPath string JMXJarPath string + OIDCTokenPath string ) diff --git a/tool/paths/paths_unix.go b/tool/paths/paths_unix.go index 801e4239d74..09a79f02670 100644 --- a/tool/paths/paths_unix.go +++ b/tool/paths/paths_unix.go @@ -31,4 +31,5 @@ func init() { TranslatorBinaryPath = filepath.Join(AgentDir, "bin", TranslatorBinaryName) AgentBinaryPath = filepath.Join(AgentDir, "bin", AgentBinaryName) JMXJarPath = filepath.Join(AgentDir, "bin", JMXJarName) + OIDCTokenPath = filepath.Join(AgentDir, "etc", OIDCToken) } diff --git a/tool/paths/paths_windows.go b/tool/paths/paths_windows.go index 0f3305405ff..c35b53c677c 100644 --- a/tool/paths/paths_windows.go +++ b/tool/paths/paths_windows.go @@ -53,4 +53,5 @@ func init() { TranslatorBinaryPath = filepath.Join(AgentRootDir, TranslatorBinaryName) AgentBinaryPath = filepath.Join(AgentRootDir, AgentBinaryName) JMXJarPath = filepath.Join(AgentRootDir, JMXJarName) + OIDCTokenPath = filepath.Join(AgentConfigDir, OIDCToken) } diff --git a/translator/config/mode.go b/translator/config/mode.go index 5f8c8f93ede..1191380495d 100644 --- a/translator/config/mode.go +++ b/translator/config/mode.go @@ -20,6 +20,12 @@ const ( ModeK8sOnPrem = "K8sOnPrem" ) +// Azure platform modes: ModeAzureVM is host-level (like ModeEC2), ModeAKS is Kubernetes-level (like ModeEKS). +const ( + ModeAzureVM = "AzureVM" + ModeAKS = "AKS" +) + const ( ShortModeEC2 = "EC2" ShortModeOnPrem = "OP" @@ -27,4 +33,6 @@ const ( ShortModeEKS = "EKS" ShortModeK8sEC2 = "K8E" ShortModeK8sOnPrem = "K8OP" + ShortModeAzureVM = "AZVM" + ShortModeAKS = "AKS" ) diff --git a/translator/context/context.go b/translator/context/context.go index 00b790b63b9..cf94ee679df 100644 --- a/translator/context/context.go +++ b/translator/context/context.go @@ -129,8 +129,11 @@ func (ctx *Context) SetMode(mode string) { case config.ModeWithIRSA: ctx.mode = config.ModeWithIRSA ctx.shortMode = config.ShortModeWithIRSA + case config.ModeAzureVM: + ctx.mode = config.ModeAzureVM + ctx.shortMode = config.ShortModeAzureVM default: - log.Panicf("Invalid mode %s. Valid mode values are %s, %s, %s, and %s.", mode, config.ModeEC2, config.ModeOnPrem, config.ModeOnPremise, config.ModeWithIRSA) + log.Panicf("Invalid mode %s. Valid mode values are %s, %s, %s, %s, and %s.", mode, config.ModeEC2, config.ModeOnPrem, config.ModeOnPremise, config.ModeWithIRSA, config.ModeAzureVM) } } @@ -145,6 +148,9 @@ func (ctx *Context) SetKubernetesMode(mode string) { case config.ModeK8sOnPrem: ctx.kubernetesMode = config.ModeK8sOnPrem ctx.shortMode = config.ShortModeK8sOnPrem + case config.ModeAKS: + ctx.kubernetesMode = config.ModeAKS + ctx.shortMode = config.ShortModeAKS default: ctx.kubernetesMode = "" } diff --git a/translator/context/context_test.go b/translator/context/context_test.go new file mode 100644 index 00000000000..65189ff19cd --- /dev/null +++ b/translator/context/context_test.go @@ -0,0 +1,91 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package context + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/aws/amazon-cloudwatch-agent/translator/config" +) + +func TestSetMode_Azure(t *testing.T) { + ResetContext() + ctx := CurrentContext() + + ctx.SetMode(config.ModeAzureVM) + assert.Equal(t, config.ModeAzureVM, ctx.Mode()) + assert.Equal(t, config.ShortModeAzureVM, ctx.ShortMode()) +} + +func TestSetMode_ExistingModesUnchanged(t *testing.T) { + cases := map[string]struct { + mode string + wantShort string + }{ + "EC2": {config.ModeEC2, config.ShortModeEC2}, + "OnPrem": {config.ModeOnPrem, config.ShortModeOnPrem}, + "WithIRSA": {config.ModeWithIRSA, config.ShortModeWithIRSA}, + } + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + ResetContext() + ctx := CurrentContext() + ctx.SetMode(tc.mode) + assert.Equal(t, tc.mode, ctx.Mode()) + assert.Equal(t, tc.wantShort, ctx.ShortMode()) + }) + } +} + +func TestSetKubernetesMode_AKS(t *testing.T) { + ResetContext() + ctx := CurrentContext() + + ctx.SetKubernetesMode(config.ModeAKS) + assert.Equal(t, config.ModeAKS, ctx.KubernetesMode()) + assert.Equal(t, config.ShortModeAKS, ctx.ShortMode()) +} + +func TestSetKubernetesMode_ExistingModesUnchanged(t *testing.T) { + cases := map[string]struct { + mode string + wantShort string + }{ + "EKS": {config.ModeEKS, config.ShortModeEKS}, + "K8sEC2": {config.ModeK8sEC2, config.ShortModeK8sEC2}, + "K8sOnPrem": {config.ModeK8sOnPrem, config.ShortModeK8sOnPrem}, + } + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + ResetContext() + ctx := CurrentContext() + ctx.SetKubernetesMode(tc.mode) + assert.Equal(t, tc.mode, ctx.KubernetesMode()) + assert.Equal(t, tc.wantShort, ctx.ShortMode()) + }) + } +} + +func TestSetKubernetesMode_UnknownClears(t *testing.T) { + ResetContext() + ctx := CurrentContext() + // A previously-set valid kubernetes mode is cleared by an unknown one. + ctx.SetKubernetesMode(config.ModeAKS) + ctx.SetKubernetesMode("not-a-real-mode") + assert.Equal(t, "", ctx.KubernetesMode()) + // The default branch intentionally keeps shortMode (SetMode sets it first); with no host mode set it retains the last k8s shortMode. + assert.Equal(t, config.ShortModeAKS, ctx.ShortMode()) +} + +func TestSetKubernetesMode_EmptyPreservesHostShortMode(t *testing.T) { + ResetContext() + ctx := CurrentContext() + // Real startup ordering: host mode first, then empty (non-Kubernetes) mode; the host shortMode must survive. + ctx.SetMode(config.ModeAzureVM) + ctx.SetKubernetesMode("") + assert.Equal(t, "", ctx.KubernetesMode()) + assert.Equal(t, config.ShortModeAzureVM, ctx.ShortMode()) +} diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/combined_v1_v2_ec2_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/combined_v1_v2_ec2_config.yaml index ba522dcec8b..618b6bd3c7d 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/combined_v1_v2_ec2_config.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/combined_v1_v2_ec2_config.yaml @@ -926,7 +926,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -934,7 +934,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -942,7 +942,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil transform/logs_cleanup: diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/dbi_config_linux.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/dbi_config_linux.yaml index 38a0cd965b8..9bff360b085 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/dbi_config_linux.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/dbi_config_linux.yaml @@ -729,7 +729,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -737,7 +737,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -745,7 +745,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil transform/logs_cleanup: diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/default_otel_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/default_otel_config.yaml index 4df3f62b40a..b03bafc83d2 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/default_otel_config.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/default_otel_config.yaml @@ -494,7 +494,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -502,7 +502,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -510,7 +510,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil transform/logs_cleanup: diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.conf b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.conf new file mode 100644 index 00000000000..c9bfdc1e818 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.conf @@ -0,0 +1,15 @@ +[agent] + collection_jitter = "0s" + debug = false + flush_interval = "1s" + flush_jitter = "0s" + hostname = "" + interval = "60s" + logfile = "" + logtarget = "lumberjack" + metric_batch_size = 1000 + metric_buffer_limit = 10000 + omit_hostname = false + precision = "" + quiet = false + round_interval = false diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.json b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.json new file mode 100644 index 00000000000..b0f6f9f64d6 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.json @@ -0,0 +1,12 @@ +{ + "agent": { + "region": "us-west-2" + }, + "opentelemetry": { + "collect": { + "host_metrics": { + "metrics_collection_interval": 10 + } + } + } +} diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.yaml new file mode 100644 index 00000000000..54d9d687eb5 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_aks_config.yaml @@ -0,0 +1,604 @@ +connectors: + forward/opentelemetry: {} +exporters: + otlphttp/metrics: + auth: + authenticator: agenthealth/opentelemetry_metrics + compression: gzip + encoding: proto + idle_conn_timeout: 1m30s + logs_endpoint: "" + max_idle_conns: 100 + metrics_endpoint: https://monitoring.us-west-2.amazonaws.com/v1/metrics + retry_on_failure: + enabled: true + initial_interval: 5s + max_elapsed_time: 5m0s + max_interval: 30s + multiplier: 1.5 + randomization_factor: 0.5 + sending_queue: + block_on_overflow: false + blocking: false + enabled: true + num_consumers: 10 + queue_size: 1000 + sizer: {} + wait_for_result: false + timeout: 30s + traces_endpoint: "" + write_buffer_size: 524288 +extensions: + agenthealth/opentelemetry_metrics: + additional_auth: sigv4auth/monitoring + is_usage_data_enabled: true + stats: + operations: + - '*' + usage_flags: + mode: AKS + region_type: ACJ + server: + listen_addr: :4311 + tls_ca_path: /etc/amazon-cloudwatch-observability-agent-client-cert/tls-ca.crt + tls_cert_path: /etc/amazon-cloudwatch-observability-agent-server-cert/server.crt + tls_key_path: /etc/amazon-cloudwatch-observability-agent-server-cert/server.key + sigv4auth/monitoring: + assume_role: {} + imds_retries: 1 + max_retries: 2 + num_workers: 8 + region: us-west-2 + request_timeout_seconds: 30 + service: monitoring +processors: + batch/opentelemetry_metrics: + metadata_cardinality_limit: 1000 + send_batch_max_size: 1000 + send_batch_size: 1000 + timeout: 30s + k8sattributes/opentelemetry: + auth_type: serviceAccount + context: "" + exclude: + pods: [] + extract: + annotations: + - from: pod + key: resource.opentelemetry.io/service.name + key_regex: "" + tag_name: resource.opentelemetry.io/service.name + - from: pod + key: resource.opentelemetry.io/service.namespace + key_regex: "" + tag_name: resource.opentelemetry.io/service.namespace + - from: pod + key: resource.opentelemetry.io/service.instance.id + key_regex: "" + tag_name: resource.opentelemetry.io/service.instance.id + - from: pod + key: resource.opentelemetry.io/service.version + key_regex: "" + tag_name: resource.opentelemetry.io/service.version + labels: + - from: pod + key: app.kubernetes.io/instance + key_regex: "" + tag_name: app.kubernetes.io/instance + - from: pod + key: app.kubernetes.io/name + key_regex: "" + tag_name: app.kubernetes.io/name + - from: pod + key: app.kubernetes.io/version + key_regex: "" + tag_name: app.kubernetes.io/version + metadata: + - k8s.namespace.name + - k8s.deployment.name + - k8s.replicaset.name + - k8s.statefulset.name + - k8s.daemonset.name + - k8s.job.name + - k8s.cronjob.name + - k8s.node.name + - k8s.pod.name + - k8s.pod.uid + - k8s.pod.start_time + - k8s.container.name + otel_annotations: false + filter: + namespace: "" + node: "" + node_from_env_var: K8S_NODE_NAME + kube_config_path: "" + passthrough: false + wait_for_metadata: false + wait_for_metadata_timeout: 10s + resourcedetection/opentelemetry: + aks: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + azure: + resource_attributes: + azure.resourcegroup.name: + enabled: true + azure.vm.name: + enabled: true + azure.vm.scaleset.name: + enabled: true + azure.vm.size: + enabled: true + cloud.account.id: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + tags: [] + consul: + address: "" + datacenter: "" + namespace: "" + resource_attributes: + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + token_file: "" + detectors: + - env + - aks + - azure + docker: + resource_attributes: + host.name: + enabled: true + os.type: + enabled: true + ec2: + fail_on_missing_metadata: false + max_attempts: 3 + max_backoff: 20s + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.image.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + tags: [] + ecs: + resource_attributes: + aws.ecs.cluster.arn: + enabled: true + aws.ecs.launchtype: + enabled: true + aws.ecs.task.arn: + enabled: true + aws.ecs.task.family: + enabled: true + aws.ecs.task.id: + enabled: true + aws.ecs.task.revision: + enabled: true + aws.log.group.arns: + enabled: true + aws.log.group.names: + enabled: true + aws.log.stream.arns: + enabled: true + aws.log.stream.names: + enabled: true + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + eks: + resource_attributes: + cloud.account.id: + enabled: false + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + elasticbeanstalk: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + deployment.environment: + enabled: true + service.instance.id: + enabled: true + service.version: + enabled: true + gcp: + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.id: + enabled: true + faas.instance: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + gcp.cloud_run.job.execution: + enabled: true + gcp.cloud_run.job.task_index: + enabled: true + gcp.gce.instance.hostname: + enabled: false + gcp.gce.instance.name: + enabled: false + gcp.gce.instance_group_manager.name: + enabled: true + gcp.gce.instance_group_manager.region: + enabled: true + gcp.gce.instance_group_manager.zone: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + k8s.cluster.name: + enabled: true + heroku: + resource_attributes: + cloud.provider: + enabled: true + heroku.app.id: + enabled: true + heroku.dyno.id: + enabled: true + heroku.release.commit: + enabled: true + heroku.release.creation_timestamp: + enabled: true + service.instance.id: + enabled: true + service.name: + enabled: true + service.version: + enabled: true + idle_conn_timeout: 1m30s + k8snode: + auth_type: serviceAccount + context: "" + kube_config_path: "" + node_from_env_var: "" + resource_attributes: + k8s.node.name: + enabled: true + k8s.node.uid: + enabled: true + kubeadm: + auth_type: serviceAccount + context: "" + kube_config_path: "" + resource_attributes: + k8s.cluster.name: + enabled: true + k8s.cluster.uid: + enabled: true + lambda: + resource_attributes: + aws.log.group.names: + enabled: true + aws.log.stream.names: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.instance: + enabled: true + faas.max_memory: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + max_idle_conns: 100 + openshift: + address: "" + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + k8s.cluster.name: + enabled: true + tls: {} + token: "" + override: true + system: + resource_attributes: + host.arch: + enabled: false + host.cpu.cache.l2.size: + enabled: false + host.cpu.family: + enabled: false + host.cpu.model.id: + enabled: false + host.cpu.model.name: + enabled: false + host.cpu.stepping: + enabled: false + host.cpu.vendor.id: + enabled: false + host.id: + enabled: false + host.ip: + enabled: false + host.mac: + enabled: false + host.name: + enabled: true + os.description: + enabled: false + os.type: + enabled: true + os.version: + enabled: false + timeout: 2s + transform/host_metrics_scope: + error_mode: ignore + flatten_data: false + log_statements: [] + metric_statements: + - context: scope + error_mode: ignore + statements: + - set(scope.attributes["cloudwatch.source"], "cloudwatch-agent") + - set(scope.attributes["cloudwatch.solution"], "otel-host-metrics") + trace_statements: [] + transform/identity: + error_mode: ignore + flatten_data: false + log_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.namespace"], resource.attributes["resource.opentelemetry.io/service.namespace"]) where resource.attributes["service.namespace"] == nil and resource.attributes["resource.opentelemetry.io/service.namespace"] != nil + - set(resource.attributes["service.namespace"], resource.attributes["k8s.namespace.name"]) where resource.attributes["service.namespace"] == nil and resource.attributes["k8s.namespace.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["resource.opentelemetry.io/service.name"]) where resource.attributes["service.name"] == nil and resource.attributes["resource.opentelemetry.io/service.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/instance"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/instance"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/name"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.job.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.pod.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.container.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.container.name"] != nil + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Format("arn:aws:eks:%s:%s:cluster/%s", [resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], resource.attributes["k8s.cluster.name"]])) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["cloud.platform"] == "aws_eks" + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Deployment") where resource.attributes["k8s.deployment.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "StatefulSet") where resource.attributes["k8s.statefulset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.daemonset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.daemonset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "DaemonSet") where resource.attributes["k8s.daemonset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.job.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Job") where resource.attributes["k8s.job.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.cronjob.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.cronjob.name"] != nil + - set(resource.attributes["k8s.workload.type"], "CronJob") where resource.attributes["k8s.cronjob.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "ReplicaSet") where resource.attributes["k8s.replicaset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["service.instance.id"], resource.attributes["resource.opentelemetry.io/service.instance.id"]) where resource.attributes["service.instance.id"] == nil and resource.attributes["resource.opentelemetry.io/service.instance.id"] != nil + - set(resource.attributes["service.instance.id"], Concat([resource.attributes["k8s.namespace.name"], resource.attributes["k8s.pod.name"], resource.attributes["k8s.container.name"]], "/")) where resource.attributes["service.instance.id"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.version"], resource.attributes["resource.opentelemetry.io/service.version"]) where resource.attributes["service.version"] == nil and resource.attributes["resource.opentelemetry.io/service.version"] != nil + - set(resource.attributes["service.version"], resource.attributes["app.kubernetes.io/version"]) where resource.attributes["service.version"] == nil and resource.attributes["app.kubernetes.io/version"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], Concat([resource.attributes["k8s.cluster.name"], resource.attributes["k8s.namespace.name"]], "/")], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["k8s.namespace.name"] != nil + - delete_key(resource.attributes, "resource.opentelemetry.io/service.namespace") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.name") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.instance.id") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.version") + - delete_key(resource.attributes, "app.kubernetes.io/instance") + - delete_key(resource.attributes, "app.kubernetes.io/name") + - delete_key(resource.attributes, "app.kubernetes.io/version") + metric_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.namespace"], resource.attributes["resource.opentelemetry.io/service.namespace"]) where resource.attributes["service.namespace"] == nil and resource.attributes["resource.opentelemetry.io/service.namespace"] != nil + - set(resource.attributes["service.namespace"], resource.attributes["k8s.namespace.name"]) where resource.attributes["service.namespace"] == nil and resource.attributes["k8s.namespace.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["resource.opentelemetry.io/service.name"]) where resource.attributes["service.name"] == nil and resource.attributes["resource.opentelemetry.io/service.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/instance"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/instance"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/name"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.job.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.pod.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.container.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.container.name"] != nil + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Format("arn:aws:eks:%s:%s:cluster/%s", [resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], resource.attributes["k8s.cluster.name"]])) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["cloud.platform"] == "aws_eks" + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Deployment") where resource.attributes["k8s.deployment.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "StatefulSet") where resource.attributes["k8s.statefulset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.daemonset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.daemonset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "DaemonSet") where resource.attributes["k8s.daemonset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.job.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Job") where resource.attributes["k8s.job.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.cronjob.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.cronjob.name"] != nil + - set(resource.attributes["k8s.workload.type"], "CronJob") where resource.attributes["k8s.cronjob.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "ReplicaSet") where resource.attributes["k8s.replicaset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["service.instance.id"], resource.attributes["resource.opentelemetry.io/service.instance.id"]) where resource.attributes["service.instance.id"] == nil and resource.attributes["resource.opentelemetry.io/service.instance.id"] != nil + - set(resource.attributes["service.instance.id"], Concat([resource.attributes["k8s.namespace.name"], resource.attributes["k8s.pod.name"], resource.attributes["k8s.container.name"]], "/")) where resource.attributes["service.instance.id"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.version"], resource.attributes["resource.opentelemetry.io/service.version"]) where resource.attributes["service.version"] == nil and resource.attributes["resource.opentelemetry.io/service.version"] != nil + - set(resource.attributes["service.version"], resource.attributes["app.kubernetes.io/version"]) where resource.attributes["service.version"] == nil and resource.attributes["app.kubernetes.io/version"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], Concat([resource.attributes["k8s.cluster.name"], resource.attributes["k8s.namespace.name"]], "/")], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["k8s.namespace.name"] != nil + - delete_key(resource.attributes, "resource.opentelemetry.io/service.namespace") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.name") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.instance.id") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.version") + - delete_key(resource.attributes, "app.kubernetes.io/instance") + - delete_key(resource.attributes, "app.kubernetes.io/name") + - delete_key(resource.attributes, "app.kubernetes.io/version") + trace_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.namespace"], resource.attributes["resource.opentelemetry.io/service.namespace"]) where resource.attributes["service.namespace"] == nil and resource.attributes["resource.opentelemetry.io/service.namespace"] != nil + - set(resource.attributes["service.namespace"], resource.attributes["k8s.namespace.name"]) where resource.attributes["service.namespace"] == nil and resource.attributes["k8s.namespace.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["resource.opentelemetry.io/service.name"]) where resource.attributes["service.name"] == nil and resource.attributes["resource.opentelemetry.io/service.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/instance"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/instance"] != nil + - set(resource.attributes["service.name"], resource.attributes["app.kubernetes.io/name"]) where resource.attributes["service.name"] == nil and resource.attributes["app.kubernetes.io/name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.job.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.pod.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.name"], resource.attributes["k8s.container.name"]) where resource.attributes["service.name"] == nil and resource.attributes["k8s.container.name"] != nil + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Format("arn:aws:eks:%s:%s:cluster/%s", [resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], resource.attributes["k8s.cluster.name"]])) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["cloud.platform"] == "aws_eks" + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.deployment.name"]) where resource.attributes["k8s.deployment.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Deployment") where resource.attributes["k8s.deployment.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.statefulset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.statefulset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "StatefulSet") where resource.attributes["k8s.statefulset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.daemonset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.daemonset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "DaemonSet") where resource.attributes["k8s.daemonset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.job.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.job.name"] != nil + - set(resource.attributes["k8s.workload.type"], "Job") where resource.attributes["k8s.job.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.cronjob.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.cronjob.name"] != nil + - set(resource.attributes["k8s.workload.type"], "CronJob") where resource.attributes["k8s.cronjob.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["k8s.workload.name"], resource.attributes["k8s.replicaset.name"]) where resource.attributes["k8s.workload.name"] == nil and resource.attributes["k8s.replicaset.name"] != nil + - set(resource.attributes["k8s.workload.type"], "ReplicaSet") where resource.attributes["k8s.replicaset.name"] != nil and resource.attributes["k8s.workload.type"] == nil + - set(resource.attributes["service.instance.id"], resource.attributes["resource.opentelemetry.io/service.instance.id"]) where resource.attributes["service.instance.id"] == nil and resource.attributes["resource.opentelemetry.io/service.instance.id"] != nil + - set(resource.attributes["service.instance.id"], Concat([resource.attributes["k8s.namespace.name"], resource.attributes["k8s.pod.name"], resource.attributes["k8s.container.name"]], "/")) where resource.attributes["service.instance.id"] == nil and resource.attributes["k8s.pod.name"] != nil + - set(resource.attributes["service.version"], resource.attributes["resource.opentelemetry.io/service.version"]) where resource.attributes["service.version"] == nil and resource.attributes["resource.opentelemetry.io/service.version"] != nil + - set(resource.attributes["service.version"], resource.attributes["app.kubernetes.io/version"]) where resource.attributes["service.version"] == nil and resource.attributes["app.kubernetes.io/version"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], Concat([resource.attributes["k8s.cluster.name"], resource.attributes["k8s.namespace.name"]], "/")], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil and resource.attributes["k8s.cluster.name"] != nil and resource.attributes["k8s.namespace.name"] != nil + - delete_key(resource.attributes, "resource.opentelemetry.io/service.namespace") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.name") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.instance.id") + - delete_key(resource.attributes, "resource.opentelemetry.io/service.version") + - delete_key(resource.attributes, "app.kubernetes.io/instance") + - delete_key(resource.attributes, "app.kubernetes.io/name") + - delete_key(resource.attributes, "app.kubernetes.io/version") +receivers: + hostmetrics/opentelemetry: + collection_interval: 10s + initial_delay: 1s + scrapers: + cpu: + metrics: + system.cpu.frequency: + enabled: true + system.cpu.logical.count: + enabled: true + system.cpu.physical.count: + enabled: true + system.cpu.utilization: + enabled: true + disk: null + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + load: null + memory: + metrics: + system.linux.memory.available: + enabled: true + system.linux.memory.dirty: + enabled: true + system.memory.limit: + enabled: true + system.memory.page_size: + enabled: true + system.memory.utilization: + enabled: true + network: null + processes: null + timeout: 0s +service: + extensions: + - sigv4auth/monitoring + - agenthealth/opentelemetry_metrics + - server + pipelines: + metrics/host_metrics: + exporters: + - forward/opentelemetry + processors: + - transform/host_metrics_scope + receivers: + - hostmetrics/opentelemetry + metrics/opentelemetry: + exporters: + - otlphttp/metrics + processors: + - resourcedetection/opentelemetry + - k8sattributes/opentelemetry + - transform/identity + - batch/opentelemetry_metrics + receivers: + - forward/opentelemetry + telemetry: + logs: + encoding: console + level: info + sampling: + enabled: true + initial: 2 + thereafter: 500 + tick: 10s + metrics: + level: None + traces: + level: None diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.conf b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.conf new file mode 100644 index 00000000000..9d2168ce61a --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.conf @@ -0,0 +1,15 @@ +[agent] + collection_jitter = "0s" + debug = false + flush_interval = "1s" + flush_jitter = "0s" + hostname = "" + interval = "60s" + logfile = "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log" + logtarget = "lumberjack" + metric_batch_size = 1000 + metric_buffer_limit = 10000 + omit_hostname = false + precision = "" + quiet = false + round_interval = false diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.json b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.json new file mode 100644 index 00000000000..8363781c290 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.json @@ -0,0 +1,15 @@ +{ + "agent": { + "region": "us-west-2", + "credentials": { + "role_arn": "arn:aws:iam::123456789012:role/AzureVMRole" + } + }, + "opentelemetry": { + "collect": { + "host_metrics": { + "metrics_collection_interval": 10 + } + } + } +} diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.yaml new file mode 100644 index 00000000000..52052e83be8 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_config.yaml @@ -0,0 +1,448 @@ +connectors: + forward/opentelemetry: {} +exporters: + otlphttp/metrics: + auth: + authenticator: agenthealth/opentelemetry_metrics + compression: gzip + encoding: proto + idle_conn_timeout: 1m30s + logs_endpoint: "" + max_idle_conns: 100 + metrics_endpoint: https://monitoring.us-west-2.amazonaws.com/v1/metrics + retry_on_failure: + enabled: true + initial_interval: 5s + max_elapsed_time: 5m0s + max_interval: 30s + multiplier: 1.5 + randomization_factor: 0.5 + sending_queue: + block_on_overflow: false + blocking: false + enabled: true + num_consumers: 10 + queue_size: 1000 + sizer: {} + wait_for_result: false + timeout: 30s + traces_endpoint: "" + write_buffer_size: 524288 +extensions: + agenthealth/opentelemetry_metrics: + additional_auth: sigv4auth/monitoring + is_usage_data_enabled: true + stats: + operations: + - '*' + usage_flags: + mode: AZVM + region_type: ACJ + oidctoken: + output_token_file: /opt/aws/amazon-cloudwatch-agent/etc/.oidc-token + provider: azure + sigv4auth/monitoring: + assume_role: + arn: arn:aws:iam::123456789012:role/AzureVMRole + sts_region: us-west-2 + web_identity_token_file: /opt/aws/amazon-cloudwatch-agent/etc/.oidc-token + imds_retries: 1 + max_retries: 2 + num_workers: 8 + region: us-west-2 + request_timeout_seconds: 30 + service: monitoring +processors: + batch/opentelemetry_metrics: + metadata_cardinality_limit: 1000 + send_batch_max_size: 1000 + send_batch_size: 1000 + timeout: 30s + resourcedetection/opentelemetry: + aks: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + azure: + resource_attributes: + azure.resourcegroup.name: + enabled: true + azure.vm.name: + enabled: true + azure.vm.scaleset.name: + enabled: true + azure.vm.size: + enabled: true + cloud.account.id: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + tags: [] + consul: + address: "" + datacenter: "" + namespace: "" + resource_attributes: + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + token_file: "" + detectors: + - env + - azure + docker: + resource_attributes: + host.name: + enabled: true + os.type: + enabled: true + ec2: + fail_on_missing_metadata: false + max_attempts: 3 + max_backoff: 20s + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.image.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + tags: [] + ecs: + resource_attributes: + aws.ecs.cluster.arn: + enabled: true + aws.ecs.launchtype: + enabled: true + aws.ecs.task.arn: + enabled: true + aws.ecs.task.family: + enabled: true + aws.ecs.task.id: + enabled: true + aws.ecs.task.revision: + enabled: true + aws.log.group.arns: + enabled: true + aws.log.group.names: + enabled: true + aws.log.stream.arns: + enabled: true + aws.log.stream.names: + enabled: true + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + eks: + resource_attributes: + cloud.account.id: + enabled: false + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + elasticbeanstalk: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + deployment.environment: + enabled: true + service.instance.id: + enabled: true + service.version: + enabled: true + gcp: + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.id: + enabled: true + faas.instance: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + gcp.cloud_run.job.execution: + enabled: true + gcp.cloud_run.job.task_index: + enabled: true + gcp.gce.instance.hostname: + enabled: false + gcp.gce.instance.name: + enabled: false + gcp.gce.instance_group_manager.name: + enabled: true + gcp.gce.instance_group_manager.region: + enabled: true + gcp.gce.instance_group_manager.zone: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + k8s.cluster.name: + enabled: true + heroku: + resource_attributes: + cloud.provider: + enabled: true + heroku.app.id: + enabled: true + heroku.dyno.id: + enabled: true + heroku.release.commit: + enabled: true + heroku.release.creation_timestamp: + enabled: true + service.instance.id: + enabled: true + service.name: + enabled: true + service.version: + enabled: true + idle_conn_timeout: 1m30s + k8snode: + auth_type: serviceAccount + context: "" + kube_config_path: "" + node_from_env_var: "" + resource_attributes: + k8s.node.name: + enabled: true + k8s.node.uid: + enabled: true + kubeadm: + auth_type: serviceAccount + context: "" + kube_config_path: "" + resource_attributes: + k8s.cluster.name: + enabled: true + k8s.cluster.uid: + enabled: true + lambda: + resource_attributes: + aws.log.group.names: + enabled: true + aws.log.stream.names: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.instance: + enabled: true + faas.max_memory: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + max_idle_conns: 100 + openshift: + address: "" + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + k8s.cluster.name: + enabled: true + tls: {} + token: "" + override: true + system: + resource_attributes: + host.arch: + enabled: false + host.cpu.cache.l2.size: + enabled: false + host.cpu.family: + enabled: false + host.cpu.model.id: + enabled: false + host.cpu.model.name: + enabled: false + host.cpu.stepping: + enabled: false + host.cpu.vendor.id: + enabled: false + host.id: + enabled: false + host.ip: + enabled: false + host.mac: + enabled: false + host.name: + enabled: true + os.description: + enabled: false + os.type: + enabled: true + os.version: + enabled: false + timeout: 2s + transform/host_metrics_scope: + error_mode: ignore + flatten_data: false + log_statements: [] + metric_statements: + - context: scope + error_mode: ignore + statements: + - set(scope.attributes["cloudwatch.source"], "cloudwatch-agent") + - set(scope.attributes["cloudwatch.solution"], "otel-host-metrics") + trace_statements: [] + transform/identity: + error_mode: ignore + flatten_data: false + log_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil + metric_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil + trace_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil +receivers: + hostmetrics/opentelemetry: + collection_interval: 10s + initial_delay: 1s + scrapers: + cpu: + metrics: + system.cpu.frequency: + enabled: true + system.cpu.logical.count: + enabled: true + system.cpu.physical.count: + enabled: true + system.cpu.utilization: + enabled: true + disk: null + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + load: null + memory: + metrics: + system.linux.memory.available: + enabled: true + system.linux.memory.dirty: + enabled: true + system.memory.limit: + enabled: true + system.memory.page_size: + enabled: true + system.memory.utilization: + enabled: true + network: null + processes: null + timeout: 0s +service: + extensions: + - sigv4auth/monitoring + - agenthealth/opentelemetry_metrics + - oidctoken + pipelines: + metrics/host_metrics: + exporters: + - forward/opentelemetry + processors: + - transform/host_metrics_scope + receivers: + - hostmetrics/opentelemetry + metrics/opentelemetry: + exporters: + - otlphttp/metrics + processors: + - resourcedetection/opentelemetry + - transform/identity + - batch/opentelemetry_metrics + receivers: + - forward/opentelemetry + telemetry: + logs: + encoding: console + level: info + output_paths: + - /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log + sampling: + enabled: true + initial: 2 + thereafter: 500 + tick: 10s + metrics: + level: None + traces: + level: None diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.conf b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.conf new file mode 100644 index 00000000000..9d2168ce61a --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.conf @@ -0,0 +1,15 @@ +[agent] + collection_jitter = "0s" + debug = false + flush_interval = "1s" + flush_jitter = "0s" + hostname = "" + interval = "60s" + logfile = "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log" + logtarget = "lumberjack" + metric_batch_size = 1000 + metric_buffer_limit = 10000 + omit_hostname = false + precision = "" + quiet = false + round_interval = false diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.json b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.json new file mode 100644 index 00000000000..8363781c290 --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.json @@ -0,0 +1,15 @@ +{ + "agent": { + "region": "us-west-2", + "credentials": { + "role_arn": "arn:aws:iam::123456789012:role/AzureVMRole" + } + }, + "opentelemetry": { + "collect": { + "host_metrics": { + "metrics_collection_interval": 10 + } + } + } +} diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.yaml new file mode 100644 index 00000000000..2c69633b70f --- /dev/null +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_azurevm_sharedcreds_config.yaml @@ -0,0 +1,446 @@ +connectors: + forward/opentelemetry: {} +exporters: + otlphttp/metrics: + auth: + authenticator: agenthealth/opentelemetry_metrics + compression: gzip + encoding: proto + idle_conn_timeout: 1m30s + logs_endpoint: "" + max_idle_conns: 100 + metrics_endpoint: https://monitoring.us-west-2.amazonaws.com/v1/metrics + retry_on_failure: + enabled: true + initial_interval: 5s + max_elapsed_time: 5m0s + max_interval: 30s + multiplier: 1.5 + randomization_factor: 0.5 + sending_queue: + block_on_overflow: false + blocking: false + enabled: true + num_consumers: 10 + queue_size: 1000 + sizer: {} + wait_for_result: false + timeout: 30s + traces_endpoint: "" + write_buffer_size: 524288 +extensions: + agenthealth/opentelemetry_metrics: + additional_auth: sigv4auth/monitoring + is_usage_data_enabled: true + stats: + operations: + - '*' + usage_flags: + mode: AZVM + region_type: ACJ + sigv4auth/monitoring: + assume_role: + arn: arn:aws:iam::123456789012:role/AzureVMRole + sts_region: us-west-2 + imds_retries: 2 + max_retries: 2 + num_workers: 8 + profile: default + region: us-west-2 + request_timeout_seconds: 30 + service: monitoring + shared_credentials_file: + - /root/.aws/credentials +processors: + batch/opentelemetry_metrics: + metadata_cardinality_limit: 1000 + send_batch_max_size: 1000 + send_batch_size: 1000 + timeout: 30s + resourcedetection/opentelemetry: + aks: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + azure: + resource_attributes: + azure.resourcegroup.name: + enabled: true + azure.vm.name: + enabled: true + azure.vm.scaleset.name: + enabled: true + azure.vm.size: + enabled: true + cloud.account.id: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + tags: [] + consul: + address: "" + datacenter: "" + namespace: "" + resource_attributes: + cloud.region: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + token_file: "" + detectors: + - env + - azure + docker: + resource_attributes: + host.name: + enabled: true + os.type: + enabled: true + ec2: + fail_on_missing_metadata: false + max_attempts: 3 + max_backoff: 20s + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + host.id: + enabled: true + host.image.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + tags: [] + ecs: + resource_attributes: + aws.ecs.cluster.arn: + enabled: true + aws.ecs.launchtype: + enabled: true + aws.ecs.task.arn: + enabled: true + aws.ecs.task.family: + enabled: true + aws.ecs.task.id: + enabled: true + aws.ecs.task.revision: + enabled: true + aws.log.group.arns: + enabled: true + aws.log.group.names: + enabled: true + aws.log.stream.arns: + enabled: true + aws.log.stream.names: + enabled: true + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + eks: + resource_attributes: + cloud.account.id: + enabled: false + cloud.platform: + enabled: true + cloud.provider: + enabled: true + k8s.cluster.name: + enabled: false + elasticbeanstalk: + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + deployment.environment: + enabled: true + service.instance.id: + enabled: true + service.version: + enabled: true + gcp: + resource_attributes: + cloud.account.id: + enabled: true + cloud.availability_zone: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.id: + enabled: true + faas.instance: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + gcp.cloud_run.job.execution: + enabled: true + gcp.cloud_run.job.task_index: + enabled: true + gcp.gce.instance.hostname: + enabled: false + gcp.gce.instance.name: + enabled: false + gcp.gce.instance_group_manager.name: + enabled: true + gcp.gce.instance_group_manager.region: + enabled: true + gcp.gce.instance_group_manager.zone: + enabled: true + host.id: + enabled: true + host.name: + enabled: true + host.type: + enabled: true + k8s.cluster.name: + enabled: true + heroku: + resource_attributes: + cloud.provider: + enabled: true + heroku.app.id: + enabled: true + heroku.dyno.id: + enabled: true + heroku.release.commit: + enabled: true + heroku.release.creation_timestamp: + enabled: true + service.instance.id: + enabled: true + service.name: + enabled: true + service.version: + enabled: true + idle_conn_timeout: 1m30s + k8snode: + auth_type: serviceAccount + context: "" + kube_config_path: "" + node_from_env_var: "" + resource_attributes: + k8s.node.name: + enabled: true + k8s.node.uid: + enabled: true + kubeadm: + auth_type: serviceAccount + context: "" + kube_config_path: "" + resource_attributes: + k8s.cluster.name: + enabled: true + k8s.cluster.uid: + enabled: true + lambda: + resource_attributes: + aws.log.group.names: + enabled: true + aws.log.stream.names: + enabled: true + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + faas.instance: + enabled: true + faas.max_memory: + enabled: true + faas.name: + enabled: true + faas.version: + enabled: true + max_idle_conns: 100 + openshift: + address: "" + resource_attributes: + cloud.platform: + enabled: true + cloud.provider: + enabled: true + cloud.region: + enabled: true + k8s.cluster.name: + enabled: true + tls: {} + token: "" + override: true + system: + resource_attributes: + host.arch: + enabled: false + host.cpu.cache.l2.size: + enabled: false + host.cpu.family: + enabled: false + host.cpu.model.id: + enabled: false + host.cpu.model.name: + enabled: false + host.cpu.stepping: + enabled: false + host.cpu.vendor.id: + enabled: false + host.id: + enabled: false + host.ip: + enabled: false + host.mac: + enabled: false + host.name: + enabled: true + os.description: + enabled: false + os.type: + enabled: true + os.version: + enabled: false + timeout: 2s + transform/host_metrics_scope: + error_mode: ignore + flatten_data: false + log_statements: [] + metric_statements: + - context: scope + error_mode: ignore + statements: + - set(scope.attributes["cloudwatch.source"], "cloudwatch-agent") + - set(scope.attributes["cloudwatch.solution"], "otel-host-metrics") + trace_statements: [] + transform/identity: + error_mode: ignore + flatten_data: false + log_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil + metric_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil + trace_statements: + - context: resource + error_mode: ignore + statements: + - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil + - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil +receivers: + hostmetrics/opentelemetry: + collection_interval: 10s + initial_delay: 1s + scrapers: + cpu: + metrics: + system.cpu.frequency: + enabled: true + system.cpu.logical.count: + enabled: true + system.cpu.physical.count: + enabled: true + system.cpu.utilization: + enabled: true + disk: null + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + load: null + memory: + metrics: + system.linux.memory.available: + enabled: true + system.linux.memory.dirty: + enabled: true + system.memory.limit: + enabled: true + system.memory.page_size: + enabled: true + system.memory.utilization: + enabled: true + network: null + processes: null + timeout: 0s +service: + extensions: + - sigv4auth/monitoring + - agenthealth/opentelemetry_metrics + pipelines: + metrics/host_metrics: + exporters: + - forward/opentelemetry + processors: + - transform/host_metrics_scope + receivers: + - hostmetrics/opentelemetry + metrics/opentelemetry: + exporters: + - otlphttp/metrics + processors: + - resourcedetection/opentelemetry + - transform/identity + - batch/opentelemetry_metrics + receivers: + - forward/opentelemetry + telemetry: + logs: + encoding: console + level: info + output_paths: + - /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log + sampling: + enabled: true + initial: 2 + thereafter: 500 + tick: 10s + metrics: + level: None + traces: + level: None diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_config.yaml index 976fe2bdb6d..4ef33d3d73a 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_config.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/host_metrics_config.yaml @@ -351,7 +351,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -359,7 +359,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -367,7 +367,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil receivers: diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/otlp_otel_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/otlp_otel_config.yaml index 15d9457266d..23f95d08bb1 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/otlp_otel_config.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/otlp_otel_config.yaml @@ -464,7 +464,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -472,7 +472,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -480,7 +480,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil transform/logs_cleanup: diff --git a/translator/tocwconfig/sampleConfig/opentelemetry/prometheus_otel_pipeline_config.yaml b/translator/tocwconfig/sampleConfig/opentelemetry/prometheus_otel_pipeline_config.yaml index c2c536aa604..af03ed4c80a 100644 --- a/translator/tocwconfig/sampleConfig/opentelemetry/prometheus_otel_pipeline_config.yaml +++ b/translator/tocwconfig/sampleConfig/opentelemetry/prometheus_otel_pipeline_config.yaml @@ -340,7 +340,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: @@ -348,7 +348,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil trace_statements: @@ -356,7 +356,7 @@ processors: error_mode: ignore statements: - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil transform/prometheus_scope: diff --git a/translator/tocwconfig/tocwconfig_unix_test.go b/translator/tocwconfig/tocwconfig_unix_test.go index ee5d7022c37..eb0adfb322c 100644 --- a/translator/tocwconfig/tocwconfig_unix_test.go +++ b/translator/tocwconfig/tocwconfig_unix_test.go @@ -18,6 +18,7 @@ import ( "github.com/stretchr/testify/require" "gopkg.in/yaml.v3" + "github.com/aws/amazon-cloudwatch-agent/cfg/envconfig" "github.com/aws/amazon-cloudwatch-agent/internal/mapstructure" "github.com/aws/amazon-cloudwatch-agent/tool/testutil" "github.com/aws/amazon-cloudwatch-agent/translator" @@ -183,3 +184,30 @@ func TestCombinedV1V2EKSConfig(t *testing.T) { }) assert.Empty(t, cmp.Diff(expected, actual, opt)) } + +func TestAzureVMHostMetricsConfig(t *testing.T) { + resetContext(t) + context.CurrentContext().SetMode(config.ModeAzureVM) + + checkTranslation(t, "opentelemetry/host_metrics_azurevm_config", "linux", nil, "") +} + +func TestAzureVMHostMetricsSharedCredsConfig(t *testing.T) { + resetContext(t) + context.CurrentContext().SetMode(config.ModeAzureVM) + // common-config.toml creds: sigv4auth assumes the role directly, so no oidctoken/web_identity path. + readCommonConfig(t, "./sampleConfig/commonConfig/withCredentials.toml") + + checkTranslation(t, "opentelemetry/host_metrics_azurevm_sharedcreds_config", "linux", nil, "") +} + +func TestAKSHostMetricsConfig(t *testing.T) { + resetContext(t) + context.CurrentContext().SetRunInContainer(true) + t.Setenv(envconfig.RunInAKS, envconfig.TrueValue) + // AKS nodes are Azure VMs, so DetectAgentMode resolves host mode to AzureVM; mirror that here. + context.CurrentContext().SetMode(config.ModeAzureVM) + context.CurrentContext().SetKubernetesMode(config.ModeAKS) + + checkTranslation(t, "opentelemetry/host_metrics_aks_config", "linux", nil, "") +} diff --git a/translator/translate/agent/ruleCommonCreds.go b/translator/translate/agent/ruleCommonCreds.go index c2ca9bb3e2d..e66938012ab 100644 --- a/translator/translate/agent/ruleCommonCreds.go +++ b/translator/translate/agent/ruleCommonCreds.go @@ -5,6 +5,7 @@ package agent import ( "github.com/aws/amazon-cloudwatch-agent/cfg/commonconfig" + "github.com/aws/amazon-cloudwatch-agent/translator/config" "github.com/aws/amazon-cloudwatch-agent/translator/context" "github.com/aws/amazon-cloudwatch-agent/translator/util" ) @@ -54,6 +55,19 @@ func (c *CommonCreds) ApplyRule(input interface{}) (returnKey string, returnVal return } +// HasSharedCredentials reports whether common-config.toml supplied a profile or credentials file. +func HasSharedCredentials() bool { + _, hasProfile := Global_Config.Credentials[Profile_Key] + _, hasFile := Global_Config.Credentials[CredentialsFile_Key] + return hasProfile || hasFile +} + +// IsAzureWebIdentity reports whether the oidctoken IMDS web-identity chain applies: plain Azure VM (not AKS, which uses the chart's projected SA token) with no common-config credentials. +func IsAzureWebIdentity() bool { + ctx := context.CurrentContext() + return ctx.Mode() == config.ModeAzureVM && ctx.KubernetesMode() != config.ModeAKS && !HasSharedCredentials() +} + func init() { c := new(CommonCreds) RegisterRule(CommonCredentialsSectionKey, c) diff --git a/translator/translate/otel/extension/oidctoken/translator.go b/translator/translate/otel/extension/oidctoken/translator.go new file mode 100644 index 00000000000..3483e3c505e --- /dev/null +++ b/translator/translate/otel/extension/oidctoken/translator.go @@ -0,0 +1,36 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package oidctoken + +import ( + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidctokenextension" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/confmap" + "go.opentelemetry.io/collector/extension" + + "github.com/aws/amazon-cloudwatch-agent/tool/paths" + "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/common" +) + +type translator struct { + factory extension.Factory +} + +var _ common.ComponentTranslator = (*translator)(nil) + +func NewTranslator() common.ComponentTranslator { + return &translator{factory: oidctokenextension.NewFactory()} +} + +func (t *translator) ID() component.ID { + return component.NewID(t.factory.Type()) +} + +func (t *translator) Translate(_ *confmap.Conf) (component.Config, error) { + cfg := t.factory.CreateDefaultConfig().(*oidctokenextension.Config) + // Only emitted for Azure VM/AKS, so the provider is always Azure. + cfg.Provider = oidctokenextension.ProviderAzure + cfg.OutputTokenFile = paths.OIDCTokenPath + return cfg, nil +} diff --git a/translator/translate/otel/extension/oidctoken/translator_test.go b/translator/translate/otel/extension/oidctoken/translator_test.go new file mode 100644 index 00000000000..cb17eb9a277 --- /dev/null +++ b/translator/translate/otel/extension/oidctoken/translator_test.go @@ -0,0 +1,36 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package oidctoken + +import ( + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/oidctokenextension" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/confmap" + + "github.com/aws/amazon-cloudwatch-agent/tool/paths" + "github.com/aws/amazon-cloudwatch-agent/translator/config" + "github.com/aws/amazon-cloudwatch-agent/translator/context" +) + +func TestTranslator(t *testing.T) { + t.Cleanup(context.ResetContext) + context.ResetContext() + context.CurrentContext().SetMode(config.ModeAzureVM) + + tt := NewTranslator() + assert.Equal(t, "oidctoken", tt.ID().String()) + + got, err := tt.Translate(confmap.New()) + require.NoError(t, err) + require.NotNil(t, got) + + cfg, ok := got.(*oidctokenextension.Config) + require.True(t, ok) + assert.Equal(t, oidctokenextension.ProviderAzure, cfg.Provider) + assert.Equal(t, paths.OIDCTokenPath, cfg.OutputTokenFile) + assert.NoError(t, cfg.Validate()) +} diff --git a/translator/translate/otel/extension/sigv4auth/translator.go b/translator/translate/otel/extension/sigv4auth/translator.go index 5e4b8fe849a..8dc577a7060 100644 --- a/translator/translate/otel/extension/sigv4auth/translator.go +++ b/translator/translate/otel/extension/sigv4auth/translator.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/extension" "github.com/aws/amazon-cloudwatch-agent/internal/retryer" + "github.com/aws/amazon-cloudwatch-agent/tool/paths" "github.com/aws/amazon-cloudwatch-agent/translator/config" "github.com/aws/amazon-cloudwatch-agent/translator/context" "github.com/aws/amazon-cloudwatch-agent/translator/translate/agent" @@ -25,6 +26,11 @@ type translator struct { var _ common.ComponentTranslator = (*translator)(nil) +// Type is the sigv4auth extension's component type. +func Type() component.Type { + return sigv4authextension.NewFactory().Type() +} + func NewTranslator() common.ComponentTranslator { return &translator{factory: sigv4authextension.NewFactory()} } @@ -55,6 +61,10 @@ func (t *translator) Translate(_ *confmap.Conf) (component.Config, error) { cfg.IMDSRetries = retryer.GetDefaultRetryNumber() if agent.Global_Config.Role_arn != "" { cfg.AssumeRole = sigv4authextension.AssumeRole{ARN: agent.Global_Config.Role_arn, STSRegion: agent.Global_Config.Region} + // Feed the oidctoken file into AssumeRoleWithWebIdentity for the Azure VM web-identity chain. + if agent.IsAzureWebIdentity() { + cfg.AssumeRole.WebIdentityTokenFile = paths.OIDCTokenPath + } } return cfg, nil diff --git a/translator/translate/otel/extension/sigv4auth/translator_test.go b/translator/translate/otel/extension/sigv4auth/translator_test.go index f11f5a525b3..6b6e0a858c9 100644 --- a/translator/translate/otel/extension/sigv4auth/translator_test.go +++ b/translator/translate/otel/extension/sigv4auth/translator_test.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" + "github.com/aws/amazon-cloudwatch-agent/tool/paths" "github.com/aws/amazon-cloudwatch-agent/translator/config" "github.com/aws/amazon-cloudwatch-agent/translator/context" translateagent "github.com/aws/amazon-cloudwatch-agent/translator/translate/agent" @@ -88,6 +89,17 @@ func TestTranslate(t *testing.T) { STSRegion: "us-east-1", }, }, + "AzureVMWithRoleARN": { + mode: config.ModeAzureVM, + region: "us-west-2", + roleARN: "arn:aws:iam::123456789012:role/azure-role", + wantID: component.MustNewID("sigv4auth"), + wantRole: sigv4authextension.AssumeRole{ + ARN: "arn:aws:iam::123456789012:role/azure-role", + STSRegion: "us-west-2", + WebIdentityTokenFile: paths.OIDCTokenPath, + }, + }, "OnPremWithProfileAndFileAndRole": { service: "logs", mode: config.ModeOnPrem, @@ -118,6 +130,7 @@ func TestTranslate(t *testing.T) { translateagent.Global_Config.Credentials[translateagent.CredentialsFile_Key] = testCase.credsFile } context.CurrentContext().SetMode(testCase.mode) + context.CurrentContext().SetOs(config.OS_TYPE_LINUX) var tt common.ComponentTranslator if testCase.service != "" { diff --git a/translator/translate/otel/processor/resourcedetection/configs/aks_config.yaml b/translator/translate/otel/processor/resourcedetection/configs/aks_config.yaml new file mode 100644 index 00000000000..f72397d4e0c --- /dev/null +++ b/translator/translate/otel/processor/resourcedetection/configs/aks_config.yaml @@ -0,0 +1,3 @@ +detectors: [env, aks, azure] +override: true +timeout: 2s diff --git a/translator/translate/otel/processor/resourcedetection/configs/azure_config.yaml b/translator/translate/otel/processor/resourcedetection/configs/azure_config.yaml new file mode 100644 index 00000000000..2951efdb403 --- /dev/null +++ b/translator/translate/otel/processor/resourcedetection/configs/azure_config.yaml @@ -0,0 +1,3 @@ +detectors: [env, azure] +override: true +timeout: 2s diff --git a/translator/translate/otel/processor/resourcedetection/translator.go b/translator/translate/otel/processor/resourcedetection/translator.go index d5a631276d3..a76d592fd3e 100644 --- a/translator/translate/otel/processor/resourcedetection/translator.go +++ b/translator/translate/otel/processor/resourcedetection/translator.go @@ -25,6 +25,12 @@ var appSignalsDefaultResourceDetectionConfig string //go:embed configs/ecs_config.yaml var appSignalsECSResourceDetectionConfig string +//go:embed configs/azure_config.yaml +var azureVMResourceDetectionConfig string + +//go:embed configs/aks_config.yaml +var aksResourceDetectionConfig string + type translator struct { name string signal pipeline.Signal @@ -88,6 +94,10 @@ func (t *translator) Translate(conf *confmap.Conf) (component.Config, error) { switch mode { case config.ModeECS: return common.GetYamlFileToYamlConfig(cfg, appSignalsECSResourceDetectionConfig) + case config.ModeAKS: + return common.GetYamlFileToYamlConfig(cfg, aksResourceDetectionConfig) + case config.ModeAzureVM: + return common.GetYamlFileToYamlConfig(cfg, azureVMResourceDetectionConfig) default: return common.GetYamlFileToYamlConfig(cfg, appSignalsDefaultResourceDetectionConfig) } diff --git a/translator/translate/otel/processor/resourcedetection/translator_test.go b/translator/translate/otel/processor/resourcedetection/translator_test.go index cd2c60c56b4..5fe5be4caa0 100644 --- a/translator/translate/otel/processor/resourcedetection/translator_test.go +++ b/translator/translate/otel/processor/resourcedetection/translator_test.go @@ -20,11 +20,12 @@ import ( func TestTranslate(t *testing.T) { tt := NewTranslator(WithSignal(pipeline.SignalTraces)) testCases := map[string]struct { - input map[string]interface{} - mode string - isECS bool - want *confmap.Conf - wantErr error + input map[string]interface{} + mode string + kubernetesMode string + isECS bool + want *confmap.Conf + wantErr error }{ "WithAppSignalsEnabledOnECS": { mode: translatorconfig.ModeEC2, @@ -118,11 +119,52 @@ func TestTranslate(t *testing.T) { }, }), }, + "WithAppSignalsEnabledOnAzureVM": { + mode: translatorconfig.ModeAzureVM, + input: map[string]interface{}{ + "traces": map[string]interface{}{ + "traces_collected": map[string]interface{}{ + "app_signals": map[string]interface{}{}, + }, + }}, + want: confmap.NewFromStringMap(map[string]interface{}{ + "detectors": []interface{}{ + "env", + "azure", + }, + "timeout": "2s", + "override": true, + }), + }, + "WithAppSignalsEnabledOnAKS": { + kubernetesMode: translatorconfig.ModeAKS, + input: map[string]interface{}{ + "traces": map[string]interface{}{ + "traces_collected": map[string]interface{}{ + "app_signals": map[string]interface{}{}, + }, + }}, + want: confmap.NewFromStringMap(map[string]interface{}{ + "detectors": []interface{}{ + "env", + "aks", + "azure", + }, + "timeout": "2s", + "override": true, + }), + }, } factory := resourcedetectionprocessor.NewFactory() for name, testCase := range testCases { t.Run(name, func(t *testing.T) { - context.CurrentContext().SetMode(testCase.mode) + // Reset so kubernetesMode/mode does not bleed across cases (map iteration is non-deterministic). + context.ResetContext() + if testCase.kubernetesMode != "" { + context.CurrentContext().SetKubernetesMode(testCase.kubernetesMode) + } else { + context.CurrentContext().SetMode(testCase.mode) + } if testCase.isECS { ecsutil.GetECSUtilSingleton().Region = "test-region" } else { diff --git a/translator/translate/otel/processor/transformprocessor/transform_identity_host.yaml b/translator/translate/otel/processor/transformprocessor/transform_identity_host.yaml index 95393bc76f5..8baf16f31a3 100644 --- a/translator/translate/otel/processor/transformprocessor/transform_identity_host.yaml +++ b/translator/translate/otel/processor/transformprocessor/transform_identity_host.yaml @@ -4,7 +4,7 @@ trace_statements: context: resource statements: &identity_statements - set(resource.attributes["service.name"], "unknown_service") where resource.attributes["service.name"] == nil - - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil + - set(resource.attributes["cloud.resource_id"], Concat(["arn:aws:ec2", resource.attributes["cloud.region"], resource.attributes["cloud.account.id"], Concat(["instance", resource.attributes["host.id"]], "/")], ":")) where resource.attributes["cloud.resource_id"] == nil and resource.attributes["host.id"] != nil and resource.attributes["cloud.platform"] == "aws_ec2" - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], resource.attributes["ec2.tag.aws:autoscaling:groupName"]], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["ec2.tag.aws:autoscaling:groupName"] != nil - set(resource.attributes["deployment.environment.name"], Concat([resource.attributes["cloud.platform"], "default"], ":")) where resource.attributes["deployment.environment.name"] == nil and resource.attributes["cloud.platform"] != nil metric_statements: diff --git a/translator/translate/otel/translate_otel.go b/translator/translate/otel/translate_otel.go index a6518a7d6ea..82a57a9b0e6 100644 --- a/translator/translate/otel/translate_otel.go +++ b/translator/translate/otel/translate_otel.go @@ -21,9 +21,12 @@ import ( "go.uber.org/zap/zapcore" "github.com/aws/amazon-cloudwatch-agent/translator/context" + "github.com/aws/amazon-cloudwatch-agent/translator/translate/agent" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/common" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/entitystore" + "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/oidctoken" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/server" + "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/extension/sigv4auth" pipelinetranslator "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/pipeline" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/pipeline/applicationsignals" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/pipeline/containerinsights" @@ -113,6 +116,14 @@ func translateInternal(jsonConfig interface{}, os string, validate bool) (*otelc pipelines.Translators.Extensions.Set(server.NewTranslator()) } + // Emit oidctoken only when a sigv4auth extension consumes it; that web-identity path needs role_arn. + if agent.IsAzureWebIdentity() && hasSigv4auth(pipelines.Translators.Extensions) { + if agent.Global_Config.Role_arn == "" { + return nil, errors.New("credentials.role_arn is required on Azure VM for the oidctoken web-identity credential chain") + } + pipelines.Translators.Extensions.Set(oidctoken.NewTranslator()) + } + cfg := &otelcol.Config{ Receivers: map[component.ID]component.Config{}, Exporters: map[component.ID]component.Config{}, @@ -140,6 +151,16 @@ func translateInternal(jsonConfig interface{}, os string, validate bool) (*otelc return cfg, nil } +// hasSigv4auth reports whether a sigv4auth extension is present, i.e. some pipeline will consume the oidctoken file. +func hasSigv4auth(extensions common.ComponentTranslatorMap) bool { + for _, id := range extensions.Keys() { + if id.Type() == sigv4auth.Type() { + return true + } + } + return false +} + // parseAgentLogLevel returns the logging level from the JSON config, or the // default value. func parseAgentLogLevel(conf *confmap.Conf) zapcore.Level { diff --git a/translator/translate/otel/translate_otel_test.go b/translator/translate/otel/translate_otel_test.go index f122eb12285..40b708c9497 100644 --- a/translator/translate/otel/translate_otel_test.go +++ b/translator/translate/otel/translate_otel_test.go @@ -8,11 +8,14 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/pipeline" "github.com/aws/amazon-cloudwatch-agent/tool/testutil" "github.com/aws/amazon-cloudwatch-agent/translator" + "github.com/aws/amazon-cloudwatch-agent/translator/config" + "github.com/aws/amazon-cloudwatch-agent/translator/context" _ "github.com/aws/amazon-cloudwatch-agent/translator/registerrules" "github.com/aws/amazon-cloudwatch-agent/translator/translate/agent" "github.com/aws/amazon-cloudwatch-agent/translator/translate/otel/common" @@ -269,6 +272,55 @@ func TestTranslator(t *testing.T) { } } +func TestOIDCTokenGatedOnAzureMode(t *testing.T) { + t.Setenv("SYSTEM_METRICS_ENABLED", "false") + testutil.SetPrometheusRemoteWriteTestingEnv(t) + translator.SetTargetPlatform("linux") + oidcID := component.MustNewID("oidctoken") + + input := map[string]interface{}{ + "opentelemetry": map[string]interface{}{ + "collect": map[string]interface{}{ + "host_metrics": map[string]interface{}{"metrics_collection_interval": 10}, + }, + }, + } + + testCases := map[string]struct { + mode string + roleARN string + wantOIDC bool + wantErr string + }{ + // Azure VM/AKS reaches AWS only via the oidctoken web-identity chain, so role_arn is mandatory. + "AzureVMWithRoleARN": {mode: config.ModeAzureVM, roleARN: "arn:aws:iam::123456789012:role/AzureVMRole", wantOIDC: true}, + "AzureVMMissingRoleARN": {mode: config.ModeAzureVM, roleARN: "", wantErr: "role_arn is required"}, + "EC2NoOIDC": {mode: config.ModeEC2, roleARN: "", wantOIDC: false}, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + context.ResetContext() + t.Cleanup(context.ResetContext) + context.CurrentContext().SetMode(tc.mode) + agent.Global_Config.Region = "us-west-2" + agent.Global_Config.Role_arn = tc.roleARN + t.Cleanup(func() { agent.Global_Config.Region = ""; agent.Global_Config.Role_arn = "" }) + + got, err := TranslateWithoutValidation(input, "linux") + if tc.wantErr != "" { + require.Error(t, err) + assert.ErrorContains(t, err, tc.wantErr) + return + } + require.NoError(t, err) + require.NotNil(t, got) + _, hasOIDC := got.Extensions[oidcID] + assert.Equal(t, tc.wantOIDC, hasOIDC) + }) + } +} + type testTranslator struct { id pipeline.ID version int diff --git a/translator/util/azuredetector/azuredetector.go b/translator/util/azuredetector/azuredetector.go new file mode 100644 index 00000000000..65054757ed1 --- /dev/null +++ b/translator/util/azuredetector/azuredetector.go @@ -0,0 +1,66 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +// Package azuredetector detects Azure VM / AKS, mirroring the eksdetector package. +package azuredetector + +import ( + "context" + "sync/atomic" + "time" + + azuremeta "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/metadataproviders/azure" + + "github.com/aws/amazon-cloudwatch-agent/cfg/envconfig" +) + +// azureIMDSTimeout bounds one probe attempt so startup can't stall on a non-Azure host. +const azureIMDSTimeout = 1 * time.Second + +// azureIMDSMaxAttempts bounds probe retries; a successful response is not retried. +const azureIMDSMaxAttempts = 2 + +var ( + metadataProvider = azuremeta.NewProvider() + + // IsAzureVM probes Azure IMDS (cached) and IsAKS reads RUN_IN_AKS; both are vars so they can be stubbed. + IsAzureVM = isAzureVM + IsAKS = envconfig.IsRunningInAKS + + // azureVMCache holds a definitive probe result; a transient error stays uncached so boot can re-probe. + azureVMCache atomic.Pointer[bool] +) + +// isAzureVM reports whether the host is an Azure VM (cached); an unreachable probe reports false. +func isAzureVM() bool { + ok, _ := detectAzureVM() + return ok +} + +// detectAzureVM probes Azure IMDS once, caching only a definitive result; returns the error for tests. +func detectAzureVM() (bool, error) { + if c := azureVMCache.Load(); c != nil { + return *c, nil + } + value, err := probeAzureIMDS() + if err == nil { + azureVMCache.CompareAndSwap(nil, &value) + } + return value, err +} + +// probeAzureIMDS reports whether the contrib provider returns a compute doc with a VM ID; any error is retryable and uncached. +func probeAzureIMDS() (bool, error) { + var lastErr error + for range azureIMDSMaxAttempts { + ctx, cancel := context.WithTimeout(context.Background(), azureIMDSTimeout) + compute, err := metadataProvider.Metadata(ctx) + cancel() + if err == nil { + // A genuine Azure compute document always carries a VM ID. + return compute != nil && compute.VMID != "", nil + } + lastErr = err + } + return false, lastErr +} diff --git a/translator/util/azuredetector/azuredetector_test.go b/translator/util/azuredetector/azuredetector_test.go new file mode 100644 index 00000000000..76276605cc1 --- /dev/null +++ b/translator/util/azuredetector/azuredetector_test.go @@ -0,0 +1,128 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package azuredetector + +import ( + "context" + "errors" + "testing" + + azuremeta "github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/metadataproviders/azure" + "github.com/stretchr/testify/assert" + + "github.com/aws/amazon-cloudwatch-agent/cfg/envconfig" +) + +// fakeProvider is a stub azuremeta.Provider for tests. +type fakeProvider struct { + compute *azuremeta.ComputeMetadata + err error + calls int +} + +func (f *fakeProvider) Metadata(context.Context) (*azuremeta.ComputeMetadata, error) { + f.calls++ + return f.compute, f.err +} + +// setProvider swaps metadataProvider and resets the cache for the test, restoring both on cleanup. +func setProvider(t *testing.T, p azuremeta.Provider) { + t.Helper() + orig := metadataProvider + metadataProvider = p + azureVMCache.Store(nil) + t.Cleanup(func() { + metadataProvider = orig + azureVMCache.Store(nil) + }) +} + +// ---- AKS (env-var) detection ---- + +func TestIsAKS_ReadsRunInAKSEnvVar(t *testing.T) { + // IsAKS is the real envconfig-backed check; confirm the wiring to RUN_IN_AKS. + t.Setenv(envconfig.RunInAKS, envconfig.TrueValue) + assert.True(t, IsAKS()) + + t.Setenv(envconfig.RunInAKS, "") + assert.False(t, IsAKS()) +} + +// ---- Azure VM (IMDS) detection ---- + +func TestIsAzureVM_Detected(t *testing.T) { + setProvider(t, &fakeProvider{compute: &azuremeta.ComputeMetadata{VMID: "vm-123", Name: "vm1"}}) + + ok, err := detectAzureVM() + assert.True(t, ok) + assert.NoError(t, err) +} + +func TestIsAzureVM_NotAzure(t *testing.T) { + // The provider succeeds but returns no VM ID (e.g. a non-Azure 200 response). + cases := map[string]*azuremeta.ComputeMetadata{ + "nilCompute": nil, + "emptyCompute": {}, + } + for name, compute := range cases { + t.Run(name, func(t *testing.T) { + setProvider(t, &fakeProvider{compute: compute}) + ok, err := detectAzureVM() + assert.False(t, ok) + assert.NoError(t, err) + }) + } +} + +func TestIsAzureVM_Unreachable(t *testing.T) { + // IMDS unreachable (e.g. on-prem/EC2): the probe errors and reports false. + p := &fakeProvider{err: errors.New("dial tcp 169.254.169.254: connect: no route to host")} + setProvider(t, p) + + ok, err := detectAzureVM() + assert.False(t, ok) + assert.Error(t, err) + assert.Equal(t, azureIMDSMaxAttempts, p.calls, "a transient error should be retried") +} + +func TestIsAzureVM_TransientErrorNotCached(t *testing.T) { + // A transient error that exhausts retries must NOT be cached; a later call (IMDS now up) must re-probe. + p := &transientThenOKProvider{failFirst: azureIMDSMaxAttempts} + setProvider(t, p) + + first, err := detectAzureVM() + assert.False(t, first) + assert.Error(t, err) + assert.Equal(t, azureIMDSMaxAttempts, p.calls, "first call should exhaust all retry attempts") + + second, err := detectAzureVM() + assert.True(t, second, "a transient failure must not be cached; re-probe should succeed") + assert.NoError(t, err) + assert.Equal(t, azureIMDSMaxAttempts+1, p.calls, "second call should require exactly one successful probe") +} + +func TestIsAzureVM_ResultIsCached(t *testing.T) { + p := &fakeProvider{compute: &azuremeta.ComputeMetadata{VMID: "vm-123"}} + setProvider(t, p) + + first := isAzureVM() + second := isAzureVM() + assert.True(t, first) + assert.Equal(t, first, second) + assert.Equal(t, 1, p.calls, "IMDS should be queried at most once due to caching") +} + +// transientThenOKProvider errors for the first failFirst calls, then succeeds. +type transientThenOKProvider struct { + failFirst int + calls int +} + +func (p *transientThenOKProvider) Metadata(context.Context) (*azuremeta.ComputeMetadata, error) { + p.calls++ + if p.calls <= p.failFirst { + return nil, errors.New("imds temporarily unavailable") + } + return &azuremeta.ComputeMetadata{VMID: "vm-123"}, nil +} diff --git a/translator/util/sdkutil.go b/translator/util/sdkutil.go index d0bb20510b7..2e8f2ee8feb 100644 --- a/translator/util/sdkutil.go +++ b/translator/util/sdkutil.go @@ -15,6 +15,7 @@ import ( "github.com/aws/amazon-cloudwatch-agent/cfg/commonconfig" "github.com/aws/amazon-cloudwatch-agent/translator" "github.com/aws/amazon-cloudwatch-agent/translator/config" + "github.com/aws/amazon-cloudwatch-agent/translator/util/azuredetector" "github.com/aws/amazon-cloudwatch-agent/translator/util/ec2util" "github.com/aws/amazon-cloudwatch-agent/translator/util/ecsutil" "github.com/aws/amazon-cloudwatch-agent/translator/util/eksdetector" @@ -29,6 +30,10 @@ var DetectCredentialsPath = detectCredentialsPath var DefaultEC2Region = defaultEC2Region var DefaultECSRegion = defaultECSRegion var IsEKS = isEKS + +// IsAKS/IsAzureVM are overridable detection hooks; tests override these vars. +var IsAKS = azuredetector.IsAKS +var IsAzureVM = azuredetector.IsAzureVM var runInAws = os.Getenv(config.RUN_IN_AWS) var runWithIrsa = os.Getenv(config.RUN_WITH_IRSA) @@ -57,21 +62,37 @@ func DetectAgentMode(configuredMode string) string { return config.ModeEC2 } + // Azure is checked only after all AWS signals; RUN_IN_AKS is checked before the IMDS probe since an AKS pod may not reach IMDS. + if IsAKS() { + fmt.Println("I! Detected from ENV instance is Azure (AKS)") + return config.ModeAzureVM + } + + // Last resort: IMDS probe (~2s worst-case one-time cost on a black-holed host). + if IsAzureVM() { + fmt.Println("I! Detected the instance is Azure VM") + return config.ModeAzureVM + } + fmt.Println("I! Detected the instance is OnPremise") return config.ModeOnPrem } func DetectKubernetesMode(configuredMode string) string { + // RUN_IN_AKS is an explicit env signal (no I/O), so short-circuit before the EKS in-cluster probe. + if IsAKS() { + return config.ModeAKS + } + isEKS := IsEKS() + if isEKS.Err == nil && isEKS.Value { + return config.ModeEKS + } if isEKS.Err != nil { return "" // not kubernetes } - if isEKS.Value { - return config.ModeEKS - } - if configuredMode == config.ModeEC2 { return config.ModeK8sEC2 } diff --git a/translator/util/sdkutil_test.go b/translator/util/sdkutil_test.go index 94d4d4f3c65..f45dca5b557 100644 --- a/translator/util/sdkutil_test.go +++ b/translator/util/sdkutil_test.go @@ -13,45 +13,74 @@ import ( "github.com/aws/amazon-cloudwatch-agent/translator/util/eksdetector" ) +// restoreDetectionHooks snapshots the overridable detection vars and restores them on cleanup so stubs don't leak. +func restoreDetectionHooks(t *testing.T) { + t.Helper() + origIsEKS, origIsAKS, origIsAzureVM := IsEKS, IsAKS, IsAzureVM + origRunInAws, origEC2, origECS := runInAws, DefaultEC2Region, DefaultECSRegion + t.Cleanup(func() { + IsEKS, IsAKS, IsAzureVM = origIsEKS, origIsAKS, origIsAzureVM + runInAws, DefaultEC2Region, DefaultECSRegion = origRunInAws, origEC2, origECS + }) +} + func TestDetectAgentModeAuto(t *testing.T) { + restoreDetectionHooks(t) + testCases := map[string]struct { runInAws string ec2Region string ecsRegion string + isAKS bool + isAzureVM bool wantMode string }{ - "WithRunInAWS": {runInAws: config.RUN_IN_AWS_TRUE, wantMode: config.ModeEC2}, - "WithEC2Region": {ec2Region: "us-east-1", wantMode: config.ModeEC2}, - "WithECSRegion": {ecsRegion: "us-east-1", wantMode: config.ModeEC2}, - "WithNone": {wantMode: config.ModeOnPrem}, + // AWS detection must win: the Azure signals are intentionally true here and must NOT override it. + "WithRunInAWS": {runInAws: config.RUN_IN_AWS_TRUE, isAKS: true, isAzureVM: true, wantMode: config.ModeEC2}, + "WithEC2Region": {ec2Region: "us-east-1", isAKS: true, isAzureVM: true, wantMode: config.ModeEC2}, + "WithECSRegion": {ecsRegion: "us-east-1", isAKS: true, isAzureVM: true, wantMode: config.ModeEC2}, + // AKS nodes are Azure VMs, so the host mode resolves to AzureVM. + "AzureHostWhenAKS": {isAKS: true, isAzureVM: false, wantMode: config.ModeAzureVM}, + "AzureVMWhenNoAWS": {isAzureVM: true, wantMode: config.ModeAzureVM}, + "OnPremWhenNoAWSNoAzure": {isAzureVM: false, wantMode: config.ModeOnPrem}, } for name, testCase := range testCases { t.Run(name, func(t *testing.T) { runInAws = testCase.runInAws DefaultEC2Region = func() string { return testCase.ec2Region } DefaultECSRegion = func() string { return testCase.ecsRegion } + IsAKS = func() bool { return testCase.isAKS } + IsAzureVM = func() bool { return testCase.isAzureVM } require.Equal(t, testCase.wantMode, DetectAgentMode("auto")) }) } } func TestDetectKubernetesMode(t *testing.T) { + restoreDetectionHooks(t) + testCases := map[string]struct { isEKS bool isEKSErr error + isAKS bool configuredMode string wantKubernetesMode string }{ - "EKS": {isEKS: true, isEKSErr: nil, configuredMode: config.ModeEC2, wantKubernetesMode: config.ModeEKS}, - "K8sEC2": {isEKS: false, isEKSErr: nil, configuredMode: config.ModeEC2, wantKubernetesMode: config.ModeK8sEC2}, - "K8sOnPrem": {isEKS: false, isEKSErr: nil, configuredMode: config.ModeOnPrem, wantKubernetesMode: config.ModeK8sOnPrem}, - "NotKubernetes": {isEKS: false, isEKSErr: fmt.Errorf("error"), configuredMode: config.ModeEC2, wantKubernetesMode: ""}, + "EKS": {isEKS: true, isEKSErr: nil, isAKS: false, configuredMode: config.ModeEC2, wantKubernetesMode: config.ModeEKS}, + "K8sEC2": {isEKS: false, isEKSErr: nil, isAKS: false, configuredMode: config.ModeEC2, wantKubernetesMode: config.ModeK8sEC2}, + "K8sOnPrem": {isEKS: false, isEKSErr: nil, isAKS: false, configuredMode: config.ModeOnPrem, wantKubernetesMode: config.ModeK8sOnPrem}, + "NotKubernetes": {isEKS: false, isEKSErr: fmt.Errorf("error"), isAKS: false, configuredMode: config.ModeEC2, wantKubernetesMode: ""}, + // RUN_IN_AKS short-circuits to AKS without the EKS probe, regardless of what EKS detection would report. + "AKS": {isEKS: false, isEKSErr: nil, isAKS: true, configuredMode: config.ModeAzureVM, wantKubernetesMode: config.ModeAKS}, + "AKSWhenEKSErr": {isEKS: false, isEKSErr: fmt.Errorf("error"), isAKS: true, configuredMode: config.ModeAzureVM, wantKubernetesMode: config.ModeAKS}, + "AKSWinsOverEKS": {isEKS: true, isEKSErr: nil, isAKS: true, configuredMode: config.ModeEC2, wantKubernetesMode: config.ModeAKS}, } for name, testCase := range testCases { t.Run(name, func(t *testing.T) { IsEKS = func() eksdetector.IsEKSCache { return eksdetector.IsEKSCache{Value: testCase.isEKS, Err: testCase.isEKSErr} } + IsAKS = func() bool { return testCase.isAKS } require.Equal(t, testCase.wantKubernetesMode, DetectKubernetesMode(testCase.configuredMode)) }) }