Skip to content

Alarme ​

Dozzle kann Container-Logs, Ressourcenmetriken und Lebenszyklus-Ereignisse überwachen und dich benachrichtigen, sobald eine von dir beschriebene Bedingung zutrifft. Regeln werden als Ausdrücke geschrieben, auf deiner eigenen Instanz ausgewertet und an einen Webhook, an Slack, Discord oder ntfy zugestellt.

Regeln liegen immer hier, auf der selbst gehosteten Instanz, weil dort deine Logs sind. Wenn du die Instanz mit Dozzle Cloud verbunden hast, speisen dieselben Regeln auch Cloud, und die Zustellung (Bündelung, Zusammenfassungen, Stummschaltung, mobile Kanäle) konfigurierst du dort statt unten pro Ziel.

Alarmtypen ​

Dozzle unterstützt drei Arten von Alarmen, die alle gleich auf der Seite Benachrichtigungen konfiguriert werden:

TypLöst aus beiBeispielhafter Anwendungsfall
LogEiner Logmeldung, die auf ein Muster passt5xx-Fehler, Stacktraces
MetrikCPU / Speicher überschreitet einen SchwellenwertContainer über 90 % CPU
EreignisLebenszyklus-Ereignissen von DockerOOM-Kills, ungesunde Container

Jeder Alarm kombiniert einen Container-Ausdruck (welche Container überwacht werden) mit einem Auslöse-Ausdruck (die Bedingung, die den Alarm feuern lässt).

IMPORTANT

Die Konfiguration von Alarmen und Zielen liegt im Verzeichnis /data. Du musst dieses Verzeichnis als Volume einhängen, damit deine Benachrichtigungseinstellungen Neustarts des Containers überleben.

sh
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/data:/data -p 8080:8080 amir20/dozzle:latest
yaml
services:
  dozzle:
    image: amir20/dozzle:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /path/to/data:/data
    ports:
      - 8080:8080

Ein Ziel einrichten ​

Bevor du Alarme anlegst, musst du mindestens ein Benachrichtigungsziel konfigurieren. Geh in Dozzle auf die Seite Benachrichtigungen und klicke auf Ziel hinzufügen.

Webhook ​

Webhooks schicken eine HTTP-POST-Anfrage an eine URL deiner Wahl. Dozzle bringt fertige Payload-Templates für verbreitete Dienste mit:

  • Slack — formatiert mit Blocks und Markdown
  • Discord — formatiert für die Discord-Webhook-API
  • ntfy — formatiert für Push-Benachrichtigungen von ntfy.sh
  • Custom — generisches JSON-Payload, das du anpassen kannst

Du kannst auch ein eigenes Payload-Template mit der text/template-Syntax von Go schreiben. Diese Variablen stehen zur Verfügung:

VariableBeschreibung
{{.Detail}}Zusammenfassung (Logmeldung oder Metrikwerte)
{{.Container.Name}}Name des Containers
{{.Container.Image}}Image des Containers
{{.Container.HostName}}Name des Docker-Hosts
{{.Container.State}}Status des Containers
{{.Log.Message}}Inhalt der Logmeldung
{{.Log.Level}}Loglevel
{{.Log.Timestamp}}Zeitstempel des Logs
{{.Log.Stream}}Art des Streams (stdout/stderr)
{{.Stat.CPUPercent}}CPU-Auslastung in Prozent
{{.Stat.MemoryPercent}}Speicherauslastung in Prozent
{{.Stat.MemoryUsage}}Speicherverbrauch in Bytes
{{.Subscription.Name}}Name der Alarmregel

TIP

Nutze den Button Test, um deinen Webhook vor dem Speichern zu prüfen.

Dozzle Cloud ​

Verbundene Instanzen bekommen Dozzle Cloud automatisch als Ziel. Anders als ein reiner Webhook bündelt es wiederkehrende Fehler zu einer einzigen Benachrichtigung, fasst zusammen was passiert ist, und verteilt an E-Mail, Telegram, Discord, Slack, ntfy und Browser-Push, ohne dass du jeden Kanal hier einrichten musst. Siehe Dozzle Cloud.

Einen Alarm anlegen ​

Geh auf die Seite Benachrichtigungen und klicke auf Alarm hinzufügen. Jeder Alarm hat einen Container-Ausdruck plus einen Auslöse-Ausdruck für Log, Metrik oder Ereignis.

Container-Ausdruck ​

Der Container-Ausdruck wählt aus, welche Container überwacht werden. Verfügbare Eigenschaften:

EigenschaftTypBeispiel
namestringname contains "api"
imagestringimage == "nginx:latest"
statestringstate == "running"
healthstringhealth == "unhealthy"
hostNamestringhostName == "prod-host"
labelsmaplabels["env"] == "production"

Bedingungen kannst du mit && (UND), || (ODER) und ! (NICHT) kombinieren:

name contains "api" && labels["env"] == "production"

Log-Alarme ​

Log-Ausdruck ​

Der Log-Ausdruck filtert, welche Logmeldungen den Alarm auslösen. Verfügbare Eigenschaften:

EigenschaftTypBeispiel
messagestring/mapmessage contains "error"
levelstringlevel == "error"
streamstringstream == "stderr"
typestringtype == "complex"

