Forja.Telemetry
(Forja v0.4.0)
View Source
Telemetry event emission and default logger for Forja.
All events follow the [:forja, resource, action] convention and are
emitted via :telemetry.execute/3.
Default Logger
Forja ships with an opt-in default logger that converts telemetry events
into structured Logger calls. Activate it in your application.ex:
Forja.Telemetry.attach_default_logger(level: :info)The :level option controls which categories of events are logged:
| Level | Events logged |
|---|---|
:debug | All events (emitted, processed, deduplicated, reconciled, failed, validation_failed, dead_letter, abandoned) |
:info | Lifecycle + problems (emitted, processed, reconciled, failed, validation_failed, dead_letter, abandoned) |
:warning | Problems only (failed, validation_failed, dead_letter, abandoned) |
:error | Critical only (dead_letter, abandoned) |
Options
:level- Logger level tier (default::info):include_payload- Include event payload in logs (default:false):encode- JSON-encode log output (default:false):events-:all(default) or explicit list like[:emitted, :processed]
Example
# Development: see everything including payloads
Forja.Telemetry.attach_default_logger(level: :debug, include_payload: true)
# Production: only problems
Forja.Telemetry.attach_default_logger(level: :warning, encode: true)All log calls use domain: [:forja], so you can filter them:
# Suppress all Forja logs via Erlang logger filters
:logger.add_primary_filter(:no_forja, {&:logger_filters.domain/2, {:stop, :sub, [:forja]}})Emitted events
emit_emitted(name, %{type: type} = attrs)emits[:forja, :event, :emitted]- Measurements:
%{count: 1} Metadata:
%{name: atom, type: string, source: string, payload: map | nil, correlation_id: string | nil}
- Measurements:
emit_processed(name, %{type: type, handler: handler, path: path, duration: duration})emits[:forja, :event, :processed]when a handler processes successfully- Measurements:
%{duration: native_time} - Metadata:
%{name: atom, type: string, handler: module, path: atom()}
- Measurements:
emit_failed(name, %{type: type, handler: handler, path: path, reason: reason})emits[:forja, :event, :failed]when a handler fails- Measurements:
%{count: 1} - Metadata:
%{name: atom, type: string, handler: module, path: atom, reason: term}
- Measurements:
[:forja, :event, :dead_letter]- When Oban discards a job (all attempts exhausted)- Measurements:
%{count: 1} - Metadata:
%{name: atom, event_id: binary, reason: term}
- Measurements:
[:forja, :event, :abandoned]- When reconciliation also exhausts its retries- Measurements:
%{count: 1} - Metadata:
%{name: atom, event_id: binary, reconciliation_attempts: integer}
- Measurements:
[:forja, :event, :reconciled]- When reconciliation successfully processes an event- Measurements:
%{count: 1} - Metadata:
%{name: atom, event_id: binary}
- Measurements:
[:forja, :event, :deduplicated]- When an idempotency key prevents a duplicate emission- Measurements:
%{count: 1} - Metadata:
%{name: atom, idempotency_key: string, existing_event_id: binary}
- Measurements:
[:forja, :event, :validation_failed]- When payload validation fails at emit-time- Measurements:
%{count: 1} Metadata:
%{name: atom, type: string | module, errors: term}
- Measurements:
Summary
Functions
Attaches the default logger that converts Forja telemetry events into
structured Logger calls with domain: [:forja].
Returns the telemetry handler ID used by the default logger.
Detaches the default logger.
Emits a telemetry event when reconciliation exhausts all retries (abandoned).
Emits a telemetry event when Oban discards a job (dead letter).
Emits a telemetry event when an idempotency key prevents a duplicate emission.
Emits a telemetry event for event emission.
Emits a telemetry event for handler failure.
Emits a telemetry event for successful handler processing.
Emits a telemetry event when reconciliation successfully processes an event.
Emits a telemetry event when payload validation fails at emit-time.
Functions
@spec attach_default_logger(keyword()) :: :ok | {:error, :already_exists}
Attaches the default logger that converts Forja telemetry events into
structured Logger calls with domain: [:forja].
Options
:level- Controls which event categories are logged. One of:debug,:info,:warning,:error. Default::info.:include_payload- Whentrue, includes the event payload in:emittedlog entries. Default:false.:encode- Whentrue, JSON-encodes the log output. Default:false.:events-:allto use the level tier (default), or an explicit list of category atoms like[:emitted, :processed, :failed].
@spec default_handler_id() :: String.t()
Returns the telemetry handler ID used by the default logger.
@spec detach_default_logger() :: :ok | {:error, :not_found}
Detaches the default logger.
@spec emit_abandoned(atom(), String.t(), non_neg_integer()) :: :ok
Emits a telemetry event when reconciliation exhausts all retries (abandoned).
Emits a telemetry event when Oban discards a job (dead letter).
Emits a telemetry event when an idempotency key prevents a duplicate emission.
Emits a telemetry event for event emission.
Emits a telemetry event for handler failure.
Emits a telemetry event for successful handler processing.
Emits a telemetry event when reconciliation successfully processes an event.
Emits a telemetry event when payload validation fails at emit-time.