Skip to content

Watch the alerting dead man's switch trip, once #288

Description

@Gerrrt

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.

The procedure

Already written, in docs/runbooks/verify-the-alert-path.md under "Confirming it actually works":

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions