Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ Increment the:
* [CONFIGURATION] File configuration - implement cardinality_limits
[#3820](https://github.com/open-telemetry/opentelemetry-cpp/pull/3820)

* [CONFIGURATION] File configuration - implement distribution
[#3833](https://github.com/open-telemetry/opentelemetry-cpp/pull/3833)

Breaking changes:

* [CONFIGURATION] File configuration - remove zipkin
Expand Down
2 changes: 2 additions & 0 deletions sdk/include/opentelemetry/sdk/configuration/configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <string>

#include "opentelemetry/sdk/configuration/attribute_limits_configuration.h"
#include "opentelemetry/sdk/configuration/distribution_configuration.h"
#include "opentelemetry/sdk/configuration/document.h"
#include "opentelemetry/sdk/configuration/logger_provider_configuration.h"
#include "opentelemetry/sdk/configuration/meter_provider_configuration.h"
Expand Down Expand Up @@ -75,6 +76,7 @@ class Configuration
std::unique_ptr<TracerProviderConfiguration> tracer_provider;
std::unique_ptr<ResourceConfiguration> resource;
// Ignored: instrumentation
std::unique_ptr<DistributionConfiguration> distribution;

private:
std::unique_ptr<Document> doc_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "opentelemetry/sdk/configuration/console_span_exporter_configuration.h"
#include "opentelemetry/sdk/configuration/default_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h"
#include "opentelemetry/sdk/configuration/distribution_configuration.h"
#include "opentelemetry/sdk/configuration/document.h"
#include "opentelemetry/sdk/configuration/document_node.h"
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
Expand Down Expand Up @@ -361,6 +362,9 @@ class ConfigurationParser
std::unique_ptr<ResourceConfiguration> ParseResourceConfiguration(
const std::unique_ptr<DocumentNode> &node) const;

std::unique_ptr<DistributionConfiguration> ParseDistributionConfiguration(
const std::unique_ptr<DocumentNode> &node) const;

std::unique_ptr<Configuration> Parse(std::unique_ptr<Document> doc);

private:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include <memory>
#include <string>

#include "opentelemetry/sdk/configuration/distribution_entry_configuration.h"
#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace configuration
{

class DistributionConfiguration
{
public:
std::vector<std::unique_ptr<DistributionEntryConfiguration>> entries;
};

} // namespace configuration
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include <memory>
#include <string>

#include "opentelemetry/sdk/configuration/document_node.h"
#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace configuration
{

class DistributionEntryConfiguration
{
public:
std::string name;
std::unique_ptr<DocumentNode> node;
};

} // namespace configuration
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
35 changes: 34 additions & 1 deletion sdk/src/configuration/configuration_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
#include "opentelemetry/sdk/configuration/console_span_exporter_configuration.h"
#include "opentelemetry/sdk/configuration/default_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h"
#include "opentelemetry/sdk/configuration/distribution_configuration.h"
#include "opentelemetry/sdk/configuration/distribution_entry_configuration.h"
#include "opentelemetry/sdk/configuration/document.h"
#include "opentelemetry/sdk/configuration/document_node.h"
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
Expand Down Expand Up @@ -2114,6 +2116,33 @@ std::unique_ptr<ResourceConfiguration> ConfigurationParser::ParseResourceConfigu
return model;
}

std::unique_ptr<DistributionConfiguration> ConfigurationParser::ParseDistributionConfiguration(
const std::unique_ptr<DocumentNode> &node) const
{
auto model = std::make_unique<DistributionConfiguration>();

for (auto it = node->begin(); it != node->end(); ++it)
{
std::unique_ptr<DocumentNode> child(*it);
std::string name = child->Key();

auto entry = std::make_unique<DistributionEntryConfiguration>();
entry->name = std::move(name);
entry->node = std::move(child);

model->entries.push_back(std::move(entry));
}

size_t count = model->entries.size();
if (count == 0)
{
std::string message("Illegal distribution, 0 entries");
throw InvalidSchemaException(node->Location(), message);
}

return model;
}

std::unique_ptr<Configuration> ConfigurationParser::Parse(std::unique_ptr<Document> doc)
{
std::unique_ptr<DocumentNode> node = doc->GetRootNode();
Expand Down Expand Up @@ -2199,7 +2228,11 @@ std::unique_ptr<Configuration> ConfigurationParser::Parse(std::unique_ptr<Docume

// FIXME: instrumentation/development

// FIXME: distribution
child = node->GetChildNode("distribution");
if (child)
{
model->distribution = ParseDistributionConfiguration(child);
}

return model;
}
Expand Down
4 changes: 2 additions & 2 deletions sdk/src/configuration/ryml_document_node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ DocumentNodeConstIterator RymlDocumentNode::begin() const
#ifdef WITH_DEBUG_NODE
DebugNode("::begin()", node_);

for (int index = 0; index < node_.num_children(); index++)
for (long unsigned int index = 0; index < node_.num_children(); index++)
{
DebugNode("(child)", node_[index]);
}
Expand Down Expand Up @@ -407,7 +407,7 @@ PropertiesNodeConstIterator RymlDocumentNode::begin_properties() const
#ifdef WITH_DEBUG_NODE
DebugNode("::begin_properties()", node_);

for (int index = 0; index < node_.num_children(); index++)
for (long unsigned int index = 0; index < node_.num_children(); index++)
{
DebugNode("(child)", node_[index]);
}
Expand Down
20 changes: 20 additions & 0 deletions sdk/test/configuration/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,23 @@ cc_test(
"@com_google_googletest//:gtest_main",
],
)

cc_test(
name = "yaml_distribution_test",
srcs = [
"yaml_distribution_test.cc",
],
tags = [
"test",
"yaml",
],
deps = [
"//api",
"//sdk:headers",
"//sdk/src/configuration",
"//sdk/src/logs",
"//sdk/src/metrics",
"//sdk/src/trace",
"@com_google_googletest//:gtest_main",
],
)
11 changes: 9 additions & 2 deletions sdk/test/configuration/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0

foreach(testname yaml_logs_test yaml_metrics_test yaml_propagator_test
yaml_resource_test yaml_test yaml_trace_test)
foreach(
testname
yaml_logs_test
yaml_metrics_test
yaml_propagator_test
yaml_resource_test
yaml_test
yaml_trace_test
yaml_distribution_test)
add_executable(${testname} "${testname}.cc")
target_link_libraries(${testname} ${GTEST_BOTH_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT} opentelemetry_configuration)
Expand Down
107 changes: 107 additions & 0 deletions sdk/test/configuration/yaml_distribution_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#include <gtest/gtest.h>
#include <memory>
#include <string>
#include <vector>

#include "opentelemetry/sdk/configuration/configuration.h"
#include "opentelemetry/sdk/configuration/distribution_configuration.h"
#include "opentelemetry/sdk/configuration/distribution_entry_configuration.h"
#include "opentelemetry/sdk/configuration/document_node.h"
#include "opentelemetry/sdk/configuration/yaml_configuration_parser.h"

static std::unique_ptr<opentelemetry::sdk::configuration::Configuration> DoParse(
const std::string &yaml)
{
static const std::string source("test");
return opentelemetry::sdk::configuration::YamlConfigurationParser::ParseString(source, yaml);
}

TEST(YamlTrace, empty_distribution)
{
std::string yaml = R"(
file_format: "1.0-distribution"
distribution:
)";

auto config = DoParse(yaml);
ASSERT_EQ(config, nullptr);
}

