Metric modes
IBC supports 2 metric modes:simpleexposes a Prometheus-compatible/metricsendpoint for direct scraping. It is intended for local development and straightforward Prometheus deployments.otelconfigures 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.
Available metrics
Default OpenTelemetry Go runtime metrics and ConnectRPC RPC metrics from otelconnect are also exposed when observability is enabled. OTEL host instrumentation also exportsprocess.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, ortimeout.- Batch
chain_id: destination forrecv; source forackandtimeout. - Transaction
chain_id: chain receiving the transaction. - Transaction
client_id: client updated by the transaction; destination forrecv, source forackandtimeout. - Processor
type:send_to_recv,send_to_timeout, orrecv_to_ack.
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.