Ext Ops Panel
Dashboard öffnen

Start/Doks/Monitoring

Monitoring-Vertrag

Vertragsversion 2.1.0 · Payload schema_version 2.0

Zwei Arten von Heartbeats. Diese Seite beschreibt das Monitoring einer registrierten Chrome-Erweiterung: Ihr Agent sendet seinen Bericht an POST /api/v1/monitoring/report. Umgebungen eines Webprojekts nutzen im Panel einen separaten Endpunkt POST /api/v1/heartbeat/report mit einem anderen Token. Der kleinste Umgebungsbericht ist {"overall":"ok"}; eine v2-Payload für eigene Metriken wird ebenfalls akzeptiert. Vertauschen Sie die beiden Endpunkte beim Einrichten eines Agenten nicht. Abschnitt 8b beschreibt den Heartbeat einer Umgebung.

Monitoring stellt Ihre Erweiterung unter ständige Beobachtung: eine Live-Ampel auf ihrer Karte in der Liste, den Basis-Tab monitoring in der Detailansicht und eine separate Telegram-Statusnachricht mit Flankenalarmen. Es kombiniert zwei unabhängig aktivierbare Komponenten: einen Push-Heartbeat (ein Agent auf dem Host Ihres Dienstes meldet sich nach einem festgelegten Zeitplan; Stille ist selbst ein Signal) und Uptime-Pings (das Panel prüft Ihre öffentlichen URLs auf Erreichbarkeit).

↓ OpenAPI 3.1 (YAML) herunterladen /monitoring-openapi.yaml · info.version 2.1.0

1. Funktionsweise (zwei Komponenten, eine Ampel)

Eine Erweiterung ist „im Monitoring“, wenn das Monitoring aktiviert und mindestens eine Komponente konfiguriert ist. Andernfalls zeigt ihre Karte einen neutralen grauen Punkt.

1b. Heartbeats und der Slot-Pool

Monitoring ist auf der Erweiterungsebene angesiedelt, als zwei unabhängige flache Listen, die sich einen Slot-Pool teilen: Heartbeats (Push-Quellen, früher „Stands“) und Uptime-Pings (Pull-Prüfungen). Eine Erweiterung kann mehrere Heartbeats haben – zum Beispiel einen Haupt-Host und einen kostenpflichtigen Worker. Jeder Heartbeat sendet Berichte mit seinem eigenen Bearer-Token und deklariert über sein label seine eigene Darstellung (Tabs, Abschnitte und Telegram-Zeilen). Uptime-Pings sind eine separate flache Liste, die zur Erweiterung gehört und unter keinem Heartbeat verschachtelt ist. Das Panel führt alles zu einer Gesamtampel (Worst-of), einer Detailansicht und einer zusammenfassenden Telegram-Nachricht zusammen.

Heartbeats und Pings teilen sich pro Erweiterung einen gemeinsamen Slot-Pool: Ein Heartbeat kostet einen Slot, ein aktiver Ping kostet einen Slot, und ihre Summe darf max_slots des Tarifs nicht überschreiten (Trial 3 · Studio 10 · Fleet 25). Wird der Pool überschritten, kommt 409 slot_limit zurück; nach einem Downgrade wird der Überschuss pausiert (zuerst Pings, zuletzt Heartbeats). Die Antwort enthält slots_used und max_slots, damit die Oberfläche das Budget anzeigen kann.

2. Die Ampel

Die Gesamtampel ergibt sich als Worst-of über die Komponente jedes aktivierten Heartbeats und die Ampel jedes aktiven Pings, wobei die Schweregrade als ok < warn < crit geordnet sind. Die Komponente eines Heartbeats ist max(reported, watchdog): reported ist der schlechtere Schweregrad aus der Metrik overall und den überschrittenen Schwellenwerten (6.2) aus dem letzten akzeptierten Bericht; watchdog ist eine Frische-Untergrenze, berechnet anhand der Empfangsuhr des Panels (eine abweichende Uhr des Agenten schadet nicht).

