11 min. read

Fritz!Box Monitoring mit Grafana und Raspberry

Der c´t Artikel Router-Watching brachte mich auf die Idee, meiner Fritz!Box mal ein wenig genauer auf die Finger zu schauen.

Allerdings fand ich den Lösungsansatz mit Munin nicht mehr so ganz zeitgemäß, etwas frischeres - in diesem Fall Grafana - sollte für die Ausgabe her.

Der Blogpost von Christian Fetzer beschreibt in kurzen Worten, wo die Reise hin geht. Da ich jedoch während meiner Einrichtung auf dem Raspberry Pi über das eine oder andere Problem gestolpert bin, hier eine Schritt-für-Schritt Anleitung.

Dieser Artikel beschreibt die Einrichtung auf einem Raspberry Pi Model 3. Das stellt dann aber auch das untere Ende der Leistungsfähigkeit dar, mit einem älteren Modell würde ich es nicht versuchen.

Grundsätzlich sollte diese Anleitung auch für andere debianartige Linux Distributionen auf anderen CPU Plattformen funktionieren (Debian, Ubuntu, … x86, x64).
Lediglich beim Download des Grafana-Pakets muss jedoch darauf geachtet werden, die entsprechende Plattform zu wählen.

Raspberry vorbereiten

Die Erstellung einer Raspi SD-Karte spare ich mir, ein SSH- oder Konsolenzugang zu einem Raspi mit aktuellem Raspbian ist Voraussetzung. Wer´s dazu Fragen hat: Google hilft.

Raspberry updaten

sudo apt-get update && sudo apt-get -y upgrade

Installation(en)

Das Python Paket fritzcollectd dient uns hier zum Sammeln der Daten aus der Fritz!Box.

sudo apt-get install -y python-pip

installiert zunächst Python und den Paketmanager Pip. Anschließend installiert

sudo apt-get install -y libxml2-dev libxslt1-dev

weitere Pakete, die benötigt werden, um im nächsten Schritt fritzcollectd und seine Abhängigkeiten per pip zu installieren:

sudo pip install fritzcollectd

Das kann auf einem Raspberry ziemlich lange dauern. Insbesondere braucht die Installation von lxml eine ganze Weile: Bei Running setup.py bdist_wheel for lxml also nicht die Geduld verlieren - auch wenn sich scheinbar nichts mehr tut! Mein Raspi 3 brauchte dafür ungefähr eine halbe Stunde.

Fritz!Box vorbereiten

Damit die Fritz!Box überhaupt Daten zur Verfügung stellt, muss die Option Statusinformationen über UPnP übertragen in den Netzwerkeinstellungen aktiviert sein. Zu finden ist sie unter Heimnetz > Netzwerk > Netzwerkeinstellungen.

Der Schalter Zugriff für Anwendungen zulassen muss ebenfalls aktiviert werden.

Optional sollte man einen neuen Fritz!Box Benutzer einrichten, über den später die Daten abgefragt werden:

Als Berechtigung wird FRITZ!Box Einstellungen benötigt, die Rechte für Sprachnachrichten und Smart Home sind darin enthalten und werden zwangsweise mit aktiviert.

Benutzername und Kennwort werden später noch benötigt, also irgendwohin copypasten.

Sammelstelle

Im nächsten Schritt bringen wir collectd dazu, alle 10 Sekunden Daten aus der Fritzbox zu einzusammeln.

Die Installation erfolgt per

sudo apt-get install -y collectd

Das zieht einen Haufen abhängiger Paket hinter sich her, dauert also auch eine Weile.

Nun passen wir die Konfiguration von collectd an, damit die Fritz!Box Daten ausgelesen werden:

sudo nano /etc/collectd/collectd.conf

Zunächst das Kommentarzeichen in der Zeile #LoadPlugin python und #LoadPlugin networkentfernen:

1
2
3
LoadPlugin python
[...]
LoadPlugin network

Weiter unten finden sich die Plugin-Blöcke.

