From 7a8688d4770251697a3fb30a2fef50819c0002a0 Mon Sep 17 00:00:00 2001 From: Douglas Heriot Date: Fri, 10 Jan 2025 00:43:28 +0000 Subject: [PATCH] fix(otel): Exporter creating Monitored Resource with task_id for Cloud Run Fixes #14925 When inside a Cloud Run environment, the [`MonitoredResource`](https://cloud.google.com/monitoring/api/ref_v3/rpc/google.monitoring.v3#google.monitoring.v3.TimeSeries) in a [`CreateTimeSeriesRequest`](https://cloud.google.com/monitoring/api/ref_v3/rpc/google.monitoring.v3#google.monitoring.v3.CreateTimeSeriesRequest) to the Cloud Monitoring API does not include the necessary fields for the [`generic_task`](https://cloud.google.com/monitoring/api/resources#tag_generic_task) resource type, and is rejected. Should follow the [well-tested Golang implementation](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/8da0f42dab085c916987891419461d583a2aa96e/internal/resourcemapping/resourcemapping.go#L153) where the `faas.instance` OTel Resource Attribute is mapped to `MonitoredResource` `task_id`. As the `service.namespace` OTel Resource Attribute is not set by the Resource Detector from within Cloud Run, it should be mapped as an empty string (as in [golang implementation](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/8da0f42dab085c916987891419461d583a2aa96e/internal/resourcemapping/resourcemapping.go#L250)), rather than being left absent. --- google/cloud/opentelemetry/internal/monitored_resource.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/google/cloud/opentelemetry/internal/monitored_resource.cc b/google/cloud/opentelemetry/internal/monitored_resource.cc index 6a58be612504b..99f919a747587 100644 --- a/google/cloud/opentelemetry/internal/monitored_resource.cc +++ b/google/cloud/opentelemetry/internal/monitored_resource.cc @@ -74,6 +74,8 @@ class MonitoredResourceProvider { mr.labels[kv.first] = AsString(attributes.at(*found)); } else if (kv.second.fallback) { mr.labels[kv.first] = *kv.second.fallback; + } else { + mr.labels[kv.first] = ""; } } return mr; @@ -162,8 +164,8 @@ MonitoredResourceProvider GenericTask() { {"location", {{sc::kCloudAvailabilityZone, sc::kCloudRegion}, "global"}}, {"namespace", {{sc::kServiceNamespace}}}, - {"job", {{sc::kServiceName}}}, - {"task_id", {{sc::kServiceInstanceId}}}, + {"job", {{sc::kServiceName, sc::kFaasName}}}, + {"task_id", {{sc::kServiceInstanceId, sc::kFaasInstance}}}, }); } @@ -174,7 +176,7 @@ MonitoredResourceProvider GenericNode() { {"location", {{sc::kCloudAvailabilityZone, sc::kCloudRegion}, "global"}}, {"namespace", {{sc::kServiceNamespace}}}, - {"node_id", {{sc::kHostId}}}, + {"node_id", {{sc::kHostId, sc::kHostName}}}, }); }