HZW Monitoring

From hzw wiki
Jump to navigation Jump to search
Schematische Darstellung des Monitorings

Dieser Artikel ist WORK IN PROGRESS


In der HZW Umgebung läuft auf den Linux VMs der Telegraf Service.

Dieser sammelt Informationen wie CPU Load, Plattennutzung etc. ein und schreibt sie in eine auf der vm_grafana gehostete InfluxDB.


Diese InfluxDB wird als Datenquelle an Grafana angeschlossen, einer Datenvisualisierungsplattform.

Unser Grafana ist unter https://grafana.hackzenwerk.org gehostet.




Informationen Grafana einsehen

In Grafana werden Informationen in Boards abgebildet, welche mehrere Dinge in einer übersicht zusammenfassen.

Wählt nach dem Login auf der linken Seite Dashboards > Manage aus um eine Liste der verfügbaren Boards anzuzeigen.

In dem Board Telegraf - system metrics sind die Metriken der virtuellen Maschinen zu finden.

Grafana1.png


In diesem Board könnt Ihr in der Kopfzeile den Server auswählen, zu dem Ihr Statistiken einsehen wollt.

Wählt oben Rechts einen Zeitrahmen aus, zu dem Ihr informationen haben wollt.


Grafana2.png

Telegraf Konfiguration

Die Konfiguration von Telegraf, also die Einstellungen was wie eingesammelt werden soll, geschieht unter /etc/telegraf/telegraf.conf

Ich werde hier in dem Artikel nicht alle Settings dieser Konfig durchgehen, dafür ist die offizielle Dokumentation da.

Allerdings kann ich ein paar exemplarische Beispiele geben.


Die im oberen Screenshot zu sehenden CPU Statistiken liegen folgender Config zugrunde.

[[inputs.cpu]]
 percpu = true
   totalcpu = true
   collect_cpu_time = false
   report_active = false

Das die Daten in der InfluxDB laden wird durch folgende config erreicht.

