Skip to content

Commit dbd0680

Browse files
authored
[CONFIGURATION] File configuration - spec version 1.0.0-rc1 (#3557)
1 parent fdee87f commit dbd0680

File tree

8 files changed

+465
-15
lines changed

8 files changed

+465
-15
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
#include <string>
8+
9+
#include "opentelemetry/sdk/configuration/document_node.h"
10+
#include "opentelemetry/sdk/configuration/metric_producer_configuration.h"
11+
#include "opentelemetry/sdk/configuration/metric_producer_configuration_visitor.h"
12+
#include "opentelemetry/version.h"
13+
14+
OPENTELEMETRY_BEGIN_NAMESPACE
15+
namespace sdk
16+
{
17+
namespace configuration
18+
{
19+
20+
class ExtensionMetricProducerConfiguration : public MetricProducerConfiguration
21+
{
22+
public:
23+
void Accept(MetricProducerConfigurationVisitor *visitor) const override
24+
{
25+
visitor->VisitExtension(this);
26+
}
27+
28+
std::string name;
29+
std::unique_ptr<DocumentNode> node;
30+
};
31+
32+
} // namespace configuration
33+
} // namespace sdk
34+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/version.h"
7+
8+
OPENTELEMETRY_BEGIN_NAMESPACE
9+
namespace sdk
10+
{
11+
namespace configuration
12+
{
13+
14+
class OpenCensusMetricProducerConfiguration;
15+
class ExtensionMetricProducerConfiguration;
16+
17+
class MetricProducerConfigurationVisitor
18+
{
19+
public:
20+
MetricProducerConfigurationVisitor() = default;
21+
MetricProducerConfigurationVisitor(MetricProducerConfigurationVisitor &&) = default;
22+
MetricProducerConfigurationVisitor(const MetricProducerConfigurationVisitor &) = default;
23+
MetricProducerConfigurationVisitor &operator=(MetricProducerConfigurationVisitor &&) = default;
24+
MetricProducerConfigurationVisitor &operator=(const MetricProducerConfigurationVisitor &other) =
25+
default;
26+
virtual ~MetricProducerConfigurationVisitor() = default;
27+
28+
virtual void VisitOpenCensus(const OpenCensusMetricProducerConfiguration *model) = 0;
29+
virtual void VisitExtension(const ExtensionMetricProducerConfiguration *model) = 0;
30+
};
31+
32+
} // namespace configuration
33+
} // namespace sdk
34+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <string>
7+
8+
#include "opentelemetry/sdk/configuration/metric_producer_configuration.h"
9+
#include "opentelemetry/sdk/configuration/metric_producer_configuration_visitor.h"
10+
#include "opentelemetry/version.h"
11+
12+
OPENTELEMETRY_BEGIN_NAMESPACE
13+
namespace sdk
14+
{
15+
namespace configuration
16+
{
17+
18+
// YAML-SCHEMA: schema/meter_provider.json
19+
// YAML-NODE: OpenCensusMetricProducer
20+
class OpenCensusMetricProducerConfiguration : public MetricProducerConfiguration
21+
{
22+
public:
23+
void Accept(MetricProducerConfigurationVisitor *visitor) const override
24+
{
25+
visitor->VisitOpenCensus(this);
26+
}
27+
};
28+
29+
} // namespace configuration
30+
} // namespace sdk
31+
OPENTELEMETRY_END_NAMESPACE

sdk/include/opentelemetry/sdk/configuration/propagator_configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class PropagatorConfiguration
2020
{
2121
public:
2222
std::vector<std::string> composite;
23+
std::string composite_list;
2324
};
2425

2526
} // namespace configuration

sdk/src/configuration/configuration_parser.cc

Lines changed: 110 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
3838
#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h"
3939
#include "opentelemetry/sdk/configuration/extension_log_record_processor_configuration.h"
40+
#include "opentelemetry/sdk/configuration/extension_metric_producer_configuration.h"
4041
#include "opentelemetry/sdk/configuration/extension_pull_metric_exporter_configuration.h"
4142
#include "opentelemetry/sdk/configuration/extension_push_metric_exporter_configuration.h"
4243
#include "opentelemetry/sdk/configuration/extension_sampler_configuration.h"
@@ -55,7 +56,9 @@
5556
#include "opentelemetry/sdk/configuration/log_record_processor_configuration.h"
5657
#include "opentelemetry/sdk/configuration/logger_provider_configuration.h"
5758
#include "opentelemetry/sdk/configuration/meter_provider_configuration.h"
59+
#include "opentelemetry/sdk/configuration/metric_producer_configuration.h"
5860
#include "opentelemetry/sdk/configuration/metric_reader_configuration.h"
61+
#include "opentelemetry/sdk/configuration/open_census_metric_producer_configuration.h"
5962
#include "opentelemetry/sdk/configuration/otlp_file_log_record_exporter_configuration.h"
6063
#include "opentelemetry/sdk/configuration/otlp_file_push_metric_exporter_configuration.h"
6164
#include "opentelemetry/sdk/configuration/otlp_file_span_exporter_configuration.h"
@@ -691,7 +694,7 @@ static std::unique_ptr<PullMetricExporterConfiguration> ParsePullMetricExporterC
691694
throw InvalidSchemaException(message);
692695
}
693696

