Letzte Aktualisierung am 6. Juni 2025


In diesem Abschnitt werden wir Grafana für die Visualisierung der Metrike-Daten in einem eigenen Docker-Container installieren.

Wie üblich setze ich voraus, dass du mit dem Anlegen von Docker-Netzwerken und Stack in Portainer vertraut bist. Die nachfolgende Beschreibung nutzt die unter Raspberry Pi, Docker, NAS und mehr… aufgesetzte Umgebung mit Gitea, Visual Studio Code (VSC), Portainer und einem NAS-Share als Datenablage.

Installation

Basis für die Ablage der Dateien docker-compose.yml und .env ist ein Repository in Gitea. Ich habe dafür ein neues Repository grafana in Gitea angelegt und in Visual Studio Code eingebunden. In VSC nutze ich folgende Verzeichnisstruktur.

Nach der Einrichtung des Repositories metrics fügst du die Inhalte für docker-compose.yml und .env in die entsprechenden Dateien in VSC ein. In den Dateien musst du folgende Änderungen vornehmen, um diese an deine Anforderungen anzupassen.

  • docker-compose.yml
    • Zeilen 7 und 8
      Hier legen wir fest, dass das Datenverzeichnis von Grafana in der eingerichteten Datenablage verwendet wird. Somit sind die Daten im Zugriff über das NAS.
    • Zeile 19
      Hier wird das Portmapping festgelegt. Grafana nutzt im Docker-Container den Port 3000. Da dieser Port für den Zugriff von außen bereits von Gitea genutzt wird, legen wir hier den Port 3030 fest.
    • Zeile 21
      Der Docker-Container von Grafana läuft im Netzwerk nw-dekayone-grafana. Dieses Netzwerk deklarieren wir am Ende der docker-compose.yml als externes Netzwerk im Abschnitt networks. Daher musst du es vor dem Deployment des Stack in Portainer anlegen!
    • Zeile 23
      Im label-Abschnitt tragen wird das Watchtower-Label ein, sodass Watchtower auf Aktualisierungen von Grafana prüft und installiert. Wenn du kein Watchtower nutzt, kannst du dieses Label weglassen.
  • .env
    • Zeile 5
      Hier ergänzt du den Link zu deiner Datenablage, die du beim Aufsetzen der Umgebung eingerichtet hast.
    • Zeile 8
      Grafana nutzt intern Organisations-Namen für die Strukturierung der Dashboards. Deinen Namen legst du in dieser Zeile fest.
    • Zeile 12
      Hier trägst das von dir favorisierte Passwort für den Nutzer grafana aus der Zeile davor ein.
docker-compose.yml
services:
  grafana:
    image: grafana/grafana:latest
    restart: unless-stopped
    container_name: grafana
    volumes:
      - ${DATA_ROOT}/grafana/data:/var/lib/grafana
      - ${DATA_ROOT}/grafana/provisioning:/etc/grafana/provisioning
    user: "1002"
    environment:
      - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD}
      - GF_SECURITY_ALLOW_EMBEDDING=true
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_ANONYMOUS_ORG_NAME=${ORG_NAME}
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
      - TZ=${TIMEZONE}
    ports:
      - 3030:3000
    networks:
      - nw-dekayone-grafana
    labels:
      - com.centurylinklabs.watchtower.enable=true

networks:
  nw-dekayone-grafana:
    external:
      true
.env
# timezone
TIMEZONE=Europe/Berlin

# mountpoint of persistent data storage on NAS
DATA_ROOT=dein_datenablage_share

# orgname used by grafana & influxdb
ORG_NAME=dein_orgname

# environment of Grafana
GRAFANA_ADMIN_USER=grafana
GRAFANA_ADMIN_PASSWORD=supersecretadminpassword

Nachdem du angepassten Dateien via „Commit und Push“ im Repository aktualisiert hast, legst du in Portainer zunächst das passende Docker-Netzwerk und anschließend einen Stack grafana mit der Verbindung zum Repository.

Wenn der Stack erfolgreich gestartet wurde, siehst du in den Stack-Details den laufenden Container für Grafana.

Nutzung

