UPDATE: 02.02.2014 – Anpassung an aktuellen Stand der Dinge.
So, ausgehend von Teil 1 gehts nun weiter mit der Entwicklung eines check_mk Plugins, am Beispiel eines MySQL check.
Wenn in Teil 1 nun alles geklappt hat, liefert uns der Agent des Servers nun die Sektion mysql_status mit aus. Dies lässt sich einfach mit cmk -d Hostname prüfen. Die Ausgabe sollte nun einen Abschnitt ähnlich diesem:
<<<mysql_status>>> Aborted_clients 246 Aborted_connects 69 Binlog_cache_disk_use 0 Binlog_cache_use 0 ...
enthalten. Ist das der Fall, sind wir nun fertig für Schritt zwei. Pfadangaben die nun folgen, gehen von einer Installation mit OMD aus. Solltest du OMD (Open Monitoring Distribution) noch nicht kennen, schau sie dir unbedingt mal an. Einen einfachen Weg, ein perfekt konfiguriertes Nagios/ Icinga inklusive verschiedener Plugins und Guis aufzusetzen, gibt es nicht. Also los: Wir legen nun unter ~/local/share/check_mk/checks/ das eigentliche check Skript mit dem Namen mysql_status an. Hier ist nun Python nötig.
Ein normaler Agent basierender Check besteht primär aus zwei Funktionen. Zum einen aus einer Inventory Funktion zum anderen aus der Check Funktion. Beginnen wir mit der Inventory Funktion:
mysql_status_dl = ( 20, 30 ) mysq_status_inventory = [ ] def inventory_mysql_status(info): inv = [] for line in info: if line[0] in mysq_status_inventory: inv.append((line[0],'mysql_status_dl')) return inv
Der Name der Funktion sollte immer inventory_check_name entsprechen. Übergeben wird ein Wert: Die sogenannte info . Diese enthält eine Liste bestehen aller Zeilen unserer Agenten Sektion. Praktischerweise sind die Zeilen auch gleich an den Leerzeichen/ Tabs gesplittet. An diesem Beispiel seht ihr was ich meine:
[ ['Aborted_clients', '246'], ['Aborted_connects', '69'], ['Binlog_cache_disk_use', '0'], ['Binlog_cache_use', '0'] ... ]
Und damit können wir jetzt arbeiten. Gerade bei der Ausgabe des SHOW STATUS; querys gibt es nun ziemlich viele Werte die uns gar nicht interessieren. Und jeder hat natürlich andere Interessen. Somit sollte es für jeden konfigurierbar sein, welche Werte er überwachen will. Hier kommt nun die Variable mysq_status_inventory ins Spiel. Diese ist am Anfang des Checkes einmal leer definiert:
mysq_status_inventory = []
Sollen nun bestimmte Variablen Inventurisiert werden, passen wir aber nicht die Liste im Check an, sondern überschreiben diese in der main.mk (Eine Beschreibung für WATO folgt)
#Beispiel Config main.mk mysq_status_inventory = [ "Aborted_clients", "Created_tmp_files", ]
Weiter nun in der Inventory Funktion. Nach der Definition legen wir uns zuerst eine leere Liste als Hilfsvariable an. Wir nennen sie inv, da wir in ihr später alle Übereinstimmungen ablegen.
for line in info:
Wir beginnen nun jeden Wert, der uns vom Agent geliefert wird, zu durchlaufen.
if line[0] in mysq_status_inventory:
Und für jeden Wert müssen wir natürlich auch schon gleich nachsehen, ob eine Inventur gewünscht wird. Wenn ja:
inv.append((line[0],'mysql_status_dl'))
In line[0] steht nun der Name der SQL Variable, so wie wir ihn auch in unserer mysq_status_inventory liste vermerkt haben und als Schwellwerte werden die Default Levels übergeben.
Die Default Level Variable ist auch im Kopf des Checks festgelegt. Aber auch diese ändern wir nicht mehr im Check, sondern Überschreiben sie in der main.mk.
Durch iventory.append((item,(params)) können wir nun Item und Parameter in check_mk Form zusammenstellen. Aber erst mal landet es natürlich in der Liste inv. Ist die for Schleife durch info durch, geben wir nun unsere Liste im inv endgültig zurück an check_mk.
bei einem check_mk -I Rechnername werden nun alle unsere Werte gefunden und in die Autochecks aufgenommen. Was bedeutet, jetzt sind sie im Monitoring. Nun können wir zur check Funktion weiter. Aber das dann erst in Teil 3.
Hi, erst mal danke für dein feines Tutorial!
Als Python Laie versuche ich da gerade durchzusteigen und habe ein paar Schwierigkeiten mit den Einrückungen. Unter Python soll das ja wichtig sein:)
Müsste es nicht so aussehen?
1 #!/usr/bin/python
2 mssql_counter_vars = []
3 def inventory_mssql_counter(checkname, info):
4 inventory = []
5 for line in info:
6 for status_var,warn,crit in mssql_counter_vars:
7 if status_var == line[0]:
8 inventory.append((status_var,(warn,crit)))
9 break
10 return inventory
soviel zum Thema Einrückungen :-)
Jedenfalls wollte ich damit sagen das, dass ganze einen Laien erst mal verwirrt :)
Ja, hast recht :) Einrücken absolut wichtig. Aber das macht man beim Programmieren doch eh :)
Hallo,
eine Frage habe ich dazu.
Wie kommt die Liste aus main.mk in dieses Script??
Ich sehe nirgends ein Import oder so ähnlich.
Weiter habe ich das mal versucht mit dem vorhandenen Plugin “apache_status” nachzubauen.
Leider ohne Erfolg. Habe aus der Datei
/usr/share/check_mk/checks/apache_status
die Einträge unter apache_status_fields = {…..} entfernt so das nur noch
apache_status_fields = {}
dort steht. In der main.mk habe ich dann folgendes hinzu gefügt
apache_status_fields = {
# key sort convert-func
‘Uptime’: (0, int),
‘OpenSlots’: (7, int),
‘TotalSlots’: (8, int),
}
Wie gesagt, leider ohne Erfolg. Geht das nur mit Listen??
Würde mich über eine Antwort freuen.
Gruß
Andi
Hallo,
zum Zeitpunkt der Inventur ist die Liste als globale Variable der Inventurfunktion bekannt (Achtung, nicht der Check Funktion später).
Funktioniert mit jedem Python Datentyp.
Erstmal vielen Dank für die schnelle Antwort.
Also bei mir klappt das so leider nicht.
Aber es wird wohl daran liegen, dass das ja ein Check ist der nur eine Ausgabe hat.
Ich wollte eben mal schauen, ob man die Ausgabe verkleinern kann. Habe es eben nochmal versucht wie oben beschrieben und diesmal findet er den Check gar nicht erst.
Na mal schauen, versuch macht ja klug.
Schönen Abend noch.