You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split out of #120, which is closed: the three notification secrets are filled in, the five-receiver config is live, and each receiver reads its own non-empty secret. What #120 could not close is its own last instruction:
Then, once, actually watch it trip. A dead man's switch nobody has seen go red is indistinguishable from one that does not work.
The mechanism is built and verifiable from the repository. The drill is not, and there is no record of it having been run. That is a different kind of task with a different definition of done, which is why it is here rather than holding #120 open.
What exists today
watchdog.rules.yaml emits the always-firing Watchdog alert.
alertmanager.yaml:61-67 routes it to the heartbeat receiver with group_wait: 0s, group_interval: 1m, repeat_interval: 5m, continue: true.
A second Watchdog route sends 24h to the real alert channel — the half that catches a webhook which is well-formed, reachable, returns 200 and points at nothing (No dead man's switch on the notification path #67's actual failure).
ALERTMANAGER_HEARTBEAT_URL is set and the external check is green.
A green check that has never been seen go red is the thing this issue exists to fix.
docker stop alertmanager
# wait out the grace window — 15m by default# the external check must report DOWN and notify you
docker start alertmanager
# it must return to green within one repeat_interval
Nothing needs to be written. This is execution, and then a line somewhere saying it happened.
The runbook's second paragraph there covers the daily half without waiting a day: temporarily lower repeat_interval on the second Watchdog route, make reload, and check the real channel.
Pick the window deliberately
docker stop alertmanager for the length of the grace window means the estate has no alert delivery for ~15 minutes. Prometheus keeps evaluating and Alertmanager will deliver what is still firing when it comes back, but anything that resolves inside the window is never notified. Two constraints from the runbook's own "timing is coupled" section apply:
Not Sunday 03:30 — homelab-backup-volumes quiesces the stack then, which stops Prometheus evaluating and therefore stops the heartbeat. Overlapping the two makes the result unreadable.
The external check's notification must not be this stack's webhook. If it is, the test cannot report its own failure.
Done when
The external check has been observed DOWN and sent its notification.
It returned green within one repeat_interval after docker start.
The 24h route to the real channel confirmed by the temporary-repeat_interval method.
The date recorded — verify-the-alert-path.md is the natural place, the way restore-the-firewall.md carries "until that has been done once, this runbook is a hypothesis".
That last box is what stops this being re-litigated in six months, and it is the same gap #92 has: a mechanism built, a drill never run, and nothing in the repository that says which.
Split out of #120, which is closed: the three notification secrets are filled in, the five-receiver config is live, and each receiver reads its own non-empty secret. What #120 could not close is its own last instruction:
The mechanism is built and verifiable from the repository. The drill is not, and there is no record of it having been run. That is a different kind of task with a different definition of done, which is why it is here rather than holding #120 open.
What exists today
watchdog.rules.yamlemits the always-firingWatchdogalert.alertmanager.yaml:61-67routes it to theheartbeatreceiver withgroup_wait: 0s,group_interval: 1m,repeat_interval: 5m,continue: true.Watchdogroute sends 24h to the real alert channel — the half that catches a webhook which is well-formed, reachable, returns 200 and points at nothing (No dead man's switch on the notification path #67's actual failure).ALERTMANAGER_HEARTBEAT_URLis set and the external check is green.A green check that has never been seen go red is the thing this issue exists to fix.
The procedure
Already written, in
docs/runbooks/verify-the-alert-path.mdunder "Confirming it actually works":Nothing needs to be written. This is execution, and then a line somewhere saying it happened.
The runbook's second paragraph there covers the daily half without waiting a day: temporarily lower
repeat_intervalon the secondWatchdogroute,make reload, and check the real channel.Pick the window deliberately
docker stop alertmanagerfor the length of the grace window means the estate has no alert delivery for ~15 minutes. Prometheus keeps evaluating and Alertmanager will deliver what is still firing when it comes back, but anything that resolves inside the window is never notified. Two constraints from the runbook's own "timing is coupled" section apply:homelab-backup-volumesquiesces the stack then, which stops Prometheus evaluating and therefore stops the heartbeat. Overlapping the two makes the result unreadable.Done when
repeat_intervalafterdocker start.repeat_intervalmethod.verify-the-alert-path.mdis the natural place, the wayrestore-the-firewall.mdcarries "until that has been done once, this runbook is a hypothesis".That last box is what stops this being re-litigated in six months, and it is the same gap #92 has: a mechanism built, a drill never run, and nothing in the repository that says which.