# `RpcLoadBalancer.Metrics`
[🔗](https://github.com/MikaAK/rpc_load_balancer/blob/main/lib/rpc_load_balancer/metrics.ex#L1)

`Telemetry.Metrics` definitions for `RpcLoadBalancer.call/5`,
`RpcLoadBalancer.cast/5`, and node-selection events.

Consumers register these in their telemetry supervisor — e.g. through
`PrometheusTelemetry` — to expose `rpc_load_balancer.*` series.

    # in your_app/application.ex
    children = [
      {PrometheusTelemetry,
       exporter: [enabled?: prod?()],
       metrics: [
         RpcLoadBalancer.Metrics.metrics(),
         PrometheusTelemetry.Metrics.VM.metrics()
       ]}
    ]

## Emitted events

  * `[:rpc_load_balancer, :rpc, :start]`
  * `[:rpc_load_balancer, :rpc, :stop]` — measurement `:duration` (`:native`)
  * `[:rpc_load_balancer, :rpc, :exception]`
  * `[:rpc_load_balancer, :node_selected]` — `count: 1, members_count: pool_size`
  * `[:rpc_load_balancer, :node_selected, :empty]` — `count: 1`

## Metadata

RPC events:

  * `:type` — `:call` or `:cast`
  * `:node` — target node atom
  * `:module` — `inspect/1`'d module name (string, low-cardinality)
  * `:function` — function name atom
  * `:load_balancer` — load balancer name atom, or `nil` for direct calls
  * `:status` (stop only) — `:ok | :error | atom()` mapped from `ErrorMessage` code

Selection events:

  * `:algorithm` — full algorithm module atom (e.g. `Random`, `RoundRobin`)
  * `:load_balancer` — load balancer name atom
  * `:node` — selected node atom (omitted on `:empty` event)

## Prometheus series

  * `rpc_load_balancer.rpc.request.start.count`
  * `rpc_load_balancer.rpc.request.stop.count`
  * `rpc_load_balancer.rpc.duration.milliseconds`
  * `rpc_load_balancer.node.selected.count`
  * `rpc_load_balancer.node.selected.empty.count`
  * `rpc_load_balancer.node.pool_size`

# `metrics`

```elixir
@spec metrics() :: [Telemetry.Metrics.t()]
```

---

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