694-
if (name == "prometheus")
697+
if (name == "prometheus/development")
695698
{
696699
model = ParsePrometheusPullMetricExporterConfiguration(child);
697700
}
@@ -703,6 +706,61 @@ static std::unique_ptr<PullMetricExporterConfiguration> ParsePullMetricExporterC
703706
return model;
704707
}
705708

709+
static std::unique_ptr<OpenCensusMetricProducerConfiguration>
710+
ParseOpenCensusMetricProducerConfiguration(const std::unique_ptr<DocumentNode> & /* node */)
711+
{
712+
auto model = std::make_unique<OpenCensusMetricProducerConfiguration>();
713+
714+
return model;
715+
}
716+
717+
static std::unique_ptr<ExtensionMetricProducerConfiguration>
718+
ParseExtensionMetricProducerConfiguration(const std::string &name,
719+
std::unique_ptr<DocumentNode> node)
720+
{
721+
auto model = std::make_unique<ExtensionMetricProducerConfiguration>();
722+
723+
model->name = name;
724+
model->node = std::move(node);
725+
726+
return model;
727+
}
728+
729+
static std::unique_ptr<MetricProducerConfiguration> ParseMetricProducerConfiguration(
730+
const std::unique_ptr<DocumentNode> &node)
731+
{
732+
std::unique_ptr<MetricProducerConfiguration> model;
733+
734+
std::string name;
735+
std::unique_ptr<DocumentNode> child;
736+
size_t count = 0;
737+
738+
for (auto it = node->begin_properties(); it != node->end_properties(); ++it)
739+
{
740+
name = it.Name();
741+
child = it.Value();
742+
count++;
743+
}
744+
745+
if (count != 1)
746+
{
747+
std::string message("Illegal metric producer, properties count: ");
748+
message.append(std::to_string(count));
749+
throw InvalidSchemaException(message);
750+
}
751+
752+
if (name == "opencensus")
753+
{
754+
model = ParseOpenCensusMetricProducerConfiguration(child);
755+
}
756+
else
757+
{
758+
model = ParseExtensionMetricProducerConfiguration(name, std::move(child));
759+
}
760+
761+
return model;
762+
}
763+
706764
static std::unique_ptr<PeriodicMetricReaderConfiguration> ParsePeriodicMetricReaderConfiguration(
707765
const std::unique_ptr<DocumentNode> &node)
708766
{
@@ -715,6 +773,16 @@ static std::unique_ptr<PeriodicMetricReaderConfiguration> ParsePeriodicMetricRea
715773
child = node->GetRequiredChildNode("exporter");
716774
model->exporter = ParsePushMetricExporterConfiguration(child);
717775

776+
child = node->GetChildNode("producers");
777+
778+
if (child)
779+
{
780+
for (auto it = child->begin(); it != child->end(); ++it)
781+
{
782+
model->producers.push_back(ParseMetricProducerConfiguration(*it));
783+
}
784+
}
785+
718786
return model;
719787
}
720788

@@ -727,6 +795,16 @@ static std::unique_ptr<PullMetricReaderConfiguration> ParsePullMetricReaderConfi
727795
child = node->GetRequiredChildNode("exporter");
728796
model->exporter = ParsePullMetricExporterConfiguration(child);
729797

798+
child = node->GetChildNode("producers");
799+
800+
if (child)
801+
{
802+
for (auto it = child->begin(); it != child->end(); ++it)
803+
{
804+
model->producers.push_back(ParseMetricProducerConfiguration(*it));
805+
}
806+
}
807+
730808
return model;
731809
}
732810

@@ -1031,17 +1109,41 @@ static std::unique_ptr<PropagatorConfiguration> ParsePropagatorConfiguration(
10311109
auto model = std::make_unique<PropagatorConfiguration>();
10321110

10331111
std::unique_ptr<DocumentNode> child;
1034-
child = node->GetRequiredChildNode("composite");
1112+
child = node->GetChildNode("composite");
1113+
std::string name;
1114+
int num_child = 0;
10351115

1036-
for (auto it = child->begin(); it != child->end(); ++it)
1116+
if (child)
10371117
{
1038-
std::unique_ptr<DocumentNode> element(*it);
1039-
1040-
std::string name = element->AsString();
1041-
1042-
model->composite.push_back(name);
1118+
for (auto it = child->begin(); it != child->end(); ++it)
1119+
{
1120+
// This is an entry in the composite array
1121+
std::unique_ptr<DocumentNode> element(*it);
1122+
num_child++;
1123+
int count = 0;
1124+
1125+
// Find out its name, we expect an object with a unique property.
1126+
for (auto it2 = element->begin_properties(); it2 != element->end_properties(); ++it2)
1127+
{
1128+
name = it2.Name();
1129+
count++;
1130+
}
1131+
1132+
if (count != 1)
1133+
{
1134+
std::string message("Illegal composite child ");
1135+
message.append(std::to_string(num_child));
1136+
message.append(", properties count: ");
1137+
message.append(std::to_string(count));
1138+
throw InvalidSchemaException(message);
1139+
}
1140+
1141+
model->composite.push_back(name);
1142+
}
10431143
}
10441144

1145+
model->composite_list = node->GetString("composite_list", "");
1146+
10451147
return model;
10461148
}
10471149

