guides/opentelemetry.md

# OpenTelemetry

ExGram emits [`:telemetry` events](telemetry.md) for update processing, handler execution, middleware, outbound API requests, and polling cycles. The [`opentelemetry_ex_gram`](https://github.com/rockneurotiko/opentelemetry_ex_gram) library attaches to those events and creates OpenTelemetry spans automatically.

## Installation

Add the library and the OTel SDK to your `mix.exs`:

```elixir
def deps do
  [
    {:opentelemetry_ex_gram, "~> 0.1"},
    {:opentelemetry, "~> 1.3"}
  ]
end
```

`opentelemetry_api`, `opentelemetry_telemetry`, and `opentelemetry_process_propagator` are pulled in as transitive dependencies.

## Setup

Call `OpentelemetryExGram.setup/0` once during application startup, before your bots are started:

```elixir
def start(_type, _args) do
  OpentelemetryExGram.setup()

  children = [ExGram, {MyBot, [method: :polling, token: token]}]
  Supervisor.start_link(children, strategy: :one_for_one)
end
```

You can also configure it using `OpentelemetryExGram.setup/1`. 

Available options:

| Option | Default | Description |
|---|---|---|
| `:span_prefix` | `"ExGram"` | Prefix for all span names |
| `:trace_polling` | `true` | Create spans for polling cycles |
| `:trace_middlewares` | `true` | Create spans for each middleware |
| `:trace_requests` | `true` | Create spans for outbound Telegram API calls |

## Span hierarchy

A typical update produces this span tree:

```text
{prefix}.update
  {prefix}.middleware   (one per middleware)
  {prefix}.handler
    {prefix}.request    (one per outbound API call)
```

OTel context is propagated automatically across all process boundaries, including async handlers.

## Testing

`OpentelemetryExGram.Test` provides a per-test setup helper that attaches the telemetry handler for a specific test bot and registers automatic cleanup:

```elixir
setup context do
  {bot_name, _} = ExGram.Test.start_bot(context, MyBot)
  OpentelemetryExGram.Test.setup(bot_name)
  {:ok, bot_name: bot_name}
end
```

> ### More information {: .info}
>
> For full documentation — span attributes, advanced options, and testing with
> [`opentelemetry_test_processor`](https://hex.pm/packages/opentelemetry_test_processor) — see the
> [`opentelemetry_ex_gram` repository](https://github.com/rockneurotiko/opentelemetry_ex_gram).