diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c4ce6f45f..36396204a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ Increment the: ## [Unreleased] +* [EXPORTER] Add otel_scope_name and otel_scope_version labels to the prometheus exporter. + [#2293](https://github.com/open-telemetry/opentelemetry-cpp/pull/2293) + ## [1.11.0] 2023-08-21 * [BUILD] Fix more cases for symbol name for 32-bit win32 DLL build diff --git a/exporters/prometheus/src/exporter_utils.cc b/exporters/prometheus/src/exporter_utils.cc index 966d665df6..9ecec3f8ad 100644 --- a/exporters/prometheus/src/exporter_utils.cc +++ b/exporters/prometheus/src/exporter_utils.cc @@ -72,7 +72,7 @@ std::vector PrometheusExporterUtils::TranslateT sum = nostd::get(histogram_point_data.sum_); } SetData(std::vector{sum, (double)histogram_point_data.count_}, boundaries, counts, - point_data_attr.attributes, time, &metric_family); + point_data_attr.attributes, instrumentation_info.scope_, time, &metric_family); } else if (type == prometheus_client::MetricType::Gauge) { @@ -82,14 +82,14 @@ std::vector PrometheusExporterUtils::TranslateT auto last_value_point_data = nostd::get(point_data_attr.point_data); std::vector values{last_value_point_data.value_}; - SetData(values, point_data_attr.attributes, type, time, &metric_family); + SetData(values, point_data_attr.attributes, instrumentation_info.scope_, type, time, &metric_family); } else if (nostd::holds_alternative(point_data_attr.point_data)) { auto sum_point_data = nostd::get(point_data_attr.point_data); std::vector values{sum_point_data.value_}; - SetData(values, point_data_attr.attributes, type, time, &metric_family); + SetData(values, point_data_attr.attributes, instrumentation_info.scope_, type, time, &metric_family); } else { @@ -105,7 +105,7 @@ std::vector PrometheusExporterUtils::TranslateT auto sum_point_data = nostd::get(point_data_attr.point_data); std::vector values{sum_point_data.value_}; - SetData(values, point_data_attr.attributes, type, time, &metric_family); + SetData(values, point_data_attr.attributes, instrumentation_info.scope_, type, time, &metric_family); } else { @@ -228,12 +228,13 @@ template void PrometheusExporterUtils::SetData(std::vector values, const metric_sdk::PointAttributes &labels, prometheus_client::MetricType type, + opentelemetry::sdk::instrumentationscope::InstrumentationScope scope, std::chrono::nanoseconds time, prometheus_client::MetricFamily *metric_family) { metric_family->metric.emplace_back(); prometheus_client::ClientMetric &metric = metric_family->metric.back(); - SetMetricBasic(metric, time, labels); + SetMetricBasic(metric, time, labels, scope); SetValue(values, type, &metric); } @@ -246,12 +247,13 @@ void PrometheusExporterUtils::SetData(std::vector values, const std::vector &boundaries, const std::vector &counts, const metric_sdk::PointAttributes &labels, + opentelemetry::sdk::instrumentationscope::InstrumentationScope scope, std::chrono::nanoseconds time, prometheus_client::MetricFamily *metric_family) { metric_family->metric.emplace_back(); prometheus_client::ClientMetric &metric = metric_family->metric.back(); - SetMetricBasic(metric, time, labels); + SetMetricBasic(metric, time, labels, scope); SetValue(values, boundaries, counts, &metric); } @@ -260,11 +262,11 @@ void PrometheusExporterUtils::SetData(std::vector values, */ void PrometheusExporterUtils::SetMetricBasic(prometheus_client::ClientMetric &metric, std::chrono::nanoseconds time, - const metric_sdk::PointAttributes &labels) + const metric_sdk::PointAttributes &labels, + opentelemetry::sdk::instrumentationscope::InstrumentationScope scope) { metric.timestamp_ms = time.count() / 1000000; - // auto label_pairs = ParseLabel(labels); if (!labels.empty()) { metric.label.resize(labels.size()); @@ -276,6 +278,20 @@ void PrometheusExporterUtils::SetMetricBasic(prometheus_client::ClientMetric &me metric.label[i++].value = AttributeValueToString(label.second); } } + auto scope_name = scope.GetName(); + if (!scope_name.empty()) + { + metric.label.resize(metric.label.size() + 1); + metric.label[i].name = "otel_scope_name"; + metric.label[i++].value = scope_name; + } + auto scope_version = scope.GetVersion(); + if (!scope_version.empty()) + { + metric.label.resize(metric.label.size() + 1); + metric.label[i].name = "otel_scope_version"; + metric.label[i++].value = scope_version; + } } std::string PrometheusExporterUtils::AttributeValueToString( diff --git a/exporters/prometheus/test/exporter_utils_test.cc b/exporters/prometheus/test/exporter_utils_test.cc index 2eac7a6d8b..2ab6ea5b3a 100644 --- a/exporters/prometheus/test/exporter_utils_test.cc +++ b/exporters/prometheus/test/exporter_utils_test.cc @@ -114,7 +114,7 @@ TEST(PrometheusExporterUtils, TranslateToPrometheusIntegerCounter) auto metric1 = translated[0]; std::vector vals = {10}; - assert_basic(metric1, "library_name", "description", prometheus_client::MetricType::Counter, 1, + assert_basic(metric1, "library_name", "description", prometheus_client::MetricType::Counter, 3, vals); } @@ -127,7 +127,7 @@ TEST(PrometheusExporterUtils, TranslateToPrometheusIntegerLastValue) auto metric1 = translated[0]; std::vector vals = {10}; - assert_basic(metric1, "library_name", "description", prometheus_client::MetricType::Gauge, 1, + assert_basic(metric1, "library_name", "description", prometheus_client::MetricType::Gauge, 3, vals); } @@ -140,7 +140,7 @@ TEST(PrometheusExporterUtils, TranslateToPrometheusHistogramNormal) auto metric = translated[0]; std::vector vals = {3, 900.5, 4}; - assert_basic(metric, "library_name", "description", prometheus_client::MetricType::Histogram, 1, + assert_basic(metric, "library_name", "description", prometheus_client::MetricType::Histogram, 3, vals); assert_histogram(metric, std::list{10.1, 20.2, 30.2}, {200, 300, 400, 500}); }