[[outputs.influxdb] 
 database = "telegraf"
 urls = [ "http://IP:PORT" ]
 username = "USERNAME"
 password = "PASSWORD"

Welche Plugins input / output Plugins es gibt findet ihr hier.


Wie die Daten in der InfluxDB aussehen

Daten werden in folgendem Format in der InfluxDB Datenbank abgelegt

[Messung] [Key=Value] [Timestamp]

Ihr könnt euch mit telegraf --test auf einer der VMs eine liste der eingesammelten Werte anzeigen lassen.

Das macht das ganze etwas verständlicher.

ori@vm_bigblue:~$ telegraf --test | grep mem

mem,host=big blue active=3638714368i,available=30378135552i,available_percent=90.04302594049359,buffered=165367808i,cached=1566494720i,commit_limit=16868675584i,committed_as=7673380864i,dirty=1486848i,free=29079941120i,high_free=0i,high_total=0i,huge_page_size=2097152i,huge_pages_free=0i,huge_pages_total=0i,inactive=711901184i,low_free=0i,low_total=0i,mapped=360079360i,page_tables=24858624i,shared=39677952i,slab=171921408i,sreclaimable=130408448i,sunreclaim=41512960i,swap_cached=0i,swap_free=0i,swap_total=0i,total=33737355264i,used=2925551616i,used_percent=8.671549957331,vmalloc_chunk=0i,vmalloc_total=35184372087808i,vmalloc_used=0i,wired=0i,write_back=0i,write_back_tmp=0i 1590593128000000000

Zerlegen wir das mal in seine Teile.

Alles bis zum ersten Blankspace ist die Messung.

mem,host=big blue

Alles weitere bis zum nächsten Blankspace sind Kommaseparierte Key=Value Pairs.

active=3638714368i,available=30378135552i,available_percent=90.04302594049359,buffered=165367808i,cached=1566494720i,commit_limit=16868675584i,committed_as=7673380864i,dirty=1486848i,free=29079941120i,high_free=0i,high_total=0i,huge_page_size=2097152i,huge_pages_free=0i,huge_pages_total=0i,inactive=711901184i,low_free=0i,low_total=0i,mapped=360079360i,page_tables=24858624i,shared=39677952i,slab=171921408i,sreclaimable=130408448i,sunreclaim=41512960i,swap_cached=0i,swap_free=0i,swap_total=0i,total=33737355264i,used=2925551616i,used_percent=8.671549957331,vmalloc_chunk=0i,vmalloc_total=35184372087808i,vmalloc_used=0i,wired=0i,write_back=0i,write_back_tmp=0i

Und ganz am Ende kommt ein epoch Zeitstempel (Millisekunden seit dem 01.01.1970)

1590593128000000000

Siehe auch meinen Blogartikel Daten per InfluxDB in Grafana abbilden.

In Grafana sieht das ganze dann so aus.

Grafana3.png


Wie kommen wir jetzt von den Rohdaten in der Datenbank zu dieser ansicht? --> Wir bauen eine Query.

Eine Query Bauen

Um eine eigene Query zu bauen, klickt zunächst in einem Board oben rechts auf Add panel und dann auf Add Query.

Grafana4.png


Ihr könnt auch eine bestehende Query verändern (edit), oder sie kopieren und dann verändern (duplicate).

Grafana5.png


Der Obere Teil der Ansicht des Query Editors ist eine Echtzeitanzeige eurer Query.

Wenn Ihr etwas verändert, wird es dort direkt angezeigt.

Alle Änderungen nehmt ihr in der unteren Hälfte vor.

Die Datenquelle der Query wird bei Query eingestellt, in unserem Fall die InfluxDB.


Schauen wir uns jetzt die Memory Messung aus dem Oberen Beispiel nochmal an.

Ein einzelner Datenpunkt in der Datenbank sieht folgendermaßen aus.

mem,host=big blue active=3638714368i,available=30378135552i,available_percent=90.04302594049359,buffered=165367808i,cached=1566494720i,commit_limit=16868675584i,committed_as=7673380864i,dirty=1486848i,free=29079941120i,high_free=0i,high_total=0i,huge_page_size=2097152i,huge_pages_free=0i,huge_pages_total=0i,inactive=711901184i,low_free=0i,low_total=0i,mapped=360079360i,page_tables=24858624i,shared=39677952i,slab=171921408i,sreclaimable=130408448i,sunreclaim=41512960i,swap_cached=0i,swap_free=0i,swap_total=0i,total=33737355264i,used=2925551616i,used_percent=8.671549957331,vmalloc_chunk=0i,vmalloc_total=35184372087808i,vmalloc_used=0i,wired=0i,write_back=0i,write_back_tmp=0i 1590593128000000000

Die Query die wir also schreiben holt sich daten aus der [Messung] mem.

SELECT [...] FROM "mem"

Die Daten die wir haben wollen sind "total" und "used". Die Funktion mean() gibt uns den durchschnittlichen Wert (Value) des Keys "total" zurück.

total=33737355264

"Durchschnittlicher Wert" ist hier abhängig von dem aktuellen Zeitabschnitt, den Ihr euch anseht.

Wenn Ihr die Statistiken von zwei Jahren betrachtet, werden einzelne kurze Peaks von ein Paar Minuten über diese Funktion rausgerechnet.


Grafana6.png


Nun woher weiss nun aber Grafana, worum es sich bei dem ausgelesenen Wert 33737355264 handelt?

Garnicht. Wir müssen selbst defnieren, was das ist.

Dazu wechseln wir neben der Query auf den nächsten Punkt.

Grafana7.png

Hier könnt zum einen definieren, wie die Query aussehen soll (fancy) und welche Achsbeschriftung ihr haben wollt.

Was wir messen sind in diesem Fall Bytes.

Komfortablerweise rechnet Grafana die 33737355264 Bytes direkt in 32.59 GiB um.

Und damit uns nicht wie in einem Screenshot weiter oben so viele Nachkommastellen angezeigt werden, habe ich Decimals auf 2 reduziert.


Zuletzt könnt Ihr den Titel der Query In dem Dritten Punkt General anpassen.


Grafana8.png


Der unterste Punkt, der mit der Glocke ist für das Alerting relevant.

Alarme Definieren

Grafana ist in der Lage Alarm zu schlagen, wenn bestimmte Werte einen vorher definierten Schwellwert überschreiten.

Hierzu muss zunächst definiert werden, wer im Falle eines Alarms wie benachrichtigt wird.

Geht dazu links auf Alerting > Notification channels und definiert einen Notifikationskanal.

Dort können (kommaspariert) Mail Adressen hinterlegt werden.

Grafana9.png


So nun haben wir definiert, wer wie oft kontaktiert wird, aber noch nicht das wichtigste... wann?

Schauen wir uns also mal das Monitoring an, mit dem der Speicherplatzverbrauch der Root Pratition (/) auf unserem Hypervisor überwacht wird.

Beachtet, dass es Query B ist, welche used abfragt.

Grafana11.png


Gehen wir jetzt links auf den Alerting Berech der Query und schauen uns ein Paar dinge genauer an.

Die Regel besagt, dass jede Minute eine Überprüfung passieren soll. (Evalueate every 1m)

Das For 5m besagt, dass bei eines auslösens des Alarms der Status erstmal von OK auf PENDING wechselt.

Erst wenn er für 5 Minuten Alarm geschlagen hat, soll wirklich ein alarm ausgelöst werden.


Schauen wir uns nun den Tatsächlichen Alarm an.

Definiert ist, dass der Durchschnittliche Wert (avg = average) der Query B (siehe oben) der letzten 5 Minuten (5m, now) nicht über 126509556005 liegen darf.

Es gibt einen Schieberegler in der Interaktiven Ansicht, mit dem dieser Wert in Echtzeit verändert werden kann.

Grafana10.png

Beachtet das Grüne Herz in dem Titel der Query.

Dieses sagt, dass ein Alarm für diese Query definiert ist, welcher noch nicht ausgelöst wurde.

In dem unteren Teil kann man dann noch angeben, welche Notification channels im Falle eines Alarms kontaktiert werden und, ob eine besondere Nachricht enthalten sein soll.


Alarme testen

Ich erzeuge mal mit dd ein bisschen Daten und zeige euch, wie so ein Alarm aussieht.


Grafana12.png

Zunächst wird das Herz orange, wenn der Alert auf PENDING ist.

Unter Alerting > Alert Rules kann man das auch nochmal prüfen.

Grafana13.png


Nachdem der PENDING State dann durch ist, wird in den ALERTING State gewechselt.

Grafana14.png


Und kurze Zeit Später habe ich eine Mail im Postfach.

Grafana15.png


Wenn ich die Datei dann wieder lösche, gibt es auch Prompt eine Gutmeldung per Mail.

Beachtet die Roten, Gelben und Grünen Markiereungen in dem Graf.

Grafana16.png


Prometheus

Prometheus.

https://prometheus.io/docs/alerting/configuration/

https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/

https://prometheus.io/docs/operating/integrations/