diff --git a/docs/ALERT_RULES.md b/docs/ALERT_RULES.md index 23a2347..71a3b13 100644 --- a/docs/ALERT_RULES.md +++ b/docs/ALERT_RULES.md @@ -47,6 +47,7 @@ Severity-Routing der Bridge: `critical` und `warning` gehen beide auf | Alarm | Trigger (PromQL, gekuerzt) | Schwelle / `for` | Severity | Was tun | |---|---|---|---|---| | `HomelabDiskAlmostFull` | `100*(1-avail/size) > 85` (ohne tmpfs/overlay) | >85% / 10m | warning | Mountpoint aufraeumen / erweitern | +| `HomelabDiskCritical` | `100*(1-avail/size) > 95` (ohne tmpfs/overlay) | >95% / 5m | critical | Sofort Platz schaffen — Writes drohen zu scheitern (DB, appdata, Cache) | | `HomelabHighMemoryUsage` | `100*(1-MemAvailable/MemTotal) > 90` | >90% / 10m | warning | Speicherfresser identifizieren, ggf. Container-Limit (F-19) | | `HomelabTraefik5xx` | `increase(traefik_service_requests_total{5..}[5m]) >= 5` je Service | ≥5 / 2m | warning | Backend des betroffenen Service pruefen | @@ -64,6 +65,12 @@ Severity-Routing der Bridge: `critical` und `warning` gehen beide auf Die Liste der ueberwachten Critical-Container steht in `services/posture-check/export-prometheus-textfile.sh` (`CRITICAL_CONTAINERS`). +### Gruppe `homelab-meta` + +| Alarm | Trigger (PromQL, gekuerzt) | Schwelle / `for` | Severity | Was tun | +|---|---|---|---|---| +| `HomelabPrometheusTargetDown` | `up == 0` | =0 / 5m | critical | Scrape-Ziel (node-exporter/cadvisor/blackbox/traefik) pruefen — Metriken sind sonst still | + ## Bewertung: Sind die Alarme sinnvoll? Insgesamt solide. Die Erreichbarkeits-Gruppe ist gut entworfen — der @@ -87,40 +94,13 @@ Anmerkungen / Feinschliff (kein Handlungsdruck): ## Bewertung: Fehlt etwas? (Luecken, priorisiert) -### Hoch — echter blinder Fleck +### Hoch — erledigt 2026-05-30 -1. **Kein `up == 0` auf Scrape-Targets.** Faellt **node-exporter**, **cadvisor**, - **blackbox-exporter** oder **traefik** als Scrape-Ziel aus, verschwinden die - zugehoerigen Metriken still — und mit ihnen die darauf gebauten Alarme. Nur - der Textfile-Pfad ist ueber `BorgMetricsMissing` / `TextfileExporterStale` - abgesichert, der Rest nicht. Empfohlen: - - ```yaml - - alert: HomelabPrometheusTargetDown - expr: up == 0 - for: 5m - labels: - severity: critical - annotations: - summary: "Prometheus target down: {{ $labels.job }} / {{ $labels.instance }}" - description: "Scrape target {{ $labels.instance }} (job {{ $labels.job }}) is unreachable." - ``` - -2. **Kein Disk-Critical-Tier.** Nur ein Warning bei 85 %, kein Critical bei - ~95 %. Eine volllaufende Cache-/appdata-Disk blockiert Schreibzugriffe und - damit DB-Writes — fuer Familien-Nutzung teurer als nur Operator-Zeit. - Empfohlen (eng auf kritische Pfade gefiltert): - - ```yaml - - alert: HomelabDiskCritical - expr: 100 * (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) > 95 - for: 5m - labels: - severity: critical - annotations: - summary: "Disk critically full on {{ $labels.mountpoint }}" - description: "{{ $labels.mountpoint }} is above 95% used." - ``` +1. ~~Kein `up == 0` auf Scrape-Targets~~ → **`HomelabPrometheusTargetDown`** + umgesetzt (Gruppe `homelab-meta`). Faellt node-exporter/cadvisor/blackbox/ + traefik aus, feuert jetzt nach 5 Minuten ein Critical. +2. ~~Kein Disk-Critical-Tier~~ → **`HomelabDiskCritical`** bei >95 % umgesetzt + (Gruppe `homelab-host`), zusaetzlich zum bestehenden Warning bei >85 %. ### Mittel — sinnvoll, aber kein Notstand @@ -142,10 +122,8 @@ Anmerkungen / Feinschliff (kein Handlungsdruck): (Container-Memory-Limits) ausloesen wuerde. - **Cert/Token-Health jenseits TLS-Ablauf** → `cert-token-check.sh`. -## Empfehlung +## Stand -Die zwei Hoch-Luecken (`up == 0` Target-Down und Disk-Critical) sind der -lohnendste naechste Schritt: wenige Zeilen, schliessen einen echten blinden -Fleck und kosten keine Laufzeit. Umsetzung bewusst als eigener Aenderungsblock, -weil sie `monitoring/prometheus/alerts.yml` aendert und damit einen -Prometheus-Reload/Komodo-Deploy nach sich zieht. +Die zwei Hoch-Luecken sind seit 2026-05-30 in `alerts.yml` umgesetzt. Naechster +optionaler Schritt waere der Dead-Man's-Switch ueber einen externen Heartbeat- +Waechter; ohne familienkritischen Anlass aber nicht eilig. diff --git a/monitoring/prometheus/alerts.yml b/monitoring/prometheus/alerts.yml index 352dff0..b486961 100644 --- a/monitoring/prometheus/alerts.yml +++ b/monitoring/prometheus/alerts.yml @@ -57,6 +57,15 @@ groups: summary: "Disk usage high on {{ $labels.mountpoint }}" description: "{{ $labels.mountpoint }} is above 85% used." + - alert: HomelabDiskCritical + expr: 100 * (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) > 95 + for: 5m + labels: + severity: critical + annotations: + summary: "Disk critically full on {{ $labels.mountpoint }}" + description: "{{ $labels.mountpoint }} is above 95% used. Writes may start to fail (DB, appdata, cache)." + - alert: HomelabHighMemoryUsage expr: 100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 90 for: 10m @@ -130,3 +139,14 @@ groups: annotations: summary: "Critical container is down: {{ $labels.name }}" description: "The host textfile exporter reports that critical container {{ $labels.name }} is not running." + + - name: homelab-meta + rules: + - alert: HomelabPrometheusTargetDown + expr: up == 0 + for: 5m + labels: + severity: critical + annotations: + summary: "Prometheus target down: {{ $labels.job }} / {{ $labels.instance }}" + description: "Scrape target {{ $labels.instance }} (job {{ $labels.job }}) is unreachable. Metrics from this target are silent — alerts built on them will not fire."