Skip to content

Commit ed3a275

Browse files
authored
[CONFIGURATION] File configuration - exemplar filter (open-telemetry#3837)
1 parent e5173e4 commit ed3a275

7 files changed

Lines changed: 123 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ Increment the:
4848
* [CONFIGURATION] File configuration - implement distribution
4949
[#3833](https://github.com/open-telemetry/opentelemetry-cpp/pull/3833)
5050

51+
* [CONFIGURATION] File configuration - exemplar filter
52+
[#3837](https://github.com/open-telemetry/opentelemetry-cpp/pull/3837)
53+
5154
Breaking changes:
5255

5356
* [CONFIGURATION] File configuration - remove zipkin

sdk/include/opentelemetry/sdk/configuration/configuration_parser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
3030
#include "opentelemetry/sdk/configuration/double_attribute_value_configuration.h"
3131
#include "opentelemetry/sdk/configuration/drop_aggregation_configuration.h"
32+
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
3233
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
3334
#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h"
3435
#include "opentelemetry/sdk/configuration/extension_log_record_processor_configuration.h"
@@ -227,6 +228,9 @@ class ConfigurationParser
227228
InstrumentType ParseInstrumentType(const std::unique_ptr<DocumentNode> &node,
228229
const std::string &name) const;
229230

231+
ExemplarFilter ParseExemplarFilter(const std::unique_ptr<DocumentNode> &node,
232+
const std::string &name) const;
233+
230234
std::unique_ptr<ViewSelectorConfiguration> ParseViewSelectorConfiguration(
231235
const std::unique_ptr<DocumentNode> &node) const;
232236

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <cstdint>
7+
8+
#include "opentelemetry/version.h"
9+
10+
OPENTELEMETRY_BEGIN_NAMESPACE
11+
namespace sdk
12+
{
13+
namespace configuration
14+
{
15+
16+
// YAML-SCHEMA: schema/meter_provider.yaml
17+
// YAML-NODE: ExemplarFilter
18+
enum class ExemplarFilter : std::uint8_t
19+
{
20+
always_on,
21+
always_off,
22+
trace_based
23+
};
24+
25+
} // namespace configuration
26+
} // namespace sdk
27+
OPENTELEMETRY_END_NAMESPACE

sdk/include/opentelemetry/sdk/configuration/meter_provider_configuration.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <memory>
77
#include <vector>
88

9+
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
910
#include "opentelemetry/sdk/configuration/metric_reader_configuration.h"
1011
#include "opentelemetry/sdk/configuration/view_configuration.h"
1112
#include "opentelemetry/version.h"
@@ -16,14 +17,14 @@ namespace sdk
1617
namespace configuration
1718
{
1819

19-
// YAML-SCHEMA: schema/meter_provider.json
20+
// YAML-SCHEMA: schema/meter_provider.yaml
2021
// YAML-NODE: MeterProvider
2122
class MeterProviderConfiguration
2223
{
2324
public:
2425
std::vector<std::unique_ptr<MetricReaderConfiguration>> readers;
2526
std::vector<std::unique_ptr<ViewConfiguration>> views;
26-
// FIXME: exemplar_filter
27+
ExemplarFilter exemplar_filter = ExemplarFilter::trace_based;
2728
// FIXME: meter_configurator
2829
};
2930

sdk/src/configuration/configuration_parser.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
3939
#include "opentelemetry/sdk/configuration/double_attribute_value_configuration.h"
4040
#include "opentelemetry/sdk/configuration/drop_aggregation_configuration.h"
41+
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
4142
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
4243
#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h"
4344
#include "opentelemetry/sdk/configuration/extension_log_record_processor_configuration.h"
@@ -1171,6 +1172,34 @@ InstrumentType ConfigurationParser::ParseInstrumentType(const std::unique_ptr<Do
11711172
throw InvalidSchemaException(node->Location(), message);
11721173
}
11731174

1175+
ExemplarFilter ConfigurationParser::ParseExemplarFilter(const std::unique_ptr<DocumentNode> &node,
1176+
const std::string &name) const
1177+
{
1178+
if (name == "")
1179+
{
1180+
return ExemplarFilter::trace_based;
1181+
}
1182+
1183+
if (name == "always_on")
1184+
{
1185+
return ExemplarFilter::always_on;
1186+
}
1187+
1188+
if (name == "always_off")
1189+
{
1190+
return ExemplarFilter::always_off;
1191+
}
1192+
1193+
if (name == "trace_based")
1194+
{
1195+
return ExemplarFilter::trace_based;
1196+
}
1197+
1198+
std::string message("Illegal exemplar filter: ");
1199+
message.append(name);
1200+
throw InvalidSchemaException(node->Location(), message);
1201+
}
1202+
11741203
std::unique_ptr<ViewSelectorConfiguration> ConfigurationParser::ParseViewSelectorConfiguration(
11751204
const std::unique_ptr<DocumentNode> &node) const
11761205
{
@@ -1384,7 +1413,8 @@ std::unique_ptr<MeterProviderConfiguration> ConfigurationParser::ParseMeterProvi
13841413
}
13851414
}
13861415

1387-
// FIXME: exemplar_filter
1416+
std::string exemplar_filter = node->GetString("exemplar_filter", "trace_based");
1417+
model->exemplar_filter = ParseExemplarFilter(node, exemplar_filter);
13881418

13891419
// FIXME: meter_configurator/development
13901420

sdk/src/configuration/sdk_builder.cc

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
#include "opentelemetry/sdk/logs/processor.h"
126126
#include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h"
127127
#include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h"
128+
#include "opentelemetry/sdk/metrics/exemplar/filter_type.h"
128129
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h"
129130
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h"
130131
#include "opentelemetry/sdk/metrics/instruments.h"
@@ -155,6 +156,10 @@
155156
#include "opentelemetry/sdk/trace/tracer_provider_factory.h"
156157
#include "opentelemetry/version.h"
157158

159+
#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW
160+
# include "opentelemetry/sdk/configuration/exemplar_filter.h"
161+
#endif
162+
158163
OPENTELEMETRY_BEGIN_NAMESPACE
159164
namespace sdk
160165
{
@@ -1149,6 +1154,33 @@ static opentelemetry::sdk::metrics::InstrumentType ConvertInstrumentType(
11491154
return sdk;
11501155
}
11511156

1157+
#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW
1158+
1159+
static opentelemetry::sdk::metrics::ExemplarFilterType ConvertExemplarFilter(
1160+
enum opentelemetry::sdk::configuration::ExemplarFilter config)
1161+
{
1162+
opentelemetry::sdk::metrics::ExemplarFilterType sdk{
1163+
opentelemetry::sdk::metrics::ExemplarFilterType::kTraceBased};
1164+
1165+
switch (config)
1166+
{
1167+
case opentelemetry::sdk::configuration::ExemplarFilter::always_on:
1168+
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kAlwaysOn;
1169+
break;
1170+
case opentelemetry::sdk::configuration::ExemplarFilter::always_off:
1171+
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kAlwaysOff;
1172+
break;
1173+
case opentelemetry::sdk::configuration::ExemplarFilter::trace_based:
1174+
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kTraceBased;
1175+
break;
1176+
default:
1177+
break;
1178+
}
1179+
1180+
return sdk;
1181+
}
1182+
#endif /* ENABLE_METRICS_EXEMPLAR_PREVIEW */
1183+
11521184
std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
11531185
SdkBuilder::CreateOtlpHttpPushMetricExporter(
11541186
const opentelemetry::sdk::configuration::OtlpHttpPushMetricExporterConfiguration *model) const
@@ -1500,6 +1532,17 @@ std::unique_ptr<opentelemetry::sdk::metrics::MeterProvider> SdkBuilder::CreateMe
15001532
meter_context->AddMetricReader(metric_reader);
15011533
}
15021534

1535+
#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW
1536+
auto sdk_exemplar_filter = ConvertExemplarFilter(model->exemplar_filter);
1537+
meter_context->SetExemplarFilter(sdk_exemplar_filter);
1538+
#else
1539+
/* Do not spam with warnings if disabled anyway. */
1540+
if (model->exemplar_filter != ExemplarFilter::always_off)
1541+
{
1542+
OTEL_INTERNAL_LOG_WARN("ENABLE_METRICS_EXEMPLAR_PREVIEW not set, ignoring exemplar filter");
1543+
}
1544+
#endif /* ENABLE_METRICS_EXEMPLAR_PREVIEW */
1545+
15031546
sdk = opentelemetry::sdk::metrics::MeterProviderFactory::Create(std::move(meter_context));
15041547

15051548
return sdk;

sdk/test/configuration/yaml_metrics_test.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "opentelemetry/sdk/configuration/cardinality_limits_configuration.h"
1212
#include "opentelemetry/sdk/configuration/configuration.h"
1313
#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h"
14+
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
1415
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
1516
#include "opentelemetry/sdk/configuration/grpc_tls_configuration.h"
1617
#include "opentelemetry/sdk/configuration/headers_configuration.h"
@@ -98,6 +99,8 @@ file_format: "1.0-metrics"
9899
auto config = DoParse(yaml);
99100
ASSERT_NE(config, nullptr);
100101
ASSERT_NE(config->meter_provider, nullptr);
102+
ASSERT_EQ(config->meter_provider->exemplar_filter,
103+
opentelemetry::sdk::configuration::ExemplarFilter::trace_based);
101104
ASSERT_EQ(config->meter_provider->readers.size(), 1);
102105
auto *reader = config->meter_provider->readers[0].get();
103106
ASSERT_NE(reader, nullptr);
@@ -133,11 +136,14 @@ file_format: "1.0-metrics"
133136
observable_gauge: 600
134137
observable_up_down_counter: 700
135138
up_down_counter: 800
139+
exemplar_filter: always_on
136140
)";
137141

138142
auto config = DoParse(yaml);
139143
ASSERT_NE(config, nullptr);
140144
ASSERT_NE(config->meter_provider, nullptr);
145+
ASSERT_EQ(config->meter_provider->exemplar_filter,
146+
opentelemetry::sdk::configuration::ExemplarFilter::always_on);
141147
ASSERT_EQ(config->meter_provider->readers.size(), 1);
142148
auto *reader = config->meter_provider->readers[0].get();
143149
ASSERT_NE(reader, nullptr);
@@ -170,11 +176,14 @@ file_format: "1.0-metrics"
170176
- pull:
171177
exporter:
172178
prometheus/development:
179+
exemplar_filter: always_off
173180
)";
174181

175182
auto config = DoParse(yaml);
176183
ASSERT_NE(config, nullptr);
177184
ASSERT_NE(config->meter_provider, nullptr);
185+
ASSERT_EQ(config->meter_provider->exemplar_filter,
186+
opentelemetry::sdk::configuration::ExemplarFilter::always_off);
178187
ASSERT_EQ(config->meter_provider->readers.size(), 1);
179188
auto *reader = config->meter_provider->readers[0].get();
180189
ASSERT_NE(reader, nullptr);
@@ -205,11 +214,14 @@ file_format: "1.0-metrics"
205214
observable_gauge: 600
206215
observable_up_down_counter: 700
207216
up_down_counter: 800
217+
exemplar_filter: trace_based
208218
)";
209219

210220
auto config = DoParse(yaml);
211221
ASSERT_NE(config, nullptr);
212222
ASSERT_NE(config->meter_provider, nullptr);
223+
ASSERT_EQ(config->meter_provider->exemplar_filter,
224+
opentelemetry::sdk::configuration::ExemplarFilter::trace_based);
213225
ASSERT_EQ(config->meter_provider->readers.size(), 1);
214226
auto *reader = config->meter_provider->readers[0].get();
215227
ASSERT_NE(reader, nullptr);

0 commit comments

Comments
 (0)