Skip to content

Commit

Permalink
Merge branch 'main' into fix_1603_and_add_otlp_metric_factory
Browse files Browse the repository at this point in the history
  • Loading branch information
lalitb authored Sep 12, 2022
2 parents 9580025 + 951768a commit 4581b85
Show file tree
Hide file tree
Showing 5 changed files with 342 additions and 3 deletions.
7 changes: 7 additions & 0 deletions .github/.codecov.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,12 @@ ignore:
- "docs/**/*"
- "docker/**/*"
- "examples/**/*"
- "bazel/**/*"
- "cmake/**/*"
- "buildscripts/**/*"
- "third_party/**/*"
- "tools/**/*"
- ".vscode/**/*"
- ".github/**/*"
- "**/test/**/*"
- "**.md"
20 changes: 18 additions & 2 deletions sdk/test/metrics/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,25 @@ cc_test(
)

cc_test(
name = "sync_metric_storage_test",
name = "sync_metric_storage_counter_test",
srcs = [
"sync_metric_storage_test.cc",
"sync_metric_storage_counter_test.cc",
],
tags = [
"metrics",
"test",
],
deps = [
"//sdk/src/metrics",
"//sdk/src/resource",
"@com_google_googletest//:gtest_main",
],
)

cc_test(
name = "sync_metric_storage_histogram_test",
srcs = [
"sync_metric_storage_histogram_test.cc",
],
tags = [
"metrics",
Expand Down
3 changes: 2 additions & 1 deletion sdk/test/metrics/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ foreach(
aggregation_test
attributes_processor_test
attributes_hashmap_test
sync_metric_storage_test
sync_metric_storage_counter_test
sync_metric_storage_histogram_test
async_metric_storage_test
multi_metric_storage_test
observer_result_test
Expand Down
315 changes: 315 additions & 0 deletions sdk/test/metrics/sync_metric_storage_histogram_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,315 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#include <memory>
#ifndef ENABLE_METRICS_PREVIEW
# include "opentelemetry/common/key_value_iterable_view.h"
# include "opentelemetry/nostd/shared_ptr.h"
# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h"
# include "opentelemetry/sdk/metrics/instruments.h"
# include "opentelemetry/sdk/metrics/state/sync_metric_storage.h"
# include "opentelemetry/sdk/metrics/view/attributes_processor.h"

# include <gtest/gtest.h>
# include <map>

using namespace opentelemetry::sdk::metrics;
using namespace opentelemetry::common;
using M = std::map<std::string, std::string>;
namespace nostd = opentelemetry::nostd;

class MockCollectorHandle : public CollectorHandle
{
public:
MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {}

AggregationTemporality GetAggregationTemporality(InstrumentType instrument_type) noexcept override
{
return temporality;
}

private:
AggregationTemporality temporality;
};

class WritableMetricStorageHistogramTestFixture
: public ::testing::TestWithParam<AggregationTemporality>
{};

TEST_P(WritableMetricStorageHistogramTestFixture, LongHistogram)
{
AggregationTemporality temporality = GetParam();
auto sdk_start_ts = std::chrono::system_clock::now();
long expected_total_get_requests = 0;
long expected_total_put_requests = 0;
InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kHistogram,
InstrumentValueType::kLong};
std::map<std::string, std::string> attributes_get = {{"RequestType", "GET"}};
std::map<std::string, std::string> attributes_put = {{"RequestType", "PUT"}};

std::unique_ptr<DefaultAttributesProcessor> default_attributes_processor{
new DefaultAttributesProcessor{}};
opentelemetry::sdk::metrics::SyncMetricStorage storage(
instr_desc, AggregationType::kHistogram, default_attributes_processor.get(),
NoExemplarReservoir::GetNoExemplarReservoir(),
std::shared_ptr<opentelemetry::sdk::metrics::AggregationConfig>{});

storage.RecordLong(10l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 10;

storage.RecordLong(30l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 30;

storage.RecordLong(20l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 20;

storage.RecordLong(40l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 40;

std::shared_ptr<CollectorHandle> collector(new MockCollectorHandle(temporality));
std::vector<std::shared_ptr<CollectorHandle>> collectors;
collectors.push_back(collector);

// Some computation here
auto collection_ts = std::chrono::system_clock::now();
size_t count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_get_requests);
count_attributes++;
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_put_requests);
count_attributes++;
}
}
return true;
});
EXPECT_EQ(count_attributes, 2); // GET and PUT
// In case of delta temporarily, subsequent collection would contain new data points, so resetting
// the counts
if (temporality == AggregationTemporality::kDelta)
{
expected_total_get_requests = 0;
expected_total_put_requests = 0;
}

// collect one more time.
collection_ts = std::chrono::system_clock::now();
count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
count_attributes++;
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_get_requests);
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
count_attributes++;
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_put_requests);
}
}
return true;
});
if (temporality == AggregationTemporality::kCumulative)
{
EXPECT_EQ(count_attributes, 2); // GET AND PUT
}

