Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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 @@ -48,6 +48,9 @@ Increment the:
* [CONFIGURATION] File configuration - implement distribution
[#3833](https://github.com/open-telemetry/opentelemetry-cpp/pull/3833)

* [CONFIGURATION] File configuration - exemplar filter
[#3837](https://github.com/open-telemetry/opentelemetry-cpp/pull/3837)

Breaking changes:

* [CONFIGURATION] File configuration - remove zipkin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
#include "opentelemetry/sdk/configuration/double_attribute_value_configuration.h"
#include "opentelemetry/sdk/configuration/drop_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h"
#include "opentelemetry/sdk/configuration/extension_log_record_processor_configuration.h"
Expand Down Expand Up @@ -227,6 +228,9 @@ class ConfigurationParser
InstrumentType ParseInstrumentType(const std::unique_ptr<DocumentNode> &node,
const std::string &name) const;

ExemplarFilter ParseExemplarFilter(const std::unique_ptr<DocumentNode> &node,
const std::string &name) const;

std::unique_ptr<ViewSelectorConfiguration> ParseViewSelectorConfiguration(
const std::unique_ptr<DocumentNode> &node) const;

Expand Down
27 changes: 27 additions & 0 deletions sdk/include/opentelemetry/sdk/configuration/exemplar_filter.h
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 <cstdint>

#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace configuration
{

// YAML-SCHEMA: schema/meter_provider.yaml
// YAML-NODE: ExemplarFilter
enum class ExemplarFilter : std::uint8_t
{
always_on,
always_off,
trace_based
};

} // namespace configuration
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <memory>
#include <vector>

#include "opentelemetry/sdk/configuration/exemplar_filter.h"
#include "opentelemetry/sdk/configuration/metric_reader_configuration.h"
#include "opentelemetry/sdk/configuration/view_configuration.h"
#include "opentelemetry/version.h"
Expand All @@ -16,14 +17,14 @@ namespace sdk
namespace configuration
{

// YAML-SCHEMA: schema/meter_provider.json
// YAML-SCHEMA: schema/meter_provider.yaml
// YAML-NODE: MeterProvider
class MeterProviderConfiguration
{
public:
std::vector<std::unique_ptr<MetricReaderConfiguration>> readers;
std::vector<std::unique_ptr<ViewConfiguration>> views;
// FIXME: exemplar_filter
ExemplarFilter exemplar_filter = ExemplarFilter::trace_based;
// FIXME: meter_configurator
};

Expand Down
32 changes: 31 additions & 1 deletion sdk/src/configuration/configuration_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "opentelemetry/sdk/configuration/double_array_attribute_value_configuration.h"
#include "opentelemetry/sdk/configuration/double_attribute_value_configuration.h"
#include "opentelemetry/sdk/configuration/drop_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/extension_log_record_exporter_configuration.h"
#include "opentelemetry/sdk/configuration/extension_log_record_processor_configuration.h"
Expand Down Expand Up @@ -1171,6 +1172,34 @@ InstrumentType ConfigurationParser::ParseInstrumentType(const std::unique_ptr<Do
throw InvalidSchemaException(node->Location(), message);
}

ExemplarFilter ConfigurationParser::ParseExemplarFilter(const std::unique_ptr<DocumentNode> &node,
const std::string &name) const
{
if (name == "")
{
return ExemplarFilter::trace_based;
}

if (name == "always_on")
{
return ExemplarFilter::always_on;
}

if (name == "always_off")
{
return ExemplarFilter::always_off;
}

if (name == "trace_based")
{
return ExemplarFilter::trace_based;
}

std::string message("Illegal exemplar filter: ");
message.append(name);
throw InvalidSchemaException(node->Location(), message);
}

std::unique_ptr<ViewSelectorConfiguration> ConfigurationParser::ParseViewSelectorConfiguration(
const std::unique_ptr<DocumentNode> &node) const
{
Expand Down Expand Up @@ -1384,7 +1413,8 @@ std::unique_ptr<MeterProviderConfiguration> ConfigurationParser::ParseMeterProvi
}
}

// FIXME: exemplar_filter
std::string exemplar_filter = node->GetString("exemplar_filter", "trace_based");
model->exemplar_filter = ParseExemplarFilter(node, exemplar_filter);

// FIXME: meter_configurator/development

Expand Down
39 changes: 39 additions & 0 deletions sdk/src/configuration/sdk_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@
#include "opentelemetry/sdk/logs/processor.h"
#include "opentelemetry/sdk/logs/simple_log_record_processor_factory.h"
#include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h"
#include "opentelemetry/sdk/metrics/exemplar/filter_type.h"
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_factory.h"
#include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader_options.h"
#include "opentelemetry/sdk/metrics/instruments.h"
Expand Down Expand Up @@ -1149,6 +1150,33 @@ static opentelemetry::sdk::metrics::InstrumentType ConvertInstrumentType(
return sdk;
}

#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW

static opentelemetry::sdk::metrics::ExemplarFilterType ConvertExemplarFilter(
enum opentelemetry::sdk::configuration::ExemplarFilter config)
{
opentelemetry::sdk::metrics::ExemplarFilterType sdk{
opentelemetry::sdk::metrics::ExemplarFilterType::kTraceBased};

switch (config)
{
case opentelemetry::sdk::configuration::ExemplarFilter::always_on:
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kAlwaysOn;
break;
case opentelemetry::sdk::configuration::ExemplarFilter::always_off:
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kAlwaysOff;
break;
case opentelemetry::sdk::configuration::ExemplarFilter::trace_based:
sdk = opentelemetry::sdk::metrics::ExemplarFilterType::kTraceBased;
break;
default:
break;
}

return sdk;
}
#endif /* ENABLE_METRICS_EXEMPLAR_PREVIEW */

std::unique_ptr<opentelemetry::sdk::metrics::PushMetricExporter>
SdkBuilder::CreateOtlpHttpPushMetricExporter(
const opentelemetry::sdk::configuration::OtlpHttpPushMetricExporterConfiguration *model) const
Expand Down Expand Up @@ -1500,6 +1528,17 @@ std::unique_ptr<opentelemetry::sdk::metrics::MeterProvider> SdkBuilder::CreateMe
meter_context->AddMetricReader(metric_reader);
}

#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW
auto sdk_exemplar_filter = ConvertExemplarFilter(model->exemplar_filter);
meter_context->SetExemplarFilter(sdk_exemplar_filter);
#else
/* Do not spam with warnings if disabled anyway. */
if (model->exemplar_filter != ExemplarFilter::always_off)
{
OTEL_INTERNAL_LOG_WARN("ENABLE_METRICS_EXEMPLAR_PREVIEW not set, ignoring exemplar filter");
}
#endif /* ENABLE_METRICS_EXEMPLAR_PREVIEW */

sdk = opentelemetry::sdk::metrics::MeterProviderFactory::Create(std::move(meter_context));

return sdk;
Expand Down
12 changes: 12 additions & 0 deletions sdk/test/configuration/yaml_metrics_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "opentelemetry/sdk/configuration/cardinality_limits_configuration.h"
#include "opentelemetry/sdk/configuration/configuration.h"
#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h"
#include "opentelemetry/sdk/configuration/exemplar_filter.h"
#include "opentelemetry/sdk/configuration/explicit_bucket_histogram_aggregation_configuration.h"
#include "opentelemetry/sdk/configuration/grpc_tls_configuration.h"
#include "opentelemetry/sdk/configuration/headers_configuration.h"
Expand Down Expand Up @@ -98,6 +99,8 @@ file_format: "1.0-metrics"
auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
ASSERT_NE(config->meter_provider, nullptr);
ASSERT_EQ(config->meter_provider->exemplar_filter,
opentelemetry::sdk::configuration::ExemplarFilter::trace_based);
ASSERT_EQ(config->meter_provider->readers.size(), 1);
auto *reader = config->meter_provider->readers[0].get();
ASSERT_NE(reader, nullptr);
Expand Down Expand Up @@ -133,11 +136,14 @@ file_format: "1.0-metrics"
observable_gauge: 600
observable_up_down_counter: 700
up_down_counter: 800
exemplar_filter: always_on
)";

auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
ASSERT_NE(config->meter_provider, nullptr);
ASSERT_EQ(config->meter_provider->exemplar_filter,
opentelemetry::sdk::configuration::ExemplarFilter::always_on);
ASSERT_EQ(config->meter_provider->readers.size(), 1);
auto *reader = config->meter_provider->readers[0].get();
ASSERT_NE(reader, nullptr);
Expand Down Expand Up @@ -170,11 +176,14 @@ file_format: "1.0-metrics"
- pull:
exporter:
prometheus/development:
exemplar_filter: always_off
)";

auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
ASSERT_NE(config->meter_provider, nullptr);
ASSERT_EQ(config->meter_provider->exemplar_filter,
opentelemetry::sdk::configuration::ExemplarFilter::always_off);
ASSERT_EQ(config->meter_provider->readers.size(), 1);
auto *reader = config->meter_provider->readers[0].get();
ASSERT_NE(reader, nullptr);
Expand Down Expand Up @@ -205,11 +214,14 @@ file_format: "1.0-metrics"
observable_gauge: 600
observable_up_down_counter: 700
up_down_counter: 800
exemplar_filter: trace_based
)";

auto config = DoParse(yaml);
ASSERT_NE(config, nullptr);
ASSERT_NE(config->meter_provider, nullptr);
ASSERT_EQ(config->meter_provider->exemplar_filter,
opentelemetry::sdk::configuration::ExemplarFilter::trace_based);
ASSERT_EQ(config->meter_provider->readers.size(), 1);
auto *reader = config->meter_provider->readers[0].get();
ASSERT_NE(reader, nullptr);
Expand Down
Loading