# `Resiliency.Telemetry`
[🔗](https://github.com/yoavgeva/resiliency/blob/v0.6.0/lib/resiliency/telemetry.ex#L1)

Telemetry events emitted by the Resiliency library.

All events follow the standard `:telemetry` span convention where applicable:
`[:resiliency, :module, :action, :start | :stop | :exception]`. Point events
(non-span) are emitted for significant occurrences like retries, hedges,
rejections, and state changes.

Every event is emitted in the **caller's process** except where noted.
Attaching handlers has zero impact on server throughput for caller-emitted
events. The `state_change` event for CircuitBreaker is emitted inside the
GenServer process.

## BackoffRetry

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :retry, :start]` | span | `%{system_time: integer}` | `%{max_attempts: integer}` |
| `[:resiliency, :retry, :stop]` | span | `%{duration: integer}` | `%{max_attempts: integer, attempts: integer, result: :ok \| :error}` |
| `[:resiliency, :retry, :exception]` | span | `%{duration: integer}` | `%{max_attempts: integer, attempts: integer, kind: atom, reason: term, stacktrace: list}` |
| `[:resiliency, :retry, :retry]` | point | `%{delay: integer}` | `%{attempt: integer, error: term}` |

## CircuitBreaker

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :circuit_breaker, :call, :start]` | span | `%{system_time: integer}` | `%{name: term}` |
| `[:resiliency, :circuit_breaker, :call, :stop]` | span | `%{duration: integer}` | `%{name: term, result: :ok \| :error, error: term \| nil}` |
| `[:resiliency, :circuit_breaker, :call, :rejected]` | point | `%{}` | `%{name: term}` |
| `[:resiliency, :circuit_breaker, :state_change]` | point | `%{}` | `%{name: term, from: atom, to: atom}` |

## Bulkhead

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :bulkhead, :call, :start]` | span | `%{system_time: integer}` | `%{name: term}` |
| `[:resiliency, :bulkhead, :call, :stop]` | span | `%{duration: integer}` | `%{name: term, result: :ok \| :error, error: term \| nil}` |
| `[:resiliency, :bulkhead, :call, :rejected]` | point | `%{}` | `%{name: term}` |
| `[:resiliency, :bulkhead, :call, :permitted]` | point | `%{}` | `%{name: term}` |

## Hedged

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :hedged, :run, :start]` | span | `%{system_time: integer}` | `%{mode: :stateless \| :adaptive}` |
| `[:resiliency, :hedged, :run, :stop]` | span | `%{duration: integer}` | `%{mode: atom, result: :ok \| :error, dispatched: integer, hedged: boolean}` |
| `[:resiliency, :hedged, :hedge]` | point | `%{}` | `%{attempt: integer}` |

## SingleFlight

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :single_flight, :flight, :start]` | span | `%{system_time: integer}` | `%{name: term, key: term}` |
| `[:resiliency, :single_flight, :flight, :stop]` | span | `%{duration: integer}` | `%{name: term, key: term, result: :ok \| :error, shared: boolean}` |
| `[:resiliency, :single_flight, :flight, :exception]` | span | `%{duration: integer}` | `%{name: term, key: term, kind: atom, reason: term, stacktrace: list}` |

## WeightedSemaphore

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :semaphore, :acquire, :start]` | span | `%{system_time: integer}` | `%{name: term, weight: integer}` |
| `[:resiliency, :semaphore, :acquire, :stop]` | span | `%{duration: integer}` | `%{name: term, weight: integer, result: :ok \| :error \| :rejected}` |
| `[:resiliency, :semaphore, :acquire, :rejected]` | point | `%{}` | `%{name: term, weight: integer}` |

## Race

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :race, :run, :start]` | span | `%{system_time: integer}` | `%{count: integer}` |
| `[:resiliency, :race, :run, :stop]` | span | `%{duration: integer}` | `%{count: integer, result: :ok \| :error}` |
| `[:resiliency, :race, :run, :exception]` | span | `%{duration: integer}` | `%{count: integer, kind: atom, reason: term, stacktrace: list}` |

## AllSettled

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :all_settled, :run, :start]` | span | `%{system_time: integer}` | `%{count: integer}` |
| `[:resiliency, :all_settled, :run, :stop]` | span | `%{duration: integer}` | `%{count: integer, ok_count: integer, error_count: integer}` |
| `[:resiliency, :all_settled, :run, :exception]` | span | `%{duration: integer}` | `%{count: integer, kind: atom, reason: term, stacktrace: list}` |

## Map

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :map, :run, :start]` | span | `%{system_time: integer}` | `%{count: integer, max_concurrency: integer}` |
| `[:resiliency, :map, :run, :stop]` | span | `%{duration: integer}` | `%{count: integer, max_concurrency: integer, result: :ok \| :error}` |
| `[:resiliency, :map, :run, :exception]` | span | `%{duration: integer}` | `%{count: integer, max_concurrency: integer, kind: atom, reason: term, stacktrace: list}` |

## FirstOk

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :first_ok, :run, :start]` | span | `%{system_time: integer}` | `%{count: integer}` |
| `[:resiliency, :first_ok, :run, :stop]` | span | `%{duration: integer}` | `%{count: integer, result: :ok \| :error, attempts: integer}` |
| `[:resiliency, :first_ok, :run, :exception]` | span | `%{duration: integer}` | `%{count: integer, kind: atom, reason: term, stacktrace: list}` |

## RateLimiter

| Event | Type | Measurements | Metadata |
|---|---|---|---|
| `[:resiliency, :rate_limiter, :call, :start]` | span | `%{system_time: integer}` | `%{name: term}` |
| `[:resiliency, :rate_limiter, :call, :stop]` | span | `%{duration: integer}` | `%{name: term, result: :ok \| :error, error: term \| nil}` |
| `[:resiliency, :rate_limiter, :call, :rejected]` | point | `%{retry_after: integer}` | `%{name: term}` |

---

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