Die aktuellen Zeiten sind schon seltsame Zeiten. Cloud-Anbieter und die Unternehmens-ID laufen in Kapaztätsengpässe, Home Office ist der quasi-Standard für jene, die zum Arbeiten nicht vor Ort sein müssen. Netflix und YouTube reduzieren die Qualität ihrer Streams um die heimischen Internetanschlüsse nicht zu überlasten.
So wurde auch mir klar, dass es eine gute Idee ist die Auslastung meiner Fritzbox bzw. die Auslastung der Internetbandbreite über überwachen (zu „monitoren“).
Das Ziel
Wie eingangs bereits beschrieben, ist das Ziel die Auslastung meines Internetanschlusses zu
1. Messen
2. die Messdaten zu speichern
3. die erfassten Daten zu visualisieren
4. das ganze muss möglichst einfach sein und auf einem bestehenden RaspberryPi laufen
Die Lösung
Was benötigt es für die Lösung
1. den oben beschriebenen Raspi (Model 3), ich habe mich für Ubuntu entschieden (https://ubuntu.com/download/raspberry-pi)
2. fritzconnection und collectd zum Messen
3. InfluxDB zum speichern der Messdaten
4. Grafana zum Visualisieren
Die Vorbereitung
Als erstes aktualisieren wir das ubuntu auf dem Raspi
sudo apt update
sudo apt upgrade -y
Als nächstes kommen ein paar Basis-Pakete
# Common
sudo apt install -y apt-transport-https software-properties-common
# Python 2.7 // collectd // pip
sudo apt install -y python collectd python-pip python-lxml
Ich nutze gerne apt Repositories zur Installation von Softwaren. Zum einen hat man dann typischer weise nicht das Problem, dann man x-verschiedene Abhängigkeiten installieren muss, zum anderen ist die Wartung, also das Updaten, deutlich einfacher.
Also brauchen wir noch die Repos für InfluxDB und Grafana
# InfluxDB
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
# Grafana
curl -sL https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
# update sources
sudo apt update
InfluxDB
Das Repo für InfluxDB ist hinzugefügt, also kann es per apt installiert werden.
sudo apt update
sudo apt install -y influxdb
Grafana
Das Repo für Grafana ist ebenfalls hinzugefügt, also auch hier per apt installieren.
sudo apt update
sudo apt install -y grafana
FritzBox Benutzer
Zum Auslesen der Daten aus der Fritzbox wird ein Benutzeraccount benötigt, dass das darf. Dieser wird in der Fritzbox GUI unter System > Fritz!Box Benutzer angelegt. Der Account benötigt das Recht FRITZ!Box Einstellungen.
Diesem Beispiel heißt der Account fritzcollectd und hat als Kennwort <someverysecurepassword>.
Hier bitte eigene (sichere) Werte eintragen.
fritzcollectd
fritzcollectd wird per pip, also den “ package installer for Python„, installiert. Außerdem noch ein paar Abhängigkeiten von fritzcollectd selbst.
sudo pip install fritzconnection
sudo pip install requests
sudo pip install fritzcollectd
Die Konfiguration
Nun ist alles was benötigt wird installiert, also geht es weiter mit der Konfiguration.
InfluxDB
Als erstes wird der InfluxDB Dienst konfiguriert. Dazu wird die Datei /etc/influxdb/influxdb.conf mit dem bevorzugten Text-Editor bearbeitet. Angepasst wird der Abschnitt [collectd].
[[collectd]]
enabled = true
bind-address = "127.0.0.1:25826"
database = "collectd"
typesdb = "/usr/share/collectd/types.db"
Damit die Änderungen greifen muss der Dienst neugestartet werden. Zudem schalten wir den Dienst gleich auf „enabled“, damit dieser beim Systemstart auch mitgestartet wird. Dazu werden folgende Befehle verwendet:
sudo systemctl restart influxdb
sudo systemctl enable influxdb
collectd
Als nächstes ist der collectd Dienst dran. Die Konfigurationsdatei /etc/collectd/collectd.conf enthällt folgenden Eintrag. Somit werden .conf Dateien im Ordner /etc/collectd/collectd.conf.d berücksichtigt.
<Include "/etc/collectd/collectd.conf.d">
Filter "*.conf"
</Include>
Somit erstellen wir eine neue Konfigurationsdatei.
sudo nano /etc/collectd/collectd.conf.d/fritzcollectd.conf
Darin werden folgende Werte eingetragen. Dabei den Benutzernamen und das Kennwort verwenden, das unter dem Abschnitt FritzBox Benutzer eingetragen wurden.
LoadPlugin python
LoadPlugin network
<Plugin network>
Server "127.0.0.1" "25826"
</Plugin>
<Plugin python>
Import "fritzcollectd"
<Module fritzcollectd>
Address "fritz.box"
Port 49000
User "fritzcollectd"
Password "<someverysecurepassword>"
Hostname "FritzBox"
Instance "1"
Verbose "False"
</Module>
</Plugin>
Auch hier muss der Dienst neugestartet werden, und auch schon wie vorher „enable“n wir den Dienst im selben Schritt.
sudo systemctl restart collectd
sudo systemctl enable collectd
Treten hierbei fehler auf, können diese mit folgenden Befehl ausgelesen werden:
sudo journalctl -xe
Grafana
Grafana wird ebenfalls über apt installiert.
sudo apt install -y grafana
Grafana wird nicht per Konfigurationsdateien konfiguriert, sondern über die Web-GUI. Also nur noch den Dienst starten und aktivieren (enable).
# To start the service and verify that the service has started:
sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
# Configure the Grafana server to start at boot:
sudo systemctl enable grafana-server.service
Zur Konfiguration von Grafana wird nun die Web-GUI aufgerufen. Diese lauscht auf den Port 3000. Wer also den Hostnamen von dem Raspi nicht geändert hat, kann dazu diese URL verwenden http://ubuntu:3000. Standard-Login ist admin / admin.
Nach der obligatorischen Kennwortänderung kann direkt die Datenquelle angelegt werden. Dies geschieht nach folgenden Werten:
Typ: InfluxDB (wer hätte das gedacht?!?)
Name: InfluxDB_local_collectd (Der Name ist frei wählbar, aber ich weiß gerne was ich gerade nutze)
URL: http://localhost:8086
Database: collectd

Ist die Datenquelle angelegt braucht es noch die Visualisierung. Diese gibt es bereits bei Grafana.com und muss nur importiert werden.
Das im Menü den Import-Button wählen.

Das fertige Dashboard hat die ID 713. Einfach eintragen und es geht automatisch weiter.

Jetzt nur noch den Namen von dem Dashboard anpassen (nur bei Bedarf), den Ordner für das Dashboard auswählen sowie die vorher angelegte InfluxDB-Datenquelle (InfluxDB_local_collectd).

Und fertig ist das Dashboard und wird auch mit Daten versorgt.
Wer mag (so wie ich das mag) kann noch die Data Retention für die InfluxDB anpassen. Die Konfiguration erfolgt dabei über den Shell-Befehl influx.
Das sind die notwendigen SQL Befehle:
USE collectd
CREATE RETENTION POLICY "1y" ON "collectd" DURATION 52w REPLICATION 1
SET RETENTION POLICY "1y" on "collectd" DEFAULT
Achtung: dies setzt ggf. die gesammelten Daten zurück.
Abschließender Hinweis
Dieser Blog-Eintrag beschäftigt sich ausschließlich mit der Implementierung der Lösung, jedoch nicht mit Dingen wie z.B. die Härtung von der InfluxDB, Grafana und anderen Komponenten. Auch auf Verschlüsselung, wie z.B. die Umstellung von http auf https, wird nicht eingegangen.
Bitte darauf aufpassen!
Quellen
Ich habe mir das nicht alles selbst ausgedacht und möchte natürlich nicht meine Quellen verheimlichen.
http://www.andremiller.net/content/grafana-and-influxdb-quickstart-on-ubuntu
https://huskynarr.de/monitoring-der-fritzbox-mit-grafana-auf-dem-raspberry-pi-3/
https://fritzconnection.readthedocs.io/en/1.2.1/sources/install.html
https://grafana.com/grafana/download?platform=arm
https://grafana.com/docs/grafana/latest/installation/debian/#install-from-apt-repository
https://grafana.com/docs/grafana/latest/installation/configuration/
https://grafana.com/grafana/dashboards/713