Grafana
Grafana + InfluxDB
Im Gegensatz zu dem ELK Stack ist die Kombination von Grafana und InfluxDB sehr viel leichtgewichtiger und fühlt sich auch geschmeidiger an.
Grafana ist zu erreichen unter https://sonic.cccgoe.de/
Logbuch
Installation
- add deb https://packagecloud.io/grafana/stable/debian/ wheezy main to /etc/apt/sources.list
- apt-get install -y apt-transport-https
- curl https://packagecloud.io/gpg.key | apt-key add -
- apt-get update
- apt-get install grafana
- wget http://influxdb.s3.amazonaws.com/influxdb_0.9.5.1_amd64.deb
- dpkg -i influxdb_0.9.5.1_amd64.deb
- service influxdb start
- service grafana-server start
Konfiguration
- Auf der Grafanaoberfläche einloggen, Port 3000, user:admin, pw: admin
- Admin pw ändern
- mit 'influx' die influxDB Konsole öffnen
- DB anlegen
- admin anlegen, user anlegen, pw festlegen
- /etc/influxdb/influxdb.conf editieren
- unter http auth-enable auf true setzen
- service influxDB restart
- im Grafana die influxDB als datasource anlegen
- die Clients mir write only in die influxDB schreiben lassen
- Dashboads im Grafana erstellen
Add Data
Super easy to add data with python:
from influxdb import InfluxDBClient def main(): host = '37.120.160.199' port = 8086 user = 'client' password = ********* dbname = 'ffgoe' json_body = [ { "measurement": "test", "tags": { "host": "vpnTest" }, "fields": { "value": 7. } } ] client = InfluxDBClient(host, port, user, password, dbname) client.write_points(json_body)
clients
apt-get install python-pip pip install influxdb
edit ffgoevis, den hostnamen anpassen
cp ffgoevis /usr/local/bin/. crontab -e */5 * * * * /usr/local/bin/ffgoe_vis
TODO: ansible
Daten in die InfluxDB schieben
Auf den Supernodes liegen in
/usr/local/bin/
die Pythonscripte zum einpflegen der Daten. Das
send_to_influx
Script kann verwendet werden um Daten an die InfluxDB zu schicken.
send_to_influx -h
zeigt die flags.
Eine Beispielanwendung ist das Script
influx_traffic
Wenn der KEY == test ist, kann das Ergebnis im Grafana im TestBoard angesehen werden.
VALUE sollte ein numerischer Wert sein.
Als HOST den Namen des Supernodes angeben "VPN1-3".
Neuer Ansatz in bash
Ausgangspunkt war die Überlegung, dass es besser wäre, die Daten nicht einzeln an die Datenbank zu schicken und für jede neue Messung ein neues Python-Script anzulegen, sondern alle Daten zu sammeln und dann in einem Rutsch wegzuschicken. Außerdem gab es die Idee, die Daten zu cachen, falls keine Verbindung zur Influx-DB möglich ist.
line protocol
Das line protocol von InfluxDB eignet sich sehr gut dazu: „The line protocol is a text based format for writing points to InfluxDB. Each line defines a single point. Multiple lines must be separated by the newline character“ Das Format sieht so aus:
measurement[,tag=tagvalue] field=value [timestamp]
Mehrere tags und mehrere fields sind möglich, z. B.
traffic,host=VPN1,interface=eth0 KiB_recv=12345,KiB_sent=67890 1465063236
Wenn kein Zeitstempel angegeben wird, nimmt Influx die aktuelle Serverzeit. Welche Auflösung (s, ms, min...) der Zeitstempel hat, ist im Prinzip egal. Sie sollte natürlich überall gleich sein und muss bei der Übertragung an die Datenbank (siehe unten, Parameter 'precision') angegeben werden, sonst geht Influx von Nanosekunden aus. Da vnstat Sekunden verwendet, war das die einfachste Variante.
Ablauf
- Das Script liegt in /usr/local/bin/influx_collect.sh und wird alle 5 min ausgeführt.
- Die 'server'-Variable soll von Ansible auf den jeweils korrekten Wert gesetzt werden.
- Die Daten (siehe nächster Abschnitt) werden zuerst in eine Datei in /var/local/influx-client geschrieben. Anschließend wird versucht, die Datei mit curl an die InfluxDB zu schicken:
curl -i -XPOST 'http://example.com:8086/write?db=dbname&precision=s&u=username&p=password' --data-binary @$file
Wenn das erfolgreich war, wird die Datei gelöscht, ansonsten wird der Versuch beim nächsten Durchlauf des Scripts wiederholt.
Aktuell erfasste Werte
- CPU-Load (Durchschnitt der letzten 1, 5, 15 min) aus /proc/loadavg
cpu_loadavg,host=$server avg_1min=$value,avg_5min=$value,avg_15min=$value $zeitstempel
- Anzahl aktuell gültiger DHCP-Leases aus /var/lib/misc/dnsmasq.leases
dhcp_leases,host=$server value=$value $zeitstempel
- Anzahl der fastd-Verbindungen, wird vom Script /usr/local/bin/fastd_list geliefert
fastd_links,host=$server value=$value $zeitstempel
- Gesamt-Traffic des aktuellen Monats auf eth0 in MiB, Quelle: vnstat
traffic_month,host=$server MiB_recv=$value,MiB_sent=$value $zeitstempel
- Aktuelle Trafficcounter aller Interfaces, die von vnstat erfasst sind - eine Zeile pro Interface
traffic,host=$server,interface=$iface KiB_recv=$value,KiB_sent=$value $zeitstempel
- Ausschließlich auf VPN1 liegt ein Python-Script, das diverse Daten der einzelnen Nodes aus der nodes.json des Meshviewers ausliest und in 'nodestats' schreibt:
/usr/local/bin/influx_nodestats
Continuos Queries
Continuos queries bieten eine praktische Möglichkeit, Daten zu aggregieren. Sie werden einmal definiert und dann im angegebenen Zeitinterval von der Datenbank ausgeführt. Durch einen Bug im Influx-Webinterface zeigt 'SHOW CONTINUOUS QUERIES' aktuell kein Ergebnis an, die queries funktionieren aber trotzdem. Folgende CQs werden aktuell verwendet:
- Summe der aktuellen Client-Zahlen - statt über 700 Werten muss Grafana nur noch einen abfragen.
CREATE CONTINUOUS QUERY sum_clients ON ffgoe BEGIN SELECT sum(clients) INTO clients_online FROM nodestats GROUP BY time(5m) END