TEST(YamlTrace, one_empty_distribution)
{
std::string yaml = R"(
file_format: "1.0-distribution"
distribution:
acme_vendor:
)";

auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
auto *distribution = config->distribution.get();
ASSERT_NE(distribution, nullptr);
ASSERT_EQ(distribution->entries.size(), 1);
auto *entry = distribution->entries[0].get();
ASSERT_NE(entry, nullptr);
ASSERT_EQ(entry->name, "acme_vendor");
}

TEST(YamlTrace, many_distribution)
{
std::string yaml = R"(
file_format: "1.0-distribution"
distribution:
acme_vendor:
a: 12
b: 34
c: 56
other_vendor:
xxx: 111
yyy: 222
)";

auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
auto *distribution = config->distribution.get();
ASSERT_NE(distribution, nullptr);
ASSERT_EQ(distribution->entries.size(), 2);
opentelemetry::sdk::configuration::DocumentNode *node;
std::unique_ptr<opentelemetry::sdk::configuration::DocumentNode> property;
std::string name;

auto *entry_1 = distribution->entries[0].get();
ASSERT_NE(entry_1, nullptr);
ASSERT_EQ(entry_1->name, "acme_vendor");

node = entry_1->node.get();
ASSERT_NE(node, nullptr);
auto it = node->begin();
property = (*it);
ASSERT_NE(property, nullptr);
name = property->Key();
ASSERT_EQ(name, "a");
ASSERT_EQ(property->AsInteger(), 12);
++it;
property = (*it);
ASSERT_NE(property, nullptr);
name = property->Key();
ASSERT_EQ(name, "b");
ASSERT_EQ(property->AsInteger(), 34);
++it;
property = (*it);
ASSERT_NE(property, nullptr);
name = property->Key();
ASSERT_EQ(name, "c");
ASSERT_EQ(property->AsInteger(), 56);
++it;
ASSERT_EQ(node->end(), it);

auto *entry_2 = distribution->entries[1].get();
ASSERT_NE(entry_2, nullptr);
ASSERT_EQ(entry_2->name, "other_vendor");

node = entry_2->node.get();
ASSERT_NE(node, nullptr);
}
Loading