View Source Sentry.Telemetry.Scheduler (Sentry v14.0.0)
GenServer implementing a weighted round-robin scheduler for telemetry buffers.
The scheduler cycles through category buffers based on priority weights, ensuring critical telemetry gets priority over high-volume data under load.
Weights
:critical- weight 5 (errors):high- weight 4 (check-ins):medium- weight 3 (transactions):low- weight 2 (logs)
Signal-Based Wake
The scheduler wakes when signaled via signal/1 or when a pending buffer's
timeout expires. It processes ready batches in priority order, sleeping until
the next buffer deadline when no batches are ready. When the transport queue
is full, it waits for a send to finish before checking buffers again.
Transport Queue
The scheduler includes a bounded FIFO queue for transport concurrency control, processing one envelope at a time (single-worker model). The queue is capped at a configurable capacity (default 1000 items) to prevent unbounded memory growth. For log envelopes, each log event counts as one item toward capacity.
Summary
Functions
Builds a priority cycle based on category weights.
Returns a specification to start this module under a supervisor.
Flushes all buffers by draining their contents and sending all items.
Signals the scheduler to wake and process items.
Starts the scheduler process.
Types
@type buffers() :: %{ error: GenServer.server(), check_in: GenServer.server(), transaction: GenServer.server(), log: GenServer.server(), metric: GenServer.server() }
@type t() :: %Sentry.Telemetry.Scheduler{ active_item_count: non_neg_integer(), active_ref: reference() | nil, buffers: buffers(), capacity: pos_integer(), cycle_position: non_neg_integer(), on_envelope: (Sentry.Envelope.t() -> any()) | nil, priority_cycle: [Sentry.Telemetry.Category.t()], queue: :queue.queue(), size: non_neg_integer() }
Functions
@spec build_priority_cycle(map() | nil) :: [Sentry.Telemetry.Category.t()]
Builds a priority cycle based on category weights.
Returns a list of categories where each category appears a number of times equal to its priority weight.
Examples
iex> Sentry.Telemetry.Scheduler.build_priority_cycle()
[:error, :error, :error, :error, :error, :check_in, :check_in, :check_in, :check_in, :transaction, :transaction, :transaction, :log, :log, :metric, :metric]
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec flush(GenServer.server(), timeout()) :: :ok
Flushes all buffers by draining their contents and sending all items.
This is a blocking call that returns when all items have been processed, including any envelopes queued for transport.
@spec signal(GenServer.server()) :: :ok
Signals the scheduler to wake and process items.
This is a non-blocking call that triggers the scheduler to check buffers and send any ready items.
@spec start_link(keyword()) :: GenServer.on_start()
Starts the scheduler process.
Options
:buffers- Map of category to buffer pid (required):name- The name to register the GenServer under (optional):weights- Custom priority weights (optional):on_envelope- Callback function invoked with built envelopes (optional):capacity- Maximum items in the transport queue (default: 1000)