Möchte man kontinuierlich einen Speedtest durchführen, konnte ich bis vor wenigen Monaten den Speedtest bei UniFi nutzen. Leider lassen die jetzt den Speedtest nur noch aller 12h zu – damit ist das ganze zum Monitoren etwas obsolet. Da muss was neues her
Speedtest.net bietet seit neustem eine speedtest-cli an womit man den Test auf einer bash durchführen kann. Das Ergebnis will ich später in einer InfluxDB übertragen. Und um das ganze zu kapseln verwende ich dabei Docker.
Es geht also damit los, dass man das Dockerfile anlegen muss. Das muss man in zwei Schritten machen. Beim ersten Start von speedtest-cli wird ein Token abgerufen und lokal gespeichert. Den muss man später noch mit rein kopieren.
FROM arm32v7/debian RUN apt-get -y update \ && apt-get -y install gnupg1 apt-transport-https dirmngr curl RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 379CE192D401AB61 \ && echo "deb https://ookla.bintray.com/debian buster main" | tee /etc/apt/sources.list.d/speedtest.list RUN apt-get update && apt-get -y install speedtest RUN mkdir -p /root/.config/ookla/ ADD assert/speedtest-cli.json /root/.config/ookla/ ADD assert/start.sh /root/start.sh ADD assert/createMeasure.sh /root/createMeasure.sh WORKDIR /root CMD ["./start.sh"]
Wir bauen uns also von einem Standard arm32 v7 Debian Image das Image. Dazu bbrauchen wir diverse Pakete zum installieren und fügen dann den Server von Ookla hinzu. Die Zeilen ab “mkdir…” lässt man am Anfang weg 😃 Nach dem ersten build startet mal mit diesem Image ein Container und startet “speedtest” – bestätigt die ganzen Fragen und es wird in /root/.config/ookla eine speedtest-cli.json erstellt. Diese muss man nun in einem 2. Terminal Fenster mit docker cp raus kopieren oder man lässt sich einfach den Inhalt anzeigen und erstellt lokal die Datei. Ich habbe diese ins Verzeichnis “assert” gelegt.
Jetzt kann der Rest auch rein.
start.sh
Da der Speedtest kontinuierlich laufen soll gibt es den Einstiegspunkt start.sh wo nichts anderes passiert als Speedtest starten, warten und das ganze wiederholen:
#!/bin/bash while true do ./createMeasure.sh sleep 600 done
Die eigentliche Messung und übertragung in die InfluxDB findet dann in der createMeasure.sh statt:
#!/bin/bash # Ausgabe Datei löschen und neu anlegen rm -f output.txt touch output.txt # Speedtest ausführen, Ausgabe als csv und umleiten in die output.txt speedtest --format=csv > output.txt # alle Ergebnisse speichere ich noch zusätzlich FILENAME=html/`date +'%Y'`-`date +'%m'`_measure.csv echo Schreibe nach $FILENAME LASTLINE=`cat output.txt` echo $LASTLINE >> $FILENAME echo Ergebnis\r\n$LASTLINE # Auslesen von PING, Download (DL) und Upload (UL) aus der CSV - Kommawerte werden gelöscht. PING=`echo $LASTLINE |sed -r 's/"//g' | cut -d"," -f3 |cut -d"." -f1` DL=`echo $LASTLINE |sed -r 's/"//g' | cut -d"," -f6 |cut -d"." -f1` UL=`echo $LASTLINE |sed -r 's/"//g' | cut -d"," -f7 |cut -d"." -f1` # DL und UL sind Bit/s und müssen in Byte/s umgerechnet werden DL=`expr $DL \* 8` UL=`expr $UL \* 8` # Aufbereiten der Anfragen an Influx DATA1="Speedtest Ping=$PING" DATA2="Speedtest Download=$DL" DATA3="Speedtest Upload=$UL" # Senden. Meine Datenbank heißt hier Hausdaten und die Sammlung Speedtest echo -e "Sending Data\n$DATA1" curl -i -XPOST 'http://192.168.103.2:8086/write?db=Hausdaten' --data-binary "$DATA1" echo -e "Sending Data\n$DATA2" curl -i -XPOST 'http://192.168.103.2:8086/write?db=Hausdaten' --data-binary "$DATA2" echo -e "Sending Data\n$DATA3" curl -i -XPOST 'http://192.168.103.2:8086/write?db=Hausdaten' --data-binary "$DATA3"
Docker-compose
Das ganze jetzt noch als docker-compose.
version: "3" services: speedtest: build: context: . image: speedtest volumes: - './html/:/root/html/' restart: always network_mode: "host"
Das Volume ist dafür da, dass ich die Messwerte nach Monat getrennt raus bekomme als CSV. Zusätzlich werden die Werte ja auch an die InfluxDB übertragen.
Und wer jetzt noch nicht genug hat, kann das ganze natürlich noch auf einem mini-Display visualisieren 😀 https://www.blogyourearth.com/computer/raspberry-pi-internet-geschwindigkeit-monitor/10106