Bourse.Telemetry (bourse v0.1.0)

Copy Markdown View Source

Centralized telemetry contract for Bourse.

Single source of truth for all telemetry events emitted by the library. Both Bourse.HTTP and Bourse.CircuitBreaker delegate event names here.

Contract Version

Bumped on breaking changes to event names, measurements, or metadata shapes. Consumers can assert compatibility at startup.

Request Events

Emitted by Bourse.HTTP during HTTP request lifecycle.

[:bourse, :request, :start]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t(), method: atom(), path: String.t()}

[:bourse, :request, :stop]

  • Measurements: %{duration: integer()} (native time units)
  • Metadata: %{exchange: String.t(), method: atom(), path: String.t(), status: integer()}

[:bourse, :request, :exception]

  • Measurements: %{duration: integer()} (native time units)
  • Metadata: %{exchange: String.t(), method: atom(), path: String.t(), kind: atom(), reason: term()}

Circuit Breaker Events

Emitted by Bourse.CircuitBreaker on state transitions.

[:bourse, :circuit_breaker, :open]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t()}

[:bourse, :circuit_breaker, :closed]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t()}

[:bourse, :circuit_breaker, :rejected]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t()}

Rate Limiter Events

Emitted by Bourse.HTTP when rate limiting is triggered.

[:bourse, :rate_limiter, :throttled]

  • Measurements: %{delay_ms: integer(), cost: number()}
  • Metadata: %{exchange: String.t()}

Signing Events

Emitted by Bourse.Signing.sign/4 (single event carrying duration; signing is a fast synchronous operation).

[:bourse, :signing, :sign]

  • Measurements: %{duration: integer()} (native time units)
  • Metadata: %{exchange: String.t() | nil, pattern: atom()}

WS Message Events

Emitted by Bourse.WS (outbound) and Bourse.WS.Adapter (inbound frames).

[:bourse, :ws, :send]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t(), section: :public | :private}

[:bourse, :ws, :message]

  • Measurements: %{system_time: integer()}
  • Metadata: %{exchange: String.t(), section: :public | :private, kind: :routed | :system | :raw}

Summary

Functions

Attaches a handler to all Bourse telemetry events.

Event name for circuit breaker closed: [:bourse, :circuit_breaker, :closed].

Returns the 3 circuit breaker event names.

Event name for circuit breaker open: [:bourse, :circuit_breaker, :open].

Event name for circuit breaker rejected: [:bourse, :circuit_breaker, :rejected].

Returns the telemetry contract version.

Detaches a previously attached handler by ID.

Returns all telemetry event names.

Returns the rate limiter event names.

Event name for rate limiter throttled: [:bourse, :rate_limiter, :throttled].

Returns the 3 HTTP request event names.

Event name for request exception: [:bourse, :request, :exception].

Event name for request start: [:bourse, :request, :start].

Event name for request stop: [:bourse, :request, :stop].

Returns the signing event names (1 event).

Event name for signing (with duration): [:bourse, :signing, :sign].

Returns the 2 WS message event names.

Event name for WS message (inbound): [:bourse, :ws, :message].

Event name for WS send: [:bourse, :ws, :send].

Functions

attach(handler_id, handler_fn, config \\ nil)

@spec attach(String.t(), (list(), map(), map(), term() -> any()), term()) ::
  :ok | {:error, :already_exists}

Attaches a handler to all Bourse telemetry events.

Wraps :telemetry.attach_many/4 with events/0 as the event list.

Parameters

  • handler_id - Unique string identifying this handler
  • handler_fn - Function of arity 4: (event, measurements, metadata, config)
  • config - Optional handler config (default: nil)

circuit_breaker_closed()

@spec circuit_breaker_closed() :: [atom()]

Event name for circuit breaker closed: [:bourse, :circuit_breaker, :closed].

circuit_breaker_events()

@spec circuit_breaker_events() :: [[atom()]]

Returns the 3 circuit breaker event names.

circuit_breaker_open()

@spec circuit_breaker_open() :: [atom()]

Event name for circuit breaker open: [:bourse, :circuit_breaker, :open].

circuit_breaker_rejected()

@spec circuit_breaker_rejected() :: [atom()]

Event name for circuit breaker rejected: [:bourse, :circuit_breaker, :rejected].

contract_version()

@spec contract_version() :: pos_integer()

Returns the telemetry contract version.

Bumped on breaking changes to event names, measurements, or metadata shapes.

if Bourse.Telemetry.contract_version() != 2 do
  raise "Incompatible Bourse telemetry contract"
end

detach(handler_id)

@spec detach(String.t()) :: :ok | {:error, :not_found}

Detaches a previously attached handler by ID.

events()

@spec events() :: [[atom()]]

Returns all telemetry event names.

rate_limiter_events()

@spec rate_limiter_events() :: [[atom()]]

Returns the rate limiter event names.

rate_limiter_throttled()

@spec rate_limiter_throttled() :: [atom()]

Event name for rate limiter throttled: [:bourse, :rate_limiter, :throttled].

request_events()

@spec request_events() :: [[atom()]]

Returns the 3 HTTP request event names.

request_exception()

@spec request_exception() :: [atom()]

Event name for request exception: [:bourse, :request, :exception].

request_start()

@spec request_start() :: [atom()]

Event name for request start: [:bourse, :request, :start].

request_stop()

@spec request_stop() :: [atom()]

Event name for request stop: [:bourse, :request, :stop].

signing_events()

@spec signing_events() :: [[atom()]]

Returns the signing event names (1 event).

signing_sign()

@spec signing_sign() :: [atom()]

Event name for signing (with duration): [:bourse, :signing, :sign].

ws_events()

@spec ws_events() :: [[atom()]]

Returns the 2 WS message event names.

ws_message()

@spec ws_message() :: [atom()]

Event name for WS message (inbound): [:bourse, :ws, :message].

ws_send()

@spec ws_send() :: [atom()]

Event name for WS send: [:bourse, :ws, :send].