Skip to content

[SDK] fix: exemplar filters - #4267

Open
proost wants to merge 21 commits into
open-telemetry:mainfrom
proost:feat-exemplar-filters
Open

[SDK] fix: exemplar filters#4267
proost wants to merge 21 commits into
open-telemetry:mainfrom
proost:feat-exemplar-filters

Conversation

@proost

@proost proost commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Fixes #4178, #2526

Changes

Breaking Change is accompanied, But Because this is preview version, I think acceptable.

I will send another PR for configuration from envs.

  • CHANGELOG.md updated for non-trivial changes
  • Unit tests have been added
  • Changes in public API reviewed

@proost
proost requested a review from a team as a code owner July 18, 2026 05:50
@codecov

codecov Bot commented Jul 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.37500% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.47%. Comparing base (5ef557b) to head (685210e).

Files with missing lines Patch % Lines
...ntelemetry/sdk/metrics/state/sync_metric_storage.h 55.56% 4 Missing ⚠️
...telemetry/sdk/metrics/state/async_metric_storage.h 75.00% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #4267      +/-   ##
==========================================
+ Coverage   81.30%   81.47%   +0.17%     
==========================================
  Files         447      448       +1     
  Lines       19028    19032       +4     
==========================================
+ Hits        15469    15504      +35     
+ Misses       3559     3528      -31     
Files with missing lines Coverage Δ
...ntelemetry/sdk/metrics/exemplar/filter_predicate.h 100.00% <100.00%> (ø)
...k/metrics/exemplar/fixed_size_exemplar_reservoir.h 89.66% <100.00%> (ø)
...metry/sdk/metrics/exemplar/no_exemplar_reservoir.h 100.00% <100.00%> (ø)
...ude/opentelemetry/sdk/metrics/exemplar/reservoir.h 100.00% <ø> (ø)
...pentelemetry/sdk/metrics/exemplar/reservoir_cell.h 97.78% <100.00%> (+41.26%) ⬆️
...entelemetry/sdk/metrics/exemplar/reservoir_utils.h 100.00% <100.00%> (ø)
sdk/src/metrics/meter.cc 81.36% <ø> (ø)
...telemetry/sdk/metrics/state/async_metric_storage.h 93.19% <75.00%> (+2.28%) ⬆️
...ntelemetry/sdk/metrics/state/sync_metric_storage.h 84.94% <55.56%> (+1.19%) ⬆️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@lalitb

lalitb commented Jul 20, 2026

Copy link
Copy Markdown
Member

@proost - I think this won't yet close #4178 - We can't declare exemplar stable till we have evaluated their performance on hot-path of metrics.

Comment thread sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_utils.h Outdated
Comment thread sdk/include/opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h Outdated
@proost
proost requested a review from lalitb July 22, 2026 15:05
Comment thread sdk/test/metrics/exemplar/filtered_exemplar_reservoir_test.cc Outdated
@proost
proost requested a review from dbarker July 25, 2026 04:14

@dbarker dbarker left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR! Please see some initial feedback below.

Comment thread sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h Outdated
Comment thread sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h Outdated
Comment thread sdk/include/opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h Outdated
@proost proost changed the title [SDK] feat: exemplar filters [SDK] fix: exemplar filters Jul 31, 2026
@proost

proost commented Jul 31, 2026

Copy link
Copy Markdown
Contributor Author

@dbarker @lalitb
I'm sorry to bothering you. I missunderstand the issue and spec.

So this PR change:

  1. removing span context check so that alwaysOn works correctly.
  2. little bit refactoring(removing useless "GetSimpleFilteredExemplarReservoir")
  3. tiny performance improving that removing timestamp.

@proost
proost requested a review from dbarker July 31, 2026 14:31
Comment thread CHANGELOG.md
@proost
proost requested a review from ThomsonTan August 1, 2026 06:00

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Not ready to approve

There are correctness and robustness issues in the updated exemplar code paths (notably async exemplar attribute handling and reservoir cell reset semantics) that should be addressed before approval.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.

Pull request overview

