Grafana

Aus Wiki CCC Göttingen
Version vom 10. Januar 2017, 20:09 Uhr von Kjo (Diskussion | Beiträge) (→‎Aktuell erfasste Werte)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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

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