Monitoring mit updo und ntfy

Ich nutze seit einiger Zeit ntfy für Benachrichtigungen von einigen Apps auf meinem Smartphone mit GrapheneOS, da lag es nahe das auch für Benachrichtigungen vom Monitoring zu verwenden. Irgendwo stolperte ich über das Monitoring-Tool updo, das auf den ersten Blick einen leichtgewichtigen Eindruck machte und custom Webhooks unterstützt. ntfy unterstützt ebenfalls Webhooks, sollte also ein Kinderspiel sein.

Die README von updo beschreibt die folgende JSON payload, die mitgeschickt wird:

{
"event": "target_down",
"target": "Production API",
"url": "https://api.example.com",
"timestamp": "2024-01-01T12:00:00Z",
"response_time_ms": 1500,
"status_code": 500,
"error": "Internal Server Error"
}

Anhand dessen habe ich anhand der ntfy Dokumentation zu custom Templates dieses Template für updo erstellt:

title: |
{{- if eq .event "target_down" }}
🚨 Alert: {{ .target }} is down
{{- else if eq .event "target_up" }}
✅ Resolved: {{ .target }} is up
{{- else }}
Unsupported updo status for {{ .target }}: {{ .event }}
{{- end }}
message: |
Status: {{ .status_code }}
Error: {{ .error | trunc 100 }}
url: {{ .url }}

Die updo-Konfiguration dazu ist recht simpel:

[global]
webhook_url = "https://ntfy.example.com/notifications?template=updo"
webhook_headers = ["Authorization: Bearer tk_XXXXXXXXXXXXXXXXXXXX","X-Template: updo"]

Das klappte auch soweit, mit einem Schönheitsfehler: Ich bekam zwar Benachrichtigungen für target_down events, aber nicht von target_up events.

Irgendwann sah ich mir das dann doch mal genauer an. updo schrieb nur einen HTTP 400 error in die Logs bei den target_up events, also musste ich bei ntfy das Loglevel auf DEBUG hoch setzen. Danach fand sich dann folgendes im Log:

error=invalid request: template execution failed; template up
do (message): template: :2:25: executing “” at <100>: invalid value; expected string, error_code=40045

Die Zahlen die nach Positionsangaben aussehen waren nicht wirklich hilfreich, also habe ich im message-Bereich erstmal allen Variablen default-Werte gegeben:

message: |
Status: {{ default "200" .status_code }}
Error: {{ default "" .error | trunc 100 }}
url: {{ default "" .url }}

Danach kamen die Benachrichtigungen an, und es stellte sich heraus dass das Feld “Error” das Problem war. Das wird vermutlich beim target_up Event nicht mitgeschickt, dieses kleine Detail fehlt in der updo-Dokumentation.

Am Ende sah mein Template dann so aus:

title: |
{{- if eq .event "target_down" }}
🚨 Alert: {{ .target }} is down
{{- else if eq .event "target_up" }}
✅ Resolved: {{ .target }} is up
{{- else }}
Unsupported updo status for {{ .target }}: {{ .event }}
{{- end }}
message: |
Status: {{ default "<unknown>" .status_code }}
{{- if not (empty .error) }}
Error: {{ .error | trunc 100 }}
{{- end }}
url: {{ default "" .url }}

Damit funktionieren sowohl Up als auch Down Benachrichtigungen.

Veröffentlicht von

Gerald Schneider

Diplom-Informatiker (DH) in Rostock. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert