April 1, 2020 Von marco 0

Internet-Geschwindigkeit Monitoring mit NodeRed, Influx DB und Grafana

In diesem Artikel geht des darum, wie man verschiedene Metriken über den eigenen Internetzugang automatisiert abfragen, speichern und visualisieren kann.

Es sollen Werte wie Upstream-, Downstream-Geschwindigkeit und Latenz in einem regelmäßigen Intervall abgefragt und gespeichert werden.
Die Speicherung soll in Influx DB erfolgen, da sich die Datenbank einfach auf einem Raspberry Pi installieren lässt und für die Speicherung von Zeitreihen ausgelegt ist.

Für die Installation müssen zunächst Schlüssel und URL des Repositories auf dem Pi hinzugefügt werden.

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

Ist dies erfolgt, lässt sich Influx einfach über apt installieren.

sudo apt update
sudo apt install influxdb

Mit folgenden Befehlen, lässt sich Influx automatisch beim Boot starten:

sudo systemctl unmask influxdb
sudo systemctl enable influxdb

Alternativ kann es auch manuell gestartet werden:

sudo systemctl start influxdb

In der Konfigurationsdatei muss die http Sektion wie im Screenshot angezeigt angepasst werden.

code /etc/influxdb/influxdb.conf

Wird eine VS-Code Remote Session verwendet, kann die Datei nicht direkt unter /etc gespeichert werden (it’s not a bug it’s a feature).

Als workaround kann die Datei im Home-Verzeichnis (/home/pi/influxdb.conf) gespeichert und über das Terminal kopiert werden:

sudo mv /home/pi/influxdb.conf /etc/influxdb/influxdb.conf
sudo systemctl start influxdb

Als nächstes muss ein User angelegt und eine Datenbank erzeugt werden.
Mit dem Befehl „influx“ gelangt man zum command line interface (cli) von InfluxDB:

influx
CREATE USER admin WITH PASSWORD 'password' WITH ALL PRIVILEGES
CREATE DATABASE network
exit

Speedtest

Über speedtest.net kann eine Prüfung der Internetverbindung manuell im Browser ausgeführt werden. Der Anbieter stellt aber auch ein Tool für die automatisierte Prüfung (für private Zwecke) zur Verfügung.


Dies kann wie folgt installiert werden:

sudo apt-get install gnupg1 apt-transport-https dirmngr
export INSTALL_KEY=379CE192D401AB61
export DEB_DISTRO=$(lsb_release -sc)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $INSTALL_KEY
echo "deb https://ookla.bintray.com/debian ${DEB_DISTRO} main" | sudo tee  /etc/apt/sources.list.d/speedtest.list
sudo apt update
sudo apt install speedtest

Nach der Installation kann man über den Befehl „speedtest“ die Lizenzbedingungen akzeptieren und die Installation testen.

speedtest

Node Red – Daten sammeln

Für die regelmäßige Ausführung des speedtest und die Verarbeitung der Ergebnisse ist NodeRED verantworlich. Um die Messwerte in Influx zu Speichern wurde die Erweiterung node-red-contrib-influxdb installiert.

Der Flow in NodeRED ist relativ einfach. Er besteht aus folgenden Nodes:

  1. Inject Node: Führt den Flow alle 15 Minuten aus
  2. Exec Node: Führt das Command „speedtest –format=json“ aus
  3. JSON Parser: Konvertiert den JSON String in ein Objekt
  4. Funktion Node: Semantische Umformung für die Speicherung
  5. Influx Node: Speichert das Ergebnis in der Influx Datenbank
Speedtest to Influx Flow

Hier der gesamte Flow zum Einfügen in NodeRED:

[{"id":"3599a25b.90bbae","type":"tab","label":"Speedtest","disabled":false,"info":""},{"id":"31ac8e9d.dbb582","type":"inject","z":"3599a25b.90bbae","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":116,"y":165,"wires":[["d7e75a4f.836328"]]},{"id":"c1e60983.2ac978","type":"debug","z":"3599a25b.90bbae","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":886,"y":104,"wires":[]},{"id":"d7e75a4f.836328","type":"exec","z":"3599a25b.90bbae","command":"speedtest --format=json","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":356,"y":163.5,"wires":[["c8d2e647.5ece18"],[],[]]},{"id":"c8d2e647.5ece18","type":"json","z":"3599a25b.90bbae","name":"","property":"payload","action":"","pretty":false,"x":561,"y":150,"wires":[["27532ad9.b27a66"]]},{"id":"27532ad9.b27a66","type":"function","z":"3599a25b.90bbae","name":"","func":"var jitter = msg.payload['ping']['jitter'];\nvar latency = msg.payload['ping']['latency'];\nvar down_bw = msg.payload['download']['bandwidth']\nvar down_bytes = msg.payload['download']['bytes']\nvar down_elapsed = msg.payload['download']['elapsed']\nvar up_bw = msg.payload['upload']['bandwidth']\nvar up_bytes = msg.payload['upload']['bytes']\nvar up_elapsed = msg.payload['upload']['elapsed']\nvar loss = msg.payload['packetLoss']\n\nvar result = {\n    'jitter':jitter,\n    'latency':latency,\n    'down_bw':down_bw,\n    'down_bytes':down_bytes,\n    'down_elapsed':down_elapsed,\n    'up_bw':up_bw,\n    'up_bytes':up_bytes,\n    'up_elapsed':up_elapsed,\n    'loss':loss\n}\n\nmsg.payload = result;\n\nreturn msg;\n","outputs":1,"noerr":0,"x":700,"y":150,"wires":[["c1e60983.2ac978","56a64c7.4fb45b4"]]},{"id":"56a64c7.4fb45b4","type":"influxdb out","z":"3599a25b.90bbae","influxdb":"42046906.645448","name":"Rapeedo","measurement":"rapeedo","precision":"","retentionPolicy":"","x":866,"y":181,"wires":[]},{"id":"52af619f.2c8dd","type":"influxdb in","z":"3599a25b.90bbae","influxdb":"42046906.645448","name":"","query":"SELECT * FROM rapeedo","rawOutput":true,"precision":"","retentionPolicy":"","x":389.5,"y":386,"wires":[["78d08b22.c13214"]]},{"id":"bb629f24.7f3ed","type":"inject","z":"3599a25b.90bbae","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":125.5,"y":379,"wires":[["52af619f.2c8dd"]]},{"id":"78d08b22.c13214","type":"debug","z":"3599a25b.90bbae","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":693.5,"y":387,"wires":[]},{"id":"42046906.645448","type":"influxdb","z":"","hostname":"127.0.0.1","port":"8086","protocol":"http","database":"network","name":"Influx","usetls":false,"tls":""}]

Grafana

Letztendlich soll die Zeitreihe auch visualisiert werden. Hierzu wird Grafana genutzt, welches ebenfalls auf dem Pi installiert wurde.

Ein Paket zur Installation lässt sich wie folgt herunterladen und installieren:

wget https://dl.grafana.com/oss/release/grafana_6.6.1_armhf.deb
sudo dpkg -i grafana_6.6.1_armhf.deb

Zudem soll auch Grafana beim Boot starten:

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable grafana-server
sudo /bin/systemctl start grafana-server

Das UI von Grafana ist dann über http://<host>:3000 erreichbar. Das erste Login erfolgt über die Standard-Credentials admin/admin.

In Grafana können dann Abfragen für verschiedene Charts angelegt und einem Dashboard hinzugefügt werden.

Grafana Dashboard mit Verlauf und den aktuellen Werten

Die Screenshots (unten) zeigen die Definition der Abfragen. Eine Division durch 125000 ist nötig, um die Werte für Up- /Downstream in Mbit/sec umzurechnen.

Abfragen für Up- und Downstream
Abfrage der Latenz

Für die Anzeige der aktuellen Werte wurde der letzte Wert einer Zeitreihe durch die Funktion „last()“ abgefragt.

Fazit

NodeRED, Influx und Grafana sine eine gut funktionierende Kombination, um Messwerte abzufragen, als Zeitreihe zu speichern und in einem Dashboard darzustellen.

Sicherlich gibt es für jede der Komponenten noch mächtigere Alternativen, aber die einfache Installation und die Tatsache, dass alles problemlos auf einem Raspberry Pi läuft spricht für diese Kombination, wenn es um einfache Home-IoT-Zeitreihen geht.