Letzte Aktualisierung am 6. Juni 2025


Im vorangegangenen Abschnitt habe ich gezeigt wie ich Prometheus mit NodeExporter für das Einsammeln von Metrik-Daten des Raspberry Pi eingerichtet habe. Diese Metrik-Daten werden mit Grafana in einem Dashboard visualisiert.

In diesem Abschnitt wird es nun darum gehen weitere Metrik-Daten anderer Container einzusammeln. Dazu werden wir die Container von Cloudflare und Traefik so erweitern, dass beide Container Metrik-Daten erzeugen. Die Daten werden wieder in Grafana in zwei unterschiedlichen Dashboards visualisiert.

Die hier beschriebene Vorgehensweise für das Sammeln der Metrik-Daten von Traefik lehnt sich an an den Artikel „Native Traefik-Metriken mit Prometheus sammeln“ von Ralf Geschke, insb. bzgl. des Tipps zur benutzten Basic Authentication. Die Dashboards für die Visualisierung der Traefik-Metrik-Daten sind dem Artikel „Visualizing Traefik Metrics with Grafana and Prometheus: Step-by-Step“ von Tomer Klein entnommen.


Container-Konfiguration

In Dienstebereitstellung im Internet haben wir die Container für Cloudflare und Traefik in einem docker-compose.yml zusammengefasst, um damit einen Cloudflare-Tunnel zur Docker-Umgebung aufzubauen und um mit Traefik als Reverse Proxy das notwendige Routing zum richtigen Docker-Container zu realisieren. Dieses docker-compose.yml wird nun erweitert, um sowohl für Cloudflare als auch für Traefik Metrik-Daten zu protokollieren. Für Traefik muss zusätzlich die statische Konfiguration in der Datei traefik.yml erweitert werden.

Für Cloudflare werden die Metriken für den cloudflared-Container aktiviert. Es gibt auch die Möglichkeit weitere Daten von Cloudflare über eine entsprechenden API mit dem Cloudflare Exporter einzusammeln. Allerdings funktioniert das nach meinen letzten Recherchen nicht mit dem Free Plan von Cloudflare. Daher muss ich diese Möglichkeit an dieser Stelle schuldig bleiben.

Änderungen für Cloudflare

Die Änderungen in der docker-compose.yml beschränken sich auf die drei zusätzlichen Zeilen 8-10.

  • Zeile 8
    Hier wird die Adresse und der Port definiert, über die die eingesammelten Daten für cloudflared abgerufen werden können. Die Verwendung von 0.0.0.0 als IP-Adresse hat zur Folge, dass die IP-Adresse des Pi verwendet wird zusammen mit Port 9101.
  • Zeile 9-10
    Da wir einen zusätzlichen Port nutzen, müssen wir diesen im Abschnitts ports bekannt machen. Der Port wird für den Zugriff auf die Metriken-Daten benutzt wie in Zeile 8 angegeben.

Änderungen für Traefik

Für den Traefik-Container muss ebenfalls die service-Definition in docker-compose.yml erweitert werden.

  • Zeile 38
    Hier wird die Subdomain definiert, unter der die Metrik-Daten in Rohform einsehbar sind. Die URL lautet in diesem Fall dashboad.mein-domain.de/trafic-metrics. Diese Angabe musst du deinen Anforderungen entsprechend abändern.
  • Zeile 39
    Die Service-Definition in Traefik verwendet den internen Service prometheus@internal.
  • Zeile 40
    Damit nicht jeder über die o.g. URL auf deine Metrik-Daten zugreifen kann, wird über eine Middleware dieselbe BasicAuth traefikauth verwendet, die bereits für das Traefik-Dashboard eingerichtet ist. D.h. du kommst mit den gleichen Benutzerangaben zu den Metrik-Daten.
  • Zeile 41
    Analog zu allen anderen Verbindungen kommt auch hier TLS zum Einsatz.

An dieser Stelle der eingangs erwähnte Tipp zur Basic Authentication von Ralf Geschke vor einem Neustart des Traefik-Containers das Traefik-Dashboard im Browser zu schließen, denn:

Achtung – das Traefik-Dashboard sollte zuvor geschlossen werden! Denn falls es im selben Browser, aber einem anderen Tab geöffnet bleibt, kommen die Nachteile von HTTP-Basic-Authentication zum Tragen. Das Dashboard stellt regelmäßig Anfragen an das Backend, authentifiziert sich dabei, überschreibt damit die Zugangsdaten für die Metriken, weshalb es so wirkt, als wären diese ungültig. Insgesamt ein ziemliches Chaos, doch dieses Verhalten ist in der Praxis irrelevant, da Prometheus nur die URL der Metriken mit den entsprechenden Zugangsdaten nutzt, für den Zugriff auf das Dashboard besteht überhaupt kein Anlass. Und umgekehrt – man wird die Metriken in Rohform wohl nie mittels Browser auslesen wollen, es sei denn für einen ersten Test.

Zusätzlich muss für Traefik die statische Konfiguration in der Datei traefik.yml erweitert werden. Die Änderung muss in der traefik.yml in deiner eingerichteten Datenablage vorgenommen werden und wird erst nach dem Neustart des Containers bzw. Stacks wirksam.

  • Zeilen 35-41
    Über die vier Zeilen werden die Buckets definiert, in die Prometheus die eingesammelten Daten einsortiert (vgl. https://doc.traefik.io/traefik/observability/metrics/prometheus/)
  • Zeile 42
    Die Angabe von manualRouting: true ist notwendig, da wir in der docker-compose.yml ein eigenes Routing für die Metrik-Daten definiert haben.
docker-compose.yml
services:
  cloudflare:
    image: cloudflare/cloudflared:latest
    container_name: cloudflare-tutorial
    command: tunnel run  
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}
      - TUNNEL_METRICS=0.0.0.0:9101
    ports:
      - 9101:9101
    restart: unless-stopped
    networks:
      - nw-dekayone-clf
 
  traefik:
    image: traefik:3.2
    container_name: traefik-tutorial
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
      - ${DATA_ROOT}/dmz/config/traefik.yml:/traefik.yml:ro
      - ${DATA_ROOT}/dmz/config/dynamic_conf.yml:/dynamic_conf.yml:ro
      - ${DATA_ROOT}/dmz/certificates/origin-certificates:/origin-certificates:ro
      - ${DATA_ROOT}/dmz/logs:/logs
    labels:
      - traefik.enable=true
      # Traefik's dashoard
      - traefik.http.routers.dashboard.rule=Host(`dashboard.meine-domain.de`)
      - traefik.http.routers.dashboard.service=dashboard@internal
      - traefik.http.routers.dashboard.middlewares=traefikauth
      - traefik.http.routers.dashboard.tls=true
      - traefik.http.routers.api.rule=Host(`dashboard.meine-domain.de`) && PathPrefix(`/api`)
      - traefik.http.routers.api.service=api@internal
      - traefik.http.routers.api.middlewares=traefikauth
      - traefik.http.routers.api.tls=true
      # Metrics
      - traefik.http.routers.traefik-metrics.rule=Host(`dashboard.meine-domain.de`) && PathPrefix(`/traefik-metrics`)
      - traefik.http.routers.traefik-metrics.service=prometheus@internal
      - traefik.http.routers.traefik-metrics.middlewares=traefikauth
      - traefik.http.routers.traefik-metrics.tls=true
      # Auth
      - traefik.http.middlewares.traefikauth.basicauth.users=test:$apr1$ztPz9Iln$mXWxOyWBFx4iN225A6ma2/
    networks:
      - nw-dekayone-clf
      - nw-dekayone-dmz
 
networks:
  nw-dekayone-clf:    # network to cloudflare
    external: true
  nw-dekayone-dmz:    # internal network for attaching exposed services
    external: true
traefik.yml
# Static configuration file of traefik
 
# use dashboard, access configured in dynanmic_conf.yml
api:
  dashboard: true
  insecure: true
 
# configure logging
log:
  level: DEBUG
  filePath: "/logs/traefik.log"
  maxSize: 10
  maxBackups: 3
accessLog:
  filePath: "/logs/access.log"
  bufferingSize: 100
 
# only HTTPS-entrypoint
entryPoints:
  https:
    address: ":443"
 
# the providers
providers:
  # Definition of provider 'docker' with dynamic configuration file 'dynamic_conf.yml'
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    watch: true
  file:
    filename: dynamic_conf.yml
    watch: true

# enable prometheus metrics
metrics:
  prometheus:
    buckets:
      - 0.1
      - 0.3
      - 1.2
      - 5.0
    manualRouting: true

Nachdem du alle Änderungen vorgenommen und diese per „Commit and push“ ins Repository übertragen bzw. die Änderungen an der traefik.yml in deiner Datenablage für deine Docker-Umgebung vorgenommen hast, kannst du den Stack für Cloudflare und Traefik in Portainer per „Pull and redeploy“ aktualisieren und neu starten.