ZustandFarbeWann
off⚪ grauMonitoring nicht aktiviert oder keine Komponente konfiguriert.
paused⚪ grauAktiviert, aber eingefroren (Tarifsperre oder manuelle Pause). Berichte werden weiterhin gespeichert.
green🟢Alle Komponenten ok.
yellow🟡Schlechteste Komponente warn.
red🔴Schlechteste Komponente crit.

Der Schweregrad ist kanonisch ok | warn | crit. Gängige Aliase werden bei der Annahme normalisiert: warning wird zu warn; error und critical werden zu crit.

3. Watchdog (verpasste Heartbeats)

Sie geben beim Aktivieren des Heartbeats das erwartete Berichtsintervall an (60 s bis 24 h). Der Watchdog setzt dann anhand der Frische eine Untergrenze für die Ampel, mit grace = max(60s, 25% of the interval), um Schwankungen von Cron und Netzwerk abzufangen:

Alter des letzten akzeptierten BerichtsWatchdog-Untergrenze
bis Intervall + Karenzzeitok (grün)
1 verpasster Bericht (bis 2 × Intervall + Karenzzeit)warn (gelb)
2 oder mehr verpasste Berichtecrit (rot)

Ein abgelehnter Bericht (401 / 413 / 422 / 429) aktualisiert den Watchdog nie, daher eskaliert ein defekter Agent ehrlich; der letzte Ablehnungsgrund ist in den Monitoring-Einstellungen sichtbar. Die Erholung erfolgt sofort: Der erste akzeptierte Bericht berechnet die Ampel unmittelbar neu.

4. Uptime-Pings

Ein Ping ist eine benannte Erreichbarkeitsprüfung einer öffentlichen https-URL. Das Panel sendet GET mit einem 10-Sekunden-Timeout, folgt höchstens 5 Weiterleitungen, liest keinen Body über ein minimales Limit hinaus und wertet einen abschließenden Status der Klasse 2xx als Erfolg (auch 204 und 206 zählen). Ein abschließender 3xx-Status (Weiterleitungsschleife oder -limit), 4xx, 5xx, Timeout oder DNS-/TLS-/Netzwerkfehler gilt als Fehlschlag. Eine fehlgeschlagene Prüfung wird durch eine Wiederholung nach ca. 15 s bestätigt, bevor sie zählt; das fängt einzelne Netzwerkaussetzer ab.

Aufeinanderfolgende bestätigte FehlerPing-Ampel
0ok
1warn
2 oder mehrcrit

Ping-Ergebnisse erscheinen als panel-eigene Metriken ping:<name> im Abschnitt pings (Uptime) des Basis-Tabs monitoring und als reservierte Telegram-Zeile pings: 🟢 api 210ms · 🟢 site 90ms · 🔴 docs (timeout). Die Anzahl der Pings pro Erweiterung und das Mindestintervall hängen vom Tarif ab:

TarifUptime-Pings pro ErweiterungMin. Ping-Intervall
Trial35 Min.
Indie35 Min.
Studio101 Min.
Fleet251 Min.

Ob Monitoring verfügbar ist und wie viele Slots es gibt, hängt von Ihrem Tarif ab; das minimale Heartbeat-Intervall beträgt 60s.

5. Eine Erweiterung ins Monitoring aufnehmen

In der Erweiterung unter Einstellungen, Block „Monitoring“:

6. Das Berichtsformat

Der Bericht ist dieselbe metadatengesteuerte v2-Payload wie im Vertrag für eigene Metriken (Tabs, Abschnitte, Telegram-Zeilen, Metriken), gesendet an POST /api/v1/monitoring/report mit Authorization: Bearer <monitoring token>. Monitoring ergänzt reservierte IDs:

Reservierte IDStatusBedeutung
overallerforderlichMetrik der Art status: das Urteil des Durchlaufs, Schweregrad ok | warn | crit. Fließt in die Gesamtampel ein. Ein Bericht ohne gültiges overall wird abgelehnt (422).
issuesempfohlenMetrik der Art list: die aktuellen Probleme, items auf der obersten Ebene der Metrik. Bis zu 5 Einträge werden in Alarmtexten zitiert.
ping:*verbotenMetrik-ID-Namespace der panel-eigenen Ping-Metriken; ein Senden wird abgelehnt (422).
pingsverbotenTelegram-Zeilen-ID der panel-eigenen Ping-Zeile; ein Senden wird abgelehnt (422).
monitoringpanel-eigener TabBasis-Tab-ID. Metriken können ihn adressieren (dashboard.tab: "monitoring"), ohne ihn in tabs zu deklarieren; eine Deklaration wird ignoriert.
basepanel-eigener TabDie ID des Basic-Tabs, ebenso reserviert: eine Deklaration wird ignoriert.

Limits: Payload höchstens 64 KB, höchstens 200 Metriken, höchstens 2 Berichte pro Minute pro Quelle (Überschuss erhält 429 und zählt nicht als Heartbeat).

Ein Body über 64 KB erhält 413 payload_too_large und wird nie gekürzt und als kürzerer Bericht gelesen. Ein Bericht, der gegen die obigen Regeln verstößt, erhält 422 invalid_report mit allen Problemen als Liste. Beide Gründe werden als letzter Fehler des Heartbeats gespeichert:

HTTP/1.1 413 Payload Too Large
{ "code": "payload_too_large", "message": "report is over 64 KB; send fewer metrics or split them across heartbeats",
  "limit_bytes": 65536, "size_bytes": 71680 }

HTTP/1.1 422 Unprocessable Entity
{ "code": "invalid_report", "message": "report rejected",
  "errors": [ "metric \"overall\" must have kind \"status\" (got \"text\")",
              "metric id \"ping:x\" uses the reserved \"ping:\" namespace" ] }

6.1. Beispielbericht

{
  "schema_version": "2.0",
  "generated_at": "2026-07-12T10:19:58Z",
  "tabs":     [ { "id": "stand", "title": "Stand", "order": 5, "icon": "server" } ],
  "sections": [ { "tab": "stand",      "id": "docker", "title": "Docker", "order": 0 },
                { "tab": "monitoring", "id": "host",   "title": "Host",   "order": 10 } ],
  "telegram": { "header": "{sev} {name} monitoring",
                "lines": [ { "id": "host",   "order": 0, "prefix": "🖥 " },
                           { "id": "docker", "order": 1, "prefix": "📦 " } ] },
  "metrics": [
    { "id": "overall", "kind": "status", "state": "ok", "severity": "ok" },

    { "id": "issues", "kind": "list",
      "items": [ { "text": "RAM 91% (7.1/7.8G)", "severity": "warn" } ],
      "dashboard": { "show": true, "tab": "monitoring", "section": "host", "order": 0,
                     "render": "list", "name": "Issues" },
      "telegram":  { "show": false } },

    { "id": "ram", "kind": "percent", "label": "RAM", "value": 91, "severity": "warn",
      "dashboard": { "show": true, "tab": "monitoring", "section": "host", "order": 1,
                     "render": "kpi" },
      "telegram":  { "show": true, "line": "host", "pos": 10,
                     "format": "RAM {value}%", "sep": " · " } }
  ]
}

Erfolgreiche Antwort:

{ "accepted": true, "effective": "green", "next_expected_by": "2026-07-12T10:26:13Z" }

6.2. Schwellenwerte auf Berichtsmetriken

