Docker Logo

Fritzbox Monitoring mit Grafana Dashboard

Die Tage wurde ein interessantes Grafana Dashboard für einen Eigenbau Router (opnsense) vorgestellt. Da kam die Idee auf so ein Dashboard für die Fritzbox aufzubauen. Dazu findet man einiges im Netz. Eine Lösung war die Umsetzung mit einer InfluxDB die von einem Exporter Dienst befüllt wird. Das war schon ganz gut aber die Umsetzung ein wahres Grauen. Zumal die Docker Container eine InfluxDB2 statt eine InfluxDB installierten. Die InfluxDB musste mit UDP beliefert werden. Es begann eine Odysee der Fehlersuche. Konnte nun eine andere Lösung ausfindig machen. Die war schon sehr umfangreich und sehr informativer als die erste Lösung. So ist es nun mal in der Welt der Technik, man baut was auf und sieht dann eine andere und bessere Umsetzung.

Nun was brauchen wir:

Starte die Installation :

sudo apt install golang
go get github.com/sberk42/fritzbox_exporter/ 
cd $GOPATH/src/github.com/sberk42/fritzbox_exporter 
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o fritzbox_exporter main.go

Es sollte nun im aktuellen Verzeichnis eine Datei “fritzbox_exporter” vorhanden sein.

Erstelle ein Verzeichnis um die Dateien für den Exporter zu kopieren und kopiere alle JSON-Dateien dort hinein.

mkdir -p /usr/local/share/exporter
cp fritzbox_exporter /usr/local/share/exporter
cp *.json /usr/local/share/exporter

Erstelle ein System File unter /etc/systemd/system/fritzbox_exporter.service

[Unit]
Description=Prometheus fritzbox exporter
After=network.target
Wants=network.target

[Service]
User=prometheus
Group=prometheus
WorkingDirectory=/usr/local/share/exporter
ExecStart=/usr/local/share/exporter/fritzbox_exporter -username collectd -password <DeinPasswort> -listen-address 192.168.1.100:9042 -metrics-file /usr/local/share/exporter/exporter/metrics.json
Type=simple
Restart=always

[Install]
WantedBy=multi-user.target

Einrichtung Fritzbox:

Fritzbox einrichten mit Benutzer, Dienst und Passwort setzen

Jetzt prüfen ob die Fritzbox Daten wie gewünscht ausgibt. In der ersten Zeile wird der Exporter im Hintergrund gestartet. In der zweiten Zeile wird die Abfrage gestartet. Sollten hier Daten zu sehen sein, ist alles richtig eingerichtet. Im Anschluß Dienst Fritzbox Exporter starten. Die Listen Address muss entsprechend deinem Netzwerk und Server angepasst werden und dient nur als Platzhalter.

/usr/local/share/exporter/fritzbox_exporter -username collectd -password <DeinPasswort> -listen-address 192.168.1.100:9042 -metrics-file /usr/local/share/expoter/exporter/metrics.json& 

curl -s http://192.168.1.100:9042/metrics # Prüfung ob Daten vorhanden sind

sudo systemctl enable fritzbox_exporter # Dienst bei Reboot starten
sudo systemctl start fritzbox_exporter # Dienst starten
sudo systemctl status fritzbox_exporter # Prüfen ob Dienst gestartet ist

Docker Installation:

Starte nun die Docker Einrichtung. Hier setze ich voraus dass der Docker Host schon eingerichtet ist. Erstelle ein Verzeichnis $HOME/exporter und erstelle in dem Unterverzeichnis eine Datei “docker-compose.yml”. Starte den Container mit “docker-compose up -d” und überprüfe mit “docker ps” ob Container richtig gestartet wurde.

---
version: '3'

services:
  mon_prometheus:
    image: prom/prometheus:latest
    container_name: mon_prometheus
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - $PWD/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    depends_on:
      - mon_node-exporter
      - mon_cadvisor

  mon_node-exporter:
    image: prom/node-exporter:latest
    container_name: mon_node-exporter
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--collector.filesystem.ignored-mount-points="^(/rootfs|/host|)/(sys|proc|dev|host|etc)($$|/)"'
      - '--collector.filesystem.ignored-fs-types="^(sys|proc|auto|cgroup|devpts|ns|au|fuse\.lxc|mqueue)(fs|)$$"'

  mon_grafana:
    image: grafana/grafana:latest
    container_name: mon_grafana
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /var/docker/data/monitoring/grafana:/var/lib/grafana
    ports:
      - 3000:3000
    user: "1000"  #  USER ID des Docker Users anpassen
    depends_on:
      - mon_prometheus
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.grafana.entrypoints=websecure"
      - "traefik.http.routers.grafana.rule=Host(`grafana.example.com`)"  # Domain anpassen
      - "traefik.http.routers.grafana.tls=true"
      - "traefik.http.routers.grafana.tls.certresolver=default"
      - "traefik.http.routers.grafana.middlewares=secHeaders@file"
      - "traefik.http.services.grafana.loadbalancer.server.port=3000"
    networks:
      - traefik_proxy
      - default

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

 

Einrichtung Prometheus

Im Verzeichnis $HOME/exporter gibt es ein Unterverzeichnis prometheus. Diese Datei wie folgt ändern und mit “docker-compose restart” neue Konfiguration einlesen.

---
global:
  scrape_interval: 60s
  evaluation_interval: 60s
  external_labels:
    monitor: 'homelab'
rule_files:
scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['mon_node-exporter:9100']

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['mon_cadvisor:8080']

  - job_name: 'fritzbox_exporter'
    static_configs:
      - targets: ['192.168.1.100:9042']

