@@ -127,6 +127,56 @@ static metrics_sdk::MetricData CreateHistogramAggregationData()
127127 return data;
128128}
129129
130+ static metrics_sdk::MetricData CreateExponentialHistogramAggregationData (
131+ const std::chrono::system_clock::time_point &now_time)
132+ {
133+ metrics_sdk::MetricData data;
134+ data.start_ts = opentelemetry::common::SystemTimestamp (now_time);
135+ metrics_sdk::InstrumentDescriptor inst_desc = {" Histogram" , " desc" , " unit" ,
136+ metrics_sdk::InstrumentType::kHistogram ,
137+ metrics_sdk::InstrumentValueType::kDouble };
138+ metrics_sdk::Base2ExponentialHistogramPointData s_data_1, s_data_2;
139+ s_data_1.count_ = 3 ;
140+ s_data_1.sum_ = 6.5 ;
141+ s_data_1.min_ = 0.0 ;
142+ s_data_1.max_ = 3.5 ;
143+ s_data_1.scale_ = 3 ;
144+ s_data_2.record_min_max_ = true ;
145+ s_data_1.zero_count_ = 1 ;
146+ s_data_1.positive_buckets_ = opentelemetry::sdk::metrics::AdaptingCircularBufferCounter (10 );
147+ s_data_1.negative_buckets_ = opentelemetry::sdk::metrics::AdaptingCircularBufferCounter (10 );
148+ s_data_1.positive_buckets_ .Increment (1 , 1 );
149+ s_data_1.negative_buckets_ .Increment (-2 , 1 );
150+
151+ s_data_2.count_ = 4 ;
152+ s_data_2.sum_ = 6.2 ;
153+ s_data_2.min_ = -0.03 ;
154+ s_data_2.max_ = 3.5 ;
155+ s_data_2.scale_ = 3 ;
156+ s_data_2.record_min_max_ = false ;
157+ s_data_2.zero_count_ = 2 ;
158+ s_data_2.positive_buckets_ = opentelemetry::sdk::metrics::AdaptingCircularBufferCounter (10 );
159+ s_data_2.negative_buckets_ = opentelemetry::sdk::metrics::AdaptingCircularBufferCounter (10 );
160+ s_data_2.positive_buckets_ .Increment (3 , 1 );
161+ s_data_2.negative_buckets_ .Increment (-2 , 1 );
162+ s_data_2.negative_buckets_ .Increment (-4 , 2 );
163+
164+ data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative ;
165+ data.end_ts = opentelemetry::common::SystemTimestamp (now_time);
166+ data.instrument_descriptor = inst_desc;
167+ metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
168+ point_data_attr_1.attributes = {{" k1" , " v1" }};
169+ point_data_attr_1.point_data = s_data_1;
170+
171+ point_data_attr_2.attributes = {{" k2" , " v2" }};
172+ point_data_attr_2.point_data = s_data_2;
173+ std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
174+ point_data_attr.push_back (point_data_attr_1);
175+ point_data_attr.push_back (point_data_attr_2);
176+ data.point_data_attr_ = std::move (point_data_attr);
177+ return data;
178+ }
179+
130180static metrics_sdk::MetricData CreateObservableGaugeAggregationData ()
131181{
132182 metrics_sdk::MetricData data;
@@ -261,6 +311,65 @@ TEST(OtlpMetricSerializationTest, Histogram)
261311 EXPECT_EQ (1 , 1 );
262312}
263313
314+ TEST (OtlpMetricSerializationTest, ExponentialHistogramAggregationData)
315+ {
316+ const auto start_test_time = std::chrono::system_clock::now ();
317+ const auto data = CreateExponentialHistogramAggregationData (start_test_time);
318+ opentelemetry::proto::metrics::v1::ExponentialHistogram exponentialHistogram;
319+ otlp_exporter::OtlpMetricUtils::ConvertExponentialHistogramMetric (data, &exponentialHistogram);
320+ EXPECT_EQ (exponentialHistogram.aggregation_temporality (),
321+ proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
322+
323+ EXPECT_EQ (exponentialHistogram.data_points_size (), 2 );
324+ // Point 1
325+ {
326+ const auto &data_point1 = exponentialHistogram.data_points (0 );
327+ EXPECT_EQ (data_point1.count (), 3 );
328+ EXPECT_EQ (data_point1.sum (), 6.5 );
329+ EXPECT_EQ (data_point1.min (), 0.0 );
330+ EXPECT_EQ (data_point1.max (), 3.5 );
331+ EXPECT_EQ (data_point1.zero_count (), 1 );
332+ EXPECT_EQ (data_point1.scale (), 3 );
333+ EXPECT_EQ (data_point1.positive ().offset (), 1 );
334+ EXPECT_EQ (data_point1.positive ().bucket_counts_size (), 1 );
335+ EXPECT_EQ (data_point1.positive ().bucket_counts (0 ), 1 );
336+ EXPECT_EQ (data_point1.negative ().offset (), -2 );
337+ EXPECT_EQ (data_point1.negative ().bucket_counts_size (), 1 );
338+ EXPECT_EQ (data_point1.negative ().bucket_counts (0 ), 1 );
339+
340+ EXPECT_EQ (data_point1.attributes_size (), 1 );
341+ EXPECT_EQ (data_point1.attributes (0 ).key (), " k1" );
342+ EXPECT_EQ (data_point1.attributes (0 ).value ().string_value (), " v1" );
343+ EXPECT_EQ (data_point1.start_time_unix_nano (), data.start_ts .time_since_epoch ().count ());
344+ EXPECT_EQ (data_point1.time_unix_nano (), data.end_ts .time_since_epoch ().count ());
345+ }
346+
347+ // Point 2
348+ {
349+ const auto &data_point2 = exponentialHistogram.data_points (1 );
350+ EXPECT_EQ (data_point2.count (), 4 );
351+ EXPECT_EQ (data_point2.sum (), 6.2 );
352+ EXPECT_EQ (data_point2.min (), 0.0 );
353+ EXPECT_EQ (data_point2.max (), 0.0 );
354+ EXPECT_EQ (data_point2.zero_count (), 2 );
355+ EXPECT_EQ (data_point2.scale (), 3 );
356+ EXPECT_EQ (data_point2.positive ().offset (), 3 );
357+ EXPECT_EQ (data_point2.positive ().bucket_counts_size (), 1 );
358+ EXPECT_EQ (data_point2.positive ().bucket_counts (0 ), 1 );
359+ EXPECT_EQ (data_point2.negative ().offset (), -4 );
360+ EXPECT_EQ (data_point2.negative ().bucket_counts_size (), 3 );
361+ EXPECT_EQ (data_point2.negative ().bucket_counts (0 ), 2 );
362+ EXPECT_EQ (data_point2.negative ().bucket_counts (1 ), 0 );
363+ EXPECT_EQ (data_point2.negative ().bucket_counts (2 ), 1 );
364+ EXPECT_EQ (data_point2.attributes (0 ).key (), " k2" );
365+ EXPECT_EQ (data_point2.attributes (0 ).value ().string_value (), " v2" );
366+ EXPECT_EQ (data_point2.start_time_unix_nano (), data.start_ts .time_since_epoch ().count ());
367+ EXPECT_EQ (data_point2.time_unix_nano (), data.end_ts .time_since_epoch ().count ());
368+ }
369+
370+ EXPECT_EQ (1 , 1 );
371+ }
372+
264373TEST (OtlpMetricSerializationTest, ObservableGauge)
265374{
266375 metrics_sdk::MetricData data = CreateObservableGaugeAggregationData ();
0 commit comments