Echtzeitstatistiken für Icecast2 mit Grafana & InfluxDB

Ich habe lange Zeit eine kleine Webradiostation betrieben und da wollte ich natürlich ganz genau wissen, wie viele Leute wann einschalten. Mittels Icecast2 habe ich mein Programm in die Welt ausgestrahlt und auch Tools wie Centova Cast verwendet. Leider waren diese Statistiken nicht besonders effektiv. Bei weiteren Recherchen bin ich darauf gestoßen, dass man mit InfluxDB und Grafana Echtzeitstatistiken für Icecast2 bauen könnte. Gesagt, getan und hier meine Schritt für Schritt Anleitung, die auch auf der tollen Arbeit von Peter beruht.

Das fertige Produkt sollte dann z. B. so aussehen:

Voraussetzung für die Anleitung ist, dass ihr den Adminzugang zu Icecast2 habt und dieser die verbundenen Clients über alle Mounts anzeigen kann. Ohne Adminzugang oder mit komplett verkonfiguriertem Icecast2 wird es nicht möglich sein, auf diese Weise Echtzeitstatistiken zu erstellen.

Installation des Frameworks

InfluxDB

InfluxDB ist eine Zeitreihendatenbank, z.B. um 10:15 am 23.02.2020 ist die Zahl 10 eingetragen. Grafana kann nun diese Zeitreihen auslesen und in einem Graph anzeigen. Das ist der Grundprinzip. Für das gesamte Konstrukt benötigen wir folgende Software auf unserem Linux-Server (ich gehe hier von Debian 10 aus):

  • nginx
  • InfluxDB
  • Grafana
  • Telegraf
  • Chronograf

Auf die nginx Installation werde ich im folgenden nicht groß eingehen. Hier ist es unerheblich, ob Distro Repo oder offizielles Repo. Beginnen wir mit der Installation InfluxDB:

wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/os-release
echo "deb https://repos.influxdata.com/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update && sudo apt-get install influxdb

Damit InfluxDB nach außen nicht erreichbar ist, unter /etc/influxdb/influxdb.conf folgenden Eintrag setzen:

  • ganz am Anfang bind-address = „127.0.0.1:8086“ auskommentieren
  • in der Sektion http bind-address ebenfalls auskommentieren und 127.0.0.1 voranstellen beim Port
  • in dieser Sektion ebenfalls auth-enabled = false auskommentieren

Nun influxdb mit service influxdb restart neustarten.

Mithilfe der letzten Zeile kann man sich direkt ohne Authentifizierung verbinden. Daher unbedingt localhost arbeiten!

Chronograf

Chronograf ist die Web-Verwaltungsoberfläche für InfluxDB. Wenn ihr das Repo von InfluxDB eingebunden habt, ist die Installation ganz einfach:


apt-get install chronograf

Nach der Installation ruft euren hostname:8888 auf und klickt euch durch die Kurzeinrichtung (default Werte sollten passen). Danach unbedingt via iptables oder ufw den Zugriff auf diesen Port abschalten.

Es muss zwar irgendwie möglich sein, dass man Chronograf nur localhost lauschen lassen kann, aber das habe ich bisher noch nicht herausgefunden, daher unbedingt den Port 8888 über die Firewall blockieren! Tipps gerne willkommen.

Telegraf

Mittels Telegraf werden über Konnectoren von außen Daten nach InfluxDB geschrieben. Man könnte also sagen, dass Telegraf die Datenschnittstelle ist, mit der alles nach InfluxDB übersetzt wird. Hier müssen wir später das Go-Plugin einbinden, das uns die Werte vom Icecast2 holt.

Wenn ihr das Repo von InfluxDB eingebunden habt, ist die Installation ganz einfach:


apt-get install telegraf

Nach der Installation muss man hier nichts weiter machen, dafür aber dann unten in der Konfiguration.

Grafana

Zu guter letzt benötigen wir noch Grafana als Plotter. Die Installation ist sehr einfach:


sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

# Alternatively you can add the beta repository, see in the table above
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"

sudo apt-get update
sudo apt-get install grafana
/bin/systemctl start grafana-server
service grafana-server start

Danach müssen wir in die /etc/grafana/grafana.ini und ein paar Werte anpassen:

  • app_mode = production
  • http_addr = 127.0.0.1
  • domain = nginx server_name
  • enforce_domain = true
  • root_url = https://nginx server_name/
  • Unter [auth.anonymous] auth.enabled = false
  • org_name = Euer Sender

Danach den Service neustarten.

Konfiguration

Nun ist das Basis-Framework installiert und wir können alles konfigurieren und zusammenführen.

nginx Vhosts

Zuerst richten wir die VHosts für nginx ein. Beachtet hier bitte, dass ihr beim chronograf Eintrag (influx.) nur die IP-Adressen freigebt, die diese Oberfläche verwenden sollen (ipaddress/32)!


upstream grafana {
server localhost:3000;
keepalive 15;
}

upstream influx {
server localhost:8888;
keepalive 10;
}

upstream influxdb {
server localhost:8086;
keepalive 10;
}

