[SDK] fix: exemplar filters - #4267
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ 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
🚀 New features to boost your workflow:
|
…to feat-exemplar-filters
…to feat-exemplar-filters
…to feat-exemplar-filters
dbarker
left a comment
There was a problem hiding this comment.
Thanks for the PR! Please see some initial feedback below.
…ry-cpp into feat-exemplar-filters
…to feat-exemplar-filters
…to feat-exemplar-filters
…y-cpp into feat-exemplar-filters
There was a problem hiding this comment.
🟡 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
SystemTimestampparameter from previewExemplarReservoir::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(notablykAlwaysOff) 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.
| auto data = reservoir_cell.GetAndResetLong(MetricAttributes{}); | ||
| ASSERT_NE(data, nullptr); | ||
| EXPECT_FALSE(data->GetSpanContext().IsValid()); | ||
| } |
| 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)}); | ||
| } |
| if (offer_exemplars) | ||
| { | ||
| exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {}, | ||
| std::chrono::system_clock::now()); | ||
| exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {}); | ||
| } |
| 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(); | ||
| } |
| * [SDK] Complete exemplar filtering: the exemplar filter(`AlwaysOn`/ | ||
| `AlwaysOff`/`TraceBased`) |
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.mdupdated for non-trivial changes