Abhängigkeitsfreies Uptime-Monitoring für Atlassian Statuspage, betrieben von GitHub Actions.
Alle 5 Minuten ein HTTP-Healthcheck, das Ergebnis landet direkt in den Statuspage-Components.
flowchart LR
A["GitHub Actions<br/><code>*/5 * * * *</code>"] --> B["Ist-Status<br/>von Statuspage lesen"]
B --> C["Healthcheck<br/>GET /up · Timeout 10s"]
C -->|"3× Fehler in Folge"| D["PATCH<br/>major_outage"]
C -->|"2× Erfolg in Folge"| E["PATCH<br/>operational"]
C -->|"Status bereits korrekt"| F["kein API-Call"]
D --> G["Statuspage"]
E --> G
Pro Lauf und pro Monitor:
-
Aktuellen Component-Status lesen
GET https://api.statuspage.io/v1/pages/{page_id}/components/{component_id} -
Healthcheck ausführen – HTTP-Request auf die konfigurierte URL mit Timeout (Standard 10 Sekunden). Erfolgreich ist nur ein erwarteter Statuscode (Standard: genau
200). -
Wiederholen, bis ein Ergebnis feststeht:
failure_thresholdaufeinanderfolgende Fehlversuche → DOWN- die nötige Anzahl aufeinanderfolgender Erfolge → UP
-
Statuspage aktualisieren – nur wenn sich der Status tatsächlich ändert:
PATCH https://api.statuspage.io/v1/pages/{page_id}/components/{component_id} Authorization: OAuth <STATUSPAGE_API_KEY> Content-Type: application/json {"component": {"status": "operational"}}
Weil der Ist-Zustand vor jedem Lauf von Statuspage gelesen wird, braucht das Projekt keinen eigenen Zustandsspeicher.
Ein Monitor = ein Statuspage-Component. Beliebig viele davon, ein einziger Eintrag pro Endpoint – Code und Workflow müssen nie angefasst werden.
Schritt 1: Component in Statuspage anlegen (Components → Add a component).
Schritt 2: Component-ID nachschlagen:
export STATUSPAGE_API_KEY=...
python3 monitor.py --list-componentspage_id t7lm3xn8kz9q CoreFit Status
component 9k2f4b7c1d3e CoreFit API [operational]
component aa11bb22cc33 Billing API [major_outage]
group gg99hh88ii77 Backend [operational]
Schritt 3: Monitor in monitors.json ergänzen – die ID direkt eintragen:
{
"monitors": [
{
"name": "CoreFit API",
"url": "https://api.core-fit.app/up",
"component_id": "${STATUSPAGE_COMPONENT_ID}"
},
{
"name": "Billing API",
"url": "https://billing.core-fit.app/health",
"component_id": "aa11bb22cc33",
"timeout_seconds": 5,
"expected_status": [200, 204]
},
{
"name": "Marketing-Site",
"url": "https://core-fit.app/",
"component_id": "d4e5f6a7b8c9",
"method": "HEAD",
"down_status": "partial_outage"
}
]
}Committen, fertig. Der nächste geplante Lauf prüft alle Monitore und aktualisiert jeden Component einzeln.