ExemplarReservoir behaviour. A reservoir samples and stores exemplars from offered measurements, then returns them during collection.
Each reservoir instance is associated with a single timeseries (stream + attribute combination).
Concurrency
Spec metrics/sdk.md L1878 (Status: Stable) — "all methods
MUST be safe to be called concurrently." Implementing
modules MUST be safe for concurrent invocation of offer/5
and collect/1. Built-in implementations
(SimpleFixedSize, AlignedHistogramBucket) satisfy this
via :counters / :atomics / :ets with appropriate
concurrency options.
Summary
Types
@type primitive_any() :: primitive() | [primitive_any()] | %{required(String.t()) => primitive_any()}
Callbacks
@callback collect(state :: term()) :: {[Otel.SDK.Metrics.Exemplar.t()], state :: term()}
@callback offer( state :: term(), value :: number(), time :: non_neg_integer(), filtered_attributes :: %{required(String.t()) => primitive_any()}, ctx :: Otel.API.Ctx.t() ) :: state :: term()
Functions
@spec collect(reservoir :: {module(), term()} | nil) :: {[Otel.SDK.Metrics.Exemplar.t()], {module(), term()} | nil}
@spec offer( reservoir :: {module(), term()} | nil, filter :: Otel.SDK.Metrics.Exemplar.Filter.t(), value :: number(), time :: non_neg_integer(), filtered_attributes :: %{required(String.t()) => primitive_any()}, ctx :: Otel.API.Ctx.t() ) :: {module(), term()} | nil