Die Metrik-Daten von Traefik in Rohform erreichst du über die Eingabe der URL dashboard.meine-domain.de/traefik-metrics, die Rohdaten von cloudflared über Eingabe der IP-Adresse deines Pi und des Ports 9101 gefolgt /metrics.

Prometheus-Konfiguration

Im vorangegangen Kapitel haben wir Cloudflare und Traefik so konfiguriert, dass beide Container fleißig Metrik-Daten sammeln. Nun müssen wir Prometheus noch mitteilen, wo es die Metrik-Daten einsammeln soll. Das machen wir über eine Erweiterung der prometheus.yml um neue Jobs für Cloudflare und Traefik.

Die Änderungen müssen in der prometheus.yml vorgenommen werden, die in der Datenablage deiner Docker-Umgebung abgelegt ist. Die Änderungen werden nach einem Neustart des Containers bzw. Stacks für Prometheus aktiv.

  • Zeilen 15-17
    Hier wird analog zu den bereits vorhandenen Jobs ein neuer statischer Job für die Cloudflare-Daten ergänzt. IP-Adresse und Port musst du ggf. deinen eigenen Bedürfnissen anpassen.
  • Zeilen 19-27
    In diesem Block wird der Job für die Metrik-Daten von Traefik definiert, der etwas umfangreicher als die statischen Job zuvor ausfällt.
    • Zeile 19
      Die Definition beginnt wie üblich mit dem Job-Namen.
    • Zeile 20
      Es wird eine HTTPS-Verbindung benutzt.
    • Zeile 21
      Der URL-Präfix aus der Service-Definition für Traefik in der docker-compose.yml
    • Zeilen 22-24
      Die statische Angabe der URL, ebenfalls aus der Service-Definition für Traefik in der docker-compose.yml
    • Zeilen 25-27
      Die Angaben zu Benutzernamen und Kennwort für die BasicAuth. Achtung: Die Angaben stehen im Klartext in der prometheus.yml. Du musst diese Angaben anpassen an die Benutzerdaten, die du für das Traefik-Dashboard erstellt hast. Ich verwende hier die Beispieldaten.
prometheus.yml
global:
  scrape_interval: 30s
  evaluation_interval: 30s
 
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 30s
    static_configs:
      - targets: ['192.168.1.222:9090']
 
  - job_name: 'dk2docker'
    static_configs:
      - targets: ['192.168.1.222:9100']

  - job_name: 'cloudflare'
    static_configs:
      - targets: ['192.168.1.222:9101']
  
  - job_name: 'traefik'
    scheme: https
    metrics_path: '/traefik-metrics'
    static_configs:
      - targets: 
        - dashboard.meine-domain.de
    basic_auth:
      username: test
      password: 'dk1tutorial'

Nach dem Neustart deiner Prometheus-Instanz findest du in der Prometheus-GUI im Reiter „Status > Target health“ zwei neue Einträge „cloudflare“ und „traefik“. Hinterlegt sind dort die beiden URLs aus der prometheus.yml, über die du auf die Rohdaten zugreifen kannst.

Dashboards

Von Grafana.com selbst werden Dashboard-Template im Internet zum Download angeboten. Der Download und die Einbindung als neues Dashboard in deine eigene Grafana-Instanz habe ich im vorgegangenen Kapitel beschrieben. Das Verzeichnis auf Grafana.com bietet eine Suchfunktion, sodass du sicherlich für deine Anforderungen das richtige Dashboard findest.

Exemplarisch zeige ich dir in den folgenden beiden Abschnitten, welche Dashboards ich für die Visualisierung der Metrik-Daten von Cloudflare und Traefik nutze, die wie zuvor beschrieben von Prometheus eingesammelt werden.

Cloudflare

Wie bereits weiter oben erwähnt habe ich die Metriken für cloudflared eingeschaltet. Ein passendes Dashboard für die Visualisierung dieser Daten trägt die ID 17457.

Für Cloudflare gibt es viele weitere Dashboard auf Grafana.com, die allerdings auf den Daten der Cloudflare-API aufsetzen. Das Einsammeln der Metrik-Daten über diesen Weg mit dem Cloudflare Exporter funktioniert allerdings nicht mit dem Cloudflare Free Plan und ist daher hier nicht dargestellt.

Traefik

Für Traefik nutze ich das Dashboard-Template 11462, dass du wie hier beschrieben in deine Grafana-Instanz einbinden kannst, um es deinen eigenen Bedürfnissen anzupassen. Persönlich nutze ich derzeit das Traefik-Dashboard häufiger, um die Aufrufe meiner ins Internet gestellten Dienste (u.a. diese Website) zu tracken.


Quellen

Schreibe einen Kommentar