Open-source Avalanche observability
A relayer can report healthy while cross-chain messages silently pile up. AvaPulse is the alerting layer for self-hosted Avalanche L1s and ICM relayers — it watches the message lifecycle, not just the process, and pings you on Telegram or Discord before your users notice.
docker-compose up → dashboards + alerts in minutes
The gap
The ICM relayer ships raw Prometheus metrics and nothing else — no alerting layer, no official dashboards. Generic monitoring sees healthy processes. But the failures that take down cross-chain apps are semantic: every individual signal looks fine, and the outage only exists in the relationship between them.
Metrics endpoint responding, no error logs — while messages accumulate on the source chain and none arrive. Every health check passes. Every user transaction fails.
The relayer pays destination-chain gas from its own wallet. When it empties, delivery halts with no error surfaced anywhere. The classic silent killer of ICM setups.
Uptime decays gradually, then crosses the threshold all at once. By the time an explorer shows it, rewards are already gone. You needed the alert last week.
No generic Alertmanager rule ships for any of these — detecting them requires understanding the Teleporter message lifecycle. That understanding is AvaPulse.
Shipped defaults
Avalanche-native rules out of the box, routed to Telegram, Discord, Slack, email, and webhooks by severity — with recovery notifications, cooldowns, and escalation built in.
Source chain emitting messages, relayer delivering none — while its process still reports healthy.
Destination-chain balance below threshold, with projected time-to-empty from recent spend rate.
A tracked message passed send but never reached execution within its delivery window — alert carries the messageID and chain pair.
Fires while uptime is trending toward the floor — before rewards are lost, not after.
RPC unresponsive or block height not advancing on any monitored L1.
How it works
One YAML file: your L1 RPCs, node metrics endpoints, relayers, and the gas wallets they spend from.
The lifecycle tracker follows every Teleporter message by messageID — send, receive, execute, receipt — and knows what “late” means for each chain pair.
Alerts hit Telegram, Discord, Slack, or any webhook — with recoveries, so silence means healthy, not unknown.
chains:
- name: my-l1
rpc: https://my-l1.example.com/rpc
node_metrics: http://10.0.0.5:9650/ext/metrics
relayers:
- metrics: http://10.0.0.6:9090/metrics
gas_wallets: [{ chain: my-l1, min_balance: 0.5 AVAX }]
icm:
pairs: [{ from: c-chain, to: my-l1, max_delivery_seconds: 120 }]
notify:
telegram: { bot_token: $TG_TOKEN, chat_id: $TG_CHAT }
# then:
$ docker-compose upThe landscape
Good tools exist around the edges of this problem. None of them watch the cross-chain message layer.
| ICM-aware | Alerting-first | Self-host | Free core | |
|---|---|---|---|---|
| AvaPulse | ✓ | ✓ | ✓ | ✓ |
| Zeeve | — | ✓ | ✓ | enterprise pricing |
| Avalanche Notify | — | email only, beta | — | ✓ |
| avalanche-monitoring | — | DIY Grafana | ✓ | ✓ |
| AvaCloud | — | — | managed only | — |
Zeeve monitors nodes and chains well — for enterprise budgets. Avalanche Notify covers primary-network validators by email, in beta. Neither tracks message lifecycles, relayer throughput, or gas wallets. That layer is the wedge.
Building in public