sum_aggregation_benchmark.cc 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <benchmark/benchmark.h>
  4. #include <stddef.h>
  5. #include <algorithm>
  6. #include <chrono>
  7. #include <functional>
  8. #include <initializer_list>
  9. #include <random>
  10. #include <thread>
  11. #include <utility>
  12. #include <vector>
  13. #include "common.h"
  14. #include "opentelemetry/metrics/meter.h"
  15. #include "opentelemetry/metrics/sync_instruments.h"
  16. #include "opentelemetry/nostd/function_ref.h"
  17. #include "opentelemetry/nostd/shared_ptr.h"
  18. #include "opentelemetry/nostd/variant.h"
  19. #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.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/meter_provider.h"
  24. #include "opentelemetry/sdk/metrics/metric_reader.h"
  25. #include "opentelemetry/sdk/metrics/push_metric_exporter.h"
  26. using namespace opentelemetry;
  27. using namespace opentelemetry::sdk::instrumentationscope;
  28. using namespace opentelemetry::sdk::metrics;
  29. namespace
  30. {
  31. void BM_SumAggregation(benchmark::State &state)
  32. {
  33. MeterProvider mp;
  34. auto m = mp.GetMeter("meter1", "version1", "schema1");
  35. std::unique_ptr<MockMetricExporter> exporter(new MockMetricExporter());
  36. std::shared_ptr<MetricReader> reader{new MockMetricReader(std::move(exporter))};
  37. mp.AddMetricReader(reader);
  38. auto h = m->CreateDoubleCounter("counter1", "counter1_description", "counter1_unit");
  39. std::default_random_engine generator;
  40. std::uniform_int_distribution<int> distribution(0, 1000000);
  41. // Generate 100000 measurements
  42. constexpr size_t TOTAL_MEASUREMENTS = 100000;
  43. double measurements[TOTAL_MEASUREMENTS];
  44. for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++)
  45. {
  46. measurements[i] = static_cast<double>(distribution(generator));
  47. }
  48. std::vector<SumPointData> actuals;
  49. std::vector<std::thread> collectionThreads;
  50. std::function<void()> collectMetrics = [&reader, &actuals]() {
  51. reader->Collect([&](ResourceMetrics &rm) {
  52. for (const ScopeMetrics &smd : rm.scope_metric_data_)
  53. {
  54. for (const MetricData &md : smd.metric_data_)
  55. {
  56. for (const PointDataAttributes &dp : md.point_data_attr_)
  57. {
  58. actuals.push_back(opentelemetry::nostd::get<SumPointData>(dp.point_data));
  59. }
  60. }
  61. }
  62. return true;
  63. });
  64. };
  65. while (state.KeepRunning())
  66. {
  67. for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++)
  68. {
  69. h->Add(measurements[i], {});
  70. if (i % 1000 == 0 || i == TOTAL_MEASUREMENTS - 1)
  71. {
  72. collectMetrics();
  73. }
  74. if (i == 500)
  75. {
  76. std::this_thread::sleep_for(std::chrono::nanoseconds(2));
  77. }
  78. }
  79. }
  80. }
  81. BENCHMARK(BM_SumAggregation);
  82. } // namespace
  83. BENCHMARK_MAIN();