From 2eec485beff4eb9fb08648b98b681646b8f7a36f Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] alerts: the silence alarms now cover the media restore probe too A second monthly probe exists (restore-drill-media). Its failure was already covered - BackupJobFailed matches the prefix - but its silence was not, and silence is the failure this rule set was written against. RestoreDrillStale now matches the prefix instead of one exact name, and names the affected probe in the message: with two drills, "the restore probe has not run" no longer says which. BackupCronJobMissing gains the new cronjob, because a series that disappears is not an alert in Prometheus, it is quiet. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01F2Q4Ri8NGwyTZzScvKnWFM --- monitoring/prometheus/alerts.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/monitoring/prometheus/alerts.yml b/monitoring/prometheus/alerts.yml index 6f563c8..ec600f0 100644 --- a/monitoring/prometheus/alerts.yml +++ b/monitoring/prometheus/alerts.yml @@ -137,18 +137,20 @@ groups: annotations: summary: "Seit ueber 26h kein Lauf von {{ $labels.cronjob }} — CronJob ausgesetzt oder verschwunden?" - # Die monatliche Restore-Probe laeuft nicht mehr. Eine Sicherung, die nie + # Die monatlichen Restore-Proben laufen nicht mehr - restore-drill (Datenbanken) + # und restore-drill-media (Synapse-Medien). Praefix-Matcher und cronjob-Name in der + # Meldung, sonst sagt der Alarm nicht, WELCHE Probe steht. Eine Sicherung, die nie # zurueckgespielt wurde, ist eine Vermutung — deshalb ist auch das Ausbleiben # der PRUEFUNG ein Alarm, nicht nur ihr Fehlschlag. 40 Tage = Monatsrhythmus + Puffer. # Bis zum ersten REGULAEREN Lauf gibt es keine last_schedule_time-Serie (ein # manuell ausgeloester Job setzt sie nicht) - ohne Fallback waere dieser # Alarm bis dahin blind. Gleiche max-by-Konstruktion wie oben. - alert: RestoreDrillStale - expr: time() - max by (namespace, cronjob) (kube_cronjob_status_last_schedule_time{cronjob="restore-drill"} or kube_cronjob_created{cronjob="restore-drill"}) > 3456000 + expr: time() - max by (namespace, cronjob) (kube_cronjob_status_last_schedule_time{cronjob=~"restore-drill.*"} or kube_cronjob_created{cronjob=~"restore-drill.*"}) > 3456000 labels: severity: warning annotations: - summary: "Restore-Probe seit ueber 40 Tagen nicht gelaufen — Wiederherstellbarkeit ist wieder unbewiesen (Verfahren: notfallhandbuch)" + summary: "{{ $labels.cronjob }} seit ueber 40 Tagen nicht gelaufen — Wiederherstellbarkeit ist wieder unbewiesen (Verfahren: notfallhandbuch)" # Ein Backup-CronJob existiert gar nicht mehr (geloescht, Kustomization # entfernt, Namespace weg). Bei den Alarmen oben verschwindet dann die @@ -162,6 +164,7 @@ groups: or absent(kube_cronjob_info{namespace="matrix", cronjob="wikijs-backup"}) or absent(kube_cronjob_info{namespace="authentik", cronjob="authentik-backup"}) or absent(kube_cronjob_info{namespace="matrix", cronjob="restore-drill"}) + or absent(kube_cronjob_info{namespace="matrix", cronjob="restore-drill-media"}) for: 30m labels: severity: critical