51 lines
2.8 KiB
Markdown
51 lines
2.8 KiB
Markdown
# SPEC-healer: Deterministisches Autohealing
|
|
|
|
Paket: `knaster.healer`.
|
|
|
|
## 1. Eingang
|
|
|
|
Alertmanager-Webhook (Version 4) an `POST /v1/healer/alertmanager`. Pro Alert werden `status` (firing/resolved), `labels`, `annotations` und `fingerprint` verarbeitet.
|
|
|
|
## 2. Regeln (`config/healer-rules.yaml`)
|
|
|
|
```yaml
|
|
rules:
|
|
- id: slot-endpoint-down
|
|
match: {alertname: SlotEndpointDown} # alle Labels müssen gleich sein
|
|
ladder:
|
|
- {action: restart_container, params: {host: "{node}", container: "{container}"}, attempts: 2, cooldown: 5m}
|
|
- {action: restart_vm, params: {vmid: "{vmid}", pve_node: "{pve_node}"}, attempts: 1, cooldown: 15m}
|
|
- {action: mark_slot, params: {slot: "{slot}", status: degraded}, attempts: 1}
|
|
on_exhausted: notify
|
|
on_resolved: [{action: mark_slot, params: {slot: "{slot}", status: ok}, only_if_set_by_healer: true}]
|
|
```
|
|
|
|
`{label}` wird aus den Alert-Labels ersetzt. Fehlt ein Label, wird die Stufe übersprungen und im Ergebnis vermerkt.
|
|
|
|
## 3. Ablauf pro Alert (firing)
|
|
|
|
1. Erste passende Regel suchen (Reihenfolge der Datei). Passt keine, wird nur benachrichtigt (`unmatched`).
|
|
2. Zustand pro `(rule_id, fingerprint)`: Versuche pro Stufe und Zeitpunkt der letzten Aktion.
|
|
3. Ist der Cooldown der letzten Aktion noch nicht vorbei, passiert nichts (`cooldown`).
|
|
4. Sonst wird die erste Stufe genommen, deren Versuchsbudget noch nicht erschöpft ist. Vor der Ausführung entscheidet die **Policy** (SPEC-maintenance §2): Bei `auto` wird ausgeführt, bei `approve` entsteht ein Vorschlag (Quelle `healer`) und die Stufe gilt als verbraucht.
|
|
5. Sind alle Stufen erschöpft, wird einmalig benachrichtigt (`exhausted`).
|
|
6. Ein globaler Schutz begrenzt die Infrastruktur-Aktionen auf `max_actions_per_hour` (Standard 10). Darüber wird nur noch benachrichtigt.
|
|
|
|
**resolved:** Die `on_resolved`-Aktionen laufen, und der Zustand des Fingerprints wird gelöscht.
|
|
|
|
## 4. Treiber (`knaster.healer.drivers`)
|
|
|
|
| Aktion | Treiber | API |
|
|
|---|---|---|
|
|
| `restart_container` | Portainer | `POST /api/endpoints/{endpoint}/docker/containers/{container}/restart` |
|
|
| `restart_vm` | Proxmox | `POST /api2/json/nodes/{pve_node}/qemu/{vmid}/status/reboot` |
|
|
| `reboot_host` | Proxmox | `POST /api2/json/nodes/{pve_node}/status` (`command=reboot`) |
|
|
| `mark_slot` | Registry | Laufzeitzustand |
|
|
| `notify` | Webhook (n8n) | `POST NOTIFY_WEBHOOK_URL` |
|
|
|
|
Alle Treiber haben einen **Dry-Run**-Modus (Standard: an). Ein globales `KNASTER_DRY_RUN=false` schaltet die Ausführung frei, zusätzlich muss der Treiber pro Aktion in `config/healer-rules.yaml` unter `enabled_actions` aufgeführt sein.
|
|
|
|
## 5. Mitgelieferte Alerts (`deploy/prometheus/alerts.yml`)
|
|
|
|
`SlotEndpointDown`, `SlotCanaryFailing`, `GpuXidError`, `GpuTemperatureHigh`, `VllmKvCacheSaturated`, `NodeDown`, `DiskAlmostFull`.
|