Bei JSON-Logs kannst du über die Punktnotation auf verschachtelte Felder zugreifen:

message.status >= 500 && message.path contains "/api"

Zu den unterstützten String-Operatoren gehören contains, startsWith, endsWith und matches (Regex).

Log-Beispiele ​

Alarm bei allen Fehlern aus Produktionscontainern:

Container: labels["env"] == "production"
Log:       level == "error"

Alarm bei HTTP-5xx-Fehlern aus API-Containern:

Container: name contains "api"
Log:       message.status >= 500

Alarm bei jeder stderr-Ausgabe eines bestimmten Images:

Container: image startsWith "myapp/"
Log:       stream == "stderr"

Alarm bei langsamen API-Antworten in der Produktion:

Container: name contains "api" && labels["env"] == "production"
Log:       message.duration > 5000 && message.path contains "/api"

Alarm bei fehlgeschlagenen Anmeldungen per Regex:

Container: name contains "auth" || name contains "gateway"
Log:       message matches "(?i)(unauthorized|forbidden|invalid token)"

NOTE

Der Alarm-Editor bietet Autovervollständigung und prüft die Eingabe direkt. Du kannst vor dem Speichern eine Vorschau der passenden Container und Logs sehen.

Metrik-Alarme ​

Metrik-Alarme feuern, wenn die CPU- oder Speicherauslastung eines Containers einen Schwellenwert überschreitet. Der Auslöse-Ausdruck wird gegen einen geglätteten Durchschnitt der Messwerte aus einem gleitenden Zeitfenster ausgewertet, was Fehlalarme durch kurze Spitzen verhindert.

Metrik-Ausdruck ​

Verfügbare Eigenschaften:

EigenschaftTypBeschreibung
cpunumberCPU-Auslastung in Prozent (0–100), wie in der Oberfläche
memorynumberSpeicherauslastung in Prozent (0–100)
memoryUsagenumberSpeicherverbrauch in Bytes

Abklingzeit & Messfenster ​

  • Messfenster — wie viele Sekunden an Messwerten gemittelt werden, bevor der Ausdruck ausgewertet wird. Längere Fenster glätten Spitzen, kürzere reagieren schneller.
  • Abklingzeit — Mindestabstand in Sekunden zwischen zwei Auslösungen für denselben Container. Verhindert eine Flut von Alarmen, wenn ein Container dauerhaft über dem Schwellenwert liegt.

Metrik-Beispiele ​

Hohe CPU-Last bei Produktionscontainern:

Container: labels["env"] == "production"
Metric:    cpu > 90

Speicherdruck bei einem bestimmten Dienst:

Container: name contains "api"
Metric:    memory > 85

Absoluter Speicherverbrauch (1 GiB):

Container: name == "postgres"
Metric:    memoryUsage > 1073741824

Ereignis-Alarme ​

Ereignis-Alarme feuern bei Lebenszyklus-Ereignissen von Docker-Containern. Praktisch, um Abstürze, OOM-Kills und Änderungen des Gesundheitszustands zu erkennen, ohne Logs zu parsen.

Ereignis-Ausdruck ​

Verfügbare Eigenschaften:

EigenschaftTypBeschreibung
namestringName des Ereignisses (siehe unten)
actorIdstringDocker-Actor-ID (normalerweise die Container-ID)
attributesmapEreignisattribute von Docker (je nach Ereignistyp verschieden)
timestamptimeZeitpunkt des Ereignisses

Gängige Docker-Ereignisnamen sind start, stop, die, kill, oom, restart, destroy und health_status.

Bei health_status-Ereignissen stellt Dozzle den aktuellen Zustand als attributes["healthStatus"] bereit (healthy oder unhealthy).

Ereignis-Beispiele ​

Alarm, wenn ein Produktionscontainer stirbt:

Container: labels["env"] == "production"
Event:     name == "die"

Alarm bei OOM-Kills:

Container: true
Event:     name == "oom"

Alarm, wenn ein Container ungesund wird:

Container: true
Event:     name == "health_status" && attributes["healthStatus"] == "unhealthy"

Alarm bei unerwarteten Beendigungen (saubere und geordnete Shutdowns ausgenommen):

Die Exit-Codes 0 (Erfolg), 130 (SIGINT), 143 (SIGTERM) und 137 (SIGKILL) treten bei docker stop, Strg+C und Update-Zyklen auf und werden deshalb ausgeschlossen, um Rauschen zu vermeiden. Echte Fehler-Exits (1, 2, 125, ...) lösen weiterhin einen Alarm aus.

Container: name contains "worker"
Event:     name == "die" && !(attributes["exitCode"] in ["0", "130", "143", "137"])

Alarme verwalten ​

Auf der Seite Benachrichtigungen kannst du:

  • Alarme aktivieren/deaktivieren, ohne sie zu löschen
  • Ausdrücke und Ziele von Alarmen bearbeiten
  • Statistiken ansehen, darunter Anzahl der Auslösungen, passende Container und Zeitpunkt der letzten Auslösung
  • Nicht mehr benötigte Alarme löschen

Veröffentlicht unter der MIT-Lizenz. Quelloffen und gesponsert von Docker OSS.