Skip to content

Commit

Permalink
Add additional fallbacks for GMP exporter (#823)
Browse files Browse the repository at this point in the history
* Add additional fallbacks for GMP exporter

* Only drop service.name, service.namespace, and service.instance.id and GMP labels
  • Loading branch information
damemi committed Mar 25, 2024
1 parent 80c6b9c commit ed7ca96
Show file tree
Hide file tree
Showing 11 changed files with 211 additions and 26 deletions.
29 changes: 16 additions & 13 deletions exporter/collector/googlemanagedprometheus/extra_metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"go.opentelemetry.io/collector/featuregate"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/pmetric"
semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
)

const (
Expand Down Expand Up @@ -177,9 +178,22 @@ func (c Config) addTargetInfoMetric(m pmetric.Metrics) {
dataPoint.SetIntValue(1)
dataPoint.SetTimestamp(pcommon.NewTimestampFromTime(latestTime))

// copy Resource attributes to the metric except for attributes which will already be present in the MonitoredResource labels
// copy Resource attributes to the metric except for service.name, service.namespace, and service.instance.id
// because those three attributes (if present) will be copied to resource attributes.
// See https://opentelemetry.io/docs/specs/otel/compatibility/prometheus_and_openmetrics/#resource-attributes-1
// Also drop reserved GMP labels (location, cluster, namespace, job, service_namespace, instance).
// Other "fallback" attributes which could become `job` or `instance` in the absence of those three
// (such as k8s.pod.name or faas.name) will be duplicated as a resource attribute and metric label.
rm.Resource().Attributes().Range(func(k string, v pcommon.Value) bool {
if !isSpecialAttribute(k) {
if k != semconv.AttributeServiceName &&
k != semconv.AttributeServiceNamespace &&
k != semconv.AttributeServiceInstanceID &&
k != locationLabel &&
k != clusterLabel &&
k != namespaceLabel &&
k != jobLabel &&
k != serviceNamespaceLabel &&
k != instanceLabel {
dataPoint.Attributes().PutStr(k, v.AsString())
}
return true
Expand Down Expand Up @@ -282,14 +296,3 @@ func (c Config) addScopeInfoMetric(m pmetric.Metrics) {
}
}
}

func isSpecialAttribute(attributeKey string) bool {
for _, keys := range promTargetKeys {
for _, specialKey := range keys {
if attributeKey == specialKey {
return true
}
}
}
return false
}
38 changes: 32 additions & 6 deletions exporter/collector/googlemanagedprometheus/monitoredresource.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,38 @@ const (
// promTargetKeys are attribute keys which are used in the prometheus_target monitored resource.
// It is also used by GMP to exclude these keys from the target_info metric.
var promTargetKeys = map[string][]string{
locationLabel: {locationLabel, semconv.AttributeCloudAvailabilityZone, semconv.AttributeCloudRegion},
clusterLabel: {clusterLabel, semconv.AttributeK8SClusterName},
namespaceLabel: {namespaceLabel, semconv.AttributeK8SNamespaceName},
jobLabel: {jobLabel, semconv.AttributeServiceName, semconv.AttributeFaaSName},
serviceNamespaceLabel: {semconv.AttributeServiceNamespace},
instanceLabel: {instanceLabel, semconv.AttributeServiceInstanceID, semconv.AttributeFaaSInstance},
locationLabel: {
locationLabel,
semconv.AttributeCloudAvailabilityZone,
semconv.AttributeCloudRegion,
},
clusterLabel: {
clusterLabel,
semconv.AttributeK8SClusterName,
},
namespaceLabel: {
namespaceLabel,
semconv.AttributeK8SNamespaceName,
},
jobLabel: {
jobLabel,
semconv.AttributeServiceName,
semconv.AttributeFaaSName,
semconv.AttributeK8SDeploymentName,
semconv.AttributeK8SStatefulSetName,
semconv.AttributeK8SDaemonSetName,
semconv.AttributeK8SJobName,
semconv.AttributeK8SCronJobName,
},
serviceNamespaceLabel: {
semconv.AttributeServiceNamespace,
},
instanceLabel: {
instanceLabel,
semconv.AttributeServiceInstanceID,
semconv.AttributeFaaSInstance,
semconv.AttributeK8SPodName,
},
}

func (c Config) MapToPrometheusTarget(res pcommon.Resource) *monitoredrespb.MonitoredResource {
Expand Down
132 changes: 132 additions & 0 deletions exporter/collector/googlemanagedprometheus/monitoredresource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,138 @@ func TestMapToPrometheusTarget(t *testing.T) {
},
},
},
{
desc: "k8s.pod.name as additional fallback to instance",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
"service.name": "myservicename",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "myservicename",
"instance": "mypod",
},
},
},
{
desc: "k8s.deployment.name as additional fallback to job",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.deployment.name": "mydeployment",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "mydeployment",
"instance": "mypod",
},
},
},
{
desc: "k8s.statefuleset.name as additional fallback to job",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.statefulset.name": "mystatefulset",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "mystatefulset",
"instance": "mypod",
},
},
},
{
desc: "k8s.daemonset.name as additional fallback to job",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.daemonset.name": "mydaemonset",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "mydaemonset",
"instance": "mypod",
},
},
},
{
desc: "k8s.job.name as additional fallback to job",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.job.name": "myjob",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "myjob",
"instance": "mypod",
},
},
},
{
desc: "k8s.cronjob.name as additional fallback to job",
resourceLabels: map[string]string{
"cloud.platform": "gcp_kubernetes_engine",
"cloud.availability_zone": "us-central1-c",
"k8s.cluster.name": "mycluster",
"k8s.namespace.name": "mynamespace",
"k8s.cronjob.name": "mycronjob",
"k8s.pod.name": "mypod",
"k8s.container.name": "mycontainer",
},
expected: &monitoredrespb.MonitoredResource{
Type: "prometheus_target",
Labels: map[string]string{
"location": "us-central1-c",
"cluster": "mycluster",
"namespace": "mynamespace",
"job": "mycronjob",
"instance": "mypod",
},
},
},
{
desc: "overridden attributes",
resourceLabels: map[string]string{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -938,9 +938,12 @@
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c",
"cloud_platform": "gcp_kubernetes_engine",
"http_scheme": "http",
"k8s_cluster_name": "rabbitmq-test-dev",
"k8s_container_name": "rabbitmq",
"k8s_namespace_name": "default",
"k8s_node_name": "10.92.5.2",
"k8s_pod_name": "rabbitmq-server-0",
"net_host_ip": "10.92.5.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@
},
{
"metric": {
"type": "prometheus.googleapis.com/target_info/gauge"
"type": "prometheus.googleapis.com/target_info/gauge",
"labels": {
"cloud_availability_zone": "us-central1-c"
}
},
"resource": {
"type": "prometheus_target",
Expand Down

0 comments on commit ed7ca96

Please sign in to comment.