@@ -127,6 +127,56 @@ static metrics_sdk::MetricData CreateHistogramAggregationData()
127
127
return data;
128
128
}
129
129
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
+
130
180
static metrics_sdk::MetricData CreateObservableGaugeAggregationData ()
131
181
{
132
182
metrics_sdk::MetricData data;
@@ -261,6 +311,65 @@ TEST(OtlpMetricSerializationTest, Histogram)
261
311
EXPECT_EQ (1 , 1 );
262
312
}
263
313
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
+
264
373
TEST (OtlpMetricSerializationTest, ObservableGauge)
265
374
{
266
375
metrics_sdk::MetricData data = CreateObservableGaugeAggregationData ();
0 commit comments