Einrichtung Grafana

Starte Grafana Interface im Browser – http://<Docker-IP>:3000 und es sollte sich ein Anmeldefenster öffnen. Dort Anmeldung Benutzer und Passwort  =  admin:admin . Nach erfolgreicher Anmeldung wird man aufgefordert dem Benutzer “admin” ein neues Passwort zu vergeben. Im Anschluß eine neue Data Source Prometheus anlegen. Die URL lautet “http://mon_prometheus:9090” dann auf Testen und Speichern klicken.
Nun ein neues Dashboard erstellen mit “Import” und ID “12579” eintragen und auf Load klicken. 

Wenn alles richtig eingerichtet wurde sollte das Dashboard bereits mit Daten zu sehen sein.

Fritzbox Monitor
Fritzbox Monitor
Noch ein Hinweis:

Nimm bitte nur den fritzbox_exporter wie er oben angegeben ist, denn ein anderer Exporter liefert keine Daten bei Network Devices, das Panel ist einfach leer. Sollten hier Daten fehlen dann bitte nochmal von oben beginnen.

Architektur:

Anbei noch ein Bild von dem ganzen Aufbau im Überblick

Überblick Fritzbox Monitoring
Überblick Fritzbox Monitoring

Die mit Sternchen (*) gekennzeichneten Verweise sind sogenannte Provision-Links. Wenn du auf so einen Verweislink klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine Provision. Weiterführende Infos gibt es hier unter Punkt 8 in der Datenschutzerklärung  https://blog.unixweb.de/datenschutzerklaerung/

Bei Fragen bitte die Kommentarfunktion nutzen.

Viel Spaß beim Aufbau und Monitoring der Fritzbox wünscht Joachim.

14 Kommentare

  1. Hallo, vielen dank für die gute Arbeit. Ich hätte aber doch noch ein zwei fragen. Unter welchem OS installieren sie dies Monitoring? Ich habe versucht das unter Ubuntu zu installieren und scheitere schon an der ersten Befehlszeile „go get…“ ich hab das ganze auf Proxmox und in LXC. der Docker läuft ebenfalls in einem LXC. Können Sie mir einen tip geben?

    1. Hallo Marco

      da hab ich doch noch einen Arbeitsschritt unterschlagen. Mach einfach vorher :
      $ sudo apt install golang

      Beste Grüße Joachim

    2. Hallo Marco

      danke für den Hinweis hatte ich doch einen Befehl vergessen. Hab den jetzt nachgetragen.
      $ sudo apt install golang

      Viel Erfolg und Grüße Joachim

  2. Mir geht es leider wir Marco. Ich hänge am gleichen Ort fest. Bei Eingabe der “go get…” Befehlszeile erhalte ich folgende Meldung auf meinem virtuellen Ubuntu Server: github.com/prometheus/client_golang/prometheus
    go/src/github.com/prometheus/client_golang/prometheus/go_collector.go:353:15: un defined: debug.ReadBuildInfo
    Wäre sehr dankbar um einen Tipp, wie ich weiter machen könnte.

    1. Hallo

      hast Du einen Ordner go in $HOME ?
      Wenn ja dann lösche diesen und probiere es nochmal mit go get …
      Mach den Befehl ohne “sudo” bitte.

      Grüße Joachim

  3. Hallo Joachim
    ich hab den Termin leider verpasst. ga es eine Lösung für die Fehlermeldung:
    go/src/github.com/prometheus/client_golang/prometheus/go_collector.go:353:15: undefined: debug.ReadBuildInfo
    ich hab den Ordner go gelöscht und auch dann klappt es nicht.
    System: Raspberry pi4 mit docker und grafana
    Mfg Sven

    1. Hallo Sven

      auf den Raspberry Pi 4 hab ich es nicht installiert. Ich hab es auf einen Ubuntu Server installiert.
      Go auf einem Arm6/7 Prozessor zu installieren macht Probleme, außer man weiss was man tut.

      Grüße Joachim

  4. Was im Artikel nicht erwähnt wird, ist die Voraussetzung Ubuntu Server. Auf Debian tritt nämlich der hier in den Kommentaren mehrfach erwähnte Fehler auf:
    go/src/github.com/prometheus/client_golang/prometheus/go_collector.go:353:15: undefined: debug.ReadBuildInfo

    Die Anleitung funktioniert aber auch dann nicht, weil in der yml-Datei in Zeile 15 ein Service mon_cadvisor als Abhängigkeit angegeben wird, der aber gar nicht definiert wird. Da habe ich bislang noch keine Lösung dafür gefunden. Wenn ich die Zeile weglasse, zieht Docker sich zwar images, aber es gibt dann einen neuen Fehler, dass /etc/timezone sich nicht mounten lässt. Bin mir aber nicht sicher, ob ich das überhaupt richtig interpretiere.

    1. Hallo

      dann lass die Zeile 15 raus , der Prometheus sollte aber trotzdem starten und es ist keine Abhängigkeit sondern ein Dienst von dem Daten abgeholt werden und hat nichts mit Docker zu tun.

      Wenn /etc/timezone nicht vorhanden ist oder 0 Byte hat dann muss diese erstellt und befüllt werden mit Europe/Berlin

      Grüße , Joachim

  5. Hey Joachim,

    habe ich dann auch so gemacht. Seltsamerweise gab es dann anstelle einer Datei prometheus.yml ein gleichnamiges leeres Unterverzeichnis. Das habe ich gelöscht und die Datei reingelegt. Dann ging es. Merci.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.