# `WhatsApp.Telemetry`
[🔗](https://github.com/jeffhuen/whatsapp_sdk/blob/main/lib/whatsapp/telemetry.ex#L1)

Telemetry event helpers for WhatsApp API requests.

## Events

| Event | Measurements | Metadata |
|-------|-------------|----------|
| `[:whatsapp, :request, :start]` | `%{system_time: integer}` | `%{method: atom, path: String.t}` |
| `[:whatsapp, :request, :stop]` | `%{duration: integer}` | `%{method: atom, path: String.t, status: integer}` |
| `[:whatsapp, :request, :exception]` | `%{duration: integer}` | `%{method: atom, path: String.t, kind: atom, reason: term}` |
| `[:whatsapp, :request, :retry]` | `%{system_time: integer}` | `%{method: atom, path: String.t, attempt: integer, reason: term, wait_ms: integer}` |

## Attaching Handlers

    :telemetry.attach_many(
      "whatsapp-logger",
      [
        [:whatsapp, :request, :start],
        [:whatsapp, :request, :stop],
        [:whatsapp, :request, :exception]
      ],
      &MyApp.TelemetryHandler.handle_event/4,
      nil
    )

# `emit_exception`

```elixir
@spec emit_exception(integer(), atom(), String.t(), atom(), term()) :: :ok
```

Emit an `:exception` telemetry event.

`start_time` is the monotonic time returned by `emit_start/2`.

# `emit_retry`

```elixir
@spec emit_retry(atom(), String.t(), pos_integer(), map()) :: :ok
```

Emit a `:retry` telemetry event.

Called before each retry attempt to allow observability into retry behaviour.

- `method` - HTTP method atom
- `path` - request path string
- `attempt` - the upcoming attempt number (1-indexed, so first retry is attempt 2)
- `metadata` - map with `:reason` (atom) and `:wait_ms` (integer)

# `emit_start`

```elixir
@spec emit_start(atom(), String.t()) :: integer()
```

Emit a `:start` telemetry event.

Returns the start time (monotonic) for computing duration in stop/exception.

# `emit_stop`

```elixir
@spec emit_stop(integer(), atom(), String.t(), integer()) :: :ok
```

Emit a `:stop` telemetry event.

`start_time` is the monotonic time returned by `emit_start/2`.

# `event_exception`

```elixir
@spec event_exception() :: [atom()]
```

Returns the `[:whatsapp, :request, :exception]` event name.

# `event_retry`

```elixir
@spec event_retry() :: [atom()]
```

Returns the `[:whatsapp, :request, :retry]` event name.

# `event_start`

```elixir
@spec event_start() :: [atom()]
```

Returns the `[:whatsapp, :request, :start]` event name.

# `event_stop`

```elixir
@spec event_stop() :: [atom()]
```

Returns the `[:whatsapp, :request, :stop]` event name.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
