From 8efa16a7cfbbcf021f125d10a1b4d38dfcbc4805 Mon Sep 17 00:00:00 2001 From: Carlos Roman Date: Sat, 28 Feb 2026 11:40:50 +0000 Subject: [PATCH 1/5] wip: Updated prometheus_test_helper.h so that test fail correctly --- .../prometheus/test/prometheus_test_helper.h | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/exporters/prometheus/test/prometheus_test_helper.h b/exporters/prometheus/test/prometheus_test_helper.h index 1bf1f17657..6bb420addd 100644 --- a/exporters/prometheus/test/prometheus_test_helper.h +++ b/exporters/prometheus/test/prometheus_test_helper.h @@ -23,6 +23,10 @@ struct TestDataPoints Resource resource = Resource::Create(ResourceAttributes{}); nostd::unique_ptr instrumentation_scope = InstrumentationScope::Create("library_name", "1.2.0"); + opentelemetry::common::SystemTimestamp start_ts = + opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662500000}}; + opentelemetry::common::SystemTimestamp end_ts = + opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662560000}}; /** * Helper function to create ResourceMetrics @@ -39,8 +43,9 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, opentelemetry::common::SystemTimestamp{}, - opentelemetry::common::SystemTimestamp{}, + metric_sdk::AggregationTemporality::kDelta, + start_ts, + end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, sum_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, sum_point_data2}}}; @@ -67,13 +72,15 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kHistogram, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, opentelemetry::common::SystemTimestamp{}, - opentelemetry::common::SystemTimestamp{}, + metric_sdk::AggregationTemporality::kDelta, + start_ts, + end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, histogram_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, histogram_point_data2}}}; data.scope_metric_data_ = std::vector{ {instrumentation_scope.get(), std::vector{metric_data}}}; + return data; } @@ -93,8 +100,9 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, opentelemetry::common::SystemTimestamp{}, - opentelemetry::common::SystemTimestamp{}, + metric_sdk::AggregationTemporality::kDelta, + start_ts, + end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, last_value_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, last_value_point_data2}}}; @@ -113,8 +121,9 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, opentelemetry::common::SystemTimestamp{}, - opentelemetry::common::SystemTimestamp{}, + metric_sdk::AggregationTemporality::kDelta, + start_ts, + end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, drop_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, drop_point_data2}}}; From f200b2b3c3a2ce6437008dbc19412f4c7e66ed3d Mon Sep 17 00:00:00 2001 From: Carlos Roman Date: Sat, 28 Feb 2026 11:45:14 +0000 Subject: [PATCH 2/5] wip: Fixed broken test in prometheus/test/exporter_utils_test.cc --- exporters/prometheus/test/exporter_utils_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporters/prometheus/test/exporter_utils_test.cc b/exporters/prometheus/test/exporter_utils_test.cc index b5dcd554fe..98b4eb0af6 100644 --- a/exporters/prometheus/test/exporter_utils_test.cc +++ b/exporters/prometheus/test/exporter_utils_test.cc @@ -90,10 +90,10 @@ static void assert_basic(prometheus_client::MetricFamily &metric, ASSERT_EQ(metric.help, description); // description not changed ASSERT_EQ(metric.type, type); // type translated - // Prometheus metric data points should not have explicit timestamps for (const prometheus::ClientMetric &cm : metric.metric) { - ASSERT_EQ(cm.timestamp_ms, 0); + // end_ts is set as 1766662560000 + ASSERT_EQ(cm.timestamp_ms, 1766662560); } auto metric_data = metric.metric[0]; From 82d28e4756cd24491b2bf667e7df2ae4f13cf669 Mon Sep 17 00:00:00 2001 From: Carlos Roman Date: Sun, 1 Mar 2026 15:57:58 +0000 Subject: [PATCH 3/5] fix(prometheus): Remove explicit timestamps from metric points --- CHANGELOG.md | 3 +++ .../exporters/prometheus/exporter_utils.h | 4 ---- exporters/prometheus/src/exporter_utils.cc | 21 +++++++------------ .../prometheus/test/exporter_utils_test.cc | 4 ++-- 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7788e32f2..49b11bdc3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ Increment the: ## [Unreleased] +* [EXPORTER] Remove explicit timestamps from metric points exported by Prometheus + [#3895](https://github.com/open-telemetry/opentelemetry-cpp/pull/3895) + * [TEST] Add multi-threaded metrics benchmarks for shared vs per-thread counter [#3865](https://github.com/open-telemetry/opentelemetry-cpp/pull/3865) diff --git a/exporters/prometheus/include/opentelemetry/exporters/prometheus/exporter_utils.h b/exporters/prometheus/include/opentelemetry/exporters/prometheus/exporter_utils.h index 496ec9bd34..5b80d1886e 100644 --- a/exporters/prometheus/include/opentelemetry/exporters/prometheus/exporter_utils.h +++ b/exporters/prometheus/include/opentelemetry/exporters/prometheus/exporter_utils.h @@ -153,7 +153,6 @@ class PrometheusExporterUtils * Add a target_info metric to collect resource attributes */ static void SetTarget(const sdk::metrics::ResourceMetrics &data, - std::chrono::nanoseconds time, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, std::vector<::prometheus::MetricFamily> *output); @@ -166,7 +165,6 @@ class PrometheusExporterUtils const opentelemetry::sdk::metrics::PointAttributes &labels, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, ::prometheus::MetricType type, - std::chrono::nanoseconds time, ::prometheus::MetricFamily *metric_family, const opentelemetry::sdk::resource::Resource *resource); @@ -180,7 +178,6 @@ class PrometheusExporterUtils const std::vector &counts, const opentelemetry::sdk::metrics::PointAttributes &labels, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, - std::chrono::nanoseconds time, ::prometheus::MetricFamily *metric_family, const opentelemetry::sdk::resource::Resource *resource); @@ -190,7 +187,6 @@ class PrometheusExporterUtils static void SetMetricBasic( ::prometheus::ClientMetric &metric, const opentelemetry::sdk::metrics::PointAttributes &labels, - std::chrono::nanoseconds time, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, const opentelemetry::sdk::resource::Resource *resource); diff --git a/exporters/prometheus/src/exporter_utils.cc b/exporters/prometheus/src/exporter_utils.cc index 7055e0d86c..191a5ee3b6 100644 --- a/exporters/prometheus/src/exporter_utils.cc +++ b/exporters/prometheus/src/exporter_utils.cc @@ -139,7 +139,6 @@ std::vector PrometheusExporterUtils::TranslateT if (populate_target_info && !data.scope_metric_data_.empty()) { SetTarget(data, - data.scope_metric_data_.begin()->metric_data_.begin()->end_ts.time_since_epoch(), without_otel_scope ? nullptr : (*data.scope_metric_data_.begin()).scope_, &output); } @@ -151,7 +150,6 @@ std::vector PrometheusExporterUtils::TranslateT auto unit = metric_data.instrument_descriptor.unit_; prometheus_client::MetricFamily metric_family; metric_family.help = metric_data.instrument_descriptor.description_; - auto time = metric_data.end_ts.time_since_epoch(); auto front = metric_data.point_data_attr_.front(); auto kind = getAggregationType(front.point_data); bool is_monotonic = true; @@ -185,7 +183,7 @@ std::vector PrometheusExporterUtils::TranslateT sum = static_cast(nostd::get(histogram_point_data.sum_)); } SetData(std::vector{sum, static_cast(histogram_point_data.count_)}, - boundaries, counts, point_data_attr.attributes, scope, time, &metric_family, + boundaries, counts, point_data_attr.attributes, scope, &metric_family, data.resource_); } else if (type == prometheus_client::MetricType::Gauge) @@ -196,7 +194,7 @@ 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, scope, type, time, &metric_family, + SetData(values, point_data_attr.attributes, scope, type, &metric_family, data.resource_); } else if (nostd::holds_alternative(point_data_attr.point_data)) @@ -204,7 +202,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, scope, type, time, &metric_family, + SetData(values, point_data_attr.attributes, scope, type, &metric_family, data.resource_); } else @@ -221,7 +219,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, scope, type, time, &metric_family, + SetData(values, point_data_attr.attributes, scope, type, &metric_family, data.resource_); } else @@ -605,7 +603,6 @@ prometheus_client::MetricType PrometheusExporterUtils::TranslateType( void PrometheusExporterUtils::SetTarget( const sdk::metrics::ResourceMetrics &data, - std::chrono::nanoseconds time, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, std::vector<::prometheus::MetricFamily> *output) { @@ -624,7 +621,7 @@ void PrometheusExporterUtils::SetTarget( metric.info.value = 1.0; metric_sdk::PointAttributes empty_attributes; - SetMetricBasic(metric, empty_attributes, time, scope, data.resource_); + SetMetricBasic(metric, empty_attributes, scope, data.resource_); for (auto &label : data.resource_->GetAttributes()) { @@ -645,13 +642,12 @@ void PrometheusExporterUtils::SetData( const metric_sdk::PointAttributes &labels, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, prometheus_client::MetricType type, - std::chrono::nanoseconds time, prometheus_client::MetricFamily *metric_family, const opentelemetry::sdk::resource::Resource *resource) { metric_family->metric.emplace_back(); prometheus_client::ClientMetric &metric = metric_family->metric.back(); - SetMetricBasic(metric, labels, time, scope, resource); + SetMetricBasic(metric, labels, scope, resource); SetValue(values, type, &metric); } @@ -666,13 +662,12 @@ void PrometheusExporterUtils::SetData( const std::vector &counts, const metric_sdk::PointAttributes &labels, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, - std::chrono::nanoseconds time, prometheus_client::MetricFamily *metric_family, const opentelemetry::sdk::resource::Resource *resource) { metric_family->metric.emplace_back(); prometheus_client::ClientMetric &metric = metric_family->metric.back(); - SetMetricBasic(metric, labels, time, scope, resource); + SetMetricBasic(metric, labels, scope, resource); SetValue(values, boundaries, counts, &metric); } @@ -682,11 +677,9 @@ void PrometheusExporterUtils::SetData( void PrometheusExporterUtils::SetMetricBasic( prometheus_client::ClientMetric &metric, const metric_sdk::PointAttributes &labels, - std::chrono::nanoseconds time, const opentelemetry::sdk::instrumentationscope::InstrumentationScope *scope, const opentelemetry::sdk::resource::Resource *resource) { - metric.timestamp_ms = time.count() / 1000000; if (labels.empty() && nullptr == resource) { return; diff --git a/exporters/prometheus/test/exporter_utils_test.cc b/exporters/prometheus/test/exporter_utils_test.cc index 98b4eb0af6..b5dcd554fe 100644 --- a/exporters/prometheus/test/exporter_utils_test.cc +++ b/exporters/prometheus/test/exporter_utils_test.cc @@ -90,10 +90,10 @@ static void assert_basic(prometheus_client::MetricFamily &metric, ASSERT_EQ(metric.help, description); // description not changed ASSERT_EQ(metric.type, type); // type translated + // Prometheus metric data points should not have explicit timestamps for (const prometheus::ClientMetric &cm : metric.metric) { - // end_ts is set as 1766662560000 - ASSERT_EQ(cm.timestamp_ms, 1766662560); + ASSERT_EQ(cm.timestamp_ms, 0); } auto metric_data = metric.metric[0]; From fe1c8382b8236f5287fb727989e5642366794f1b Mon Sep 17 00:00:00 2001 From: Carlos Roman Date: Tue, 10 Mar 2026 14:11:48 +0000 Subject: [PATCH 4/5] style: Fixed linter issues --- exporters/prometheus/src/exporter_utils.cc | 4 ++-- .../prometheus/test/prometheus_test_helper.h | 24 +++++++------------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/exporters/prometheus/src/exporter_utils.cc b/exporters/prometheus/src/exporter_utils.cc index 191a5ee3b6..1fc87638a7 100644 --- a/exporters/prometheus/src/exporter_utils.cc +++ b/exporters/prometheus/src/exporter_utils.cc @@ -138,8 +138,8 @@ std::vector PrometheusExporterUtils::TranslateT // Append target_info as the first metric if (populate_target_info && !data.scope_metric_data_.empty()) { - SetTarget(data, - without_otel_scope ? nullptr : (*data.scope_metric_data_.begin()).scope_, &output); + SetTarget(data, without_otel_scope ? nullptr : (*data.scope_metric_data_.begin()).scope_, + &output); } for (const auto &instrumentation_info : data.scope_metric_data_) diff --git a/exporters/prometheus/test/prometheus_test_helper.h b/exporters/prometheus/test/prometheus_test_helper.h index 6bb420addd..852bd6a405 100644 --- a/exporters/prometheus/test/prometheus_test_helper.h +++ b/exporters/prometheus/test/prometheus_test_helper.h @@ -23,10 +23,10 @@ struct TestDataPoints Resource resource = Resource::Create(ResourceAttributes{}); nostd::unique_ptr instrumentation_scope = InstrumentationScope::Create("library_name", "1.2.0"); - opentelemetry::common::SystemTimestamp start_ts = - opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662500000}}; - opentelemetry::common::SystemTimestamp end_ts = - opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662560000}}; + opentelemetry::common::SystemTimestamp start_ts = + opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662500000}}; + opentelemetry::common::SystemTimestamp end_ts = + opentelemetry::common::SystemTimestamp{std::chrono::microseconds{1766662560000}}; /** * Helper function to create ResourceMetrics @@ -43,9 +43,7 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, - start_ts, - end_ts, + metric_sdk::AggregationTemporality::kDelta, start_ts, end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, sum_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, sum_point_data2}}}; @@ -72,9 +70,7 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kHistogram, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, - start_ts, - end_ts, + metric_sdk::AggregationTemporality::kDelta, start_ts, end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, histogram_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, histogram_point_data2}}}; @@ -100,9 +96,7 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, - start_ts, - end_ts, + metric_sdk::AggregationTemporality::kDelta, start_ts, end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, last_value_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, last_value_point_data2}}}; @@ -121,9 +115,7 @@ struct TestDataPoints metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", metric_sdk::InstrumentType::kCounter, metric_sdk::InstrumentValueType::kDouble}, - metric_sdk::AggregationTemporality::kDelta, - start_ts, - end_ts, + metric_sdk::AggregationTemporality::kDelta, start_ts, end_ts, std::vector{ {metric_sdk::PointAttributes{{"a1", "b1"}}, drop_point_data}, {metric_sdk::PointAttributes{{"a2", "b2"}}, drop_point_data2}}}; From 1b938fe0748314455b9668f1a7ea5fa15e5be856 Mon Sep 17 00:00:00 2001 From: Carlos Roman Date: Tue, 10 Mar 2026 14:27:33 +0000 Subject: [PATCH 5/5] style: Removed unused imports from prometheus/src/exporter_utils.cc --- exporters/prometheus/src/exporter_utils.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/exporters/prometheus/src/exporter_utils.cc b/exporters/prometheus/src/exporter_utils.cc index 1fc87638a7..97d7150aed 100644 --- a/exporters/prometheus/src/exporter_utils.cc +++ b/exporters/prometheus/src/exporter_utils.cc @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -19,7 +18,6 @@ #include #include -#include "opentelemetry/common/timestamp.h" #include "opentelemetry/exporters/prometheus/exporter_utils.h" #include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/common/attribute_utils.h"