Der Teil für das Network Plugin sorgt dafür, dass die gesammelten Daten in die InfluxDB geschrieben werden:

1
2
3
<Plugin network>
Server "127.0.0.1" "25826"
</Plugin>

Noch etwas weiter unten fügst du einen Block für das Python Plugin hinzu:

1
2
3
4
5
6
7
8
9
10
11
12
13
<Plugin python>
Import "fritzcollectd"

<Module fritzcollectd>
Address "fritz.box"
Port 49000
User "benutzer"
Password "passwort"
Hostname "FritzBox"
Instance "1"
Verbose "False"
</Module>
</Plugin>

Ersetze dabei benutzer und passwort durch die Werte des oben angelegten Fritz!Box Benutzers.
Falls deine Fritz!Box nicht DNS-Server in deinem Heimnetz ist, solltest du unter Address die IP-Adresse deiner Fritz!Box eintragen.

Die Datei speicherst du mit F2 und y.

Vom hinteren Ende…

Als Backend zur Datenspeicherung dient uns InfluxDB.

Auch hier sind die Pakete der offiziellen Raspbian Distribution veraltet (z.Zt. v1.0.2), daher bedienen wir uns aus dem Apt Repository des Herstellers Influxdata:

1
2
3
4
5
6
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update
sudo apt install influxdb
sudo systemctl enable influxdb
sudo systemctl start influxdb

Die InfluxDB Konfiguration passt du per

sudo nano /etc/influxdb/influxdb.conf

an unsere Bedürfnisse an:

Finde den Abschnitt [collectd] und ersetze ihn durch

1
2
3
4
5
[[collectd]]
enabled = true
bind-address = "127.0.0.1:25826"
database = "collectd"
typesdb = "/usr/share/collectd/types.db"

Ein anschließendes

sudo systemctl restart collectd und
sudo systemctl restart influxdb

sorgt dafür, dass unsere collectd und InfluxDB Konfiguration aktiviert wird.

…zum vorderen Ende.

Zu guter Letzt werden wir noch Grafana installieren. Da das Granafa Paket in den Raspbian Repositories recht veraltet ist (zu diesem Zeitpunkt Version 2.6.0), bedienen wir uns lieber aus den aktuellen Releases von Grafana.

Mit

1
2
3
cd ~
mkdir -p Downloads
cd Downloads && wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_5.3.2_armhf.deb

laden wir das aktuelle Paket herunter. Vor dem Download unbedingt vorher auf den Download Seiten nachsehen, ob´s nicht was Neueres gibt. Den wget Befehl (Platform ist ARMv7) zum Download im obigen Schritt in die Zwischenablage kopieren und ausführen. Danach per

1
sudo dpkg -i grafana_5.3.2_armhf.deb

installieren (auch hier muss ggf. die Version im Dateinamen angepasst werden).

Der systemctl muss dann auch noch wissen, dass er Grafana starten soll:

1
2
3
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable grafana-server
sudo /bin/systemctl start grafana-server

Und der Rest

Öffne nun in deinem Webbrowser http://raspberrypi:3000/login

Falls alles bisher geklappt hat, solltest du von der Grafana Loginseite begrüßt werden:

Beim ersten Login kannst du dich mit dem Usernamen admin und dem Kennwort admin anmelden. Das Kennwort kannst du unmittelbar nach dem ersten Login ändern.

Willkommen bei Grafana!

Her mit den Daten

