Skip to content

Commit 7c4f06b

Browse files
committed
impl(otel): copy service resource labels into metric labels
1 parent aa062cf commit 7c4f06b

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

google/cloud/opentelemetry/internal/monitored_resource.cc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
#include "absl/types/optional.h"
2020
#include "absl/types/variant.h"
2121
#include <opentelemetry/common/attribute_value.h>
22+
#include <opentelemetry/sdk/common/attribute_utils.h>
23+
#include <opentelemetry/sdk/instrumentationscope/instrumentation_scope.h>
2224
#include <opentelemetry/sdk/resource/resource.h>
2325
#include <opentelemetry/sdk/resource/semantic_conventions.h>
2426
#include <numeric>
27+
#include <string>
2528
#include <unordered_map>
29+
#include <unordered_set>
2630

2731
namespace google {
2832
namespace cloud {
@@ -229,6 +233,52 @@ MonitoredResource ToMonitoredResource(
229233
return provider.Process(attributes);
230234
}
231235

236+
opentelemetry::sdk::metrics::ResourceMetrics
237+
GetCopyWithServiceResourceLabelsAsMetricLabels(
238+
opentelemetry::sdk::metrics::ResourceMetrics const& data) {
239+
if (!data.resource_) {
240+
return data;
241+
}
242+
243+
std::unordered_set<std::string> const& kOtelServiceKeys{
244+
sc::kServiceName, sc::kServiceNamespace, sc::kServiceInstanceId};
245+
246+
std::unordered_map<std::string,
247+
opentelemetry::sdk::common::OwnedAttributeValue>
248+
service_labels;
249+
auto resource_attributes = data.resource_->GetAttributes();
250+
for (auto it = resource_attributes.begin(); it != resource_attributes.end();
251+
++it) {
252+
if (kOtelServiceKeys.find(it->first) != kOtelServiceKeys.end()) {
253+
service_labels[it->first] = it->second;
254+
}
255+
}
256+
257+
if (service_labels.empty()) {
258+
return data;
259+
}
260+
261+
opentelemetry::sdk::metrics::ResourceMetrics data_copy = data;
262+
for (opentelemetry::sdk::metrics::ScopeMetrics& scope_metrics :
263+
data_copy.scope_metric_data_) {
264+
for (opentelemetry::sdk::metrics::MetricData& metric :
265+
scope_metrics.metric_data_) {
266+
for (opentelemetry::sdk::metrics::PointDataAttributes& pda :
267+
metric.point_data_attr_) {
268+
auto& attributes = pda.attributes;
269+
for (auto it = service_labels.begin(); it != service_labels.end();
270+
++it) {
271+
if (attributes.find(it->first) == attributes.end()) {
272+
attributes[it->first] = it->second;
273+
}
274+
}
275+
}
276+
}
277+
}
278+
279+
return data_copy;
280+
}
281+
232282
GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END
233283
} // namespace otel_internal
234284
} // namespace cloud

google/cloud/opentelemetry/internal/monitored_resource.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_OPENTELEMETRY_INTERNAL_MONITORED_RESOURCE_H
1717

1818
#include "google/cloud/version.h"
19+
#include <opentelemetry/sdk/metrics/export/metric_producer.h>
1920
#include <opentelemetry/sdk/resource/resource.h>
2021
#include <string>
2122
#include <unordered_map>
@@ -42,6 +43,11 @@ struct MonitoredResource {
4243
std::unordered_map<std::string, std::string> labels;
4344
};
4445

46+
opentelemetry::sdk::metrics::ResourceMetrics
47+
GetCopyWithServiceResourceLabelsAsMetricLabels(
48+
opentelemetry::sdk::metrics::ResourceMetrics const& data);
49+
50+
4551
/*
4652
* Map the attributes to a monitored resource.
4753
*/

google/cloud/opentelemetry/monitoring_exporter.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "google/cloud/opentelemetry/monitoring_exporter.h"
1616
#include "google/cloud/monitoring/v3/metric_client.h"
17+
#include "google/cloud/opentelemetry/internal/monitored_resource.h"
1718
#include "google/cloud/opentelemetry/internal/time_series.h"
1819
#include "google/cloud/internal/noexcept_action.h"
1920
#include "google/cloud/log.h"
@@ -73,13 +74,15 @@ class MonitoringExporter final
7374
opentelemetry::sdk::metrics::ResourceMetrics const& data) {
7475
auto result = opentelemetry::sdk::common::ExportResult::kSuccess;
7576

76-
auto tss = otel_internal::ToTimeSeries(data, formatter_);
77+
auto data_copy =
78+
otel_internal::GetCopyWithServiceResourceLabelsAsMetricLabels(data);
79+
auto tss = otel_internal::ToTimeSeries(data_copy, formatter_);
7780
if (tss.empty()) {
7881
GCP_LOG(INFO) << "Cloud Monitoring Export skipped. No data.";
7982
// Return early to save the littlest bit of processing.
8083
return result;
8184
}
82-
auto mr = otel_internal::ToMonitoredResource(data, mr_proto_);
85+
auto mr = otel_internal::ToMonitoredResource(data_copy, mr_proto_);
8386
auto requests =
8487
otel_internal::ToRequests(project_.FullName(), mr, std::move(tss));
8588
for (auto& request : requests) {

0 commit comments

Comments
 (0)