1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
4 #ifndef ENABLE_METRICS_PREVIEW
5 # include "opentelemetry/sdk/metrics/state/async_metric_storage.h"
6 # include "opentelemetry/common/key_value_iterable_view.h"
7 # include "opentelemetry/sdk/metrics/instruments.h"
8 # include "opentelemetry/sdk/metrics/meter_context.h"
9 # include "opentelemetry/sdk/metrics/metric_exporter.h"
10 # include "opentelemetry/sdk/metrics/metric_reader.h"
11 # include "opentelemetry/sdk/metrics/observer_result.h"
12 # include "opentelemetry/sdk/metrics/state/metric_collector.h"
14 # include <gtest/gtest.h>
17 using namespace opentelemetry::sdk::metrics
;
18 using namespace opentelemetry::sdk::instrumentationlibrary
;
19 using namespace opentelemetry::sdk::resource
;
21 using namespace opentelemetry::sdk::metrics
;
22 using namespace opentelemetry::common
;
23 using M
= std::map
<std::string
, std::string
>;
25 class MockCollectorHandle
: public CollectorHandle
28 MockCollectorHandle(AggregationTemporality temp
) : temporality(temp
) {}
30 AggregationTemporality
GetAggregationTemporality() noexcept override
{ return temporality
; }
33 AggregationTemporality temporality
;
36 class WritableMetricStorageTestFixture
: public ::testing::TestWithParam
<AggregationTemporality
>
39 class MeasurementFetcher
42 static void Fetcher(opentelemetry::metrics::ObserverResult
<long> &observer_result
,
48 observer_result
.Observe(20l, {{"RequestType", "GET"}});
49 observer_result
.Observe(10l, {{"RequestType", "PUT"}});
53 else if (fetch_count
== 2)
55 observer_result
.Observe(40l, {{"RequestType", "GET"}});
56 observer_result
.Observe(20l, {{"RequestType", "PUT"}});
62 static void init_values()
69 static size_t fetch_count
;
70 static long number_of_get
;
71 static long number_of_put
;
72 static const size_t number_of_attributes
= 2; // GET , PUT
75 size_t MeasurementFetcher::fetch_count
;
76 long MeasurementFetcher::number_of_get
;
77 long MeasurementFetcher::number_of_put
;
78 const size_t MeasurementFetcher::number_of_attributes
;
80 TEST_P(WritableMetricStorageTestFixture
, TestAggregation
)
82 MeasurementFetcher::init_values();
83 AggregationTemporality temporality
= GetParam();
85 InstrumentDescriptor instr_desc
= {"name", "desc", "1unit", InstrumentType::kObservableCounter
,
86 InstrumentValueType::kLong
};
88 auto sdk_start_ts
= std::chrono::system_clock::now();
89 // Some computation here
90 auto collection_ts
= std::chrono::system_clock::now() + std::chrono::seconds(5);
92 std::shared_ptr
<CollectorHandle
> collector(new MockCollectorHandle(temporality
));
93 std::vector
<std::shared_ptr
<CollectorHandle
>> collectors
;
94 collectors
.push_back(collector
);
95 size_t count_attributes
= 0;
98 MeasurementFetcher measurement_fetcher
;
99 opentelemetry::sdk::metrics::AsyncMetricStorage
<long> storage(instr_desc
, AggregationType::kSum
,
100 MeasurementFetcher::Fetcher
,
101 new DefaultAttributesProcessor());
103 storage
.Collect(collector
.get(), collectors
, sdk_start_ts
, collection_ts
,
104 [&](const MetricData data
) {
105 for (auto data_attr
: data
.point_data_attr_
)
107 auto data
= opentelemetry::nostd::get
<SumPointData
>(data_attr
.point_data
);
108 if (opentelemetry::nostd::get
<std::string
>(
109 data_attr
.attributes
.find("RequestType")->second
) == "GET")
111 EXPECT_EQ(opentelemetry::nostd::get
<long>(data
.value_
),
112 MeasurementFetcher::number_of_get
);
114 else if (opentelemetry::nostd::get
<std::string
>(
115 data_attr
.attributes
.find("RequestType")->second
) == "PUT")
117 EXPECT_EQ(opentelemetry::nostd::get
<long>(data
.value_
),
118 MeasurementFetcher::number_of_put
);
124 EXPECT_EQ(MeasurementFetcher::number_of_attributes
, count_attributes
);
127 INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestLong
,
128 WritableMetricStorageTestFixture
,
129 ::testing::Values(AggregationTemporality::kCumulative
,
130 AggregationTemporality::kDelta
));