From 79a9471f5c6462cf5d013331e91f25455f824cd2 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Thu, 6 Oct 2022 10:31:14 -0700 Subject: [PATCH] Fix observable Gauge metrics generation (#1651) --- .../aggregation/lastvalue_aggregation.cc | 10 +- sdk/test/metrics/async_metric_storage_test.cc | 122 ++++++++++++------ 2 files changed, 88 insertions(+), 44 deletions(-) diff --git a/sdk/src/metrics/aggregation/lastvalue_aggregation.cc b/sdk/src/metrics/aggregation/lastvalue_aggregation.cc index cbcce248a22..d12d393831d 100644 --- a/sdk/src/metrics/aggregation/lastvalue_aggregation.cc +++ b/sdk/src/metrics/aggregation/lastvalue_aggregation.cc @@ -34,6 +34,7 @@ void LongLastValueAggregation::Aggregate(long value, const std::lock_guard locked(lock_); point_data_.is_lastvalue_valid_ = true; point_data_.value_ = value; + point_data_.sample_ts_ = std::chrono::system_clock::now(); } std::unique_ptr LongLastValueAggregation::Merge( @@ -93,6 +94,7 @@ void DoubleLastValueAggregation::Aggregate(double value, const std::lock_guard locked(lock_); point_data_.is_lastvalue_valid_ = true; point_data_.value_ = value; + point_data_.sample_ts_ = std::chrono::system_clock::now(); } std::unique_ptr DoubleLastValueAggregation::Merge( @@ -102,12 +104,12 @@ std::unique_ptr DoubleLastValueAggregation::Merge( nostd::get(delta.ToPoint()).sample_ts_.time_since_epoch()) { LastValuePointData merge_data = std::move(nostd::get(ToPoint())); - return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); + return std::unique_ptr(new DoubleLastValueAggregation(std::move(merge_data))); } else { LastValuePointData merge_data = std::move(nostd::get(delta.ToPoint())); - return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); + return std::unique_ptr(new DoubleLastValueAggregation(std::move(merge_data))); } } @@ -118,12 +120,12 @@ std::unique_ptr DoubleLastValueAggregation::Diff( nostd::get(next.ToPoint()).sample_ts_.time_since_epoch()) { LastValuePointData diff_data = std::move(nostd::get(ToPoint())); - return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + return std::unique_ptr(new DoubleLastValueAggregation(std::move(diff_data))); } else { LastValuePointData diff_data = std::move(nostd::get(next.ToPoint())); - return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + return std::unique_ptr(new DoubleLastValueAggregation(std::move(diff_data))); } } diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index 7e5024bf1c0..74fff4661d3 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -46,49 +46,12 @@ class MockCollectorHandle : public CollectorHandle class WritableMetricStorageTestFixture : public ::testing::TestWithParam {}; -class MeasurementFetcher -{ -public: - static void Fetcher(opentelemetry::metrics::ObserverResult observer_result, void * /*state*/) - { - fetch_count++; - if (fetch_count == 1) - { - opentelemetry::nostd::get<0>(observer_result)->Observe(20l, {{"RequestType", "GET"}}); - opentelemetry::nostd::get<0>(observer_result)->Observe(10l, {{"RequestType", "PUT"}}); - number_of_get += 20l; - number_of_put += 10l; - } - else if (fetch_count == 2) - { - opentelemetry::nostd::get<0>(observer_result)->Observe(40l, {{"RequestType", "GET"}}); - opentelemetry::nostd::get<0>(observer_result)->Observe(20l, {{"RequestType", "PUT"}}); - number_of_get += 40l; - number_of_put += 20l; - } - } - - static void init_values() - { - fetch_count = 0; - number_of_get = 0; - number_of_put = 0; - } - - static size_t fetch_count; - static long number_of_get; - static long number_of_put; - static const size_t number_of_attributes = 2; -}; - -size_t MeasurementFetcher::fetch_count; -long MeasurementFetcher::number_of_get; -long MeasurementFetcher::number_of_put; -const size_t MeasurementFetcher::number_of_attributes; +class WritableMetricStorageTestObservableGaugeFixture + : public ::testing::TestWithParam +{}; TEST_P(WritableMetricStorageTestFixture, TestAggregation) { - MeasurementFetcher::init_values(); AggregationTemporality temporality = GetParam(); InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kObservableCounter, @@ -180,4 +143,83 @@ INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestLong, ::testing::Values(AggregationTemporality::kCumulative, AggregationTemporality::kDelta)); +TEST_P(WritableMetricStorageTestObservableGaugeFixture, TestAggregation) +{ + AggregationTemporality temporality = GetParam(); + + InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kObservableGauge, + InstrumentValueType::kLong}; + + auto sdk_start_ts = std::chrono::system_clock::now(); + // Some computation here + auto collection_ts = std::chrono::system_clock::now() + std::chrono::seconds(5); + + std::shared_ptr collector(new MockCollectorHandle(temporality)); + std::vector> collectors; + collectors.push_back(collector); + + std::unique_ptr default_attributes_processor{ + new DefaultAttributesProcessor{}}; + opentelemetry::sdk::metrics::AsyncMetricStorage storage( + instr_desc, AggregationType::kLastValue, default_attributes_processor.get(), + std::shared_ptr{}); + long freq_cpu0 = 3l; + long freq_cpu1 = 5l; + size_t attribute_count = 2; + std::unordered_map measurements1 = { + {{{"CPU", "0"}}, freq_cpu0}, {{{"CPU", "1"}}, freq_cpu1}}; + storage.RecordLong(measurements1, + opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now())); + + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get(data_attr.attributes.find("CPU")->second) == + "0") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), freq_cpu0); + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("CPU")->second) == "1") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), freq_cpu1); + } + } + return true; + }); + + freq_cpu0 = 6l; + freq_cpu1 = 8l; + + std::unordered_map measurements2 = { + {{{"CPU", "0"}}, freq_cpu0}, {{{"CPU", "1"}}, freq_cpu1}}; + storage.RecordLong(measurements2, + opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now())); + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get(data_attr.attributes.find("CPU")->second) == + "0") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), freq_cpu0); + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("CPU")->second) == "1") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), freq_cpu1); + } + } + return true; + }); +} + +INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestObservableGaugeFixtureLong, + WritableMetricStorageTestObservableGaugeFixture, + ::testing::Values(AggregationTemporality::kCumulative, + AggregationTemporality::kDelta)); + #endif