Wenn der Grafana-Stack erfolgreich gestartet wurde, erreichst du über die Eingabe der IP-Adresse deines Pi gefolgt vom Port 3030 die Grafana-Oberfläche. Dort nutzt den Admin-User mit dem passenden Passwort aus der .env-Datei für die Anmeldung und landest auf der Grafana-Startseite.

Profil in Grafana

Dein Nutzer hat in Grafana natürlich auch ein Profil, in dem du grundlegenden Einstellungen vornehmen kannst wie z.B. die Sprache auf Deutsch umzustellen. Dazu meldest du dich über das „Sign in“ zunächst an, klickst dann rechts oben auf dein Profilbild und wählst dort den Punkt „Profil“ (bzw. „Profile“ im Englischen).

Anschließend findest du dich auf deiner Profilseite wieder, in der du die Einstellungen nach Belieben vornehmen kannst wie z.B. die Spracheinstellung. Im unteren Bereich findest du auch den Organisationsnamen, den du in der .env-Datei eingetragen hast sowie die Angaben zu den letzten Grafana-Anmeldungen im Bereich „Sessions“.

Dashboard für Pi-Daten

Für die Visualisierung der gesammelten Daten deines Pi gibt es in der Grafana-Community einige Dashboards, die du als Grundlage für eigene Experimente nutzen kannst. Ein aus meiner Sicht guter Start ist das Dashboard 1860.

Um dieses Dashboard in deine Grafana-Instanz einzubinden, meldest du dich zunächst über das „Sign in“ auf der Startseite an und wählst oben rechts in der Grafana-GUI das +-Zeichen aus. Im folgenden Menü wählst du den Punkt „Dashboard importieren“.

Im nächsten Schritt gibst du in der mittleren Eingabezeile 1860 als ID ein und klickst auf „Laden“. Daraufhin wird die Definition des Dashboards von Grafana.com geladen.

Wenn das Dashboard erfolgreich geladen wurde, musst du im nächsten Schritt die Datenquelle angeben. In der Auswahlliste wählst du „prometheus“. Du kannst auf Seite optional noch einen Namen, den Speicherort innerhalb von Grafana und eine UUID vergeben. I.d.R. kannst du die vorgeschlagenen Einträge einfach übernehmen.

Deine Einstellungen bestätigst du mit einem Klick auf „Import“.

Nach Abschluss des Imports wird das Dashboard in Grafana mit den Daten deines Pi angezeigt, die Prometheus bislang eingesammelt hat.

Back to Prometheus

Das Dashboard kannst du als gute Ausgangsbasis für eigene Anpassungen verwenden, insb. die Abfragen der Daten in den einzelnen Panels sind eine gute Quelle für eigene Experimente, wenn du die Abfragen kopierst und in der Prometheus-GUI im Bereich „Query“ einfügst. Hier werden in den Ansichten „Table“, „Graph“ und „Explain“ die Ergebnisse bzw. Erklärung deiner Abfrage angezeigt. Wenn du die „Explain“-Ansicht das erste Mal aufrufst, musst du den Link „enable the query tree view“ einmal anklicken, um die Erklärung der genutzten Funktionen zu aktivieren.

Exemplarisch habe ich in den Screenshots die Abfrage zur Anzahl der CPU-Cores aus dem Dashboard 1860 verwendet und darin die das Attribut instance gelöscht sowie die Variable $job durch einen festen Wert ersetzt. Als Wert für das Attribut job wählst du den Jobnamen, den du in der prometheus.yml für den NodeExporter vergeben hast.

# ursprüngliche Abfrage im Dashboard für die Ermittlung der Anzahl der CPUs
count(count(node_cpu_seconds_total{instance="$node",job="$job"}) by (cpu))
# Abfrage in Prometheus
count(count(node_cpu_seconds_total{job="dk2docker"}) by (cpu))

Die Abfrage in Prometheus liefert in der Table-Ansicht eine leere Tabelle, da über die doppelte Verwendung der count-Funktion ein einzige Zahl als Ergebnis geliefert wird. Diese wird mit 4 ganz rechts korrekt angezeigt, denn der Pi hat 4 CPU-Cores. In der Graph-Ansicht wird eine entsprechende Linie bei 4 angezeigt.


Quellen

Schreibe einen Kommentar