server {
        listen 80;
        listen [::]:80;
        server_name influx.server;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name influx.server;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        ssl_certificate /etc/letsencrypt/live/server/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/server/privkey.pem;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

        satisfy any;
        allow ipaddress/32;
        deny all;

        location / {

                        proxy_pass http://influx/;
                        proxy_redirect default;
                        proxy_set_header   Host                  $host;
                        proxy_set_header   X-Real-IP            $remote_addr;
                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
}

server {
        listen 80;
        listen [::]:80;
        server_name graph.server;
        return 301 https://$server_name$request_uri;
}
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name graph.server;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
        ssl_certificate /etc/letsencrypt/live/graph.server/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/graph.server/privkey.pem;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

        location / {

                        proxy_pass http://grafana/;
                        proxy_redirect default;
                        proxy_set_header   Host                  $host;
                        proxy_set_header   X-Real-IP            $remote_addr;
                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
}

Go Plugin kompilieren

Damit wir die Daten aus Icecast2 herausbekommen und in ein Format umwandeln können, mit dem InfluxDB arbeiten kann, gibt es ein Open Source Plugin. Dieses müssen wir aber zuerst noch kompilieren. Dazu installieren wir die Sprache Go samt Compiler und holen uns via Git das Telegraf Plugin


apt install golang-go

git clone https://dev.sigpipe.me/dashie/telegraf-plugins.git
cd telegraf-plugins/icecast2_listeners/

Bevor wir das Plugin kompilieren, lohnt es sich mit nano oder vim das Plugin icecast2_listeners.go genauer anzusehen. Dort sind unter func main() { die Standardzugangsdaten eingetragen. Man kann später als Befehlsparameter auch Zugangsdaten zum Icecast-Server mitgeben, aber wenn man verschiedene IP-Adressen etc. hat, lohnt es sich evtl. verschiedene Go-Plugins zu erstellen – vor allem beim Hostname. Das erleichtert später die Zusammenstellung der Graphen – gerade wenn mehrere Icecast2 Server die gleichen Mounts haben. Nach dem Editieren nun das Plugin kompilieren:


go build icecast2_listeners.go

Damit ist das Plugin im gleichen Ordner kompiliert (ohne .go). Das fertige Plugin speichere ich unter /opt/telegraf/plugins/icecast/.

Telegraf

Nun tragen wir im Telegraf die Go-Plugin Schnittstelle ein. Unter /etc/telegraf/telegraf.conf die Stelle inputs.exec suchen und dort wie folgt pro Streaming-Server (nicht Mountpoint!) eintragen:


[[inputs.exec]]
commands = [
"/opt/telegraf/plugins/icecast/icecast2_listeners -addr live.server.net -pass test123 -port 8000",
"/opt/telegraf/plugins/icecast/icecast2_listeners_andererserver -addr test.server.net -pass test123 -port 8010"
]
timeout = "5s"
data_format = "influx"

Danach Telegraf neustarten. Wenn ihr nun unter influx.euerhostname einmal in das Webinterface schaut, dann könnt ihr euch unter Explore die Datenbankverbindung zusammenklicken und somit testen, ob Daten ankommen. Wichtig: hier seht ihr nur die Icecast Server, die ihr direkt vor dem Kompilieren des Go Plugins eingetragen habt. Sonst läuft alles über localhost.

Per default werden alle Daten über inputs.exec in die telegraf Datenbank von InfluxDB geschrieben. Es ist möglich, diese in eine eigene Datenbank schreiben zu lassen, allerdings erlaubt Telegraf nur global eine Datenbankverbindung, d.h. es macht keinen Unterschied, ob Telegraf nun alle Werte, die reinkommen, in die Datenbank telegraf oder icecast schreibt. Wie ihr am Screenshot seht, schreibt Telegraf automatisch cpu, memory und andere Systemvariablen zusätzlich mit.

Grafana

Nach der Installation von Grafana und der Konfiguration des Vhosts in nginx einfach die URL aufrufen. Der Standardzugang beim ersten Start ist: admin / admin. Danach wird man gleich aufgefordert, das Passwort zu ändern. Abschließend die Organisation unter Einstellungen und die eigene Mail-Adresse im Admin Account setzen für eine Recovery.

Nun müssen wir die Data-Source in Grafana hinzufügen, was hier InfluxDB ist. Wenn ihr hier Zugangsdaten vergeben habt, bitte jeweils setzen:

Wenn das mit Save & Test klappt, können wir ein neues Dashboard erstellen und dort bereits den ersten Graphen. Die Abfrage aus der Telegraf.autogen Datenbank ist sehr einfach und folgt immer demselben Schema:

Für die bessere Übersichtlichkeit der Graphen mit mehreren Mountpoints lohnen sich folgende Einstellungen in den Graphensettings:

Nun solltet ihr oben bereits Hörerdaten sehen und in diesem Sinne viel Spaß!


Du möchtest regelmäßig Neuigkeiten von meinem Blog? Trag dich für meinen Newsletter ein:

Leave A Reply

Your email address will not be published.