# Info-Board Neu - Watchdog-Konzept ## Ziel Der Watchdog ueberwacht die kritischen Komponenten des Players und sorgt dafuer, dass der Display-Betrieb bei Abstuerzen oder Verhaengungen automatisch wiederhergestellt wird. Die Ueberwachung erfolgt auf zwei Ebenen: 1. **Browser-Watchdog** — Ueberwachung von Chromium 2. **Agent-Watchdog** — Ueberwachung des Player-Agents ## Grundprinzipien - Watchdogs sind extern und unabhaengig von den ueberwachten Prozessen - Erkennung erfolgt aktiv durch Health-Checks, nicht durch Liveness-Pings - Restart-Strategien sind progressiv und vermeiden Restart-Schleifen - Logging ist strukturiert und fuer Admin-Diagnosen aussagekraeftig ## Browser-Watchdog (Chromium-Ueberwachung) ### Aufgaben Der Browser-Watchdog sorgt dafuer, dass: - Chromium staendig laeuft und antwortet - der Renderer nicht in einer Endlosschleife haengt - Rendering-Fehler nicht zu permanenten Schwarzbildern fuehren - bei Chromium-Crash oder Verhaengung schnell neugestartet wird ### Health-Check-Verfahren Der Watchdog fuehrt regelmaeßig folgende Checks durch: #### 1. Prozess-Check ``` Existiert der Chromium-Prozess noch? - lsof oder ps-Abfrage auf die PID - Timeout: sofort bei fehlender PID ``` #### 2. HTTP-Health-Check auf localhost ``` GET http://localhost:8081/health Timeout: 5 Sekunden Erwartet: 200 OK und JSON-Antwort {status: "ok"} ``` Die `player-ui` muss einen einfachen `/health`-Endpunkt bereitstellen, der schnell antwortet, auch wenn die Playlist gerade verarbeitet wird. #### 3. Rendering-Verifizierung (optional, Phase 2) ``` Screenshot-basiert erkennen, ob der Browser: - Fehlerseite zeigt - komplett schwarz ist (mehr als 95% schwarze Pixel) - seit mehreren Minuten denselben Content zeigt, obwohl ein Wechsel erwartet wurde ``` Diese Methode ist fuer v1 optional, wird aber fuer spaetere Verhaengungserkennung eingeplant. ### Ueberwachungs-Intervall - Health-Check alle **30 Sekunden** - Bei Fehler: sofort Neustart pruefen (kein Warten auf naechsten Zyklus) ### Restart-Strategie #### Strategie: Exponentieller Backoff mit Maximum ``` Fehlerfall: Fehler 1: Sofort neustart (Wait 0s) Fehler 2: Warte 2s, versuche Restart Fehler 3: Warte 5s, versuche Restart Fehler 4: Warte 10s, versuche Restart Fehler 5+: Warte 30s, versuche Restart Nach 10 aufeinanderfolgende Fehler ohne erfolgreicher Recovery: - Alert an Admin (via Server-Status) - Overlay auf "Error" setzen - Watchdog-Loop verlangsamen auf 5 Min Intervall ``` #### Erfolg-Kriterium Wenn der Health-Check 3x hintereinander erfolgreich ist: - Backoff-Zaehler zuruecksetzen auf 0 - naechstes Fehler wieder mit sofort-Restart starten ### Logging Jeder Watchdog-Ereignis wird protokolliert: ```json { "ts": "2025-03-23T14:22:15Z", "component": "browser_watchdog", "event": "restart", "reason": "health_check_timeout", "attempt": 2, "next_retry_in_ms": 5000, "details": { "pid_before": 1234, "pid_after": 1245, "http_status_before": 0 } } ``` Logging-Ziele: - strukturiert auf stdout/stderr (JSON) - lokal in `/var/log/signage/watchdog.log` mit Rotation ## Agent-Watchdog (systemd-Integration) ### Aufgaben Der Agent-Watchdog (bzw. systemd-Unit) sorgt dafuer, dass: - der Player-Agent staendig laeuft - nach Crash oder gewolltem Stop schnell neugestartet wird - Restart-Grenzen ein Verhaengungsloop verhindern ### systemd-Konfiguration ```ini [Service] Type=simple ExecStart=/usr/local/bin/player-agent Restart=always RestartSec=5 StartLimitInterval=300 StartLimitBurst=10 StandardOutput=journal StandardError=journal ``` **Bedeutung:** - `Restart=always` — Neustart bei jedem Exit (unabhaengig vom Exit-Code) - `RestartSec=5` — Warte 5 Sekunden vor Neustart - `StartLimitInterval=300` — Zaehle Restarts in einem 300s-Fenster - `StartLimitBurst=10` — Mehr als 10 Restarts in 300s fuehrt zu systemd-Stop Wenn `StartLimitBurst` erreicht wird: - systemd laesst den Service stehen - Admin wird informiert (Status-API setzt `agent_watchdog_failed`) - manueller Eingriff oder Admin-Kommando noetig ### Health-Check durch Agent selbst Der Agent sollte intern: - Broker-Verbindung regelmaeßig pruefen - Server-Sync-Status tracken - bei kritischen Innenfehlern nicht einfach weiterlaeufen Wenn sich der Agent selbst als unheilbar beschaedigt sieht: - strukturiert mit Exit-Code `1` beenden (systemd startet neu) - nicht mit `exit(0)` haengend beenden ## Verhaeltnis zu systemd ### Architektur-Entscheidung `systemd` uebernimmt die Prozess-Wiederbelebung fuer den Agent. Der Browser-Watchdog ist ein **separater, von systemd unabhaengiger Prozess**, weil: - Chromium staendiger Ueberwachung bedarf (Health-Checks im 30s-Rhythmus) - ein Systemd-Watchdog-Timer zu unverzeihlich waere (nur on/off, nicht granular) - der Browser-Watchdog auch die Systemd-Unit selbst monitoren kann (Defensive Architektur) ### Optional: systemd WatchdogSec Fuer den Agent ist es sinnvoll, auch systemd's Watchdog-Timer zu nutzen: ```ini [Service] WatchdogSec=30 ExecStart=/usr/local/bin/player-agent ``` Der Agent muesste dann periodisch `systemd-notify --ready` senden. Das ist **optional fuer v1**, wird aber fuer spaetere Robustheit eingeplant. ## Integration mit Player-Setup ### Verzeichnisstruktur ``` /usr/local/bin/ player-agent — Go-Binary browser-watchdog — Go-Binary oder Shell-Script /etc/systemd/system/ signage-agent.service signage-browser-watchdog.service /var/lib/signage/ watchdog-state.json — letzter Zustand, Backoff-Counter /var/log/signage/ watchdog.log — strukturiertes Logging ``` ### Startup-Reihenfolge 1. Basis-System bootet, X11 startet 2. `signage-agent.service` startet (systemd) 3. Agent startet, prueft Konfiguration, startet `player-ui` HTTP-Server 4. `signage-browser-watchdog.service` startet (systemd) 5. Watchdog wartet initial 10s, bevor erste Checks starten 6. Agent laesst Chromium starten 7. Watchdog beginnt Health-Checks Dieses Ordering verhindert, dass der Watchdog versucht, den Browser zu uberwachen, bevor der Agent bereit ist. ### Stopp-Reihenfolge bei Shutdown 1. systemd sendet SIGTERM an Agent und Browser-Watchdog 2. Watchdog: beendet sich, versucht nicht zu restarten 3. Agent: beendet sich, laedt Chromium herunter 4. Systemd wartet auf Completion ## Fehlerklassifizierung und Admin-Reporting ### Fehlerklassen | Fehlerklasse | Symptom | Watchdog-Aktion | Admin-Alert | |---|---|---|---| | Prozess-Crash | PID weg | Sofort neustart | Nach 3x Fehlschlag | | Health-Check-Timeout | HTTP timeout | Backoff-Restart | Nach 5x Fehlschlag | | Rendering-Fehler | Browser zeigt Fehlerseite | Neustart | Sofort sichtbar | | Backoff-Maximum | 10+ Fehler in 5min | Stoppen, Alert | Sofort | | Agent-Unhealthy | Server-Sync fehlgeschlagen | Systemd-Neustart | Nach 3x Sync-Fehler | ### Admin-Oberflaeche Status-Page und Admin-Dashboard zeigen: ```json { "screen_id": "info01", "browser_status": { "pid": 1234, "health": "ok", "last_check_at": "2025-03-23T14:25:00Z", "restart_count_5m": 0, "last_error": null }, "agent_status": { "pid": 567, "uptime_seconds": 3600, "sync_status": "ok", "last_sync_at": "2025-03-23T14:24:55Z", "systemd_restart_count": 0 }, "watchdog_alert": null } ``` ## Konfigurierbare Parameter In `/etc/signage/config.yml` oder Umgebungsvariablen: ```yaml watchdog: browser: check_interval_sec: 30 health_check_timeout_sec: 5 restart_backoff_steps: [0, 2, 5, 10, 30] # Sekunden max_consecutive_errors: 10 error_window_sec: 300 agent: systemd_unit: "signage-agent.service" healthcheck_timeout_sec: 10 ``` ## Testing und Validierung Testfaelle fuer den Watchdog: 1. Chromium manuell toeten (`kill -9 PID`) — sollte innerhalb 30s neustartet werden 2. Player-Agent starten/stoppen — systemd sollte neustart triggern 3. Player-UI HTTP-Server abschalten — Browser-Watchdog sollte neustarten 4. Schnelle aufeinanderfolgende Crashes — Backoff-Exponentialfunktion pruefen 5. Admin-Kommando `restart_player` — geordneter Neustart, dann Restart-Counter nicht erhoeht 6. Watchdog-Logs auf Struktur und Vollstaendigkeit pruefen ## Zusammenfassung Der Watchdog-Ansatz ist: - **Transparent** — klare Logging und Admin-Sichtbarkeit - **Progressive** — Backoff statt Restart-Schleife - **Defensiv** — mehrere Erkennungsmethoden (Prozess, HTTP, optional Rendering) - **Integriert** — arbeitet mit systemd zusammen, nicht gegen es - **Skalierbar** — Verfahren gilt fuer alle Player unabhaengig von Standort oder Netzwerk