Skip to content

Monitoring und Status-Endpunkt

Betriebsteams überwachen ZMS in Produktion mit Open-Source-Observability-Tools. Die Landeshauptstadt München führt Grafana im OSS-Portfolio für die Visualisierung von Metriken in Echtzeit; in der Praxis wird Grafana meist mit einem Metrik-Backend (z. B. Prometheus) und optionaler Log-Aggregation für JSON-Anwendungslogs kombiniert.

Diese Seite beschreibt, was ZMS dafür bereitstellt und wie es mit Monolog-Logging zusammenspielt.

Status-Endpunkt (GET /status/)

zmsapi liefert Betriebsmetriken unter:

http
GET /terminvereinbarung/api/2/status/

(Host und API-Basispfad je nach Umgebung anpassen.)

Die Antwort folgt status.json. ReDoc: zmsapi API-Referenz.

Query-Parameter: includeProcessStats

WertVerhalten
1 (Standard)Vollständige Antwort inkl. processes-Aggregationen (zusätzliche DB-Last)
0Ohne Prozess-Aggregate — schneller für einfache Health Checks (DB-Cluster, Mail-Warteschlange, Version)

Für häufige Liveness-Probes includeProcessStats=0; für Dashboards zu Terminmengen 1.

Um die processes-Aggregationen in der Antwort zu erhalten, den Endpunkt mit includeProcessStats=1 (Standard) aufrufen. Die Aggregationen sind unter .data.processes verfügbar.

Metriken unter processes (Überblick)

Zählungen gelten für Nicht-Folgetermin-Zeilen in buerger (istFolgeterminvon leer), analog zur Status-SQL.

FeldBedeutung
confirmed, reserved, called, parked, missed, deleted, blocked, pendingAnzahl pro buerger.status
withExternalUserIdProzesse mit gesetztem OIDC-/Bürger-external_user_id (beliebiger Status)
confirmedWithExternalUserIdBestätigte Termine mit externem Nutzer (wird in zmscitizenapi beim Appointment-Update gesetzt, nach der Reservierung)
sinceMidnight, last7days, lastInsertBuchungsaktivität (kein Gesamtbestand aller Prozesse)
outdated, outdatedOldest, freeSlots, lastCalculateSlot-Wartung (wenn Statistik aktiv)

Die OIDC-Zähler unterstützen die Beobachtung von Bürgerlogin und „Meine Termine“ (zmscitizenapi).

Weitere Abschnitte

AbschnittMonitoring-Nutzen
database.nodeConnections, database.locks, database.clusterStatusDB-Auslastung und Cluster
database.problemsKonfigurationshinweise (nicht-leerer String)
mail.queueCount, mail.oldestSecondsMail-Backlog
sources.dldb.lastLetzter DLDB-Import
useraccounts.activeSessionsAktive Admin-Sitzungen (falls vorhanden)
versionAusgerollte API-Version

Grafana und Echtzeit-Dashboards

Typisches Setup:

  1. GET /status/ in Intervallen abfragen (Prometheus json_exporter, Skript oder Agent mit JSON-Parsing).
  2. Numerische Felder als Zeitreihen exportieren (z. B. zms_processes_confirmed, zms_mail_queue_oldest_seconds).
  3. In Grafana visualisieren und Schwellwerte alarmieren (Mail-Backlog, nodeConnections, clusterStatus, …).

Fertige Grafana-Dashboards liegen nicht in diesem Repository; Zielsysteme definieren Scraping, Intervalle und Alerts selbst. Die Status-JSON-Antwort ist für diese Integration gedacht.

flowchart LR
  zmsapi["zmsapi GET /status/"]
  scraper["Metrik-Scraper\n(Prometheus / Agent)"]
  tsdb["Zeitreihen-DB"]
  grafana["Grafana-Dashboards"]

  zmsapi --> scraper --> tsdb --> grafana

Logs vs. Metriken

SignalQuelleTypisches Tool
Metriken (Zähler, Queues, DB-Last)GET /status/Grafana + Prometheus (o. Ä.)
Strukturierte Logs (Fehler, Audit, Cron)App::$log JSON auf stderr/stdoutLoki, ELK, Plattform-Log

Siehe Monolog-Logging für Log-Level, DEBUGLEVEL und das Log-Inventar.

Verwandtes

  • API-Referenz — ReDoc für zmsapi und zmscitizenapi
  • Monolog-Logging — Anwendungslogging
  • Implementierung: zmsapi/src/Zmsapi/StatusGet.php, zmsdb/src/Zmsdb/Status.php