diff --git a/CHANGELOG.md b/CHANGELOG.md index b60ed70d0b..9381363300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,16 @@ Increment the: ## [Unreleased] +* [SDK] Update ExemplarFilter and ExemplarReservoir for spec + [#2372](https://github.com/open-telemetry/opentelemetry-cpp/pull/2372) + +Notes on experimental features: + +* [#2372](https://github.com/open-telemetry/opentelemetry-cpp/issues/2372) + introduced `MeterProvider::SetExemplar()` which accepts en + `ExemplarFilterType` enumeration with `kAlwaysOff`, `kAlwaysOn` and + `kTraceBased`. + ## [1.15.0] 2024-04-21 * [EXPORTER] Change OTLP HTTP content_type default to binary diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h similarity index 63% rename from sdk/include/opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h rename to sdk/include/opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h index f346160107..2690493d7d 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h @@ -3,15 +3,18 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/sdk/metrics/data/exemplar_data.h" -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" -#include "opentelemetry/version.h" +# include +# include + +# include "opentelemetry/sdk/common/global_log_handler.h" +# include "opentelemetry/sdk/metrics/data/exemplar_data.h" +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" +# include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace common @@ -29,7 +32,7 @@ namespace sdk namespace metrics { -class HistogramExemplarReservoir : public FixedSizeExemplarReservoir +class AlignedHistogramBucketExemplarReservoir : public FixedSizeExemplarReservoir { public: @@ -39,11 +42,11 @@ class HistogramExemplarReservoir : public FixedSizeExemplarReservoir return std::shared_ptr{new HistogramCellSelector(boundaries)}; } - HistogramExemplarReservoir(size_t size, - std::shared_ptr reservoir_cell_selector, - std::shared_ptr (ReservoirCell::*map_and_reset_cell)( - const opentelemetry::sdk::common::OrderedAttributeMap &attributes)) - : FixedSizeExemplarReservoir(size, reservoir_cell_selector, map_and_reset_cell) + AlignedHistogramBucketExemplarReservoir( + size_t size, + std::shared_ptr reservoir_cell_selector, + MapAndResetCellType map_and_reset_cell) + : FixedSizeExemplarReservoir(size + 1, reservoir_cell_selector, map_and_reset_cell) {} class HistogramCellSelector : public ReservoirCellSelector @@ -72,7 +75,9 @@ class HistogramExemplarReservoir : public FixedSizeExemplarReservoir return static_cast(i); } } - return -1; + + // The bucket at max_size is for values greater than the last boundary + return static_cast(max_size); } private: @@ -87,3 +92,5 @@ class HistogramExemplarReservoir : public FixedSizeExemplarReservoir } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h deleted file mode 100644 index 4a1366aa80..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/version.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace context -{ -class Context; -} // namespace context - -namespace sdk -{ -namespace metrics -{ - -class AlwaysSampleFilter final : public ExemplarFilter -{ -public: - bool ShouldSampleMeasurement( - int64_t /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context & /* context */) noexcept override - { - return true; - } - - bool ShouldSampleMeasurement( - double /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context & /* context */) noexcept override - { - return true; - } - - explicit AlwaysSampleFilter() = default; -}; -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h deleted file mode 100644 index a5fd8966e3..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include - -#include "opentelemetry/sdk/metrics/state/filtered_ordered_attribute_map.h" -#include "opentelemetry/version.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace context -{ -class Context; -} // namespace context - -namespace sdk -{ -namespace common -{ -class OrderedAttributeMap; -} // namespace common - -namespace metrics -{ -using MetricAttributes = opentelemetry::sdk::metrics::FilteredOrderedAttributeMap; - -/** - * Exemplar filters are used to pre-filter measurements before attempting to store them in a - * reservoir. - */ -class ExemplarFilter -{ -public: - // Returns whether or not a reservoir should attempt to filter a measurement. - virtual bool ShouldSampleMeasurement(int64_t value, - const MetricAttributes &attributes, - const opentelemetry::context::Context &context) noexcept = 0; - - // Returns whether or not a reservoir should attempt to filter a measurement. - virtual bool ShouldSampleMeasurement(double value, - const MetricAttributes &attributes, - const opentelemetry::context::Context &context) noexcept = 0; - - virtual ~ExemplarFilter() = default; - - static std::shared_ptr GetNeverSampleFilter() noexcept; - static std::shared_ptr GetAlwaysSampleFilter() noexcept; - static std::shared_ptr GetWithTraceSampleFilter() noexcept; -}; - -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/filter_type.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/filter_type.h new file mode 100644 index 0000000000..83cf7531fb --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/filter_type.h @@ -0,0 +1,46 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include + +# include "opentelemetry/sdk/metrics/state/filtered_ordered_attribute_map.h" +# include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace context +{ +class Context; +} // namespace context + +namespace sdk +{ +namespace common +{ +class OrderedAttributeMap; +} // namespace common + +namespace metrics +{ +using MetricAttributes = opentelemetry::sdk::metrics::FilteredOrderedAttributeMap; + +/** + * Exemplar filter type is used to pre-filter measurements before attempting to store them in a + * reservoir. + * https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplarfilter + */ +enum class ExemplarFilterType : uint8_t +{ + kAlwaysOff, + kAlwaysOn, + kTraceBased +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h deleted file mode 100644 index 6ed97a689e..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include -#include - -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" -#include "opentelemetry/version.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace common -{ -class SystemTimestamp; -} // namespace common - -namespace context -{ -class Context; -} // namespace context - -namespace sdk -{ -namespace metrics -{ -class FilteredExemplarReservoir final : public ExemplarReservoir -{ - -public: - FilteredExemplarReservoir(std::shared_ptr filter, - std::shared_ptr reservoir) - : filter_(filter), reservoir_(reservoir) - {} - - void OfferMeasurement(int64_t value, - const MetricAttributes &attributes, - const opentelemetry::context::Context &context, - const opentelemetry::common::SystemTimestamp ×tamp) noexcept override - { - if (filter_->ShouldSampleMeasurement(value, attributes, context)) - { - reservoir_->OfferMeasurement(value, attributes, context, timestamp); - } - } - - void OfferMeasurement(double value, - const MetricAttributes &attributes, - const opentelemetry::context::Context &context, - const opentelemetry::common::SystemTimestamp ×tamp) noexcept override - { - if (filter_->ShouldSampleMeasurement(value, attributes, context)) - { - reservoir_->OfferMeasurement(value, attributes, context, timestamp); - } - } - - std::vector> CollectAndReset( - const MetricAttributes &pointAttributes) noexcept override - { - return reservoir_->CollectAndReset(pointAttributes); - } - -private: - explicit FilteredExemplarReservoir() = default; - std::shared_ptr filter_; - std::shared_ptr reservoir_; -}; - -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h index 509b2affce..55f9ed876e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h @@ -3,16 +3,18 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/context/context.h" -#include "opentelemetry/nostd/function_ref.h" -#include "opentelemetry/nostd/shared_ptr.h" -#include "opentelemetry/sdk/common/attribute_utils.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" +# include +# include + +# include "opentelemetry/context/context.h" +# include "opentelemetry/nostd/function_ref.h" +# include "opentelemetry/nostd/shared_ptr.h" +# include "opentelemetry/sdk/common/attribute_utils.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -26,13 +28,14 @@ class FixedSizeExemplarReservoir : public ExemplarReservoir public: FixedSizeExemplarReservoir(size_t size, std::shared_ptr reservoir_cell_selector, - std::shared_ptr (ReservoirCell::*map_and_reset_cell)( - const opentelemetry::sdk::common::OrderedAttributeMap &attributes)) + MapAndResetCellType map_and_reset_cell) : storage_(size), reservoir_cell_selector_(reservoir_cell_selector), map_and_reset_cell_(map_and_reset_cell) {} + using ExemplarReservoir::OfferMeasurement; + void OfferMeasurement( int64_t value, const MetricAttributes &attributes, @@ -95,10 +98,11 @@ class FixedSizeExemplarReservoir : public ExemplarReservoir explicit FixedSizeExemplarReservoir() = default; std::vector storage_; std::shared_ptr reservoir_cell_selector_; - std::shared_ptr (ReservoirCell::*map_and_reset_cell_)( - const opentelemetry::sdk::common::OrderedAttributeMap &attributes); + MapAndResetCellType map_and_reset_cell_; }; } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h deleted file mode 100644 index 84d4ef9f77..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/version.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace context -{ -class Context; -} // namespace context - -namespace sdk -{ -namespace metrics -{ - -class NeverSampleFilter final : public ExemplarFilter -{ -public: - bool ShouldSampleMeasurement( - int64_t /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context & /* context */) noexcept override - { - return false; - } - - bool ShouldSampleMeasurement( - double /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context & /* context */) noexcept override - { - return false; - } - - explicit NeverSampleFilter() = default; -}; -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h index edcde3c12f..66486f0cd4 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h @@ -3,12 +3,14 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" -#include "opentelemetry/version.h" +# include +# include + +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +# include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace common @@ -61,3 +63,5 @@ class NoExemplarReservoir final : public ExemplarReservoir } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h index 3187e0da26..ef1df1c9a5 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h @@ -3,12 +3,14 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" -#include "opentelemetry/version.h" +# include +# include + +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" +# include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace common @@ -64,15 +66,19 @@ class ExemplarReservoir virtual std::vector> CollectAndReset( const MetricAttributes &pointAttributes) noexcept = 0; - static nostd::shared_ptr GetFilteredExemplarReservoir( - std::shared_ptr filter, + static nostd::shared_ptr GetSimpleFilteredExemplarReservoir( + ExemplarFilterType filter_type, std::shared_ptr reservoir); - static nostd::shared_ptr GetHistogramExemplarReservoir( + static nostd::shared_ptr GetSimpleFixedSizeExemplarReservoir( size_t size, std::shared_ptr reservoir_cell_selector, - std::shared_ptr (ReservoirCell::*map_and_reset_cell)( - const opentelemetry::sdk::common::OrderedAttributeMap &attributes)); + MapAndResetCellType map_and_reset_cell); + + static nostd::shared_ptr GetAlignedHistogramBucketExemplarReservoir( + size_t size, + std::shared_ptr reservoir_cell_selector, + MapAndResetCellType map_and_reset_cell); static nostd::shared_ptr GetNoExemplarReservoir(); }; @@ -80,3 +86,5 @@ class ExemplarReservoir } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell.h index 772c1cc1f1..03941870c0 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell.h @@ -3,15 +3,17 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/common/timestamp.h" -#include "opentelemetry/nostd/variant.h" -#include "opentelemetry/sdk/metrics/data/exemplar_data.h" -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/trace/context.h" -#include "opentelemetry/version.h" +# include +# include + +# include "opentelemetry/common/timestamp.h" +# include "opentelemetry/nostd/variant.h" +# include "opentelemetry/sdk/metrics/data/exemplar_data.h" +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/trace/context.h" +# include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace context @@ -151,6 +153,11 @@ class ReservoirCell friend class ReservoirCellTestPeer; }; +typedef std::shared_ptr (ReservoirCell::*MapAndResetCellType)( + const MetricAttributes &); + } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h index b3b2f09e23..79136ed9e8 100644 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h @@ -3,12 +3,14 @@ #pragma once -#include -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" -#include "opentelemetry/version.h" +# include +# include + +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" +# include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace context @@ -45,3 +47,5 @@ class ReservoirCellSelector } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_utils.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_utils.h new file mode 100644 index 0000000000..dfd10995a4 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir_utils.h @@ -0,0 +1,62 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include "opentelemetry/common/macros.h" +# include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h" +# include "opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/simple_fixed_size_exemplar_reservoir.h" +# include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +static inline MapAndResetCellType GetMapAndResetCellMethod( + const InstrumentDescriptor &instrument_descriptor) +{ + if (instrument_descriptor.value_type_ == InstrumentValueType::kLong) + { + return &ReservoirCell::GetAndResetLong; + } + + return &ReservoirCell::GetAndResetDouble; +} + +static inline nostd::shared_ptr GetExemplarReservoir( + const AggregationType agg_type, + const AggregationConfig *agg_config, + const InstrumentDescriptor &instrument_descriptor) +{ + if (agg_type == AggregationType::kHistogram) + { + const auto *histogram_agg_config = static_cast(agg_config); + + // + // Explicit bucket histogram aggregation with more than 1 bucket will use + // AlignedHistogramBucketExemplarReservoir. + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplar-defaults + // + if (histogram_agg_config != nullptr && histogram_agg_config->boundaries_.size() > 1) + { + return nostd::shared_ptr(new AlignedHistogramBucketExemplarReservoir( + histogram_agg_config->boundaries_.size(), + AlignedHistogramBucketExemplarReservoir::GetHistogramCellSelector( + histogram_agg_config->boundaries_), + GetMapAndResetCellMethod(instrument_descriptor))); + } + } + + return nostd::shared_ptr(new SimpleFixedSizeExemplarReservoir( + SimpleFixedSizeExemplarReservoir::kDefaultSimpleReservoirSize, + SimpleFixedSizeExemplarReservoir::GetSimpleFixedSizeCellSelector(), + GetMapAndResetCellMethod(instrument_descriptor))); +} +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/simple_fixed_size_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/simple_fixed_size_exemplar_reservoir.h new file mode 100644 index 0000000000..99e659bf30 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/simple_fixed_size_exemplar_reservoir.h @@ -0,0 +1,108 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include +# include + +# include "opentelemetry/sdk/metrics/data/exemplar_data.h" +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell_selector.h" +# include "opentelemetry/version.h" +# include "src/common/random.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace common +{ +class OrderedAttributeMap; +} // namespace common + +namespace context +{ +class Context; +} // namespace context + +namespace sdk +{ +namespace metrics +{ + +class SimpleFixedSizeExemplarReservoir : public FixedSizeExemplarReservoir +{ +public: + static const size_t kDefaultSimpleReservoirSize = 1; + + static std::shared_ptr GetSimpleFixedSizeCellSelector( + size_t size = kDefaultSimpleReservoirSize) + { + return std::shared_ptr{new SimpleFixedSizeCellSelector{size}}; + } + + SimpleFixedSizeExemplarReservoir(size_t size, + std::shared_ptr reservoir_cell_selector, + MapAndResetCellType map_and_reset_cell) + : FixedSizeExemplarReservoir(size, reservoir_cell_selector, map_and_reset_cell) + {} + + class SimpleFixedSizeCellSelector : public ReservoirCellSelector + { + public: + SimpleFixedSizeCellSelector(size_t size) : size_(size) {} + + int ReservoirCellIndexFor(const std::vector &cells, + int64_t value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) override + { + return ReservoirCellIndexFor(cells, static_cast(value), attributes, context); + } + + int ReservoirCellIndexFor(const std::vector & /* cells */, + double /* value */, + const MetricAttributes & /* attributes */, + const opentelemetry::context::Context & /* context */) override + { + // + // The simple reservoir sampling algorithm from the spec below is used. + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#simplefixedsizeexemplarreservoir + // + + size_t measurement_num = measurements_seen_++; + size_t index = static_cast(-1); + + if (measurement_num < size_) + { + index = measurement_num; + } + else + { + size_t random_index = sdk::common::Random::GenerateRandom64() % measurement_num; + + if (random_index < size_) + { + index = random_index; + } + } + + return static_cast(index); + } + + void reset() override {} + + private: + size_t measurements_seen_ = 0; + size_t size_; + }; // class SimpleFixedSizeCellSelector + +}; // class SimpleFixedSizeExemplarReservoir + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/with_trace_sample_filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/with_trace_sample_filter.h deleted file mode 100644 index fbc0489d3d..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/exemplar/with_trace_sample_filter.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once - -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/trace/context.h" -#include "opentelemetry/version.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace sdk -{ -namespace metrics -{ - -class WithTraceSampleFilter final : public ExemplarFilter -{ -public: - bool ShouldSampleMeasurement(int64_t /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context &context) noexcept override - { - return hasSampledTrace(context); - } - - bool ShouldSampleMeasurement(double /* value */, - const MetricAttributes & /* attributes */, - const opentelemetry::context::Context &context) noexcept override - { - return hasSampledTrace(context); - } - - explicit WithTraceSampleFilter() = default; - -private: - static bool hasSampledTrace(const opentelemetry::context::Context &context) - { - return opentelemetry::trace::GetSpan(context)->GetContext().IsValid() && - opentelemetry::trace::GetSpan(context)->GetContext().IsSampled(); - } -}; -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/metrics/meter.h b/sdk/include/opentelemetry/sdk/metrics/meter.h index 7e89d444ab..b29bede012 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter.h @@ -15,6 +15,7 @@ #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/unique_ptr.h" +#include "opentelemetry/sdk/common/attributemap_hash.h" #include "opentelemetry/sdk/instrumentationscope/instrumentation_scope.h" #include "opentelemetry/sdk/metrics/instrument_metadata_validator.h" #include "opentelemetry/sdk/metrics/instruments.h" @@ -138,6 +139,7 @@ class Meter final : public opentelemetry::metrics::Meter new opentelemetry::metrics::NoopObservableInstrument("", "", "")); return noop_instrument; } + static bool ValidateInstrument(nostd::string_view name, nostd::string_view description, nostd::string_view unit) diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index 336f5da7a0..2dfa2db56e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -12,6 +12,11 @@ #include "opentelemetry/common/timestamp.h" #include "opentelemetry/nostd/function_ref.h" #include "opentelemetry/nostd/span.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +#endif + #include "opentelemetry/sdk/metrics/view/view_registry.h" #include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/version.h" @@ -107,6 +112,14 @@ class MeterContext : public std::enable_shared_from_this std::unique_ptr meter_selector, std::unique_ptr view) noexcept; +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + + void SetExemplarFilter(ExemplarFilterType exemplar_filter_type) noexcept; + + ExemplarFilterType GetExemplarFilter() const noexcept; + +#endif + /** * NOTE - INTERNAL method, can change in future. * Adds a meter to the list of configured meters in thread safe manner. @@ -138,6 +151,10 @@ class MeterContext : public std::enable_shared_from_this opentelemetry::common::SystemTimestamp sdk_start_ts_; std::vector> meters_; +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + metrics::ExemplarFilterType exemplar_filter_type_ = metrics::ExemplarFilterType::kAlwaysOff; +#endif + #if defined(__cpp_lib_atomic_value_initialization) && \ __cpp_lib_atomic_value_initialization >= 201911L std::atomic_flag shutdown_latch_{}; diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_provider.h b/sdk/include/opentelemetry/sdk/metrics/meter_provider.h index 8a8c04c636..ddeb6d96ac 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_provider.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_provider.h @@ -10,6 +10,11 @@ #include "opentelemetry/metrics/meter_provider.h" #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/nostd/string_view.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +#endif + #include "opentelemetry/sdk/metrics/view/view_registry.h" #include "opentelemetry/sdk/resource/resource.h" #include "opentelemetry/version.h" @@ -100,6 +105,13 @@ class OPENTELEMETRY_EXPORT MeterProvider final : public opentelemetry::metrics:: std::unique_ptr meter_selector, std::unique_ptr view) noexcept; +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + + void SetExemplarFilter(metrics::ExemplarFilterType exemplar_filter_type = + metrics::ExemplarFilterType::kTraceBased) noexcept; + +#endif + /** * Shutdown the meter provider. */ diff --git a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h index 6a01d5c7f0..14e9a3fbfa 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h @@ -10,7 +10,12 @@ #include "opentelemetry/nostd/shared_ptr.h" #include "opentelemetry/sdk/common/attributemap_hash.h" #include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +#endif + #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/observer_result.h" #include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" @@ -30,14 +35,17 @@ class AsyncMetricStorage : public MetricStorage, public AsyncWritableMetricStora public: AsyncMetricStorage(InstrumentDescriptor instrument_descriptor, const AggregationType aggregation_type, - nostd::shared_ptr &&exemplar_reservoir - OPENTELEMETRY_MAYBE_UNUSED, +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType exempler_filter_type, + nostd::shared_ptr &&exemplar_reservoir, +#endif const AggregationConfig *aggregation_config) : instrument_descriptor_(instrument_descriptor), aggregation_type_{aggregation_type}, cumulative_hash_map_(new AttributesHashMap()), delta_hash_map_(new AttributesHashMap()), #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + exemplar_filter_type_(exempler_filter_type), exemplar_reservoir_(exemplar_reservoir), #endif temporal_metric_storage_(instrument_descriptor, aggregation_type, aggregation_config) @@ -54,8 +62,11 @@ class AsyncMetricStorage : public MetricStorage, public AsyncWritableMetricStora for (auto &measurement : measurements) { #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW - exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {}, - std::chrono::system_clock::now()); + if (exemplar_filter_type_ == ExemplarFilterType::kAlwaysOn) + { + exemplar_reservoir_->OfferMeasurement(measurement.second, {}, {}, + std::chrono::system_clock::now()); + } #endif auto aggr = DefaultAggregation::CreateAggregation(aggregation_type_, instrument_descriptor_); @@ -131,6 +142,7 @@ class AsyncMetricStorage : public MetricStorage, public AsyncWritableMetricStora std::unique_ptr delta_hash_map_; opentelemetry::common::SpinLockMutex hashmap_lock_; #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType exemplar_filter_type_; nostd::shared_ptr exemplar_reservoir_; #endif TemporalMetricStorage temporal_metric_storage_; diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 277b45fbb6..abeebf45a8 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -7,6 +7,7 @@ #include #include "opentelemetry/common/timestamp.h" +#include "opentelemetry/context/context.h" #include "opentelemetry/nostd/function_ref.h" #include "opentelemetry/nostd/span.h" #include "opentelemetry/sdk/metrics/data/metric_data.h" @@ -20,11 +21,6 @@ namespace common class KeyValueIterable; } // namespace common -namespace context -{ -class Context; -} // namespace context - namespace sdk { namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h index 9c851379e1..031bab2f61 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -17,11 +17,15 @@ #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/sdk/common/attributemap_hash.h" #include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +#endif + #include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" #include "opentelemetry/sdk/metrics/state/metric_collector.h" #include "opentelemetry/sdk/metrics/state/metric_storage.h" - #include "opentelemetry/sdk/metrics/state/temporal_metric_storage.h" #include "opentelemetry/sdk/metrics/view/attributes_processor.h" #include "opentelemetry/version.h" @@ -34,18 +38,34 @@ namespace metrics class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage { +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + + static inline bool EnableExamplarFilter(ExemplarFilterType filter_type, + const opentelemetry::context::Context &context) + { + return filter_type == ExemplarFilterType::kAlwaysOn || + (filter_type == ExemplarFilterType::kTraceBased && + opentelemetry::trace::GetSpan(context)->GetContext().IsValid() && + opentelemetry::trace::GetSpan(context)->GetContext().IsSampled()); + } + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW + public: SyncMetricStorage(InstrumentDescriptor instrument_descriptor, const AggregationType aggregation_type, const AttributesProcessor *attributes_processor, - nostd::shared_ptr &&exemplar_reservoir - OPENTELEMETRY_MAYBE_UNUSED, +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType exempler_filter_type, + nostd::shared_ptr &&exemplar_reservoir, +#endif const AggregationConfig *aggregation_config, size_t attributes_limit = kAggregationCardinalityLimit) : instrument_descriptor_(instrument_descriptor), attributes_hashmap_(new AttributesHashMap(attributes_limit)), attributes_processor_(attributes_processor), #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + exemplar_filter_type_(exempler_filter_type), exemplar_reservoir_(exemplar_reservoir), #endif temporal_metric_storage_(instrument_descriptor, aggregation_type, aggregation_config) @@ -66,7 +86,10 @@ class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage return; } #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW - exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); + if (EnableExamplarFilter(exemplar_filter_type_, context)) + { + exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); + } #endif static size_t hash = opentelemetry::sdk::common::GetHash(""); std::lock_guard guard(attribute_hashmap_lock_); @@ -83,8 +106,11 @@ class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage return; } #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW - exemplar_reservoir_->OfferMeasurement(value, attributes, context, - std::chrono::system_clock::now()); + if (EnableExamplarFilter(exemplar_filter_type_, context)) + { + exemplar_reservoir_->OfferMeasurement(value, attributes, context, + std::chrono::system_clock::now()); + } #endif auto hash = opentelemetry::sdk::common::GetHashForAttributeMap( attributes, [this](nostd::string_view key) { @@ -113,7 +139,10 @@ class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage return; } #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW - exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); + if (EnableExamplarFilter(exemplar_filter_type_, context)) + { + exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); + } #endif static size_t hash = opentelemetry::sdk::common::GetHash(""); std::lock_guard guard(attribute_hashmap_lock_); @@ -130,8 +159,11 @@ class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage return; } #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW - exemplar_reservoir_->OfferMeasurement(value, attributes, context, - std::chrono::system_clock::now()); + if (EnableExamplarFilter(exemplar_filter_type_, context)) + { + exemplar_reservoir_->OfferMeasurement(value, attributes, context, + std::chrono::system_clock::now()); + } #endif auto hash = opentelemetry::sdk::common::GetHashForAttributeMap( attributes, [this](nostd::string_view key) { @@ -163,6 +195,7 @@ class SyncMetricStorage : public MetricStorage, public SyncWritableMetricStorage std::function()> create_default_aggregation_; const AttributesProcessor *attributes_processor_; #ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType exemplar_filter_type_; nostd::shared_ptr exemplar_reservoir_; #endif TemporalMetricStorage temporal_metric_storage_; diff --git a/sdk/src/common/fast_random_number_generator.h b/sdk/src/common/fast_random_number_generator.h index 9887f2f3b3..13e6c738d1 100644 --- a/sdk/src/common/fast_random_number_generator.h +++ b/sdk/src/common/fast_random_number_generator.h @@ -70,9 +70,9 @@ class FastRandomNumberGenerator reinterpret_cast(state_.data() + state_.size())); } - static constexpr uint64_t min() noexcept { return 0; } + static constexpr uint64_t(min)() noexcept { return 0; } - static constexpr uint64_t max() noexcept { return std::numeric_limits::max(); } + static constexpr uint64_t(max)() noexcept { return (std::numeric_limits::max)(); } private: std::array state_{}; diff --git a/sdk/src/metrics/BUILD b/sdk/src/metrics/BUILD index c230f6a637..ff8d244da1 100644 --- a/sdk/src/metrics/BUILD +++ b/sdk/src/metrics/BUILD @@ -12,6 +12,7 @@ cc_library( "//api", "//sdk:headers", "//sdk/src/common:global_log_handler", + "//sdk/src/common:random", "//sdk/src/resource", ], ) diff --git a/sdk/src/metrics/CMakeLists.txt b/sdk/src/metrics/CMakeLists.txt index 134b227893..15611d1cab 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -23,7 +23,6 @@ add_library( aggregation/lastvalue_aggregation.cc aggregation/sum_aggregation.cc data/circular_buffer.cc - exemplar/filter.cc exemplar/reservoir.cc view/instrument_selector_factory.cc view/meter_selector_factory.cc diff --git a/sdk/src/metrics/exemplar/filter.cc b/sdk/src/metrics/exemplar/filter.cc deleted file mode 100644 index d74f024858..0000000000 --- a/sdk/src/metrics/exemplar/filter.cc +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include "opentelemetry/sdk/metrics/exemplar/filter.h" -#include "opentelemetry/sdk/metrics/exemplar/always_sample_filter.h" -#include "opentelemetry/sdk/metrics/exemplar/never_sample_filter.h" -#include "opentelemetry/sdk/metrics/exemplar/with_trace_sample_filter.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace sdk -{ -namespace metrics -{ - -std::shared_ptr ExemplarFilter::GetNeverSampleFilter() noexcept -{ - static std::shared_ptr neverSampleFilter{new NeverSampleFilter{}}; - return neverSampleFilter; -} - -std::shared_ptr ExemplarFilter::GetAlwaysSampleFilter() noexcept -{ - static std::shared_ptr alwaysSampleFilter{new AlwaysSampleFilter{}}; - return alwaysSampleFilter; -} - -std::shared_ptr ExemplarFilter::GetWithTraceSampleFilter() noexcept -{ - std::shared_ptr withTraceSampleFilter{new WithTraceSampleFilter{}}; - return withTraceSampleFilter; -} - -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/metrics/exemplar/reservoir.cc b/sdk/src/metrics/exemplar/reservoir.cc index b6f62a9885..d695587a91 100644 --- a/sdk/src/metrics/exemplar/reservoir.cc +++ b/sdk/src/metrics/exemplar/reservoir.cc @@ -1,13 +1,15 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" #include -#include "opentelemetry/sdk/metrics/exemplar/filtered_exemplar_reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/fixed_size_exemplar_reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include "opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" +# include "opentelemetry/sdk/metrics/exemplar/simple_fixed_size_exemplar_reservoir.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -15,21 +17,22 @@ namespace sdk namespace metrics { -nostd::shared_ptr ExemplarReservoir::GetFilteredExemplarReservoir( - std::shared_ptr filter, - std::shared_ptr reservoir) +nostd::shared_ptr ExemplarReservoir::GetSimpleFixedSizeExemplarReservoir( + size_t size, + std::shared_ptr reservoir_cell_selector, + MapAndResetCellType map_and_reset_cell) { - return nostd::shared_ptr{new FilteredExemplarReservoir{filter, reservoir}}; + return nostd::shared_ptr{ + new SimpleFixedSizeExemplarReservoir{size, reservoir_cell_selector, map_and_reset_cell}}; } -nostd::shared_ptr ExemplarReservoir::GetHistogramExemplarReservoir( +nostd::shared_ptr ExemplarReservoir::GetAlignedHistogramBucketExemplarReservoir( size_t size, std::shared_ptr reservoir_cell_selector, - std::shared_ptr (ReservoirCell::*map_and_reset_cell)( - const common::OrderedAttributeMap &attributes)) + MapAndResetCellType map_and_reset_cell) { - return nostd::shared_ptr{ - new HistogramExemplarReservoir{size, reservoir_cell_selector, map_and_reset_cell}}; + return nostd::shared_ptr{new AlignedHistogramBucketExemplarReservoir{ + size, reservoir_cell_selector, map_and_reset_cell}}; } nostd::shared_ptr ExemplarReservoir::GetNoExemplarReservoir() @@ -40,3 +43,5 @@ nostd::shared_ptr ExemplarReservoir::GetNoExemplarReservoir() } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index 0ae3776111..763cdcbe02 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -1,12 +1,18 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/meter.h" #include + #include "opentelemetry/metrics/noop.h" #include "opentelemetry/nostd/shared_ptr.h" +#include "opentelemetry/sdk/common/attributemap_hash.h" #include "opentelemetry/sdk/metrics/async_instruments.h" -#include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/reservoir_utils.h" +#endif + +#include "opentelemetry/sdk/metrics/meter.h" #include "opentelemetry/sdk/metrics/state/multi_metric_storage.h" #include "opentelemetry/sdk/metrics/state/observable_registry.h" #include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" @@ -309,11 +315,22 @@ std::unique_ptr Meter::RegisterSyncMetricStorage( << "The metric context is invalid"); return nullptr; } + auto view_registry = ctx->GetViewRegistry(); std::unique_ptr storages(new SyncMultiMetricStorage()); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + auto exemplar_filter_type = ctx->GetExemplarFilter(); +#endif + auto success = view_registry->FindViews( - instrument_descriptor, *scope_, [this, &instrument_descriptor, &storages](const View &view) { + instrument_descriptor, *scope_, + [this, &instrument_descriptor, &storages +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + , + exemplar_filter_type +#endif + ](const View &view) { auto view_instr_desc = instrument_descriptor; if (!view.GetName().empty()) { @@ -327,7 +344,12 @@ std::unique_ptr Meter::RegisterSyncMetricStorage( auto storage = std::shared_ptr(new SyncMetricStorage( view_instr_desc, view.GetAggregationType(), &view.GetAttributesProcessor(), - ExemplarReservoir::GetNoExemplarReservoir(), view.GetAggregationConfig())); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + exemplar_filter_type, + GetExemplarReservoir(view.GetAggregationType(), view.GetAggregationConfig(), + instrument_descriptor), +#endif + view.GetAggregationConfig())); storage_registry_[instrument_descriptor.name_] = storage; multi_storage->AddStorage(storage); return true; @@ -356,9 +378,19 @@ std::unique_ptr Meter::RegisterAsyncMetricStorage( } auto view_registry = ctx->GetViewRegistry(); std::unique_ptr storages(new AsyncMultiMetricStorage()); + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + auto exemplar_filter_type = ctx->GetExemplarFilter(); +#endif + auto success = view_registry->FindViews( instrument_descriptor, *GetInstrumentationScope(), - [this, &instrument_descriptor, &storages](const View &view) { + [this, &instrument_descriptor, &storages +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + , + exemplar_filter_type +#endif + ](const View &view) { auto view_instr_desc = instrument_descriptor; if (!view.GetName().empty()) { @@ -369,7 +401,12 @@ std::unique_ptr Meter::RegisterAsyncMetricStorage( view_instr_desc.description_ = view.GetDescription(); } auto storage = std::shared_ptr(new AsyncMetricStorage( - view_instr_desc, view.GetAggregationType(), ExemplarReservoir::GetNoExemplarReservoir(), + view_instr_desc, view.GetAggregationType(), +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + exemplar_filter_type, + GetExemplarReservoir(view.GetAggregationType(), view.GetAggregationConfig(), + instrument_descriptor), +#endif view.GetAggregationConfig())); storage_registry_[instrument_descriptor.name_] = storage; static_cast(storages.get())->AddStorage(storage); diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index 79f254fa93..2b5ef3148c 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -74,6 +74,20 @@ void MeterContext::AddView(std::unique_ptr instrument_select views_->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view)); } +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +void MeterContext::SetExemplarFilter(metrics::ExemplarFilterType exemplar_filter_type) noexcept +{ + exemplar_filter_type_ = exemplar_filter_type; +} + +ExemplarFilterType MeterContext::GetExemplarFilter() const noexcept +{ + return exemplar_filter_type_; +} + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW + void MeterContext::AddMeter(std::shared_ptr meter) { std::lock_guard guard(meter_lock_); diff --git a/sdk/src/metrics/meter_provider.cc b/sdk/src/metrics/meter_provider.cc index 63bea5ae28..943ae137bd 100644 --- a/sdk/src/metrics/meter_provider.cc +++ b/sdk/src/metrics/meter_provider.cc @@ -99,17 +99,25 @@ const resource::Resource &MeterProvider::GetResource() const noexcept void MeterProvider::AddMetricReader(std::shared_ptr reader) noexcept { - return context_->AddMetricReader(reader); + context_->AddMetricReader(reader); } void MeterProvider::AddView(std::unique_ptr instrument_selector, std::unique_ptr meter_selector, std::unique_ptr view) noexcept { - return context_->AddView(std::move(instrument_selector), std::move(meter_selector), - std::move(view)); + context_->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view)); } +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +void MeterProvider::SetExemplarFilter(metrics::ExemplarFilterType exemplar_filter_type) noexcept +{ + context_->SetExemplarFilter(exemplar_filter_type); +} + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW + /** * Shutdown the meter provider. */ diff --git a/sdk/src/metrics/state/filtered_ordered_attribute_map.cc b/sdk/src/metrics/state/filtered_ordered_attribute_map.cc index 1af0fe0d92..54552cab11 100644 --- a/sdk/src/metrics/state/filtered_ordered_attribute_map.cc +++ b/sdk/src/metrics/state/filtered_ordered_attribute_map.cc @@ -16,7 +16,7 @@ FilteredOrderedAttributeMap::FilteredOrderedAttributeMap( { attributes.ForEachKeyValue( [&](nostd::string_view key, opentelemetry::common::AttributeValue value) noexcept { - if (processor && processor->isPresent(key)) + if (!processor || processor->isPresent(key)) { SetAttribute(key, value); } @@ -32,7 +32,7 @@ FilteredOrderedAttributeMap::FilteredOrderedAttributeMap( { for (auto &kv : attributes) { - if (processor && processor->isPresent(kv.first)) + if (!processor || processor->isPresent(kv.first)) { SetAttribute(kv.first, kv.second); } diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index 7b43fea14d..3b72e99d96 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -5,7 +5,12 @@ #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/sdk/metrics/async_instruments.h" -#include "opentelemetry/sdk/metrics/exemplar/reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +#endif + #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/meter_context.h" #include "opentelemetry/sdk/metrics/metric_reader.h" @@ -55,7 +60,11 @@ TEST_P(WritableMetricStorageTestFixture, TestAggregation) collectors.push_back(collector); opentelemetry::sdk::metrics::AsyncMetricStorage storage( - instr_desc, AggregationType::kSum, ExemplarReservoir::GetNoExemplarReservoir(), nullptr); + instr_desc, AggregationType::kSum, +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); int64_t get_count1 = 20; int64_t put_count1 = 10; std::unordered_map measurements1 = { @@ -146,7 +155,11 @@ TEST_P(WritableMetricStorageTestUpDownFixture, TestAggregation) collectors.push_back(collector); opentelemetry::sdk::metrics::AsyncMetricStorage storage( - instr_desc, AggregationType::kDefault, ExemplarReservoir::GetNoExemplarReservoir(), nullptr); + instr_desc, AggregationType::kDefault, +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); int64_t get_count1 = 20; int64_t put_count1 = 10; std::unordered_map measurements1 = { @@ -236,7 +249,10 @@ TEST_P(WritableMetricStorageTestObservableGaugeFixture, TestAggregation) collectors.push_back(collector); opentelemetry::sdk::metrics::AsyncMetricStorage storage( - instr_desc, AggregationType::kLastValue, ExemplarReservoir::GetNoExemplarReservoir(), + instr_desc, AggregationType::kLastValue, +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif nullptr); int64_t freq_cpu0 = 3; int64_t freq_cpu1 = 5; diff --git a/sdk/test/metrics/cardinality_limit_test.cc b/sdk/test/metrics/cardinality_limit_test.cc index 621241557b..8c2edb4b0c 100644 --- a/sdk/test/metrics/cardinality_limit_test.cc +++ b/sdk/test/metrics/cardinality_limit_test.cc @@ -4,6 +4,9 @@ #include "common.h" #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/sdk/metrics/aggregation/sum_aggregation.h" +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +#endif #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" #include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" @@ -67,7 +70,11 @@ TEST_P(WritableMetricStorageCardinalityLimitTestFixture, LongCounterSumAggregati std::unique_ptr default_attributes_processor{ new DefaultAttributesProcessor{}}; SyncMetricStorage storage(instr_desc, AggregationType::kSum, default_attributes_processor.get(), - ExemplarReservoir::GetNoExemplarReservoir(), nullptr, attributes_limit); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, + ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr, attributes_limit); long record_value = 100; // add 9 unique metric points, and 6 more above limit. diff --git a/sdk/test/metrics/exemplar/BUILD b/sdk/test/metrics/exemplar/BUILD index 61281af745..413780b7d5 100644 --- a/sdk/test/metrics/exemplar/BUILD +++ b/sdk/test/metrics/exemplar/BUILD @@ -18,57 +18,6 @@ cc_test( ], ) -cc_test( - name = "with_trace_sample_filter_test", - srcs = [ - "with_trace_sample_filter_test.cc", - ], - tags = [ - "metrics", - "test", - ], - deps = [ - "//api", - "//sdk:headers", - "//sdk/src/metrics", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "never_sample_filter_test", - srcs = [ - "never_sample_filter_test.cc", - ], - tags = [ - "metrics", - "test", - ], - deps = [ - "//api", - "//sdk:headers", - "//sdk/src/metrics", - "@com_google_googletest//:gtest_main", - ], -) - -cc_test( - name = "always_sample_filter_test", - srcs = [ - "always_sample_filter_test.cc", - ], - tags = [ - "metrics", - "test", - ], - deps = [ - "//api", - "//sdk:headers", - "//sdk/src/metrics", - "@com_google_googletest//:gtest_main", - ], -) - cc_test( name = "reservoir_cell_test", srcs = [ @@ -87,9 +36,9 @@ cc_test( ) cc_test( - name = "histogram_exemplar_reservoir_test", + name = "aligned_histogram_bucket_exemplar_reservoir_test", srcs = [ - "histogram_exemplar_reservoir_test.cc", + "aligned_histogram_bucket_exemplar_reservoir_test.cc", ], tags = [ "metrics", diff --git a/sdk/test/metrics/exemplar/CMakeLists.txt b/sdk/test/metrics/exemplar/CMakeLists.txt index b4d5cfe793..04a715b2f8 100644 --- a/sdk/test/metrics/exemplar/CMakeLists.txt +++ b/sdk/test/metrics/exemplar/CMakeLists.txt @@ -1,11 +1,9 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -foreach( - testname - no_exemplar_reservoir_test never_sample_filter_test always_sample_filter_test - histogram_exemplar_reservoir_test reservoir_cell_test - with_trace_sample_filter_test) +foreach(testname + no_exemplar_reservoir_test + aligned_histogram_bucket_exemplar_reservoir_test reservoir_cell_test) add_executable(${testname} "${testname}.cc") target_link_libraries( ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/sdk/test/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir_test.cc b/sdk/test/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir_test.cc new file mode 100644 index 0000000000..487a0414a0 --- /dev/null +++ b/sdk/test/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir_test.cc @@ -0,0 +1,56 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include + +# include +# include "opentelemetry/sdk/metrics/exemplar/aligned_histogram_bucket_exemplar_reservoir.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +class AlignedHistogramBucketExemplarReservoirTestPeer : public ::testing::Test +{ +public: +}; + +TEST_F(AlignedHistogramBucketExemplarReservoirTestPeer, OfferMeasurement) +{ + std::vector boundaries{1, 5.0, 10, 15, 20}; + auto histogram_exemplar_reservoir = ExemplarReservoir::GetAlignedHistogramBucketExemplarReservoir( + boundaries.size(), + AlignedHistogramBucketExemplarReservoir::GetHistogramCellSelector(boundaries), nullptr); + histogram_exemplar_reservoir->OfferMeasurement( + 1.0, MetricAttributes{}, opentelemetry::context::Context{}, std::chrono::system_clock::now()); + histogram_exemplar_reservoir->OfferMeasurement(static_cast(1), MetricAttributes{}, + opentelemetry::context::Context{}, + std::chrono::system_clock::now()); + auto exemplar_data = histogram_exemplar_reservoir->CollectAndReset(MetricAttributes{}); + ASSERT_TRUE(exemplar_data.empty()); +} + +TEST_F(AlignedHistogramBucketExemplarReservoirTestPeer, OfferMeasurementWithNonEmptyCollection) +{ + std::vector boundaries{1, 5.0, 10, 15, 20}; + auto histogram_exemplar_reservoir = ExemplarReservoir::GetAlignedHistogramBucketExemplarReservoir( + boundaries.size(), + AlignedHistogramBucketExemplarReservoir::GetHistogramCellSelector(boundaries), + &ReservoirCell::GetAndResetDouble); + histogram_exemplar_reservoir->OfferMeasurement( + 1.0, MetricAttributes{}, opentelemetry::context::Context{}, std::chrono::system_clock::now()); + histogram_exemplar_reservoir->OfferMeasurement(static_cast(1), MetricAttributes{}, + opentelemetry::context::Context{}, + std::chrono::system_clock::now()); + auto exemplar_data = histogram_exemplar_reservoir->CollectAndReset(MetricAttributes{}); + ASSERT_TRUE(!exemplar_data.empty()); +} + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/test/metrics/exemplar/histogram_exemplar_reservoir_test.cc b/sdk/test/metrics/exemplar/histogram_exemplar_reservoir_test.cc deleted file mode 100644 index 927d6bdd31..0000000000 --- a/sdk/test/metrics/exemplar/histogram_exemplar_reservoir_test.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" -#include -#include - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace sdk -{ -namespace metrics -{ -class HistogramExemplarReservoirTestPeer : public ::testing::Test -{ -public: -}; - -TEST_F(HistogramExemplarReservoirTestPeer, OfferMeasurement) -{ - std::vector boundaries{1, 5.0, 10, 15, 20}; - auto histogram_exemplar_reservoir = ExemplarReservoir::GetHistogramExemplarReservoir( - boundaries.size(), HistogramExemplarReservoir::GetHistogramCellSelector(boundaries), nullptr); - histogram_exemplar_reservoir->OfferMeasurement( - 1.0, MetricAttributes{}, opentelemetry::context::Context{}, std::chrono::system_clock::now()); - histogram_exemplar_reservoir->OfferMeasurement(static_cast(1), MetricAttributes{}, - opentelemetry::context::Context{}, - std::chrono::system_clock::now()); - auto exemplar_data = histogram_exemplar_reservoir->CollectAndReset(MetricAttributes{}); - ASSERT_TRUE(exemplar_data.empty()); -} - -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/test/metrics/exemplar/never_sample_filter_test.cc b/sdk/test/metrics/exemplar/never_sample_filter_test.cc deleted file mode 100644 index e00d9f2962..0000000000 --- a/sdk/test/metrics/exemplar/never_sample_filter_test.cc +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#include -#include "opentelemetry/context/context.h" -#include "opentelemetry/sdk/metrics/exemplar/filter.h" - -using namespace opentelemetry::sdk::metrics; - -TEST(NeverSampleFilter, SampleMeasurement) -{ - auto filter = opentelemetry::sdk::metrics::ExemplarFilter::GetNeverSampleFilter(); - ASSERT_FALSE( - filter->ShouldSampleMeasurement(1.0, MetricAttributes{}, opentelemetry::context::Context{})); - ASSERT_FALSE(filter->ShouldSampleMeasurement(static_cast(1), MetricAttributes{}, - opentelemetry::context::Context{})); -} diff --git a/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc b/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc index ac86350af4..6739152b05 100644 --- a/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc +++ b/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc @@ -1,8 +1,10 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" +# include using namespace opentelemetry::sdk::metrics; @@ -16,3 +18,5 @@ TEST(NoExemplarReservoir, OfferMeasurement) auto exemplar_data = reservoir->CollectAndReset(MetricAttributes{}); ASSERT_TRUE(exemplar_data.empty()); } + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/test/metrics/exemplar/reservoir_cell_test.cc b/sdk/test/metrics/exemplar/reservoir_cell_test.cc index 7522a36312..2ce00ff3ba 100644 --- a/sdk/test/metrics/exemplar/reservoir_cell_test.cc +++ b/sdk/test/metrics/exemplar/reservoir_cell_test.cc @@ -1,8 +1,10 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -#include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" -#include +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + +# include "opentelemetry/sdk/metrics/exemplar/reservoir_cell.h" +# include OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -70,3 +72,5 @@ TEST_F(ReservoirCellTestPeer, Filtered) } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE + +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW diff --git a/sdk/test/metrics/multi_metric_storage_test.cc b/sdk/test/metrics/multi_metric_storage_test.cc index e7e4151f09..97c5a438ee 100644 --- a/sdk/test/metrics/multi_metric_storage_test.cc +++ b/sdk/test/metrics/multi_metric_storage_test.cc @@ -3,7 +3,12 @@ #include "opentelemetry/sdk/metrics/state/multi_metric_storage.h" #include "opentelemetry/common/key_value_iterable_view.h" -#include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" +#include "opentelemetry/context/context.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" +#endif // ENABLE_METRICS_EXEMPLAR_PREVIEW + #include "opentelemetry/sdk/metrics/instruments.h" #include diff --git a/sdk/test/metrics/sync_metric_storage_counter_test.cc b/sdk/test/metrics/sync_metric_storage_counter_test.cc index e27a9f5a24..220abe6b94 100644 --- a/sdk/test/metrics/sync_metric_storage_counter_test.cc +++ b/sdk/test/metrics/sync_metric_storage_counter_test.cc @@ -5,8 +5,14 @@ #include #include "opentelemetry/common/key_value_iterable_view.h" +#include "opentelemetry/context/context.h" #include "opentelemetry/nostd/shared_ptr.h" -#include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" + +#if ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +#endif + #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" #include "opentelemetry/sdk/metrics/view/attributes_processor.h" @@ -37,7 +43,10 @@ TEST_P(WritableMetricStorageTestFixture, LongCounterSumAggregation) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kSum, default_attributes_processor.get(), - ExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); storage.RecordLong(10, KeyValueIterableView>(attributes_get), opentelemetry::context::Context{}); @@ -174,7 +183,10 @@ TEST_P(WritableMetricStorageTestFixture, DoubleCounterSumAggregation) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kSum, default_attributes_processor.get(), - ExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); storage.RecordDouble(10.0, KeyValueIterableView>(attributes_get), diff --git a/sdk/test/metrics/sync_metric_storage_histogram_test.cc b/sdk/test/metrics/sync_metric_storage_histogram_test.cc index 3da2b0538e..5ded7f3b46 100644 --- a/sdk/test/metrics/sync_metric_storage_histogram_test.cc +++ b/sdk/test/metrics/sync_metric_storage_histogram_test.cc @@ -5,7 +5,12 @@ #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/shared_ptr.h" -#include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" +#endif + #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" #include "opentelemetry/sdk/metrics/view/attributes_processor.h" @@ -38,7 +43,10 @@ TEST_P(WritableMetricStorageHistogramTestFixture, LongHistogram) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kHistogram, default_attributes_processor.get(), - NoExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); storage.RecordLong(10, KeyValueIterableView>(attributes_get), opentelemetry::context::Context{}); @@ -176,7 +184,10 @@ TEST_P(WritableMetricStorageHistogramTestFixture, DoubleHistogram) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kHistogram, default_attributes_processor.get(), - NoExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); storage.RecordDouble(10.0, KeyValueIterableView>(attributes_get), diff --git a/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc b/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc index 15077b428a..216574a587 100644 --- a/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc +++ b/sdk/test/metrics/sync_metric_storage_up_down_counter_test.cc @@ -5,7 +5,11 @@ #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/shared_ptr.h" -#include "opentelemetry/sdk/metrics/exemplar/histogram_exemplar_reservoir.h" + +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter_type.h" +#endif + #include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" #include "opentelemetry/sdk/metrics/view/attributes_processor.h" @@ -37,7 +41,10 @@ TEST_P(WritableMetricStorageTestFixture, LongUpDownCounterSumAggregation) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kSum, default_attributes_processor.get(), - ExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); int64_t val1 = 10, val2 = 30, val3 = -5, val4 = -10; storage.RecordLong(val1, KeyValueIterableView>(attributes_get), @@ -184,7 +191,10 @@ TEST_P(WritableMetricStorageTestFixture, DoubleUpDownCounterSumAggregation) new DefaultAttributesProcessor{}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kSum, default_attributes_processor.get(), - ExemplarReservoir::GetNoExemplarReservoir(), nullptr); +#ifdef ENABLE_METRICS_EXEMPLAR_PREVIEW + ExemplarFilterType::kAlwaysOff, ExemplarReservoir::GetNoExemplarReservoir(), +#endif + nullptr); storage.RecordDouble(10.0, KeyValueIterableView>(attributes_get),