This PR updates the Metrics SDK exemplar “preview” pipeline to align with spec changes by moving exemplar eligibility logic into a predicate, simplifying reservoir selection based on the filter type, and removing timestamps from the ExemplarReservoir::OfferMeasurement() API.

Changes:

  • Remove the SystemTimestamp parameter from preview ExemplarReservoir::OfferMeasurement() and update all call sites/tests accordingly.
  • Centralize exemplar eligibility via ExemplarFilterEnabled(...) and add unit tests for the filter predicate and span-context behavior.
  • Adjust exemplar reservoir construction to respect ExemplarFilterType (notably kAlwaysOff) and update build/test wiring (CMake + Bazel).
File summaries
File Description
sdk/test/metrics/exemplar/with_trace_sample_filter_test.cc Removes legacy tests tied to the old ExemplarFilter interface.
sdk/test/metrics/exemplar/always_sample_filter_test.cc Removes legacy tests tied to the old ExemplarFilter interface.
sdk/test/metrics/exemplar/reservoir_cell_test.cc Adds coverage for producing exemplars without an active span context.
sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc Updates tests for the new OfferMeasurement signature (no timestamp).
sdk/test/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir_test.cc Updates tests for the new OfferMeasurement signature (no timestamp).
sdk/test/metrics/exemplar/filter_predicate_test.cc Adds new unit tests for ExemplarFilterEnabled(...) behavior.
sdk/test/metrics/exemplar/CMakeLists.txt Registers the new filter predicate test target.
sdk/test/metrics/exemplar/BUILD Registers the new Bazel test target for filter predicate tests.
sdk/src/metrics/meter.cc Passes the filter type into reservoir selection.
sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h Uses ExemplarFilterEnabled and removes timestamp from reservoir offers.
sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h Uses ExemplarFilterEnabled and removes timestamp from reservoir offers.
sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h Updates the reservoir interface to drop timestamps and removes filtered-reservoir factory.
sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_utils.h Selects NoExemplarReservoir when filter is kAlwaysOff and uses factory helpers.
sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell.h Changes how span context is captured (always overwritten).
sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h Updates overrides for the new OfferMeasurement signature.
sdk/include/opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h Updates overrides for the new OfferMeasurement signature.
sdk/include/opentelemetry/sdk/metrics/exemplar/filter_predicate.h Introduces the shared exemplar filter predicate helper.
ci/do_ci.sh Increases Bazel valgrind test timeout.
CHANGELOG.md Documents exemplar filtering changes and the breaking preview API update.
Review details
  • Files reviewed: 19/19 changed files
  • Comments generated: 5
  • Review effort level: Lite

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

Comment on lines +83 to +86
auto data = reservoir_cell.GetAndResetLong(MetricAttributes{});
ASSERT_NE(data, nullptr);
EXPECT_FALSE(data->GetSpanContext().IsValid());
}
Comment on lines 133 to 139
const opentelemetry::context::Context &context)
{
attributes_ = attributes;
record_time_ = opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now());
const auto current_ctx = opentelemetry::trace::GetSpanContext(context);
if (current_ctx.IsValid())
{
context_.reset(new opentelemetry::trace::SpanContext{current_ctx});
}
context_.reset(
new opentelemetry::trace::SpanContext{opentelemetry::trace::GetSpanContext(context)});
}
Comment on lines +74 to 77
if (offer_exemplars)
{
exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {},
std::chrono::system_clock::now());
exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {});
}
Comment on lines +30 to +40
switch (filter_type)
{
case ExemplarFilterType::kAlwaysOn:
return true;
case ExemplarFilterType::kAlwaysOff:
return false;
default: // TraceBased.
const opentelemetry::trace::SpanContext span_context =
opentelemetry::trace::GetSpanContext(context);
return span_context.IsValid() && span_context.IsSampled();
}
Comment thread CHANGELOG.md
Comment on lines +92 to +93
* [SDK] Complete exemplar filtering: the exemplar filter(`AlwaysOn`/
`AlwaysOff`/`TraceBased`)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Is support for exemplars still experimental/preview?

5 participants