sdk/src/configuration/sdk_builder.cc

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,21 +1061,87 @@ SdkBuilder::CreateTextMapPropagator(const std::string &name) const
10611061
throw UnsupportedException(die);
10621062
}
10631063

1064+
static bool IsDuplicate(const std::vector<std::string> &propagator_seen, const std::string &name)
1065+
{
1066+
bool duplicate = false;
1067+
for (const auto &seen : propagator_seen)
1068+
{
1069+
if (name == seen)
1070+
{
1071+
duplicate = true;
1072+
}
1073+
}
1074+
1075+
return duplicate;
1076+
}
1077+
10641078
std::unique_ptr<opentelemetry::context::propagation::TextMapPropagator>
10651079
SdkBuilder::CreatePropagator(
10661080
const std::unique_ptr<opentelemetry::sdk::configuration::PropagatorConfiguration> &model) const
10671081
{
1082+
std::unique_ptr<opentelemetry::context::propagation::CompositePropagator> sdk;
10681083
std::vector<std::unique_ptr<opentelemetry::context::propagation::TextMapPropagator>> propagators;
10691084
std::unique_ptr<opentelemetry::context::propagation::TextMapPropagator> propagator;
1085+
std::vector<std::string> propagator_seen;
1086+
bool duplicate = false;
1087+
1088+
/*
1089+
* Note that the spec only requires to check duplicates between
1090+
* composite and composite_list.
1091+
* Here we check for duplicates globally, for ease of use.
1092+
*/
10701093

10711094
for (const auto &name : model->composite)
10721095
{
1073-
propagator = CreateTextMapPropagator(name);
1074-
propagators.push_back(std::move(propagator));
1096+
duplicate = IsDuplicate(propagator_seen, name);
1097+
1098+
if (!duplicate)
1099+
{
1100+
propagator = CreateTextMapPropagator(name);
1101+
propagators.push_back(std::move(propagator));
1102+
propagator_seen.push_back(name);
1103+
}
10751104
}
10761105

1077-
auto sdk = std::make_unique<opentelemetry::context::propagation::CompositePropagator>(
1078-
std::move(propagators));
1106+
if (model->composite_list.size() > 0)
1107+
{
1108+
std::string str_list = model->composite_list;
1109+
size_t start_pos = 0;
1110+
size_t end_pos = 0;
1111+
char separator = ',';
1112+
std::string name;
1113+
1114+
while ((end_pos = str_list.find(separator, start_pos)) != std::string::npos)
1115+
{
1116+
name = str_list.substr(start_pos, end_pos - start_pos);
1117+
1118+
duplicate = IsDuplicate(propagator_seen, name);
1119+
1120+
if (!duplicate)
1121+
{
1122+
propagator = CreateTextMapPropagator(name);
1123+
propagators.push_back(std::move(propagator));
1124+
propagator_seen.push_back(name);
1125+
}
1126+
start_pos = end_pos + 1;
1127+
}
1128+
1129+
name = str_list.substr(start_pos);
1130+
1131+
duplicate = IsDuplicate(propagator_seen, name);
1132+
1133+
if (!duplicate)
1134+
{
1135+
propagator = CreateTextMapPropagator(name);
1136+
propagators.push_back(std::move(propagator));
1137+
}
1138+
}
1139+
1140+
if (propagators.size() > 0)
1141+
{
1142+
sdk = std::make_unique<opentelemetry::context::propagation::CompositePropagator>(
1143+
std::move(propagators));
1144+
}
10791145

10801146
return sdk;
10811147
}
@@ -1293,6 +1359,11 @@ std::unique_ptr<opentelemetry::sdk::metrics::MetricReader> SdkBuilder::CreatePer
12931359

12941360
auto exporter_sdk = CreatePushMetricExporter(model->exporter);
12951361

1362+
if (model->producers.size() > 0)
1363+
{
1364+
OTEL_INTERNAL_LOG_WARN("metric producer not supported, ignoring");
1365+
}
1366+
12961367
sdk = opentelemetry::sdk::metrics::PeriodicExportingMetricReaderFactory::Create(
12971368
std::move(exporter_sdk), options);
12981369

@@ -1306,6 +1377,11 @@ std::unique_ptr<opentelemetry::sdk::metrics::MetricReader> SdkBuilder::CreatePul
13061377

13071378
sdk = CreatePullMetricExporter(model->exporter);
13081379

1380+
if (model->producers.size() > 0)
1381+
{
1382+
OTEL_INTERNAL_LOG_WARN("metric producer not supported, ignoring");
1383+
}
1384+
13091385
return sdk;
13101386
}
13111387

0 commit comments

Comments
 (0)