sum_aggregation_test.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <gtest/gtest.h>
  4. #include <algorithm>
  5. #include <initializer_list>
  6. #include <string>
  7. #include <unordered_map>
  8. #include <utility>
  9. #include <vector>
  10. #include "common.h"
  11. #include "opentelemetry/common/macros.h"
  12. #include "opentelemetry/context/context.h"
  13. #include "opentelemetry/metrics/meter.h"
  14. #include "opentelemetry/metrics/sync_instruments.h"
  15. #include "opentelemetry/nostd/function_ref.h"
  16. #include "opentelemetry/nostd/shared_ptr.h"
  17. #include "opentelemetry/nostd/variant.h"
  18. #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
  19. #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h"
  20. #include "opentelemetry/sdk/metrics/data/metric_data.h"
  21. #include "opentelemetry/sdk/metrics/data/point_data.h"
  22. #include "opentelemetry/sdk/metrics/export/metric_producer.h"
  23. #include "opentelemetry/sdk/metrics/instruments.h"
  24. #include "opentelemetry/sdk/metrics/meter_provider.h"
  25. #include "opentelemetry/sdk/metrics/metric_reader.h"
  26. #include "opentelemetry/sdk/metrics/push_metric_exporter.h"
  27. #include "opentelemetry/sdk/metrics/view/attributes_processor.h"
  28. #include "opentelemetry/sdk/metrics/view/instrument_selector.h"
  29. #include "opentelemetry/sdk/metrics/view/meter_selector.h"
  30. #include "opentelemetry/sdk/metrics/view/view.h"
  31. #if OPENTELEMETRY_HAVE_WORKING_REGEX
  32. using namespace opentelemetry;
  33. using namespace opentelemetry::sdk::instrumentationscope;
  34. using namespace opentelemetry::sdk::metrics;
  35. TEST(HistogramToSum, Double)
  36. {
  37. MeterProvider mp;
  38. auto m = mp.GetMeter("meter1", "version1", "schema1");
  39. std::string instrument_unit = "ms";
  40. std::string instrument_name = "historgram1";
  41. std::string instrument_desc = "histogram metrics";
  42. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  43. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  44. mp.AddMetricReader(reader);
  45. std::unique_ptr<View> view{
  46. new View("view1", "view1_description", instrument_unit, AggregationType::kSum)};
  47. std::unique_ptr<InstrumentSelector> instrument_selector{
  48. new InstrumentSelector(InstrumentType::kHistogram, instrument_name, instrument_unit)};
  49. std::unique_ptr<MeterSelector> meter_selector{new MeterSelector("meter1", "version1", "schema1")};
  50. mp.AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view));
  51. auto h = m->CreateDoubleHistogram(instrument_name, instrument_desc, instrument_unit);
  52. h->Record(5, {});
  53. h->Record(10, {});
  54. h->Record(15, {});
  55. h->Record(20, {});
  56. h->Record(25, {});
  57. h->Record(30, {});
  58. h->Record(35, {});
  59. h->Record(40, {});
  60. h->Record(45, {});
  61. h->Record(50, {});
  62. h->Record(1e6, {});
  63. std::vector<SumPointData> actuals;
  64. reader->Collect([&](ResourceMetrics &rm) {
  65. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  66. {
  67. for (const MetricData &md : smd.metric_data_)
  68. {
  69. for (const PointDataAttributes &dp : md.point_data_attr_)
  70. {
  71. actuals.push_back(opentelemetry::nostd::get<SumPointData>(dp.point_data));
  72. }
  73. }
  74. }
  75. return true;
  76. });
  77. ASSERT_EQ(1, actuals.size());
  78. const auto &actual = actuals.at(0);
  79. ASSERT_EQ(1000275.0, opentelemetry::nostd::get<double>(actual.value_));
  80. }
  81. TEST(HistogramToSumFilterAttributes, Double)
  82. {
  83. MeterProvider mp;
  84. auto m = mp.GetMeter("meter1", "version1", "schema1");
  85. std::string instrument_unit = "ms";
  86. std::string instrument_name = "historgram1";
  87. std::string instrument_desc = "histogram metrics";
  88. std::unordered_map<std::string, bool> allowedattr;
  89. allowedattr["attr1"] = true;
  90. std::unique_ptr<opentelemetry::sdk::metrics::AttributesProcessor> attrproc{
  91. new opentelemetry::sdk::metrics::FilteringAttributesProcessor(allowedattr)};
  92. std::shared_ptr<opentelemetry::sdk::metrics::AggregationConfig> dummy_aggregation_config{
  93. new opentelemetry::sdk::metrics::AggregationConfig};
  94. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  95. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  96. mp.AddMetricReader(reader);
  97. std::unique_ptr<View> view{new View("view1", "view1_description", instrument_unit,
  98. AggregationType::kSum, dummy_aggregation_config,
  99. std::move(attrproc))};
  100. std::unique_ptr<InstrumentSelector> instrument_selector{
  101. new InstrumentSelector(InstrumentType::kHistogram, instrument_name, instrument_unit)};
  102. std::unique_ptr<MeterSelector> meter_selector{new MeterSelector("meter1", "version1", "schema1")};
  103. mp.AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view));
  104. auto h = m->CreateDoubleHistogram(instrument_name, instrument_desc, instrument_unit);
  105. std::unordered_map<std::string, std::string> attr1 = {{"attr1", "val1"}, {"attr2", "val2"}};
  106. std::unordered_map<std::string, std::string> attr2 = {{"attr1", "val1"}, {"attr2", "val2"}};
  107. h->Record(5, attr1, opentelemetry::context::Context{});
  108. h->Record(10, attr2, opentelemetry::context::Context{});
  109. reader->Collect([&](ResourceMetrics &rm) {
  110. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  111. {
  112. for (const MetricData &md : smd.metric_data_)
  113. {
  114. EXPECT_EQ(1, md.point_data_attr_.size());
  115. if (md.point_data_attr_.size() == 1)
  116. {
  117. EXPECT_EQ(15.0, opentelemetry::nostd::get<double>(opentelemetry::nostd::get<SumPointData>(
  118. md.point_data_attr_[0].point_data)
  119. .value_));
  120. EXPECT_EQ(1, md.point_data_attr_[0].attributes.size());
  121. EXPECT_NE(md.point_data_attr_[0].attributes.end(),
  122. md.point_data_attr_[0].attributes.find("attr1"));
  123. }
  124. }
  125. }
  126. return true;
  127. });
  128. }
  129. TEST(CounterToSum, Double)
  130. {
  131. MeterProvider mp;
  132. auto m = mp.GetMeter("meter1", "version1", "schema1");
  133. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  134. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  135. mp.AddMetricReader(reader);
  136. std::unique_ptr<View> view{new View("view1", "view1_description", "ms", AggregationType::kSum)};
  137. std::unique_ptr<InstrumentSelector> instrument_selector{
  138. new InstrumentSelector(InstrumentType::kCounter, "counter1", "ms")};
  139. std::unique_ptr<MeterSelector> meter_selector{new MeterSelector("meter1", "version1", "schema1")};
  140. mp.AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view));
  141. auto h = m->CreateDoubleCounter("counter1", "counter1_description", "counter1_unit");
  142. h->Add(5, {});
  143. h->Add(10, {});
  144. h->Add(15, {});
  145. h->Add(20, {});
  146. h->Add(25, {});
  147. h->Add(30, {});
  148. h->Add(35, {});
  149. h->Add(40, {});
  150. h->Add(45, {});
  151. h->Add(50, {});
  152. h->Add(1e6, {});
  153. std::vector<SumPointData> actuals;
  154. reader->Collect([&](ResourceMetrics &rm) {
  155. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  156. {
  157. for (const MetricData &md : smd.metric_data_)
  158. {
  159. for (const PointDataAttributes &dp : md.point_data_attr_)
  160. {
  161. actuals.push_back(opentelemetry::nostd::get<SumPointData>(dp.point_data));
  162. }
  163. }
  164. }
  165. return true;
  166. });
  167. ASSERT_EQ(1, actuals.size());
  168. const auto &actual = actuals.at(0);
  169. ASSERT_EQ(1000275.0, opentelemetry::nostd::get<double>(actual.value_));
  170. }
  171. TEST(CounterToSumFilterAttributes, Double)
  172. {
  173. MeterProvider mp;
  174. auto m = mp.GetMeter("meter1", "version1", "schema1");
  175. std::string instrument_unit = "ms";
  176. std::string instrument_name = "counter1";
  177. std::string instrument_desc = "counter metrics";
  178. std::unordered_map<std::string, bool> allowedattr;
  179. allowedattr["attr1"] = true;
  180. std::unique_ptr<opentelemetry::sdk::metrics::AttributesProcessor> attrproc{
  181. new opentelemetry::sdk::metrics::FilteringAttributesProcessor(allowedattr)};
  182. std::shared_ptr<opentelemetry::sdk::metrics::AggregationConfig> dummy_aggregation_config{
  183. new opentelemetry::sdk::metrics::AggregationConfig};
  184. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  185. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  186. mp.AddMetricReader(reader);
  187. std::unique_ptr<View> view{new View("view1", "view1_description", instrument_unit,
  188. AggregationType::kSum, dummy_aggregation_config,
  189. std::move(attrproc))};
  190. std::unique_ptr<InstrumentSelector> instrument_selector{
  191. new InstrumentSelector(InstrumentType::kCounter, instrument_name, instrument_unit)};
  192. std::unique_ptr<MeterSelector> meter_selector{new MeterSelector("meter1", "version1", "schema1")};
  193. mp.AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view));
  194. auto c = m->CreateDoubleCounter(instrument_name, instrument_desc, instrument_unit);
  195. std::unordered_map<std::string, std::string> attr1 = {{"attr1", "val1"}, {"attr2", "val2"}};
  196. std::unordered_map<std::string, std::string> attr2 = {{"attr1", "val1"}, {"attr2", "val2"}};
  197. c->Add(5, attr1, opentelemetry::context::Context{});
  198. c->Add(10, attr2, opentelemetry::context::Context{});
  199. reader->Collect([&](ResourceMetrics &rm) {
  200. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  201. {
  202. for (const MetricData &md : smd.metric_data_)
  203. {
  204. EXPECT_EQ(1, md.point_data_attr_.size());
  205. if (md.point_data_attr_.size() == 1)
  206. {
  207. EXPECT_EQ(15.0, opentelemetry::nostd::get<double>(opentelemetry::nostd::get<SumPointData>(
  208. md.point_data_attr_[0].point_data)
  209. .value_));
  210. EXPECT_EQ(1, md.point_data_attr_[0].attributes.size());
  211. EXPECT_NE(md.point_data_attr_[0].attributes.end(),
  212. md.point_data_attr_[0].attributes.find("attr1"));
  213. }
  214. }
  215. }
  216. return true;
  217. });
  218. }
  219. class UpDownCounterToSumFixture : public ::testing::TestWithParam<bool>
  220. {};
  221. TEST_P(UpDownCounterToSumFixture, Double)
  222. {
  223. bool is_matching_view = GetParam();
  224. MeterProvider mp;
  225. auto m = mp.GetMeter("meter1", "version1", "schema1");
  226. std::string instrument_name = "updowncounter1";
  227. std::string instrument_desc = "updowncounter desc";
  228. std::string instrument_unit = "ms";
  229. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  230. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  231. mp.AddMetricReader(reader);
  232. if (is_matching_view)
  233. {
  234. std::unique_ptr<View> view{
  235. new View("view1", "view1_description", instrument_unit, AggregationType::kSum)};
  236. std::unique_ptr<InstrumentSelector> instrument_selector{
  237. new InstrumentSelector(InstrumentType::kUpDownCounter, instrument_name, instrument_unit)};
  238. std::unique_ptr<MeterSelector> meter_selector{
  239. new MeterSelector("meter1", "version1", "schema1")};
  240. mp.AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view));
  241. }
  242. auto h = m->CreateDoubleUpDownCounter(instrument_name, instrument_desc, instrument_unit);
  243. h->Add(5, {});
  244. h->Add(10, {});
  245. h->Add(-15, {});
  246. h->Add(20, {});
  247. h->Add(25, {});
  248. h->Add(-30, {});
  249. std::vector<SumPointData> actuals;
  250. reader->Collect([&](ResourceMetrics &rm) {
  251. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  252. {
  253. for (const MetricData &md : smd.metric_data_)
  254. {
  255. for (const PointDataAttributes &dp : md.point_data_attr_)
  256. {
  257. actuals.push_back(opentelemetry::nostd::get<SumPointData>(dp.point_data));
  258. }
  259. }
  260. }
  261. return true;
  262. });
  263. ASSERT_EQ(1, actuals.size());
  264. const auto &actual = actuals.at(0);
  265. ASSERT_EQ(15.0, opentelemetry::nostd::get<double>(actual.value_));
  266. }
  267. INSTANTIATE_TEST_SUITE_P(UpDownCounterToSum,
  268. UpDownCounterToSumFixture,
  269. ::testing::Values(true, false));
  270. #endif