From 09cf939cc4dc0965366a43905e8d23dae3579f29 Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Thu, 12 Sep 2024 17:30:16 +0200 Subject: [PATCH] deps: add support for exporting Summary via OTLP --- .../exporters/otlp/otlp_metric_utils.h | 3 + .../exporters/otlp/src/otlp_metric_utils.cc | 63 +++++++++++++++++++ .../metrics/aggregation/default_aggregation.h | 2 + .../sdk/metrics/data/metric_data.h | 2 +- .../sdk/metrics/data/point_data.h | 14 +++++ .../opentelemetry/sdk/metrics/instruments.h | 4 +- 6 files changed, 86 insertions(+), 2 deletions(-) diff --git a/deps/opentelemetry-cpp/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h b/deps/opentelemetry-cpp/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h index c6e11aeff36..2d9d9c723b6 100644 --- a/deps/opentelemetry-cpp/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h +++ b/deps/opentelemetry-cpp/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h @@ -40,6 +40,9 @@ class OtlpMetricUtils static void ConvertGaugeMetric(const opentelemetry::sdk::metrics::MetricData &metric_data, proto::metrics::v1::Gauge *const gauge) noexcept; + static void ConvertSummaryMetric(const opentelemetry::sdk::metrics::MetricData &metric_data, + proto::metrics::v1::Summary *const summary) noexcept; + static void PopulateInstrumentInfoMetrics( const opentelemetry::sdk::metrics::MetricData &metric_data, proto::metrics::v1::Metric *metric) noexcept; diff --git a/deps/opentelemetry-cpp/exporters/otlp/src/otlp_metric_utils.cc b/deps/opentelemetry-cpp/exporters/otlp/src/otlp_metric_utils.cc index e75b17ddd77..89367175223 100644 --- a/deps/opentelemetry-cpp/exporters/otlp/src/otlp_metric_utils.cc +++ b/deps/opentelemetry-cpp/exporters/otlp/src/otlp_metric_utils.cc @@ -46,6 +46,11 @@ metric_sdk::AggregationType OtlpMetricUtils::GetAggregationType( { return metric_sdk::AggregationType::kLastValue; } + else if (nostd::holds_alternative( + point_data_with_attributes.point_data)) + { + return metric_sdk::AggregationType::kSummary; + } return metric_sdk::AggregationType::kDrop; } @@ -185,6 +190,56 @@ void OtlpMetricUtils::ConvertGaugeMetric(const opentelemetry::sdk::metrics::Metr } } +void OtlpMetricUtils::ConvertSummaryMetric(const metric_sdk::MetricData &metric_data, + proto::metrics::v1::Summary *const summary) noexcept +{ + auto start_ts = metric_data.start_ts.time_since_epoch().count(); + auto ts = metric_data.end_ts.time_since_epoch().count(); + for (auto &point_data_with_attributes : metric_data.point_data_attr_) + { + proto::metrics::v1::SummaryDataPoint *proto_summary_point_data = summary->add_data_points(); + proto_summary_point_data->set_start_time_unix_nano(start_ts); + proto_summary_point_data->set_time_unix_nano(ts); + auto summary_data = nostd::get(point_data_with_attributes.point_data); + + // sum + if ((nostd::holds_alternative(summary_data.sum_))) + { + // Use static_cast to avoid C4244 in MSVC + proto_summary_point_data->set_sum( + static_cast(nostd::get(summary_data.sum_))); + } + else + { + proto_summary_point_data->set_sum(nostd::get(summary_data.sum_)); + } + // count + proto_summary_point_data->set_count(summary_data.count_); + // quantile values + for (auto &kv : summary_data.quantile_values_) + { + proto::metrics::v1::SummaryDataPoint::ValueAtQuantile *quantile = + proto_summary_point_data->add_quantile_values(); + quantile->set_quantile(kv.first); + if ((nostd::holds_alternative(kv.second))) + { + // Use static_cast to avoid C4244 in MSVC + quantile->set_value(static_cast(nostd::get(kv.second))); + } + else + { + quantile->set_value(nostd::get(kv.second)); + } + } + // set attributes + for (auto &kv_attr : point_data_with_attributes.attributes) + { + OtlpPopulateAttributeUtils::PopulateAttribute(proto_summary_point_data->add_attributes(), + kv_attr.first, kv_attr.second); + } + } +} + void OtlpMetricUtils::PopulateInstrumentInfoMetrics( const opentelemetry::sdk::metrics::MetricData &metric_data, proto::metrics::v1::Metric *metric) noexcept @@ -207,6 +262,10 @@ void OtlpMetricUtils::PopulateInstrumentInfoMetrics( ConvertGaugeMetric(metric_data, metric->mutable_gauge()); break; } + case metric_sdk::AggregationType::kSummary: { + ConvertSummaryMetric(metric_data, metric->mutable_summary()); + break; + } default: break; } @@ -278,6 +337,8 @@ sdk::metrics::AggregationTemporality OtlpMetricUtils::DeltaTemporalitySelector( case sdk::metrics::InstrumentType::kUpDownCounter: case sdk::metrics::InstrumentType::kObservableUpDownCounter: return sdk::metrics::AggregationTemporality::kCumulative; + case sdk::metrics::InstrumentType::kSummary: + return sdk::metrics::AggregationTemporality::kUnspecified; } return sdk::metrics::AggregationTemporality::kUnspecified; } @@ -301,6 +362,8 @@ sdk::metrics::AggregationTemporality OtlpMetricUtils::LowMemoryTemporalitySelect case sdk::metrics::InstrumentType::kUpDownCounter: case sdk::metrics::InstrumentType::kObservableUpDownCounter: return sdk::metrics::AggregationTemporality::kCumulative; + case sdk::metrics::InstrumentType::kSummary: + return sdk::metrics::AggregationTemporality::kUnspecified; } return sdk::metrics::AggregationTemporality::kUnspecified; } diff --git a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h index 4f3346707fe..1d14c0760e5 100644 --- a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h +++ b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h @@ -182,6 +182,8 @@ class DefaultAggregation return AggregationType::kHistogram; case InstrumentType::kObservableGauge: return AggregationType::kLastValue; + case InstrumentType::kSummary: + return AggregationType::kSummary; default: return AggregationType::kDrop; } diff --git a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h index ad1084f5819..dfe4d94eff0 100644 --- a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h +++ b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h @@ -19,7 +19,7 @@ namespace metrics using PointAttributes = opentelemetry::sdk::common::OrderedAttributeMap; using PointType = opentelemetry::nostd:: - variant; + variant; struct PointDataAttributes { diff --git a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/point_data.h b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/point_data.h index 32853316a54..4cd19d3ea2a 100644 --- a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/point_data.h +++ b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/data/point_data.h @@ -74,6 +74,20 @@ class DropPointData DropPointData &operator=(DropPointData &&) = default; }; +class SummaryPointData +{ +public: +// TODO: remove ctors and initializers when GCC<5 stops shipping on Ubuntu + SummaryPointData(SummaryPointData &&) = default; + SummaryPointData(const SummaryPointData &) = default; + SummaryPointData &operator=(SummaryPointData &&) = default; + SummaryPointData() = default; + + uint64_t count_ = {}; + ValueType sum_ = {}; + std::unordered_map quantile_values_ = {}; +}; + } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/instruments.h b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/instruments.h index d7c6870945f..eb9fc30a5a4 100644 --- a/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/instruments.h +++ b/deps/opentelemetry-cpp/sdk/include/opentelemetry/sdk/metrics/instruments.h @@ -21,7 +21,8 @@ enum class InstrumentType kUpDownCounter, kObservableCounter, kObservableGauge, - kObservableUpDownCounter + kObservableUpDownCounter, + kSummary }; enum class InstrumentClass @@ -44,6 +45,7 @@ enum class AggregationType kHistogram, kLastValue, kSum, + kSummary, kDefault };