internal/health: wiederverwendbare Registry fuer benannte Checks (DB, Queue) — nicht Core-spezifisch, sondern von jedem registrierten Modul (API-02) gleichermassen einsetzbar. LivenessHandler prueft bewusst KEINE externen Abhaengigkeiten (Akzeptanzkriterium 2: Liveness/Readiness getrennt) — ein DB-Ausfall soll den Prozess nicht faelschlich als "tot" markieren und einen grundlosen Neustart ausloesen. ReadinessHandler fuehrt alle registrierten Checks NEBENLAEUFIG mit je eigenem Timeout aus (DefaultCheckTimeout=2s) und liefert 503, sobald irgendeine Abhaengigkeit fehlschlaegt (Akzeptanz- kriterium 1 + 3) — echte Pruefung von DB (Ping) und Job-Queue statt nur Prozessstatus. Pruefungen (ausgefuehrt auf root@192.168.1.131, go build/vet/test PASS): 1. Simulierter Datenbankausfall fuehrt zu "nicht bereit" — TestReadinessHandler_ReportsNotReadyOnDatabaseFailure: geschlossener Pool, 503 mit "database" im Checks-Ergebnis. PASS. 2. Health-Endpunkt antwortet auch bei haengendem Check innerhalb definierter Zeit — TestReadinessHandler_RespondsWithinTimeoutEvenWithHangingCheck: ein 10s blockierender Check wird durch 50ms-Timeout begrenzt, Handler antwortet deutlich unter 1s. PASS. 3. Readiness- und Liveness-Antwort unterscheiden sich nachweislich in mindestens einem Fehlerfall — TestLivenessAndReadiness_DifferOnDatabaseFailure: bei DB-Ausfall liefert Liveness weiterhin 200, Readiness 503. PASS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
26 lines
682 B
Go
26 lines
682 B
Go
package health
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
// DatabaseChecker prueft die tatsaechliche Erreichbarkeit der Datenbank
|
|
// (Ping) — nicht nur, ob der Pool existiert.
|
|
func DatabaseChecker(pool *pgxpool.Pool) CheckerFunc {
|
|
return func(ctx context.Context) error {
|
|
return pool.Ping(ctx)
|
|
}
|
|
}
|
|
|
|
// QueueChecker prueft, dass die Postgres-basierte Job-Queue (siehe CFG-02)
|
|
// tatsaechlich abfragbar ist — eine eigene, benannte Abhaengigkeit neben der
|
|
// reinen DB-Erreichbarkeit (Akzeptanzkriterium 1).
|
|
func QueueChecker(pool *pgxpool.Pool) CheckerFunc {
|
|
return func(ctx context.Context) error {
|
|
_, err := pool.Exec(ctx, `SELECT 1`)
|
|
return err
|
|
}
|
|
}
|