storage.RecordLong(50l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 50;
storage.RecordLong(40l, KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 40;

collection_ts = std::chrono::system_clock::now();
count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_get_requests);
count_attributes++;
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
EXPECT_EQ(opentelemetry::nostd::get<long>(data.sum_), expected_total_put_requests);
count_attributes++;
}
}
return true;
});
EXPECT_EQ(count_attributes, 2); // GET and PUT
}

INSTANTIATE_TEST_SUITE_P(WritableMetricStorageHistogramTestLong,
WritableMetricStorageHistogramTestFixture,
::testing::Values(AggregationTemporality::kCumulative,
AggregationTemporality::kDelta));

TEST_P(WritableMetricStorageHistogramTestFixture, DoubleHistogram)
{
AggregationTemporality temporality = GetParam();
auto sdk_start_ts = std::chrono::system_clock::now();
double expected_total_get_requests = 0;
double expected_total_put_requests = 0;
InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kHistogram,
InstrumentValueType::kDouble};
std::map<std::string, std::string> attributes_get = {{"RequestType", "GET"}};
std::map<std::string, std::string> attributes_put = {{"RequestType", "PUT"}};

std::unique_ptr<DefaultAttributesProcessor> default_attributes_processor{
new DefaultAttributesProcessor{}};
opentelemetry::sdk::metrics::SyncMetricStorage storage(
instr_desc, AggregationType::kHistogram, default_attributes_processor.get(),
NoExemplarReservoir::GetNoExemplarReservoir(),
std::shared_ptr<opentelemetry::sdk::metrics::AggregationConfig>{});

storage.RecordDouble(10.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 10;

storage.RecordDouble(30.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 30;

storage.RecordDouble(20.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 20;

storage.RecordDouble(40.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 40;

std::shared_ptr<CollectorHandle> collector(new MockCollectorHandle(temporality));
std::vector<std::shared_ptr<CollectorHandle>> collectors;
collectors.push_back(collector);

// Some computation here
auto collection_ts = std::chrono::system_clock::now();
size_t count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_get_requests);
count_attributes++;
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_put_requests);
count_attributes++;
}
}
return true;
});
EXPECT_EQ(count_attributes, 2); // GET and PUT

// In case of delta temporarily, subsequent collection would contain new data points, so resetting
// the counts
if (temporality == AggregationTemporality::kDelta)
{
expected_total_get_requests = 0;
expected_total_put_requests = 0;
}

// collect one more time.
collection_ts = std::chrono::system_clock::now();
count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
count_attributes++;
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_get_requests);
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
count_attributes++;
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_put_requests);
}
}
return true;
});
if (temporality == AggregationTemporality::kCumulative)
{
EXPECT_EQ(count_attributes, 2); // GET AND PUT
}

storage.RecordDouble(50.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_get),
opentelemetry::context::Context{});
expected_total_get_requests += 50;
storage.RecordDouble(40.0,
KeyValueIterableView<std::map<std::string, std::string>>(attributes_put),
opentelemetry::context::Context{});
expected_total_put_requests += 40;

collection_ts = std::chrono::system_clock::now();
count_attributes = 0;
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<HistogramPointData>(data_attr.point_data);
if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "GET")
{
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_get_requests);
count_attributes++;
}
else if (opentelemetry::nostd::get<std::string>(
data_attr.attributes.find("RequestType")->second) == "PUT")
{
EXPECT_EQ(opentelemetry::nostd::get<double>(data.sum_), expected_total_put_requests);
count_attributes++;
}
}
return true;
});
EXPECT_EQ(count_attributes, 2); // GET and PUT
}
INSTANTIATE_TEST_SUITE_P(WritableMetricStorageHistogramTestDouble,
WritableMetricStorageHistogramTestFixture,
::testing::Values(AggregationTemporality::kCumulative,
AggregationTemporality::kDelta));

#endif

0 comments on commit 4581b85

Please sign in to comment.