Otel.SDK.Metrics.Exemplar.Reservoir behaviour (otel v0.2.0)

Copy Markdown View Source

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

primitive()

@type primitive() ::
  String.t() | {:bytes, binary()} | boolean() | integer() | float() | nil

primitive_any()

@type primitive_any() ::
  primitive() | [primitive_any()] | %{required(String.t()) => primitive_any()}

Callbacks

collect(state)

@callback collect(state :: term()) :: {[Otel.SDK.Metrics.Exemplar.t()], state :: term()}

new(opts)

@callback new(opts :: map()) :: state :: term()

offer(state, value, time, filtered_attributes, ctx)

@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

collect(arg1)

@spec collect(reservoir :: {module(), term()} | nil) ::
  {[Otel.SDK.Metrics.Exemplar.t()], {module(), term()} | nil}

offer(arg1, filter, value, time, filtered_attributes, ctx)

@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