otlp_metrics_serialization_test.cc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <stddef.h>
  5. #include <algorithm>
  6. #include <chrono>
  7. #include <string>
  8. #include <utility>
  9. #include <vector>
  10. #include "opentelemetry/common/timestamp.h"
  11. #include "opentelemetry/exporters/otlp/otlp_metric_utils.h"
  12. #include "opentelemetry/nostd/unique_ptr.h"
  13. #include "opentelemetry/nostd/variant.h"
  14. #include "opentelemetry/sdk/common/attribute_utils.h"
  15. #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
  16. #include "opentelemetry/sdk/metrics/data/circular_buffer.h"
  17. #include "opentelemetry/sdk/metrics/data/metric_data.h"
  18. #include "opentelemetry/sdk/metrics/data/point_data.h"
  19. #include "opentelemetry/sdk/metrics/export/metric_producer.h"
  20. #include "opentelemetry/sdk/metrics/instruments.h"
  21. #include "opentelemetry/sdk/resource/resource.h"
  22. #include "opentelemetry/version.h"
  23. // clang-format off
  24. #include "opentelemetry/exporters/otlp/protobuf_include_prefix.h" // IWYU pragma: keep
  25. #include "opentelemetry/proto/collector/metrics/v1/metrics_service.pb.h"
  26. #include "opentelemetry/proto/common/v1/common.pb.h"
  27. #include "opentelemetry/proto/metrics/v1/metrics.pb.h"
  28. #include "opentelemetry/exporters/otlp/protobuf_include_suffix.h" // IWYU pragma: keep
  29. // clang-format on
  30. OPENTELEMETRY_BEGIN_NAMESPACE
  31. namespace exporter
  32. {
  33. namespace otlp
  34. {
  35. namespace resource = opentelemetry::sdk::resource;
  36. namespace proto = opentelemetry::proto;
  37. namespace metrics_sdk = opentelemetry::sdk::metrics;
  38. namespace otlp_exporter = opentelemetry::exporter::otlp;
  39. static metrics_sdk::MetricData CreateSumAggregationData()
  40. {
  41. metrics_sdk::MetricData data;
  42. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  43. metrics_sdk::InstrumentDescriptor inst_desc = {"Counter", "desc", "unit",
  44. metrics_sdk::InstrumentType::kCounter,
  45. metrics_sdk::InstrumentValueType::kDouble};
  46. metrics_sdk::SumPointData s_data_1, s_data_2;
  47. s_data_1.value_ = 10.2;
  48. s_data_2.value_ = 20.2;
  49. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  50. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  51. data.instrument_descriptor = inst_desc;
  52. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  53. point_data_attr_1.attributes = {{"k1", "v1"}};
  54. point_data_attr_1.point_data = s_data_1;
  55. point_data_attr_2.attributes = {{"k2", "v2"}};
  56. point_data_attr_2.point_data = s_data_2;
  57. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  58. point_data_attr.push_back(point_data_attr_1);
  59. point_data_attr.push_back(point_data_attr_2);
  60. data.point_data_attr_ = std::move(point_data_attr);
  61. return data;
  62. }
  63. static metrics_sdk::MetricData CreateUpDownCounterAggregationData()
  64. {
  65. metrics_sdk::MetricData data;
  66. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  67. metrics_sdk::InstrumentDescriptor inst_desc = {"UpDownCounter", "Robot Pose Y", "Meter",
  68. metrics_sdk::InstrumentType::kUpDownCounter,
  69. metrics_sdk::InstrumentValueType::kDouble};
  70. metrics_sdk::SumPointData s_data_1, s_data_2;
  71. s_data_1.value_ = 1.35;
  72. s_data_2.value_ = 1.37;
  73. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  74. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  75. data.instrument_descriptor = inst_desc;
  76. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  77. point_data_attr_1.attributes = {{"environment_id", "DEV-AYS"}};
  78. point_data_attr_1.point_data = s_data_1;
  79. point_data_attr_2.attributes = {{"robot_id", "DEV-AYS-03-02"}};
  80. point_data_attr_2.point_data = s_data_2;
  81. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  82. point_data_attr.push_back(point_data_attr_1);
  83. point_data_attr.push_back(point_data_attr_2);
  84. data.point_data_attr_ = std::move(point_data_attr);
  85. return data;
  86. }
  87. static metrics_sdk::MetricData CreateHistogramAggregationData()
  88. {
  89. metrics_sdk::MetricData data;
  90. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  91. metrics_sdk::InstrumentDescriptor inst_desc = {"Histogram", "desc", "unit",
  92. metrics_sdk::InstrumentType::kCounter,
  93. metrics_sdk::InstrumentValueType::kDouble};
  94. metrics_sdk::HistogramPointData s_data_1, s_data_2;
  95. s_data_1.sum_ = 100.2;
  96. s_data_1.count_ = 22;
  97. s_data_1.counts_ = {2, 9, 4, 7};
  98. s_data_1.boundaries_ = std::vector<double>({0.0, 10.0, 20.0, 30.0});
  99. s_data_2.sum_ = 200.2;
  100. s_data_2.count_ = 20;
  101. s_data_2.counts_ = {0, 8, 5, 7};
  102. s_data_2.boundaries_ = std::vector<double>({0.0, 10.0, 20.0, 30.0});
  103. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  104. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  105. data.instrument_descriptor = inst_desc;
  106. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  107. point_data_attr_1.attributes = {{"k1", "v1"}};
  108. point_data_attr_1.point_data = s_data_1;
  109. point_data_attr_2.attributes = {{"k2", "v2"}};
  110. point_data_attr_2.point_data = s_data_2;
  111. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  112. point_data_attr.push_back(point_data_attr_1);
  113. point_data_attr.push_back(point_data_attr_2);
  114. data.point_data_attr_ = std::move(point_data_attr);
  115. return data;
  116. }
  117. static metrics_sdk::MetricData CreateExponentialHistogramAggregationData(
  118. const std::chrono::system_clock::time_point &now_time)
  119. {
  120. metrics_sdk::MetricData data;
  121. data.start_ts = opentelemetry::common::SystemTimestamp(now_time);
  122. metrics_sdk::InstrumentDescriptor inst_desc = {"Histogram", "desc", "unit",
  123. metrics_sdk::InstrumentType::kHistogram,
  124. metrics_sdk::InstrumentValueType::kDouble};
  125. metrics_sdk::Base2ExponentialHistogramPointData s_data_1, s_data_2;
  126. s_data_1.count_ = 3;
  127. s_data_1.sum_ = 6.5;
  128. s_data_1.min_ = 0.0;
  129. s_data_1.max_ = 3.5;
  130. s_data_1.scale_ = 3;
  131. s_data_1.record_min_max_ = true;
  132. s_data_1.zero_count_ = 1;
  133. s_data_1.positive_buckets_ =
  134. std::make_unique<opentelemetry::sdk::metrics::AdaptingCircularBufferCounter>(10);
  135. s_data_1.negative_buckets_ =
  136. std::make_unique<opentelemetry::sdk::metrics::AdaptingCircularBufferCounter>(10);
  137. s_data_1.positive_buckets_->Increment(1, 1);
  138. s_data_1.negative_buckets_->Increment(-2, 1);
  139. s_data_2.count_ = 4;
  140. s_data_2.sum_ = 6.2;
  141. s_data_2.min_ = -0.03;
  142. s_data_2.max_ = 3.5;
  143. s_data_2.scale_ = 3;
  144. s_data_2.record_min_max_ = false;
  145. s_data_2.zero_count_ = 2;
  146. s_data_2.positive_buckets_ =
  147. std::make_unique<opentelemetry::sdk::metrics::AdaptingCircularBufferCounter>(10);
  148. s_data_2.negative_buckets_ =
  149. std::make_unique<opentelemetry::sdk::metrics::AdaptingCircularBufferCounter>(10);
  150. s_data_2.positive_buckets_->Increment(3, 1);
  151. s_data_2.negative_buckets_->Increment(-2, 1);
  152. s_data_2.negative_buckets_->Increment(-4, 2);
  153. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  154. data.end_ts = opentelemetry::common::SystemTimestamp(now_time);
  155. data.instrument_descriptor = inst_desc;
  156. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  157. point_data_attr_1.attributes = {{"k1", "v1"}};
  158. point_data_attr_1.point_data = s_data_1;
  159. point_data_attr_2.attributes = {{"k2", "v2"}};
  160. point_data_attr_2.point_data = s_data_2;
  161. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  162. point_data_attr.push_back(point_data_attr_1);
  163. point_data_attr.push_back(point_data_attr_2);
  164. data.point_data_attr_ = std::move(point_data_attr);
  165. return data;
  166. }
  167. static metrics_sdk::MetricData CreateObservableGaugeAggregationData()
  168. {
  169. metrics_sdk::MetricData data;
  170. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  171. metrics_sdk::InstrumentDescriptor inst_desc = {"LastValue", "desc", "unit",
  172. metrics_sdk::InstrumentType::kObservableGauge,
  173. metrics_sdk::InstrumentValueType::kDouble};
  174. metrics_sdk::LastValuePointData s_data_1, s_data_2;
  175. s_data_1.value_ = 30.2;
  176. s_data_2.value_ = 50.2;
  177. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  178. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  179. data.instrument_descriptor = inst_desc;
  180. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  181. point_data_attr_1.attributes = {{"k1", "v1"}};
  182. point_data_attr_1.point_data = s_data_1;
  183. point_data_attr_2.attributes = {{"k2", "v2"}};
  184. point_data_attr_2.point_data = s_data_2;
  185. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  186. point_data_attr.push_back(point_data_attr_1);
  187. point_data_attr.push_back(point_data_attr_2);
  188. data.point_data_attr_ = std::move(point_data_attr);
  189. return data;
  190. }
  191. static metrics_sdk::MetricData CreateObservableCounterAggregationData()
  192. {
  193. metrics_sdk::MetricData data;
  194. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  195. metrics_sdk::InstrumentDescriptor inst_desc = {
  196. "ObservableCounter", "test description", "test unit",
  197. metrics_sdk::InstrumentType::kObservableCounter, metrics_sdk::InstrumentValueType::kDouble};
  198. metrics_sdk::SumPointData s_data_1, s_data_2;
  199. s_data_1.value_ = 1.23;
  200. s_data_2.value_ = 4.56;
  201. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  202. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  203. data.instrument_descriptor = inst_desc;
  204. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2;
  205. point_data_attr_1.attributes = {{"key1", "value1"}};
  206. point_data_attr_1.point_data = s_data_1;
  207. point_data_attr_2.attributes = {{"key2", "value2"}};
  208. point_data_attr_2.point_data = s_data_2;
  209. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  210. point_data_attr.push_back(point_data_attr_1);
  211. point_data_attr.push_back(point_data_attr_2);
  212. data.point_data_attr_ = std::move(point_data_attr);
  213. return data;
  214. }
  215. static metrics_sdk::MetricData CreateObservableUpDownCounterAggregationData()
  216. {
  217. metrics_sdk::MetricData data;
  218. data.start_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  219. metrics_sdk::InstrumentDescriptor inst_desc = {
  220. "ObservableUpDownCounter", "test description", "test unit",
  221. metrics_sdk::InstrumentType::kObservableUpDownCounter,
  222. metrics_sdk::InstrumentValueType::kDouble};
  223. metrics_sdk::SumPointData s_data_1, s_data_2, s_data_3;
  224. s_data_1.value_ = 1.23;
  225. s_data_2.value_ = 4.56;
  226. s_data_3.value_ = 2.34;
  227. data.aggregation_temporality = metrics_sdk::AggregationTemporality::kCumulative;
  228. data.end_ts = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
  229. data.instrument_descriptor = inst_desc;
  230. metrics_sdk::PointDataAttributes point_data_attr_1, point_data_attr_2, point_data_attr_3;
  231. point_data_attr_1.attributes = {{"key1", "value1"}};
  232. point_data_attr_1.point_data = s_data_1;
  233. point_data_attr_2.attributes = {{"key2", "value2"}};
  234. point_data_attr_2.point_data = s_data_2;
  235. point_data_attr_3.attributes = {{"key3", "value3"}};
  236. point_data_attr_3.point_data = s_data_3;
  237. std::vector<metrics_sdk::PointDataAttributes> point_data_attr;
  238. point_data_attr.push_back(point_data_attr_1);
  239. point_data_attr.push_back(point_data_attr_2);
  240. point_data_attr.push_back(point_data_attr_3);
  241. data.point_data_attr_ = std::move(point_data_attr);
  242. return data;
  243. }
  244. TEST(OtlpMetricSerializationTest, Counter)
  245. {
  246. metrics_sdk::MetricData data = CreateSumAggregationData();
  247. opentelemetry::proto::metrics::v1::Sum sum;
  248. otlp_exporter::OtlpMetricUtils::ConvertSumMetric(data, &sum);
  249. EXPECT_EQ(sum.aggregation_temporality(),
  250. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  251. EXPECT_EQ(sum.is_monotonic(), true);
  252. for (size_t i = 0; i < 1; i++)
  253. {
  254. const auto &proto_number_point = sum.data_points(i);
  255. EXPECT_EQ(proto_number_point.as_double(), i == 0 ? 10.2 : 20.2);
  256. }
  257. EXPECT_EQ(1, 1);
  258. }
  259. TEST(OtlpMetricSerializationTest, UpDownCounter)
  260. {
  261. metrics_sdk::MetricData data = CreateUpDownCounterAggregationData();
  262. opentelemetry::proto::metrics::v1::Sum sum;
  263. otlp_exporter::OtlpMetricUtils::ConvertSumMetric(data, &sum);
  264. EXPECT_EQ(sum.aggregation_temporality(),
  265. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  266. EXPECT_EQ(sum.is_monotonic(), false);
  267. EXPECT_EQ(sum.data_points(0).as_double(), 1.35);
  268. EXPECT_EQ(sum.data_points(1).as_double(), 1.37);
  269. EXPECT_EQ(1, 1);
  270. }
  271. TEST(OtlpMetricSerializationTest, Histogram)
  272. {
  273. metrics_sdk::MetricData data = CreateHistogramAggregationData();
  274. opentelemetry::proto::metrics::v1::Histogram histogram;
  275. otlp_exporter::OtlpMetricUtils::ConvertHistogramMetric(data, &histogram);
  276. EXPECT_EQ(histogram.aggregation_temporality(),
  277. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  278. for (size_t i = 0; i < 1; i++)
  279. {
  280. const auto &proto_number_point = histogram.data_points(i);
  281. EXPECT_EQ(proto_number_point.sum(), i == 0 ? 100.2 : 200.2);
  282. }
  283. EXPECT_EQ(1, 1);
  284. }
  285. TEST(OtlpMetricSerializationTest, ExponentialHistogramAggregationData)
  286. {
  287. const auto start_test_time = std::chrono::system_clock::now();
  288. const auto data = CreateExponentialHistogramAggregationData(start_test_time);
  289. opentelemetry::proto::metrics::v1::ExponentialHistogram exponentialHistogram;
  290. otlp_exporter::OtlpMetricUtils::ConvertExponentialHistogramMetric(data, &exponentialHistogram);
  291. EXPECT_EQ(exponentialHistogram.aggregation_temporality(),
  292. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  293. EXPECT_EQ(exponentialHistogram.data_points_size(), 2);
  294. // Point 1
  295. {
  296. const auto &data_point1 = exponentialHistogram.data_points(0);
  297. EXPECT_EQ(data_point1.count(), 3);
  298. EXPECT_EQ(data_point1.sum(), 6.5);
  299. EXPECT_EQ(data_point1.min(), 0.0);
  300. EXPECT_EQ(data_point1.max(), 3.5);
  301. EXPECT_EQ(data_point1.zero_count(), 1);
  302. EXPECT_EQ(data_point1.scale(), 3);
  303. EXPECT_EQ(data_point1.positive().offset(), 1);
  304. EXPECT_EQ(data_point1.positive().bucket_counts_size(), 1);
  305. EXPECT_EQ(data_point1.positive().bucket_counts(0), 1);
  306. EXPECT_EQ(data_point1.negative().offset(), -2);
  307. EXPECT_EQ(data_point1.negative().bucket_counts_size(), 1);
  308. EXPECT_EQ(data_point1.negative().bucket_counts(0), 1);
  309. EXPECT_EQ(data_point1.attributes_size(), 1);
  310. EXPECT_EQ(data_point1.attributes(0).key(), "k1");
  311. EXPECT_EQ(data_point1.attributes(0).value().string_value(), "v1");
  312. EXPECT_EQ(data_point1.start_time_unix_nano(), data.start_ts.time_since_epoch().count());
  313. EXPECT_EQ(data_point1.time_unix_nano(), data.end_ts.time_since_epoch().count());
  314. }
  315. // Point 2
  316. {
  317. const auto &data_point2 = exponentialHistogram.data_points(1);
  318. EXPECT_EQ(data_point2.count(), 4);
  319. EXPECT_EQ(data_point2.sum(), 6.2);
  320. EXPECT_EQ(data_point2.min(), 0.0);
  321. EXPECT_EQ(data_point2.max(), 0.0);
  322. EXPECT_EQ(data_point2.zero_count(), 2);
  323. EXPECT_EQ(data_point2.scale(), 3);
  324. EXPECT_EQ(data_point2.positive().offset(), 3);
  325. EXPECT_EQ(data_point2.positive().bucket_counts_size(), 1);
  326. EXPECT_EQ(data_point2.positive().bucket_counts(0), 1);
  327. EXPECT_EQ(data_point2.negative().offset(), -4);
  328. EXPECT_EQ(data_point2.negative().bucket_counts_size(), 3);
  329. EXPECT_EQ(data_point2.negative().bucket_counts(0), 2);
  330. EXPECT_EQ(data_point2.negative().bucket_counts(1), 0);
  331. EXPECT_EQ(data_point2.negative().bucket_counts(2), 1);
  332. EXPECT_EQ(data_point2.attributes(0).key(), "k2");
  333. EXPECT_EQ(data_point2.attributes(0).value().string_value(), "v2");
  334. EXPECT_EQ(data_point2.start_time_unix_nano(), data.start_ts.time_since_epoch().count());
  335. EXPECT_EQ(data_point2.time_unix_nano(), data.end_ts.time_since_epoch().count());
  336. }
  337. EXPECT_EQ(1, 1);
  338. }
  339. TEST(OtlpMetricSerializationTest, ObservableGauge)
  340. {
  341. metrics_sdk::MetricData data = CreateObservableGaugeAggregationData();
  342. opentelemetry::proto::metrics::v1::Gauge gauge;
  343. otlp_exporter::OtlpMetricUtils::ConvertGaugeMetric(data, &gauge);
  344. for (size_t i = 0; i < 1; i++)
  345. {
  346. const auto &proto_number_point = gauge.data_points(i);
  347. EXPECT_EQ(proto_number_point.as_double(), i == 0 ? 30.2 : 50.2);
  348. }
  349. EXPECT_EQ(1, 1);
  350. }
  351. TEST(OtlpMetricSerializationTest, ObservableCounter)
  352. {
  353. metrics_sdk::MetricData data = CreateObservableCounterAggregationData();
  354. opentelemetry::proto::metrics::v1::Sum sum;
  355. otlp_exporter::OtlpMetricUtils::ConvertSumMetric(data, &sum);
  356. EXPECT_EQ(sum.aggregation_temporality(),
  357. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  358. EXPECT_EQ(sum.is_monotonic(), true);
  359. EXPECT_EQ(sum.data_points_size(), 2);
  360. EXPECT_EQ(sum.data_points(0).as_double(), 1.23);
  361. EXPECT_EQ(sum.data_points(1).as_double(), 4.56);
  362. EXPECT_EQ(1, 1);
  363. }
  364. TEST(OtlpMetricSerializationTest, ObservableUpDownCounter)
  365. {
  366. metrics_sdk::MetricData data = CreateObservableUpDownCounterAggregationData();
  367. opentelemetry::proto::metrics::v1::Sum sum;
  368. otlp_exporter::OtlpMetricUtils::ConvertSumMetric(data, &sum);
  369. EXPECT_EQ(sum.aggregation_temporality(),
  370. proto::metrics::v1::AggregationTemporality::AGGREGATION_TEMPORALITY_CUMULATIVE);
  371. EXPECT_EQ(sum.is_monotonic(), false);
  372. EXPECT_EQ(sum.data_points_size(), 3);
  373. EXPECT_EQ(sum.data_points(0).as_double(), 1.23);
  374. EXPECT_EQ(sum.data_points(1).as_double(), 4.56);
  375. EXPECT_EQ(sum.data_points(2).as_double(), 2.34);
  376. EXPECT_EQ(1, 1);
  377. }
  378. TEST(OtlpMetricSerializationTest, PopulateExportMetricsServiceRequest)
  379. {
  380. const auto resource =
  381. resource::Resource::Create({{"service.name", "test_service_name"}}, "resource_schema_url");
  382. const auto scope = opentelemetry::sdk::instrumentationscope::InstrumentationScope::Create(
  383. "scope_name", "scope_version", "scope_schema_url", {{"scope_key", "scope_value"}});
  384. metrics_sdk::ScopeMetrics scope_metrics{scope.get(), CreateSumAggregationData()};
  385. metrics_sdk::ResourceMetrics resource_metrics{&resource, scope_metrics};
  386. proto::collector::metrics::v1::ExportMetricsServiceRequest request_proto;
  387. otlp_exporter::OtlpMetricUtils::PopulateRequest(resource_metrics, &request_proto);
  388. ASSERT_EQ(1, request_proto.resource_metrics_size());
  389. const auto &resource_metrics_proto = request_proto.resource_metrics(0);
  390. EXPECT_EQ("resource_schema_url", resource_metrics_proto.schema_url());
  391. ASSERT_EQ(1, resource_metrics_proto.scope_metrics_size());
  392. const auto &scope_metrics_proto = resource_metrics_proto.scope_metrics(0);
  393. EXPECT_EQ("scope_schema_url", scope_metrics_proto.schema_url());
  394. ASSERT_EQ(1, scope_metrics_proto.metrics_size());
  395. const auto &metric_proto = scope_metrics_proto.metrics(0);
  396. EXPECT_EQ("Counter", metric_proto.name());
  397. const auto &scope_proto = scope_metrics_proto.scope();
  398. EXPECT_EQ("scope_name", scope_proto.name());
  399. EXPECT_EQ("scope_version", scope_proto.version());
  400. ASSERT_EQ(1, scope_proto.attributes_size());
  401. const auto &scope_attributes_proto = scope_proto.attributes(0);
  402. EXPECT_EQ("scope_key", scope_attributes_proto.key());
  403. EXPECT_EQ("scope_value", scope_attributes_proto.value().string_value());
  404. }
  405. } // namespace otlp
  406. } // namespace exporter
  407. OPENTELEMETRY_END_NAMESPACE