From 6f17c56757bde983c5de3d27786cedef84a5b55a Mon Sep 17 00:00:00 2001 From: om7057 Date: Mon, 27 Jul 2026 20:20:50 +0530 Subject: [PATCH 1/8] Fix histogram views rejected when only aggregation_cardinality_limit is set When a metrics view's stream configuration set aggregation_cardinality_limit without an explicit aggregation block, SdkBuilder::AddView() always built a plain AggregationConfig. For histogram (and base2 exponential histogram) instruments this mismatched the type ViewRegistry::AddView() expects for the instrument's default aggregation, so the whole view was silently rejected and the configured cardinality limit never took effect. AddView() now resolves the instrument's effective aggregation type (falling back to the instrument-derived default, same as ViewRegistry does) and constructs the matching AggregationConfig subclass before applying the cardinality limit. Follow-up to #4188, addressing review feedback left after that PR merged. --- sdk/src/configuration/sdk_builder.cc | 36 +++++++- sdk/test/configuration/sdk_builder_test.cc | 98 ++++++++++++++++++++++ 2 files changed, 132 insertions(+), 2 deletions(-) diff --git a/sdk/src/configuration/sdk_builder.cc b/sdk/src/configuration/sdk_builder.cc index 2568b49db..7d21f6e52 100644 --- a/sdk/src/configuration/sdk_builder.cc +++ b/sdk/src/configuration/sdk_builder.cc @@ -146,6 +146,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/aggregation/default_aggregation.h" #include "opentelemetry/sdk/metrics/cardinality_limits.h" #include "opentelemetry/sdk/metrics/exemplar/filter_type.h" #include "opentelemetry/sdk/metrics/export/metric_producer.h" @@ -1745,8 +1746,39 @@ void SdkBuilder::AddView( } else { - sdk_aggregation_config = std::make_shared( - stream->aggregation_cardinality_limit); + // No explicit `aggregation` block was configured, so the view falls back to the + // instrument's default aggregation. ViewRegistry::AddView() rejects a view whose + // AggregationConfig type does not match the (possibly instrument-derived) aggregation + // type, so the config created here must match that same default rather than always + // being a plain AggregationConfig (which only satisfies kSum/kLastValue/kDrop). + auto effective_aggregation_type = sdk_aggregation_type; + if (effective_aggregation_type == opentelemetry::sdk::metrics::AggregationType::kDefault) + { + bool is_monotonic{false}; + effective_aggregation_type = + opentelemetry::sdk::metrics::DefaultAggregation::GetDefaultAggregationType( + sdk_instrument_type, is_monotonic); + } + + switch (effective_aggregation_type) + { + case opentelemetry::sdk::metrics::AggregationType::kHistogram: + sdk_aggregation_config = + std::make_shared( + stream->aggregation_cardinality_limit); + break; + + case opentelemetry::sdk::metrics::AggregationType::kBase2ExponentialHistogram: + sdk_aggregation_config = std::make_shared< + opentelemetry::sdk::metrics::Base2ExponentialHistogramAggregationConfig>( + stream->aggregation_cardinality_limit); + break; + + default: + sdk_aggregation_config = std::make_shared( + stream->aggregation_cardinality_limit); + break; + } } } diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index 461f722df..32ed1f4a1 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -16,6 +16,7 @@ #include "opentelemetry/sdk/configuration/always_on_sampler_configuration.h" #include "opentelemetry/sdk/configuration/extension_push_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_push_metric_exporter_configuration.h" +#include "opentelemetry/sdk/configuration/instrument_type.h" #include "opentelemetry/sdk/configuration/logger_config_configuration.h" #include "opentelemetry/sdk/configuration/logger_configurator_configuration.h" #include "opentelemetry/sdk/configuration/logger_matcher_and_config_configuration.h" @@ -30,11 +31,18 @@ #include "opentelemetry/sdk/configuration/span_limits_configuration.h" #include "opentelemetry/sdk/configuration/trace_id_ratio_based_sampler_configuration.h" #include "opentelemetry/sdk/configuration/tracer_provider_configuration.h" +#include "opentelemetry/sdk/configuration/view_configuration.h" +#include "opentelemetry/sdk/configuration/view_selector_configuration.h" +#include "opentelemetry/sdk/configuration/view_stream_configuration.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger_config.h" +#include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" +#include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/metric_reader.h" +#include "opentelemetry/sdk/metrics/view/view.h" +#include "opentelemetry/sdk/metrics/view/view_registry.h" #include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/sdk/trace/sampler.h" #include "opentelemetry/sdk/trace/span_limits.h" @@ -260,3 +268,93 @@ TEST(SdkBuilder, CreatePeriodicMetricReader) EXPECT_EQ(captured->timeout, model.timeout); EXPECT_TRUE(captured->exporter != nullptr); } + +namespace +{ + +// Builds a ViewConfiguration selecting the given instrument type, with only +// aggregation_cardinality_limit set on the stream (no explicit `aggregation` block). +std::unique_ptr MakeCardinalityOnlyViewConfig( + config_sdk::InstrumentType instrument_type, + std::size_t cardinality_limit) +{ + auto model = std::make_unique(); + model->selector = std::make_unique(); + model->selector->instrument_type = instrument_type; + + model->stream = std::make_unique(); + model->stream->aggregation_cardinality_limit = cardinality_limit; + + return model; +} + +} // namespace + +TEST(SdkBuilder, AddViewHistogramCardinalityLimitOnly) +{ + namespace metrics_sdk = opentelemetry::sdk::metrics; + + auto model = MakeCardinalityOnlyViewConfig(config_sdk::InstrumentType::histogram, 42); + + auto registry = std::make_shared(); + config_sdk::SdkBuilder builder(registry); + + metrics_sdk::ViewRegistry view_registry; + builder.AddView(&view_registry, model); + + metrics_sdk::InstrumentDescriptor instrument_descriptor{ + "", "", "", metrics_sdk::InstrumentType::kHistogram, metrics_sdk::InstrumentValueType::kLong}; + auto instrumentation_scope = scope_sdk::InstrumentationScope::Create(""); + + int matched = 0; + view_registry.FindViews( + instrument_descriptor, *instrumentation_scope, [&](const metrics_sdk::View &view) { + matched++; + // The view must not be rejected: it should carry a + // HistogramAggregationConfig (not a plain AggregationConfig), since + // the instrument's default aggregation for kHistogram is kHistogram. + auto *aggregation_config = view.GetAggregationConfig(); + EXPECT_NE(aggregation_config, nullptr); + if (aggregation_config) + { + EXPECT_EQ(aggregation_config->GetType(), metrics_sdk::AggregationType::kHistogram); + EXPECT_EQ(aggregation_config->cardinality_limit_, 42u); + } + return true; + }); + + EXPECT_EQ(matched, 1); +} + +TEST(SdkBuilder, AddViewCounterCardinalityLimitOnly) +{ + namespace metrics_sdk = opentelemetry::sdk::metrics; + + auto model = MakeCardinalityOnlyViewConfig(config_sdk::InstrumentType::counter, 7); + + auto registry = std::make_shared(); + config_sdk::SdkBuilder builder(registry); + + metrics_sdk::ViewRegistry view_registry; + builder.AddView(&view_registry, model); + + metrics_sdk::InstrumentDescriptor instrument_descriptor{ + "", "", "", metrics_sdk::InstrumentType::kCounter, metrics_sdk::InstrumentValueType::kLong}; + auto instrumentation_scope = scope_sdk::InstrumentationScope::Create(""); + + int matched = 0; + view_registry.FindViews( + instrument_descriptor, *instrumentation_scope, [&](const metrics_sdk::View &view) { + matched++; + auto *aggregation_config = view.GetAggregationConfig(); + EXPECT_NE(aggregation_config, nullptr); + if (aggregation_config) + { + EXPECT_EQ(aggregation_config->GetType(), metrics_sdk::AggregationType::kDefault); + EXPECT_EQ(aggregation_config->cardinality_limit_, 7u); + } + return true; + }); + + EXPECT_EQ(matched, 1); +} From 6b87ec4ca510f0ff44e1314f053e992f9f93d65f Mon Sep 17 00:00:00 2001 From: om7057 Date: Mon, 27 Jul 2026 20:21:55 +0530 Subject: [PATCH 2/8] Add CHANGELOG entry for PR #4314 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d331510af..ba097a086 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,10 @@ Increment the: ## [Unreleased] +* [METRICS SDK] Fix histogram views being rejected when only + `aggregation_cardinality_limit` is set + [#4314](https://github.com/open-telemetry/opentelemetry-cpp/pull/4314) + * [CODE HEALTH] Move SDK trace and metrics test helpers into anonymous namespaces [#4303](https://github.com/open-telemetry/opentelemetry-cpp/pull/4303) From 2ae3755199223dd8edff54ca6bd42aba68c807bb Mon Sep 17 00:00:00 2001 From: om7057 Date: Mon, 27 Jul 2026 23:28:54 +0530 Subject: [PATCH 3/8] fix(metrics): add default_aggregation include to sdk_builder_test --- sdk/test/configuration/sdk_builder_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index 32ed1f4a1..849da4ed0 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -39,6 +39,7 @@ #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" +#include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/metric_reader.h" #include "opentelemetry/sdk/metrics/view/view.h" From c313e7f523bbb63fd4ea355bed728c3dc821e020 Mon Sep 17 00:00:00 2001 From: om7057 Date: Mon, 27 Jul 2026 23:35:48 +0530 Subject: [PATCH 4/8] test(metrics): add Base2ExponentialHistogram cardinality limit coverage --- sdk/test/configuration/sdk_builder_test.cc | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index 849da4ed0..0bf612e7c 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -359,3 +359,39 @@ TEST(SdkBuilder, AddViewCounterCardinalityLimitOnly) EXPECT_EQ(matched, 1); } + +TEST(SdkBuilder, AddViewBase2ExponentialHistogramCardinalityLimitOnly) +{ + namespace metrics_sdk = opentelemetry::sdk::metrics; + + auto model = MakeCardinalityOnlyViewConfig(config_sdk::InstrumentType::base2_exponential_histogram, + 123); + + auto registry = std::make_shared(); + config_sdk::SdkBuilder builder(registry); + + metrics_sdk::ViewRegistry view_registry; + builder.AddView(&view_registry, model); + + metrics_sdk::InstrumentDescriptor instrument_descriptor{ + "", "", "", metrics_sdk::InstrumentType::kBase2ExponentialHistogram, + metrics_sdk::InstrumentValueType::kLong}; + auto instrumentation_scope = scope_sdk::InstrumentationScope::Create(""); + + int matched = 0; + view_registry.FindViews( + instrument_descriptor, *instrumentation_scope, [&](const metrics_sdk::View &view) { + matched++; + auto *aggregation_config = view.GetAggregationConfig(); + EXPECT_NE(aggregation_config, nullptr); + if (aggregation_config) + { + EXPECT_EQ(aggregation_config->GetType(), + metrics_sdk::AggregationType::kBase2ExponentialHistogram); + EXPECT_EQ(aggregation_config->cardinality_limit_, 123u); + } + return true; + }); + + EXPECT_EQ(matched, 1); +} From 5a3eba8a302251f838526e85c23adf844bc541b8 Mon Sep 17 00:00:00 2001 From: om7057 Date: Mon, 27 Jul 2026 23:51:31 +0530 Subject: [PATCH 5/8] fix(metrics): remove unreachable Base2ExponentialHistogram branch and fix format The fallback branch in SdkBuilder::AddView() only runs when no explicit aggregation block was set, in which case the aggregation type is always resolved via DefaultAggregation::GetDefaultAggregationType(), which can only return kSum, kHistogram, kLastValue, or kDrop for a given instrument type - never kBase2ExponentialHistogram. The switch case for it was dead code, and the regression test added to cover it referenced instrument type enumerators (InstrumentType::base2_exponential_histogram / kBase2ExponentialHistogram) that don't exist, breaking the build. Also reformats sdk_builder_test.cc per clang-format-18 (CI Format check). --- sdk/src/configuration/sdk_builder.cc | 6 ---- sdk/test/configuration/sdk_builder_test.cc | 36 ---------------------- 2 files changed, 42 deletions(-) diff --git a/sdk/src/configuration/sdk_builder.cc b/sdk/src/configuration/sdk_builder.cc index 7d21f6e52..e6ec0a986 100644 --- a/sdk/src/configuration/sdk_builder.cc +++ b/sdk/src/configuration/sdk_builder.cc @@ -1768,12 +1768,6 @@ void SdkBuilder::AddView( stream->aggregation_cardinality_limit); break; - case opentelemetry::sdk::metrics::AggregationType::kBase2ExponentialHistogram: - sdk_aggregation_config = std::make_shared< - opentelemetry::sdk::metrics::Base2ExponentialHistogramAggregationConfig>( - stream->aggregation_cardinality_limit); - break; - default: sdk_aggregation_config = std::make_shared( stream->aggregation_cardinality_limit); diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index 0bf612e7c..849da4ed0 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -359,39 +359,3 @@ TEST(SdkBuilder, AddViewCounterCardinalityLimitOnly) EXPECT_EQ(matched, 1); } - -TEST(SdkBuilder, AddViewBase2ExponentialHistogramCardinalityLimitOnly) -{ - namespace metrics_sdk = opentelemetry::sdk::metrics; - - auto model = MakeCardinalityOnlyViewConfig(config_sdk::InstrumentType::base2_exponential_histogram, - 123); - - auto registry = std::make_shared(); - config_sdk::SdkBuilder builder(registry); - - metrics_sdk::ViewRegistry view_registry; - builder.AddView(&view_registry, model); - - metrics_sdk::InstrumentDescriptor instrument_descriptor{ - "", "", "", metrics_sdk::InstrumentType::kBase2ExponentialHistogram, - metrics_sdk::InstrumentValueType::kLong}; - auto instrumentation_scope = scope_sdk::InstrumentationScope::Create(""); - - int matched = 0; - view_registry.FindViews( - instrument_descriptor, *instrumentation_scope, [&](const metrics_sdk::View &view) { - matched++; - auto *aggregation_config = view.GetAggregationConfig(); - EXPECT_NE(aggregation_config, nullptr); - if (aggregation_config) - { - EXPECT_EQ(aggregation_config->GetType(), - metrics_sdk::AggregationType::kBase2ExponentialHistogram); - EXPECT_EQ(aggregation_config->cardinality_limit_, 123u); - } - return true; - }); - - EXPECT_EQ(matched, 1); -} From 3484667248d515a241a113f1faabe179d57c77c6 Mon Sep 17 00:00:00 2001 From: om7057 Date: Tue, 28 Jul 2026 06:26:36 +0530 Subject: [PATCH 6/8] fix(metrics): preserve default histogram boundaries in cardinality-limit-only views ThomsonTan pointed out that the HistogramAggregationConfig synthesized in AddView()'s cardinality-limit fallback path default-constructs with empty boundaries_. LongHistogramAggregation/DoubleHistogramAggregation treat a non-null config's boundaries_ literally rather than falling back to the SDK defaults (that fallback only triggers on a null config pointer), so the view registered correctly but collapsed every histogram to a single bucket instead of the SDK's 15-boundary/16-bucket default. Adds HistogramAggregationConfig::DefaultBoundaries() as the single source of truth for those boundaries and uses it in the three places that previously duplicated the literal (both histogram_aggregation.cc constructors, and now sdk_builder.cc). Also strengthens AddViewHistogramCardinalityLimitOnly to build the aggregation via DefaultAggregation::CreateAggregation() and assert on the resulting HistogramPointData's boundary/bucket counts, so the test pins actual behavior rather than just the config's declared type. --- .../metrics/aggregation/aggregation_config.h | 9 +++++++++ sdk/src/configuration/sdk_builder.cc | 14 +++++++++++-- .../aggregation/histogram_aggregation.cc | 6 ++---- sdk/test/configuration/sdk_builder_test.cc | 20 +++++++++++++++++++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation_config.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation_config.h index e96736fca..8c8071584 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation_config.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation_config.h @@ -52,6 +52,15 @@ class HistogramAggregationConfig : public AggregationConfig AggregationType GetType() const noexcept override { return AggregationType::kHistogram; } + // The SDK-specified default bucket boundaries, used when no boundaries are configured. + static const std::vector &DefaultBoundaries() + { + static const std::vector boundaries = {0.0, 5.0, 10.0, 25.0, 50.0, + 75.0, 100.0, 250.0, 500.0, 750.0, + 1000.0, 2500.0, 5000.0, 7500.0, 10000.0}; + return boundaries; + } + std::vector boundaries_; bool record_min_max_ = true; }; diff --git a/sdk/src/configuration/sdk_builder.cc b/sdk/src/configuration/sdk_builder.cc index e6ec0a986..f15e51fa0 100644 --- a/sdk/src/configuration/sdk_builder.cc +++ b/sdk/src/configuration/sdk_builder.cc @@ -1762,11 +1762,21 @@ void SdkBuilder::AddView( switch (effective_aggregation_type) { - case opentelemetry::sdk::metrics::AggregationType::kHistogram: - sdk_aggregation_config = + case opentelemetry::sdk::metrics::AggregationType::kHistogram: { + auto histogram_config = std::make_shared( stream->aggregation_cardinality_limit); + // A default-constructed HistogramAggregationConfig has empty boundaries_, which + // LongHistogramAggregation/DoubleHistogramAggregation interpret as "use these zero + // boundaries" rather than "no boundaries configured" (that distinction only exists + // when the config pointer itself is null). Since this config is synthesized here + // rather than coming from an explicit `aggregation` block, it must carry the SDK's + // default boundaries to preserve the instrument's default histogram shape. + histogram_config->boundaries_ = + opentelemetry::sdk::metrics::HistogramAggregationConfig::DefaultBoundaries(); + sdk_aggregation_config = histogram_config; break; + } default: sdk_aggregation_config = std::make_shared( diff --git a/sdk/src/metrics/aggregation/histogram_aggregation.cc b/sdk/src/metrics/aggregation/histogram_aggregation.cc index d6b4c90a0..717ae495e 100644 --- a/sdk/src/metrics/aggregation/histogram_aggregation.cc +++ b/sdk/src/metrics/aggregation/histogram_aggregation.cc @@ -34,8 +34,7 @@ LongHistogramAggregation::LongHistogramAggregation(const AggregationConfig *aggr } else { - point_data_.boundaries_ = {0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, - 500.0, 750.0, 1000.0, 2500.0, 5000.0, 7500.0, 10000.0}; + point_data_.boundaries_ = HistogramAggregationConfig::DefaultBoundaries(); } if (ac) @@ -115,8 +114,7 @@ DoubleHistogramAggregation::DoubleHistogramAggregation(const AggregationConfig * } else { - point_data_.boundaries_ = {0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, - 500.0, 750.0, 1000.0, 2500.0, 5000.0, 7500.0, 10000.0}; + point_data_.boundaries_ = HistogramAggregationConfig::DefaultBoundaries(); } if (ac) { diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index 849da4ed0..c922d924a 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -35,11 +35,14 @@ #include "opentelemetry/sdk/configuration/view_selector_configuration.h" #include "opentelemetry/sdk/configuration/view_stream_configuration.h" +#include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger_config.h" #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" #include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" +#include "opentelemetry/sdk/metrics/data/metric_data.h" +#include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/metric_reader.h" #include "opentelemetry/sdk/metrics/view/view.h" @@ -320,6 +323,23 @@ TEST(SdkBuilder, AddViewHistogramCardinalityLimitOnly) { EXPECT_EQ(aggregation_config->GetType(), metrics_sdk::AggregationType::kHistogram); EXPECT_EQ(aggregation_config->cardinality_limit_, 42u); + + // Pin what users actually receive: building the aggregation from this config + // must keep the SDK's default bucket boundaries, not silently collapse to a + // single bucket. A default-constructed HistogramAggregationConfig has empty + // boundaries_, which the aggregation takes literally (as opposed to a null + // config pointer, which falls back to the default boundaries), so AddView() + // must populate boundaries_ explicitly. + auto aggregation = metrics_sdk::DefaultAggregation::CreateAggregation( + metrics_sdk::AggregationType::kHistogram, instrument_descriptor, aggregation_config); + EXPECT_NE(aggregation, nullptr); + if (aggregation) + { + auto histogram_data = + opentelemetry::nostd::get(aggregation->ToPoint()); + EXPECT_EQ(histogram_data.boundaries_.size(), 15u); + EXPECT_EQ(histogram_data.counts_.size(), 16u); + } } return true; }); From 25115b2beb7d1c0a3a8ff82e98a794627183dd3d Mon Sep 17 00:00:00 2001 From: om7057 Date: Tue, 28 Jul 2026 07:32:27 +0530 Subject: [PATCH 7/8] fix(test): satisfy include-what-you-use for sdk_builder_test.cc Both iwyu jobs (all-options-abiv1-preview, all-options-abiv2-preview) flagged sdk_builder_test.cc after the histogram cardinality-limit test additions: missing direct includes for size_t, nostd::function_ref (the FindViews lambda parameter type), and Aggregation (returned by DefaultAggregation::CreateAggregation() and used via ->ToPoint()); and a redundant metric_data.h include already provided transitively through aggregation.h. --- sdk/test/configuration/sdk_builder_test.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/test/configuration/sdk_builder_test.cc b/sdk/test/configuration/sdk_builder_test.cc index c922d924a..178d91ad6 100644 --- a/sdk/test/configuration/sdk_builder_test.cc +++ b/sdk/test/configuration/sdk_builder_test.cc @@ -3,6 +3,7 @@ #include +#include #include #include #include @@ -35,13 +36,14 @@ #include "opentelemetry/sdk/configuration/view_selector_configuration.h" #include "opentelemetry/sdk/configuration/view_stream_configuration.h" +#include "opentelemetry/nostd/function_ref.h" #include "opentelemetry/nostd/variant.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/instrumentationscope/scope_configurator.h" #include "opentelemetry/sdk/logs/logger_config.h" +#include "opentelemetry/sdk/metrics/aggregation/aggregation.h" #include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" #include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" -#include "opentelemetry/sdk/metrics/data/metric_data.h" #include "opentelemetry/sdk/metrics/data/point_data.h" #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/metric_reader.h" From d98aceed55e6fd9d38f394da259e204e03b5bf63 Mon Sep 17 00:00:00 2001 From: om7057 Date: Fri, 31 Jul 2026 09:18:05 +0530 Subject: [PATCH 8/8] Trigger CI re-run The misspell check failed on the previous push due to a transient network error (curl: Recv failure: Connection reset by peer) while downloading the misspell tool itself, before any files were scanned. No misspellings found locally against this exact commit.