TelemetryReporter is a transport-agnostic telemetry batching library for Elixir/BEAM apps. It uses Pachka for size and time based flushing, drops on overload to protect producers, and isolates encoding failures so a single bad event never poisons a batch.
Add telemetry_reporter to your dependencies:
def deps do
[
{:telemetry_reporter, "~> 0.1.0"}
]
endDefine a transport:
defmodule MyApp.TelemetryTransport do
@behaviour TelemetryReporter.Transport
@impl true
def send_batch(events, _opts) do
# Deliver encoded events to your backend.
:ok
end
endStart the reporter and log events:
{:ok, _pid} =
TelemetryReporter.start_link(
name: MyReporter,
transport: MyApp.TelemetryTransport,
max_batch_size: 200,
max_batch_delay: :timer.seconds(2)
)
:ok = TelemetryReporter.log(MyReporter, "user.login", %{user_id: "123"}, :info)TelemetryReporter options:
:transport- module implementingTelemetryReporter.Transport(required):transport_opts- options passed to the transport (default: []):event_encoder- encode events before delivery (default:TelemetryReporter.Event.encode/1):retry_backoff- backoff strategy or function (default:{:linear, 1_000})
All other options are forwarded to Pachka.start_link/1 (such as
max_batch_size, max_batch_delay, critical_queue_size, and export_timeout).
Forward :telemetry events into TelemetryReporter:
handler_id =
TelemetryReporter.TelemetryAdapter.attach_many(
reporter: MyReporter,
events: [[:my_app, :http, :request, :stop]],
severity: :info
)
# Later...
TelemetryReporter.TelemetryAdapter.detach(handler_id)TelemetryReporter emits telemetry events with prefix [:telemetry_reporter]:
[:telemetry_reporter, :event, :dropped][:telemetry_reporter, :event, :encode_error][:telemetry_reporter, :batch, :sent][:telemetry_reporter, :batch, :failed]
See docs/usage.md for advanced usage, encoder details, and retry backoff
configuration.