From 7c0826efe0cf205f1f30d6c6a9d0d3a0254adb92 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Wed, 22 Feb 2023 12:18:12 -0800 Subject: [PATCH] Add benchmark tests for Sum Aggregation #1949 (#1948) --- sdk/test/metrics/BUILD | 73 +++++++++++----- sdk/test/metrics/CMakeLists.txt | 12 ++- sdk/test/metrics/async_metric_storage_test.cc | 26 ++---- sdk/test/metrics/common.cc | 68 +++++++++++++++ sdk/test/metrics/common.h | 60 +++++++++++++ .../histogram_aggregation_benchmark.cc | 87 +++++++++---------- .../metrics/histogram_aggregation_test.cc | 46 +--------- sdk/test/metrics/histogram_test.cc | 46 +--------- sdk/test/metrics/meter_provider_sdk_test.cc | 47 +--------- sdk/test/metrics/meter_test.cc | 18 +--- sdk/test/metrics/metric_reader_test.cc | 24 +---- sdk/test/metrics/sum_aggregation_benchmark.cc | 79 +++++++++++++++++ sdk/test/metrics/sum_aggregation_test.cc | 46 +--------- .../sync_metric_storage_counter_test.cc | 19 +--- .../sync_metric_storage_histogram_test.cc | 21 +---- ...ync_metric_storage_up_down_counter_test.cc | 19 +--- 16 files changed, 336 insertions(+), 355 deletions(-) create mode 100644 sdk/test/metrics/common.cc create mode 100644 sdk/test/metrics/common.h create mode 100644 sdk/test/metrics/sum_aggregation_benchmark.cc diff --git a/sdk/test/metrics/BUILD b/sdk/test/metrics/BUILD index 210d0c2c3f..61c526bb0c 100644 --- a/sdk/test/metrics/BUILD +++ b/sdk/test/metrics/BUILD @@ -3,6 +3,21 @@ load("//bazel:otel_cc_benchmark.bzl", "otel_cc_benchmark") +cc_library( + name = "metrics_common_test_utils", + srcs = [ + "common.cc", + ], + hdrs = ["common.h"], + tags = [ + "metrics", + "test", + ], + deps = [ + "//sdk/src/metrics", + ], +) + cc_test( name = "meter_test", srcs = [ @@ -13,7 +28,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -28,7 +43,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -44,7 +59,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -60,7 +75,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -76,7 +91,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -92,7 +107,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -108,7 +123,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -124,7 +139,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -140,7 +155,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -156,7 +171,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -172,7 +187,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -187,7 +202,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -203,7 +218,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -219,7 +234,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "//sdk/src/resource", "@com_google_googletest//:gtest_main", ], @@ -235,7 +250,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -250,7 +265,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -265,7 +280,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -280,7 +295,7 @@ cc_test( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", "@com_google_googletest//:gtest_main", ], ) @@ -296,7 +311,7 @@ otel_cc_benchmark( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", ], ) @@ -311,7 +326,7 @@ otel_cc_benchmark( "test", ], deps = [ - "//sdk/src/metrics", + "metrics_common_test_utils", ], ) @@ -326,6 +341,24 @@ otel_cc_benchmark( "test", ], deps = [ + "metrics_common_test_utils", + "//sdk/src/metrics", + "//sdk/src/resource", + ], +) + +otel_cc_benchmark( + name = "sum_aggregation_benchmark", + srcs = [ + "sum_aggregation_benchmark.cc", + ], + tags = [ + "benchmark", + "metrics", + "test", + ], + deps = [ + "metrics_common_test_utils", "//sdk/src/metrics", "//sdk/src/resource", ], diff --git a/sdk/test/metrics/CMakeLists.txt b/sdk/test/metrics/CMakeLists.txt index 984260a544..dc81b07e61 100644 --- a/sdk/test/metrics/CMakeLists.txt +++ b/sdk/test/metrics/CMakeLists.txt @@ -1,6 +1,9 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +add_library(metrics_common_test_utils common.cc) +target_link_libraries(metrics_common_test_utils opentelemetry_metrics) + foreach( testname meter_provider_sdk_test @@ -27,7 +30,7 @@ foreach( add_executable(${testname} "${testname}.cc") target_link_libraries( ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} - opentelemetry_resources opentelemetry_metrics) + metrics_common_test_utils opentelemetry_resources) gtest_add_tests( TARGET ${testname} TEST_PREFIX metrics. @@ -48,8 +51,13 @@ if(WITH_BENCHMARK) histogram_aggregation_benchmark.cc) target_link_libraries( histogram_aggregation_benchmark benchmark::benchmark - ${CMAKE_THREAD_LIBS_INIT} opentelemetry_common opentelemetry_metrics + ${CMAKE_THREAD_LIBS_INIT} metrics_common_test_utils opentelemetry_common opentelemetry_resources) + + add_executable(sum_aggregation_benchmark sum_aggregation_benchmark.cc) + target_link_libraries( + sum_aggregation_benchmark benchmark::benchmark ${CMAKE_THREAD_LIBS_INIT} + metrics_common_test_utils opentelemetry_common opentelemetry_resources) endif() add_subdirectory(exemplar) diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index f56a403862..0ce91dafe1 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -1,8 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/state/async_metric_storage.h" -#include +#include "common.h" + #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/sdk/metrics/async_instruments.h" #include "opentelemetry/sdk/metrics/instruments.h" @@ -10,38 +10,22 @@ #include "opentelemetry/sdk/metrics/metric_reader.h" #include "opentelemetry/sdk/metrics/observer_result.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" +#include "opentelemetry/sdk/metrics/state/async_metric_storage.h" #include "opentelemetry/sdk/metrics/state/metric_collector.h" #include "opentelemetry/sdk/metrics/state/observable_registry.h" #include +#include #include #include using namespace opentelemetry::sdk::metrics; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::resource; - -using namespace opentelemetry::sdk::metrics; using namespace opentelemetry::common; -using M = std::map; namespace nostd = opentelemetry::nostd; -class MockCollectorHandle : public CollectorHandle -{ -public: - MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {} - - ~MockCollectorHandle() override = default; - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) noexcept override - { - return temporality; - } - -private: - AggregationTemporality temporality; -}; +using M = std::map; class WritableMetricStorageTestFixture : public ::testing::TestWithParam {}; diff --git a/sdk/test/metrics/common.cc b/sdk/test/metrics/common.cc new file mode 100644 index 0000000000..87343f6186 --- /dev/null +++ b/sdk/test/metrics/common.cc @@ -0,0 +1,68 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "common.h" + +using namespace opentelemetry; +using namespace opentelemetry::sdk::instrumentationscope; +using namespace opentelemetry::sdk::metrics; +using namespace opentelemetry::sdk::common; + +// MockMetricExporter + +ExportResult MockMetricExporter::Export(const ResourceMetrics & /*resource_metrics*/) noexcept +{ + return ExportResult::kSuccess; +} + +AggregationTemporality MockMetricExporter::GetAggregationTemporality( + InstrumentType /*instrument_type*/) const noexcept +{ + return AggregationTemporality::kCumulative; +} + +bool MockMetricExporter::ForceFlush(std::chrono::microseconds /* timeout */) noexcept +{ + return true; +} + +bool MockMetricExporter::Shutdown(std::chrono::microseconds /* timeout */) noexcept +{ + return true; +} + +// MockMetricReader +MockMetricReader::MockMetricReader(std::unique_ptr exporter) + : exporter_(std::move(exporter)) +{} + +MockMetricReader::MockMetricReader() : exporter_{new MockMetricExporter()} {} + +AggregationTemporality MockMetricReader::GetAggregationTemporality( + InstrumentType instrument_type) const noexcept + +{ + return exporter_->GetAggregationTemporality(instrument_type); +} + +bool MockMetricReader::OnForceFlush(std::chrono::microseconds /* timeout */) noexcept +{ + return true; +} + +bool MockMetricReader::OnShutDown(std::chrono::microseconds /* timeout */) noexcept +{ + return true; +} + +void MockMetricReader::OnInitialized() noexcept {} + +// MockCollectorHandle + +MockCollectorHandle::MockCollectorHandle(AggregationTemporality temp) : temporality_(temp) {} + +AggregationTemporality MockCollectorHandle::GetAggregationTemporality( + InstrumentType /* instrument_type */) noexcept +{ + return temporality_; +} diff --git a/sdk/test/metrics/common.h b/sdk/test/metrics/common.h new file mode 100644 index 0000000000..b3b73e15d6 --- /dev/null +++ b/sdk/test/metrics/common.h @@ -0,0 +1,60 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/sdk/metrics/data/point_data.h" +#include "opentelemetry/sdk/metrics/metric_reader.h" +#include "opentelemetry/sdk/metrics/push_metric_exporter.h" +#include "opentelemetry/sdk/metrics/state/metric_collector.h" + +#include + +class MockMetricExporter : public opentelemetry::sdk::metrics::PushMetricExporter +{ +public: + MockMetricExporter() = default; + opentelemetry::sdk::common::ExportResult Export( + const opentelemetry::sdk::metrics::ResourceMetrics &) noexcept override; + + opentelemetry::sdk::metrics::AggregationTemporality GetAggregationTemporality( + opentelemetry::sdk::metrics::InstrumentType) const noexcept override; + + bool ForceFlush(std::chrono::microseconds) noexcept override; + + bool Shutdown(std::chrono::microseconds) noexcept override; +}; + +class MockMetricReader : public opentelemetry::sdk::metrics::MetricReader +{ +public: + MockMetricReader(std::unique_ptr); + + MockMetricReader(); + + opentelemetry::sdk::metrics::AggregationTemporality GetAggregationTemporality( + opentelemetry::sdk::metrics::InstrumentType) const noexcept override; + + bool OnForceFlush(std::chrono::microseconds) noexcept override; + + bool OnShutDown(std::chrono::microseconds) noexcept override; + + void OnInitialized() noexcept override; + +private: + std::unique_ptr exporter_; +}; + +class MockCollectorHandle : public opentelemetry::sdk::metrics::CollectorHandle +{ +public: + MockCollectorHandle(opentelemetry::sdk::metrics::AggregationTemporality); + + ~MockCollectorHandle() override = default; + + opentelemetry::sdk::metrics::AggregationTemporality GetAggregationTemporality( + opentelemetry::sdk::metrics::InstrumentType) noexcept override; + +private: + opentelemetry::sdk::metrics::AggregationTemporality temporality_; +}; diff --git a/sdk/test/metrics/histogram_aggregation_benchmark.cc b/sdk/test/metrics/histogram_aggregation_benchmark.cc index 41ac2379ca..bb63f1230c 100644 --- a/sdk/test/metrics/histogram_aggregation_benchmark.cc +++ b/sdk/test/metrics/histogram_aggregation_benchmark.cc @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include +#include "common.h" #include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/meter.h" @@ -10,56 +10,13 @@ #include "opentelemetry/sdk/metrics/metric_reader.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" +#include #include using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricExporter : public PushMetricExporter -{ -public: - MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const ResourceMetrics & /* records */) noexcept override - { - return opentelemetry::sdk::common::ExportResult::kSuccess; - } - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - - bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - - bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return true; } -}; - -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader(std::unique_ptr exporter) : exporter_(std::move(exporter)) {} - AggregationTemporality GetAggregationTemporality( - InstrumentType instrument_type) const noexcept override - { - return exporter_->GetAggregationTemporality(instrument_type); - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} - -private: - std::unique_ptr exporter_; -}; - namespace { void BM_HistogramAggregation(benchmark::State &state) @@ -73,12 +30,48 @@ void BM_HistogramAggregation(benchmark::State &state) auto h = m->CreateDoubleHistogram("histogram1", "histogram1_description", "histogram1_unit"); std::default_random_engine generator; std::uniform_int_distribution distribution(0, 1000000); + // Generate 100000 measurements + constexpr size_t TOTAL_MEASUREMENTS = 100000; + double measurements[TOTAL_MEASUREMENTS]; + for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++) + { + measurements[i] = (double)distribution(generator); + } + std::vector actuals; + std::vector collectionThreads; + std::function collectMetrics = [&reader, &actuals]() { + reader->Collect([&](ResourceMetrics &rm) { + for (const ScopeMetrics &smd : rm.scope_metric_data_) + { + for (const MetricData &md : smd.metric_data_) + { + for (const PointDataAttributes &dp : md.point_data_attr_) + { + actuals.push_back(opentelemetry::nostd::get(dp.point_data)); + } + } + } + return true; + }); + }; + while (state.KeepRunning()) { - auto value = (double)distribution(generator); - h->Record(value, {}); + for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++) + { + h->Record(measurements[i], {}); + if (i % 1000 == 0 || i == TOTAL_MEASUREMENTS - 1) + { + collectMetrics(); + } + if (i == 100) + { + std::this_thread::sleep_for(std::chrono::nanoseconds(4)); + } + } } } + BENCHMARK(BM_HistogramAggregation); } // namespace diff --git a/sdk/test/metrics/histogram_aggregation_test.cc b/sdk/test/metrics/histogram_aggregation_test.cc index 99f6ec3d82..fada036747 100644 --- a/sdk/test/metrics/histogram_aggregation_test.cc +++ b/sdk/test/metrics/histogram_aggregation_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include "opentelemetry/common/macros.h" #include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/meter.h" @@ -17,50 +19,6 @@ using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricExporter : public PushMetricExporter -{ -public: - MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const ResourceMetrics & /* records */) noexcept override - { - return opentelemetry::sdk::common::ExportResult::kSuccess; - } - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - - bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - - bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return true; } -}; - -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader(std::unique_ptr exporter) : exporter_(std::move(exporter)) {} - AggregationTemporality GetAggregationTemporality( - InstrumentType instrument_type) const noexcept override - { - return exporter_->GetAggregationTemporality(instrument_type); - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} - -private: - std::unique_ptr exporter_; -}; - TEST(HistogramInstrumentToHistogramAggregation, Double) { MeterProvider mp; diff --git a/sdk/test/metrics/histogram_test.cc b/sdk/test/metrics/histogram_test.cc index ee3aa939b6..ef2d023c92 100644 --- a/sdk/test/metrics/histogram_test.cc +++ b/sdk/test/metrics/histogram_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include "opentelemetry/common/macros.h" #include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/meter.h" @@ -19,50 +21,6 @@ using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricExporter : public PushMetricExporter -{ -public: - MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const ResourceMetrics & /* records */) noexcept override - { - return opentelemetry::sdk::common::ExportResult::kSuccess; - } - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - - bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - - bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return true; } -}; - -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader(std::unique_ptr exporter) : exporter_(std::move(exporter)) {} - AggregationTemporality GetAggregationTemporality( - InstrumentType instrument_type) const noexcept override - { - return exporter_->GetAggregationTemporality(instrument_type); - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} - -private: - std::unique_ptr exporter_; -}; - TEST(Histogram, Double) { MeterProvider mp; diff --git a/sdk/test/metrics/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index 7663ca9b01..bcdc6c4b79 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include #include "opentelemetry/sdk/metrics/export/metric_producer.h" #include "opentelemetry/sdk/metrics/meter.h" @@ -12,51 +14,6 @@ using namespace opentelemetry::sdk::metrics; -class MockMetricExporter : public PushMetricExporter -{ - -public: - MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const ResourceMetrics & /* records */) noexcept override - { - return opentelemetry::sdk::common::ExportResult::kSuccess; - } - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - - bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - - bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return true; } -}; - -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader(std::unique_ptr exporter) : exporter_(std::move(exporter)) {} - AggregationTemporality GetAggregationTemporality( - InstrumentType instrument_type) const noexcept override - { - return exporter_->GetAggregationTemporality(instrument_type); - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} - -private: - std::unique_ptr exporter_; -}; - TEST(MeterProvider, GetMeter) { diff --git a/sdk/test/metrics/meter_test.cc b/sdk/test/metrics/meter_test.cc index fb260ea19d..084f50fc09 100644 --- a/sdk/test/metrics/meter_test.cc +++ b/sdk/test/metrics/meter_test.cc @@ -1,8 +1,10 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/meter.h" +#include "common.h" + #include "opentelemetry/sdk/metrics/data/point_data.h" +#include "opentelemetry/sdk/metrics/meter.h" #include "opentelemetry/sdk/metrics/meter_context.h" #include "opentelemetry/sdk/metrics/meter_provider.h" #include "opentelemetry/sdk/metrics/metric_reader.h" @@ -13,20 +15,6 @@ using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader() = default; - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override { return true; } - bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - void OnInitialized() noexcept override {} -}; - namespace { nostd::shared_ptr InitMeter(MetricReader **metricReaderPtr, diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index de787d617c..061d505a1d 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -1,35 +1,17 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/metric_reader.h" +#include "common.h" + #include #include "opentelemetry/sdk/metrics/meter_context.h" +#include "opentelemetry/sdk/metrics/metric_reader.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader() = default; - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} -}; - TEST(MetricReaderTest, BasicTests) { std::unique_ptr metric_reader1(new MockMetricReader()); diff --git a/sdk/test/metrics/sum_aggregation_benchmark.cc b/sdk/test/metrics/sum_aggregation_benchmark.cc new file mode 100644 index 0000000000..43be12523a --- /dev/null +++ b/sdk/test/metrics/sum_aggregation_benchmark.cc @@ -0,0 +1,79 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "common.h" + +#include "opentelemetry/sdk/metrics/data/point_data.h" +#include "opentelemetry/sdk/metrics/meter.h" +#include "opentelemetry/sdk/metrics/meter_context.h" +#include "opentelemetry/sdk/metrics/meter_provider.h" +#include "opentelemetry/sdk/metrics/metric_reader.h" +#include "opentelemetry/sdk/metrics/push_metric_exporter.h" + +#include +#include +#include + +using namespace opentelemetry; +using namespace opentelemetry::sdk::instrumentationscope; +using namespace opentelemetry::sdk::metrics; + +namespace +{ +void BM_SumAggregation(benchmark::State &state) +{ + MeterProvider mp; + auto m = mp.GetMeter("meter1", "version1", "schema1"); + + std::unique_ptr exporter(new MockMetricExporter()); + std::shared_ptr reader{new MockMetricReader(std::move(exporter))}; + mp.AddMetricReader(reader); + auto h = m->CreateDoubleCounter("counter1", "counter1_description", "counter1_unit"); + std::default_random_engine generator; + std::uniform_int_distribution distribution(0, 1000000); + // Generate 100000 measurements + constexpr size_t TOTAL_MEASUREMENTS = 100000; + double measurements[TOTAL_MEASUREMENTS]; + for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++) + { + measurements[i] = (double)distribution(generator); + } + std::vector actuals; + std::vector collectionThreads; + std::function collectMetrics = [&reader, &actuals]() { + reader->Collect([&](ResourceMetrics &rm) { + for (const ScopeMetrics &smd : rm.scope_metric_data_) + { + for (const MetricData &md : smd.metric_data_) + { + for (const PointDataAttributes &dp : md.point_data_attr_) + { + actuals.push_back(opentelemetry::nostd::get(dp.point_data)); + } + } + } + return true; + }); + }; + + while (state.KeepRunning()) + { + for (size_t i = 0; i < TOTAL_MEASUREMENTS; i++) + { + h->Add(measurements[i], {}); + if (i % 1000 == 0 || i == TOTAL_MEASUREMENTS - 1) + { + collectMetrics(); + } + if (i == 500) + { + std::this_thread::sleep_for(std::chrono::nanoseconds(2)); + } + } + } +} + +BENCHMARK(BM_SumAggregation); + +} // namespace +BENCHMARK_MAIN(); diff --git a/sdk/test/metrics/sum_aggregation_test.cc b/sdk/test/metrics/sum_aggregation_test.cc index 47022c866f..9fb1804022 100644 --- a/sdk/test/metrics/sum_aggregation_test.cc +++ b/sdk/test/metrics/sum_aggregation_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include "opentelemetry/common/macros.h" #include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/meter.h" @@ -17,50 +19,6 @@ using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationscope; using namespace opentelemetry::sdk::metrics; -class MockMetricExporter : public PushMetricExporter -{ -public: - MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const ResourceMetrics & /* records */) noexcept override - { - return opentelemetry::sdk::common::ExportResult::kSuccess; - } - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) const noexcept override - { - return AggregationTemporality::kCumulative; - } - - bool ForceFlush(std::chrono::microseconds /* timeout */) noexcept override { return true; } - - bool Shutdown(std::chrono::microseconds /* timeout */) noexcept override { return true; } -}; - -class MockMetricReader : public MetricReader -{ -public: - MockMetricReader(std::unique_ptr exporter) : exporter_(std::move(exporter)) {} - AggregationTemporality GetAggregationTemporality( - InstrumentType instrument_type) const noexcept override - { - return exporter_->GetAggregationTemporality(instrument_type); - } - virtual bool OnForceFlush(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual bool OnShutDown(std::chrono::microseconds /* timeout */) noexcept override - { - return true; - } - virtual void OnInitialized() noexcept override {} - -private: - std::unique_ptr exporter_; -}; - TEST(HistogramToSum, Double) { MeterProvider mp; diff --git a/sdk/test/metrics/sync_metric_storage_counter_test.cc b/sdk/test/metrics/sync_metric_storage_counter_test.cc index 5603a8db05..1c57e1ee38 100644 --- a/sdk/test/metrics/sync_metric_storage_counter_test.cc +++ b/sdk/test/metrics/sync_metric_storage_counter_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/shared_ptr.h" @@ -17,23 +19,6 @@ using namespace opentelemetry::common; using M = std::map; namespace nostd = opentelemetry::nostd; -class MockCollectorHandle : public CollectorHandle -{ -public: - MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {} - - ~MockCollectorHandle() override = default; - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) noexcept override - { - return temporality; - } - -private: - AggregationTemporality temporality; -}; - class WritableMetricStorageTestFixture : public ::testing::TestWithParam {}; diff --git a/sdk/test/metrics/sync_metric_storage_histogram_test.cc b/sdk/test/metrics/sync_metric_storage_histogram_test.cc index 6544a21a8c..b63d31e7ce 100644 --- a/sdk/test/metrics/sync_metric_storage_histogram_test.cc +++ b/sdk/test/metrics/sync_metric_storage_histogram_test.cc @@ -1,7 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include +#include "common.h" + #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" @@ -11,29 +12,13 @@ #include #include +#include using namespace opentelemetry::sdk::metrics; using namespace opentelemetry::common; using M = std::map; namespace nostd = opentelemetry::nostd; -class MockCollectorHandle : public CollectorHandle -{ -public: - MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {} - - ~MockCollectorHandle() override = default; - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) noexcept override - { - return temporality; - } - -private: - AggregationTemporality temporality; -}; - class WritableMetricStorageHistogramTestFixture : public ::testing::TestWithParam {}; diff --git a/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc b/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc index f84bde7628..94bfc1a03d 100644 --- a/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc +++ b/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include "common.h" + #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" @@ -17,23 +19,6 @@ using namespace opentelemetry::common; using M = std::map; namespace nostd = opentelemetry::nostd; -class MockCollectorHandle : public CollectorHandle -{ -public: - MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {} - - ~MockCollectorHandle() override = default; - - AggregationTemporality GetAggregationTemporality( - InstrumentType /* instrument_type */) noexcept override - { - return temporality; - } - -private: - AggregationTemporality temporality; -}; - class WritableMetricStorageTestFixture : public ::testing::TestWithParam {};