Skip to main content
RunBook Academy

← All checklists in Observability

Before deploymentalerting-readiness

Alerting Readiness

21 items ·15 critical ·5 warn ·1 info

Run this before an alerting stack carries its first production page, and again before any change to the routing tree, the receivers, the inhibit rules or the set of people the pages reach.

This checklist is about the chain, not the rules. It asks whether an alert that fires reaches a human who can act, and whether you would find out if it stopped doing so. The content of the rules themselves — labels, annotations, thresholds, tests, burn-rate windows — is the Alert Review checklist, and the question of whether the rules that fired last quarter earned their pages is the Alert Quality Review. Running this one alone gives you a chain that reliably delivers rules nobody has audited.

What a failure means

Every critical item here describes a way a real page disappears without an error anywhere. That is the defining property of this class of fault: the rule evaluates, the alert appears in the Alertmanager list, the config is valid, the process is healthy, and no notification arrives. Each of the individual components reports success, because each of them did succeed at its own job.

The two items with the widest blast radius are the inhibit-rule scope and the catch-all receiver. Both convert a working alerting system into one that silently discards a subset of alerts, and both look correct in review.

Access this needs

amtool and promtool on a host that can reach Alertmanager on 9093 and Prometheus on 9090, plus read access to alertmanager.yml and the rule files. The amtool alert add items push synthetic alerts into the live Alertmanager; they will notify real receivers, so agree the window with the on-call rotation first and expire the test alerts afterwards. Everything else is a read.

Four items — the out-of-band canary path, the staffed rotation, the agreed page budget, and the record of the review — are attested by a person. No command can answer them, and they are the four most likely to be assumed rather than checked.

Sign-off

  • Reviewer: ________________ Date: ___________
  • Platform owner: ___________ Date: ___________
  • On-call lead: _____________ Date: ___________

Critical15 items

  1. amtool check-config /etc/alertmanager/alertmanager.yml && curl -s http://alertmanager:9093/metrics | grep alertmanager_config_last_reload_success_timestamp_seconds
  2. promtool check rules /etc/prometheus/rules/*.yml
  3. amtool config routes test --config.file=/etc/alertmanager/alertmanager.yml severity=page team=payments service=checkout
  4. amtool config routes show --config.file=/etc/alertmanager/alertmanager.yml
  5. amtool alert add alertname=ReadinessProbe severity=page team=payments --alertmanager.url=http://alertmanager:9093
  6. curl -s http://prometheus:9090/api/v1/rules | jq -r '.data.groups[].rules[] | select(.type=="alerting") | .query' | grep -c alertmanager_notifications_failed_total
  7. curl -s http://prometheus:9090/api/v1/rules | jq -r '.data.groups[].rules[] | select(.type=="alerting") | .query' | grep -c alertmanager_config_last_reload_success_timestamp_seconds
  8. amtool alert query --output=json --alertmanager.url=http://alertmanager:9093 | jq -r '.[] | select(.labels.alertname | test("Canary|Watchdog")) | "\(.labels.alertname) \(.startsAt)"'
  9. curl -s http://meta-prometheus:9090/api/v1/targets | jq -r '.data.activeTargets[] | "\(.labels.job) \(.health)"'
  10. awk '/^inhibit_rules:/{f=1} f' /etc/alertmanager/alertmanager.yml | grep -c source_matchers; awk '/^inhibit_rules:/{f=1} f' /etc/alertmanager/alertmanager.yml | grep -c "equal:"
  11. amtool alert add alertname=ClusterDown cluster=prod-eu-1 severity=critical; amtool alert add alertname=HostDown cluster=prod-us-1 severity=critical
  12. curl -s http://prometheus:9090/api/v1/rules | jq -r '.data.groups[].rules[] | select(.type=="alerting") | .labels.severity' | sort | uniq -c

Warning5 items

  1. curl -s http://alertmanager:9093/metrics | grep -E '^alertmanager_cluster_(peers|members)'
  2. grep -nE 'group_by|group_wait|group_interval|repeat_interval' /etc/alertmanager/alertmanager.yml
  3. amtool silence query --output=json | jq -r '.[] | "\(.endsAt) \(.createdBy) \(.comment)"'
  4. grep -nE 'mute_time_intervals|active_time_intervals|time_intervals' /etc/alertmanager/alertmanager.yml
  5. curl -s http://alertmanager:9093/metrics | grep alertmanager_dispatcher_aggregation_group_limit_reached_total

Info1 item