At-a-glance list of all warnings + thresholds: alert-definitions.md
One section per alert. Every alert's runbook_url annotation links here, so each Telegram notification carries a direct link to its fix. Thresholds are tuned by monitoring/threshold_tuning/tune_thresholds.py (see alert-relationships.md).
Access: AWS hosts are reached over SSH through the bastion (ProxyJump); the Vultr sui node directly via its operator SSH alias. Exact hostnames, IPs, ports and keys live in the operator's ~/.ssh/config and password manager — not here (hosts are identified by role in this doc).
Means: the 7-day-median nightly pg_dump runtime exceeds the threshold (4h). This is a capacity-drift / trend warning, not an outage — backups are still succeeding. It rises as the DB grows. Severity: warning. Not urgent unless approaching the 14h TimeoutStartSec. Check: birdai_pg_backup_last_duration_seconds trend in Grafana. Fix (in order):
mev_sc_tx_* partitions are excluded--exclude-table-data) in /usr/local/bin/pg-dump-to-s3.sh, and that theMeans: the Sui node's checkpoint execution lag exceeded 30 min — the indexer is ingesting stale or no chain data. Severity: critical. Most common cause: the WireGuard tunnel (indexer ↔ Vultr node) is down after an egress-IP change. Check: on the indexer, sudo wg show → 0 B received? Fix:
sudo ufw allow from <INDEXER_EIP> to any port 51820 proto udp. Handshakesudo systemctl status sui-node on the Vultr node;journalctl -u sui-node. The node auto-upgrades nightly (rollback onmax(timestamp_ms) in ticks resumes advancing.Means: the sui-indexer systemd service is not active (its host is still reachable — otherwise InstanceDown fires instead). Chain ingestion has stopped; MEV data will go stale. Severity: critical. Check: systemctl status sui-indexer on the indexer host; journalctl -u sui-indexer -n 100. Fix:
systemctl restart sui-indexer; confirm max(created_at) in ticks resumesMeans: no successful pg_dump in >24h (one daily run missed). Severity: critical. Check: journalctl -u pg-dump-to-s3 (or the backup timer) on the DB host; birdai_pg_backup_last_success_timestamp. Fix:
pg-dump-to-s3.service (User=postgres).TimeoutStartSec.Means: no successful partition-archive (cold-partition offload to S3) in >12d. This is the real DB-size governor; if it stalls the DB and dumps both grow. Severity: critical. Check: the partition-archive timer/logs; birdai_partition_archive_last_success_timestamp. Note: the archive offload was scaffolded but historically under-implemented — if the metric is absent the textfile-collector path may be broken. Verify the job actually exists before assuming a transient failure.
Means: a db-host filesystem is <10% free. Severity: warning (→ becomes an outage at 0%). Fix:
df -h on the DB host; find the growing mount (du -xhd1 /var/lib/postgresql | sort -h).Means: MemAvailable < 500 MB — OOM risk to Postgres/uvicorn. Severity: critical. Fix: free -h, ps aux --sort=-%mem | head. Identify the consumer; restart the offending service if leaking; check for a runaway query (pg_stat_activity). Confirm swap isn't thrashing.
Means: a scrape target (up==0) or Postgres (pg_up==0) is unreachable for 2 min. Severity: critical. Binary — always actionable. Fix: SSH to the instance; systemctl status the service (birdai-api, postgresql@16-main, prometheus, node_exporter, postgres_exporter, sui-node); review journal; restart. If the host itself is down, check the EC2/Vultr console.
Means: Prometheus cannot scrape the local Alertmanager (up{job="alertmanager"}==0) for >5 min — rule evaluation still works, but alert delivery (Telegram) is broken on this box. Only fires on validator stamps that scrape localhost:9093; the AWS box has no such scrape job, so it can never fire there. Severity: critical. Inherent limit: a dead Alertmanager can't deliver its own death notice — this alert surfaces in the Prometheus/Grafana UI and during stamp verification drills, not via Telegram. Fix: SSH to the box; systemctl status alertmanager, journalctl -u alertmanager -n 50. Common causes: bad render of /etc/alertmanager/alertmanager.yml (re-run monitoring/render.sh), a missing /etc/alertmanager/bot_token, or the service failing to bind :9093. Restart and confirm up{job="alertmanager"} returns to 1.
Thresholds last tuned by the monthly alert-threshold-tuner job. To re-run on demand (on the app host, where Prometheus is local): PROM_URL=http://localhost:9090 python3 monitoring/threshold_tuning/tune_thresholds.py. Operator UI access is via the HTTPS URLs — see access.md.