Zunächst müssen wir Grafana unsere Datenquelle unterjubeln. Über die Navigationsleiste am linken Rand (oder per direkter URL http://raspberrypi:3000/datasources) kommst du in die Einstllungen für die Datasources.

Füge eine neue Datenquelle hinzu und fülle die Felder entsprechend dem Screenshot aus:

Wenn der anschließende Test erfolgreich verläuft, kann die Datenquelle hinzugefügt werden.

Mach dich hübsch

Wir haben nun unseren Datensammler collectd, unsere Datenbank InfluxDB und Grafana als Frontend. Was uns nun noch fehlt ist ein passendes Dashboard für Grafana.

Ein Grafana Dashboard setzt sich aus einem oder mehreren Panels zusammen, die bestimmte Werte in unterschiedlicher Weise grafisch anzeigen. So kann ein Panel einen Graphen darstellen, eine Tabelle oder auch nur einen Text(wert).

Viele der zur Verfügung stehenden Panels können einen zeitlichen Verlauf darstellen. Das anzuzeigende Zeitfenster kann oben rechts im Grafana Dashboard ausgewählt werden (und gilt dann für alle Panels im Dashboard).

Jedes Panel bekommt seine Daten aus einer Datenbankabfrage. So sammelt zum Beispiel

SELECT last("value") FROM "fritzbox_value" WHERE ("type_instance" = 'receiverate') AND $timeFilter GROUP BY time($__interval)

die aktuelle Empfangsrate der Fritz!Box aus der Influx Datenbank.

Möchte man beispielsweise den kumulierten Datentraffic pro Tag in Empfangsrichtung darstellen, braucht´s schon was komplexeres:

1
2
3
4
5
6
7
8
9
10
SELECT   Non_negative_difference(Last(cumulative_sum))
FROM (
SELECT Cumulative_sum(Non_negative_difference(Last("value")))
FROM "fritzbox_value"
WHERE (
"type_instance" = 'totalbytesreceived')
AND $timefilter
GROUP BY Time($__interval) )
WHERE $timefilter
GROUP BY time(1d) tz('Europe/Berlin')

Daher war ich glücklich, in der Sammlung der Grafana Dashboard-Vorlagen über Christian Fetzers FRITZ!Box Router Status - Dashboard zu stolpern.

Das Dashboard kannst du auf einfachste Weise in dein Grafana importieren. Klicke in der Menuleiste am rechten Rand auf das Plus Zeichen und anschließend auf Import:

Im anschließenden Dialog musst du nur noch die ID des Dashboards (713) eintragen:

Die Dashboard Informationen werden nun geladen. Im nächsten Schritt muss dann nur noch die Datenquelle (influxdb_collectd) ausgewählt werden. Ein Klick auf Import und fertig ist dein FRITZ!Box Router Status Dashboard.

Je nach dem, wie lange du für die Schritte nach dem Start von collectd benötigt hast, sollten auch schon Daten angezeigt werden.

Bastelstube

Wer mag, kann natürlich das Fritz!Box Grafana Dashboard nach Belieben mit weiteren Panels erweitern. fritzcollectd sammelt über die in unserem Dashboard dargestellten Werte hinaus auch weitere wie CPU-Auslastung und Temperatur. Die Werte müssen nur per Query aus der InfluxDB Datenbank rausgefischt und in weiteren Panels dargestellt werden. Der Phantasie sind hier kaum Grenzen gesetzt. Grafanas grafische Query Editor hilft beim Editieren der Panels auch Einsteigern. Wer was schönes gebaut hat: Panel einfach als JSON exportieren und mir zuschicken, ich würde das dann gern hier einpflegen.

Sicher?

Diese Anleitung beschreibt ein Projekt für eine Heimnetzwerküberwachung. Es eignet sich schon leistungsmäßig nicht für ein Monitoring im professionellen Umfeld.

Insbesondere solltest den deinen Raspberry nicht zum Internet hin exponieren ohne vorher alle möglichen Sicherheitsaspekte in Betracht gezogen zu haben.

Wenn du von unterwegs auf deinen GrafanaPi zugreifen möchtest, solltest du das ausschließlich über eine VPN-Verbindung tun.

Referenzen

https://fetzerch.github.io/2014/08/23/fritzcollectd/
https://www.digitalocean.com/community/tutorials/how-to-configure-collectd-to-gather-system-metrics-for-graphite-on-ubuntu-14-04
https://github.com/fetzerch/fritzcollectd