Jede numerische Metrik eines Berichts außer overall kann thresholds enthalten (der Block des Custom-Metrics-Vertrags, Abschnitt 5.4). Das Panel berechnet die Severity einer solchen Metrik bei der Annahme, und das Licht des Heartbeats ist das Schlechteste aus overall und den überschrittenen Schwellenwerten: Eine Metrik über crit macht den Heartbeat rot, auch wenn overall ok ist. recover bezieht sich auf den vorigen angenommenen Bericht desselben Heartbeats. Ein fehlerhafter Block erhält 422 invalid_report mit dem Grund in der Liste. Ein Bericht ohne Schwellenwerte verhält sich wie bisher.

{ "id": "queue", "kind": "number", "label": "Mail queue", "value": 41,
  "thresholds": { "direction": "above", "warn": 20, "crit": 100, "unit": "msgs", "recover": 15 },
  "dashboard": { "show": true, "tab": "monitoring", "section": "host", "order": 2, "render": "kpi" },
  "telegram": { "show": true, "line": "host", "pos": 20, "format": "queue {value}" } }

Das Panel zeigt sie als 41 (threshold 20/100 msgs) auf einer gelben Kachel, und der Heartbeat ist gelb.

7. Ein Monitor-Skript einbinden (im Stil von monitor.sh)

Wenn Sie bereits ein Cron-Skript für Health-Checks betreiben, fügen Sie am Ende jedes Durchlaufs einen POST nach dem Best-Effort-Prinzip hinzu. Ein Zustellfehler darf den Durchlauf nicht abbrechen: Längere Stille fängt der Watchdog ohnehin ab.

# monitor.env
EXTOPS_REPORT_URL="https://extops.dev/api/v1/monitoring/report"
EXTOPS_REPORT_TOKEN="<monitoring token from Settings>"

# end of the tick: build the payload with jq from the values you already computed,
# then push it best-effort (never let delivery break the tick itself)
payload="$(jq -n --arg sev "$SEVERITY" '{
  schema_version: "2.0",
  generated_at: (now | todate),
  metrics: [ { id: "overall", kind: "status", state: $sev, severity: $sev } ]
}')"
code="$(curl -sS -m 10 -o /tmp/extops-report.json -w '%{http_code}' -X POST "$EXTOPS_REPORT_URL" \
  -H "Authorization: Bearer $EXTOPS_REPORT_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$payload" || echo 000)"
# 413 payload_too_large: over 64 KB; 422 invalid_report: .errors lists every problem
case "$code" in 413|422) logger -t monitor "panel: $code $(jq -c . /tmp/extops-report.json)" ;; esac

Ordnen Sie die Schweregrade Ihres Skripts dem kanonischen Satz zu (critical wird akzeptiert und auf crit normalisiert) und speisen Sie Ihre bestehende Problemliste in die Metrik issues ein. Setzen Sie das deklarierte Intervall gleich der Cron-Periode.

8. Telegram: separate Statusnachricht und Alarme

8b. Heartbeats von Webprojekten

Ein Webprojekt hat eigene Heartbeats. Jeder gehört zu einer Umgebung (zum Beispiel Production) und hat ein eigenes Token hb_. Für den Bericht gelten die Regeln aus Abschnitt 6; unten steht, was abweicht.

POST /api/v1/heartbeat/report
Authorization: Bearer hb_<64 hex>
Content-Type: application/json

{"overall":"ok"}

8c. Wer sich mit Ihren Diensten verbindet und wie

Ein Webprojekt kann einem Service, dessen Adresse ein Host ist, Port-Prüfungen hinzufügen, zum Beispiel einem Mailserver. Diese Prüfungen führt Ext Ops Panel selbst aus. Dieser Abschnitt sagt, wer sich verbindet, was gesendet wird, wie oft und wie ein Host widersprechen kann. Der Agent-Vertrag oben ändert sich nicht.

9. Der maschinenlesbare Vertrag

Die formale Beschreibung des Berichtsendpunkts, des Payload-Schemas, der reservierten IDs und der Ampelsemantik ist die OpenAPI-3.1-Datei. Sie trägt dieselbe Vertragsversion (2.1.0).

↓ OpenAPI 3.1 (YAML) herunterladen /monitoring-openapi.yaml