measurements_benchmark.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #include <benchmark/benchmark.h>
  4. #include <stdlib.h>
  5. #include <algorithm>
  6. #include <atomic>
  7. #include <chrono>
  8. #include <cstdint>
  9. #include <map>
  10. #include <string>
  11. #include <thread>
  12. #include <utility>
  13. #include <vector>
  14. #include "opentelemetry/common/key_value_iterable_view.h"
  15. #include "opentelemetry/context/context.h"
  16. #include "opentelemetry/metrics/meter.h"
  17. #include "opentelemetry/metrics/sync_instruments.h"
  18. #include "opentelemetry/nostd/function_ref.h"
  19. #include "opentelemetry/nostd/shared_ptr.h"
  20. #include "opentelemetry/nostd/unique_ptr.h"
  21. #include "opentelemetry/sdk/common/attribute_utils.h"
  22. #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h"
  23. #include "opentelemetry/sdk/metrics/export/metric_producer.h"
  24. #include "opentelemetry/sdk/metrics/instruments.h"
  25. #include "opentelemetry/sdk/metrics/meter_provider.h"
  26. #include "opentelemetry/sdk/metrics/metric_reader.h"
  27. using namespace opentelemetry;
  28. using namespace opentelemetry::sdk::instrumentationscope;
  29. using namespace opentelemetry::sdk::metrics;
  30. using namespace opentelemetry::sdk::common;
  31. class MockMetricExporter : public MetricReader
  32. {
  33. public:
  34. MockMetricExporter() = default;
  35. opentelemetry::sdk::metrics::AggregationTemporality GetAggregationTemporality(
  36. opentelemetry::sdk::metrics::InstrumentType) const noexcept override
  37. {
  38. return AggregationTemporality::kCumulative;
  39. }
  40. private:
  41. bool OnForceFlush(std::chrono::microseconds /*timeout*/) noexcept override { return true; }
  42. bool OnShutDown(std::chrono::microseconds /*timeout*/) noexcept override { return true; }
  43. void OnInitialized() noexcept override {}
  44. };
  45. namespace
  46. {
  47. void BM_MeasurementsTest(benchmark::State &state)
  48. {
  49. MeterProvider mp;
  50. auto m = mp.GetMeter("meter1", "version1", "schema1");
  51. std::shared_ptr<MetricReader> exporter(new MockMetricExporter());
  52. mp.AddMetricReader(exporter);
  53. auto h = m->CreateDoubleCounter("counter1", "counter1_description", "counter1_unit");
  54. size_t MAX_MEASUREMENTS = 10000; // keep low to prevent CI failure due to timeout
  55. size_t NUM_CORES = 1;
  56. std::vector<std::thread> threads;
  57. std::map<std::string, uint32_t> attributes[1000];
  58. size_t total_index = 0;
  59. for (uint32_t i = 0; i < 10; i++)
  60. {
  61. for (uint32_t j = 0; j < 10; j++)
  62. for (uint32_t k = 0; k < 10; k++)
  63. attributes[total_index++] = {{"dim1", i}, {"dim2", j}, {"dim3", k}};
  64. }
  65. while (state.KeepRunning())
  66. {
  67. threads.clear();
  68. std::atomic<size_t> cur_processed{0};
  69. for (size_t i = 0; i < NUM_CORES; i++)
  70. {
  71. threads.push_back(std::thread([&h, &cur_processed, &MAX_MEASUREMENTS, &attributes]() {
  72. while (cur_processed++ <= MAX_MEASUREMENTS)
  73. {
  74. size_t index = rand() % 1000;
  75. h->Add(1.0,
  76. opentelemetry::common::KeyValueIterableView<std::map<std::string, uint32_t>>(
  77. attributes[index]),
  78. opentelemetry::context::Context{});
  79. }
  80. }));
  81. }
  82. for (auto &thread : threads)
  83. {
  84. thread.join();
  85. }
  86. }
  87. exporter->Collect([&](ResourceMetrics & /*rm*/) { return true; });
  88. }
  89. BENCHMARK(BM_MeasurementsTest);
  90. } // namespace
  91. BENCHMARK_MAIN();