Skip to main content
IBC CLI exports metrics for attestors, relayers, signers, provers, and chain RPC calls. Use the configuration reference to enable metrics and select an export mode. The local metrics stack provides a collector, Prometheus, and Grafana for development.

Metric modes

IBC supports 2 metric modes:
  • simple exposes a Prometheus-compatible /metrics endpoint for direct scraping. It is intended for local development and straightforward Prometheus deployments.
  • otel configures the OpenTelemetry SDK from a YAML file and exports metrics to an OTEL collector. It is intended for deployments that need configurable metric pipelines and observability backends.
Metrics are best-effort: failures while setting up the metrics pipeline are logged and tolerated, so they do not prevent IBC from running. The metrics pipeline does not configure log or trace export. Configure process logs through logging. Use the API health checks to check service availability.

Available metrics

Default OpenTelemetry Go runtime metrics and ConnectRPC RPC metrics from otelconnect are also exposed when observability is enabled. OTEL host instrumentation also exports process.cpu.time (user/system CPU seconds for this process) and host-wide CPU, memory, and network metrics in both metric modes. Use the rate of process.cpu.time for per-process CPU usage; host-wide metrics describe the same machine across processes and should not be summed across service runtimes.

Signer metrics

Shared label: {otel_scope_name="ibc.signer"}

Attestor metrics

Shared label: {otel_scope_name="ibc.attestor"}

Prover metrics

Shared label: {otel_scope_name="ibc.prover"} proof_kind: packet_commitment, acknowledgement, receipt_absence, unknown. Attestation prover metric (otel_scope_name="ibc.prover.attestation"):

Relayer metrics

Shared label: {otel_scope_name="ibc.relayer"}
  • processor: recv, ack, or timeout.
  • Batch chain_id: destination for recv; source for ack and timeout.
  • Transaction chain_id: chain receiving the transaction.
  • Transaction client_id: client updated by the transaction; destination for recv, source for ack and timeout.
  • Processor type: send_to_recv, send_to_timeout, or recv_to_ack.
In metrics that label both packet sides, chain_id / client_id refer to the packet’s source side and dest_chain_id / dest_client_id to its destination. Confirmations count only successful receipts for transactions broadcast by this process and are deduplicated in memory by chain and tx hash. Completions and durations are recorded only on success (CompleteWithAck, CompleteWithTimeout). EVM wallet balances are queried concurrently at the latest block, at most once every 10 seconds per wallet. Collections inside that threshold re-emit the last observed value. A failed query is logged and reported as -1. excessive_relay_latency_total counts packets still pending past a per-leg threshold, using the same type values as processor metrics (send_to_recv, send_to_timeout, recv_to_ack). It is an event counter, not a failure gauge: a packet that remains stuck increments on every dispatcher poll, so alerts should be built on rate(). The threshold is hard-coded for now (60m pending; timeouts 5m past the packet timeout, with a 15m source-finality guard) and can move to config in the future.

EVM client metrics

Shared label: {otel_scope_name="ibc.evm_client"} A null result such as a receipt that is not found yet is an answer, not a failure, so it counts as ok. The websocket endpoint used for subscriptions is not instrumented.