README.md

<p align="center">
  <img src="assets/telemetry_reporter.svg" alt="TelemetryReporter" width="200">
</p>

# TelemetryReporter

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.

## Installation

Add `telemetry_reporter` to your dependencies:

```elixir
def deps do
  [
    {:telemetry_reporter, "~> 0.1.0"}
  ]
end
```

## Quick Start

Define a transport:

```elixir
defmodule MyApp.TelemetryTransport do
  @behaviour TelemetryReporter.Transport

  @impl true
  def send_batch(events, _opts) do
    # Deliver encoded events to your backend.
    :ok
  end
end
```

Start the reporter and log events:

```elixir
{: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)
```

## Configuration

TelemetryReporter options:
- `:transport` - module implementing `TelemetryReporter.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`).

## Telemetry Adapter

Forward `:telemetry` events into TelemetryReporter:

```elixir
handler_id =
  TelemetryReporter.TelemetryAdapter.attach_many(
    reporter: MyReporter,
    events: [[:my_app, :http, :request, :stop]],
    severity: :info
  )

# Later...
TelemetryReporter.TelemetryAdapter.detach(handler_id)
```

## Telemetry Events

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]`

## Docs

See `docs/usage.md` for advanced usage, encoder details, and retry backoff
configuration.

## License

MIT — see [LICENSE](LICENSE) for details.