Um die Hardware von Sun / Oracle Sparc Servern zu überwachen kann das Solaris - Tool prtdiag verwenden. Diese Abfrage für Monitoring zu automatisieren kann mit dem Nagios Plugin check_prtdiag erreicht werden. Bei jedem Aufruf des Plugins durch einen Nagios Server wird prstat aufgerufen und der Output nach Diagnoseinformationen durchsucht. Dabei verwendet check_prtdiag ein Konfigurationsfile, in dem (z.T. mit Perl Regex) angegeben wird, wonach gesucht werden soll und welcher Wert angibt, ob die Komponente ok ist oder ein Problem hat.
Da der Output von prtdiag leider von Maschine zu Maschine sehr unterschiedlich ist, sind oft Nacharbeiten am Konfig File nötig, da nur ein paar (relativ alte) Beispielkonfigurationen enthalten sind.
Folgende Erweiterungen sind nötig, um auch die neueren T5120, M4000 un M5000 zu überwachen. Wobei ich bisher leider nur den Zustand des verbauten Rams in den M series mit aufnehmen konnte. Mehr gibt prtdiag dort nicht her.
[T5120]
system.match = ^System Configuration:.*Enterprise T5120
system.checks = CPU,Fans,Temperatures,Current,Voltages,Leds,FRU
checks.CPU.description = CPU status
checks.CPU.begin_match = ^=+ Virtual CPUs =
checks.CPU.end_match = ^=
checks.Fans.skip_match = ^CPU
checks.CPU.data_match = ^\s*(\d+)\s+(\d+)\s+MHz\s+(\S+)\s+(\S+)$
checks.CPU.data_labels = CPU,Frequency,Implementation,Status
checks.CPU.ok_condition = "%Status%" eq "on-line"
checks.CPU.output_string = CPU%CPU% status is '%Status%'
checks.Fans.description = fans status
checks.Fans.begin_match = ^Fan sensors:
checks.Fans.end_match = :$
checks.Fans.skip_match = ^Location
checks.Fans.data_match = ^(\S+)\s+(\S+)\s+(\S+)
checks.Fans.data_labels = Location,Sensor,Status
checks.Fans.ok_condition = "%Status%" eq "ok"
checks.Fans.output_string = Fan '%Location%/%Sensor%' status is '%Status%'
checks.Leds.description = system leds status
checks.Leds.begin_match = ^LEDs:
checks.Leds.end_match = :$
checks.Leds.data_match = ^(\S+)\s+(?:SERVICE)\s+(\S+)
checks.Leds.data_labels = Location,State
checks.Leds.ok_condition = "%State%" eq "off"
checks.Leds.output_string = Service indicator '%Location%' state is '%State%'
checks.Temperatures.description = temperature sensors
checks.Temperatures.begin_match = ^Temperature sensors:
checks.Temperatures.end_match = :$
checks.Temperatures.skip_match = ^Location
checks.Temperatures.data_match = ^(\S+)\s+(\S+).*?(\S+)$
checks.Temperatures.data_labels = Location,Sensor,Status
checks.Temperatures.ok_condition = ( "%Status%" eq "ok" )
checks.Temperatures.output_string = Temperature sensor '%Location%/%Sensor%' status is '%Status%'
checks.Voltages.description = voltage sensors
checks.Voltages.begin_match = ^Voltage sensors:
checks.Voltages.end_match = :$
checks.Voltages.skip_match = ^Location
checks.Voltages.data_match = ^(\S+)\s+(\S+).*?(\S+)$
checks.Voltages.data_labels = Location,Sensor,Status
checks.Voltages.ok_condition = "%Status%" eq "ok"
checks.Voltages.output_string = Voltage sensor '%Location%/%Sensor%' status is '%Status%'
checks.Current.description = current sensors # output to nagios, choose freely
checks.Current.begin_match = ^Voltage indicators: # matched with heading of prtdiag output section
checks.Current.end_match = :$ # first line of next section
checks.Current.skip_match = ^Location # lines starting with this will not get parsed for data
checks.Current.data_match = ^(\S+)\s+(\S+)\s+(\S+) # regex to split data into tokens
checks.Current.data_labels = Location,Sensor,Status # names of tokens (NOT heading in prtdiag - can be chosen freely, must match output-string and ok_condition"
checks.Current.ok_condition = "%Status%" eq "ok" # output of prtdiag, that means "ok"
checks.Current.output_string = Current sensor '%Location%/%Sensor%' status is '%Status%' # output string to nagios
checks.FRU.description = FRU operational status
checks.FRU.begin_match = ^=* FRU Status =
checks.FRU.end_match = ^$
checks.FRU.skip_match = ^Location
checks.FRU.data_match = ^(\S+)\s+(\S+)\s+(\S+)
checks.FRU.data_labels = Location,Name,Status
checks.FRU.ok_condition = "%Status%" =~ m/present|ok|enabled/
checks.FRU.output_string = FRU '%Location%' status is '%Status%'
[M4000]
system.match = ^System Configuration:.*Enterprise M4000 Server
system.checks = Memory
checks.Memory.description = Memory operational status
checks.Memory.begin_match = ^=+ Memory Configuration =
checks.Memory.end_match = ^=
checks.Memory.skip_match = ^\s*(Memory|LSB)
checks.Memory.data_match = ^\s*\d+\s+(\S+)\s+\d+\S+\s+(\S+).*
checks.Memory.data_labels = Location,Status
checks.Memory.ok_condition = "%Status%" eq "okay"
checks.Memory.output_string = Memory Group '%Location%' status is '%Status%'
[M5000]
system.match = ^System Configuration:.*Enterprise M5000 Server
system.checks = Memory
checks.Memory.description = Memory operational status
checks.Memory.begin_match = ^=+ Memory Configuration =
checks.Memory.end_match = ^=
checks.Memory.skip_match = ^\s*(Memory|LSB)
checks.Memory.data_match = ^\s*\d+\s+(\S+)\s+\d+\S+\s+(\S+).*
checks.Memory.data_labels = Location,Status
checks.Memory.ok_condition = "%Status%" eq "okay"
checks.Memory.output_string = Memory Group '%Location%' status is '%Status%'
Und hier eine kurze Anleitung zum Selbstanlegen dieser Regeln (da meine Kommentare im Code etwas kurz ausgefallen sind. :-) )
In [ ] wird ein Name für das System vergeben - hauptsächlich, um selbst zu wissen, auf welchen Host sich die Checks beziehen.
system.match enthält ein Regex nach dem im prtdiag Output gesucht wird, das die Maschinenklasse eindeutig identifizieren kann.
system.checks sind frei zu vergebende Aliases für Checks, die man durchführen lassen möchte. Im folgenden verwende ich hierfür [checkname]
checks.[checkname].description wird von an Nagios als Checkname zurückgegeben. Kann also auch selbst gewählt sein und dient nur zum Identifizieren des Checks im Nagios webinterface.
checks.[checkname].begin_match enthält ein Regex, das auf die Zeile passt, die die Sektion im prtdiag Output einleitet, die durchsucht werden soll.
checks.[checkname].end_match gibt ein Regex für die erste Zeile der nächsten Sektion an (eigentlich das Ende der Sektion, die erste Zeile der nächsten Sektion funktioniert aber weit besser)
checks.[checkname].skip_match gibt ein Regex für Zeilen innerhalb der Sektion an, die nicht geparsed werden sollen. ( e.g. Überschriften )
checks.[checkname].data_match ist die wahrscheinlich aufwändigste Zeile. Hier wird angegeben, wie die interessanten Werte innerhalb des Outputs gefunden werden können. Mit Hilfe des Regex wird jede Zeile innerhalb der Sektion geparsed. Die Werte in ( ) werden als Output verwendet.
checks.[checkname].data_labels = Hier werden die oben genannten Werte ( von s.[checkname].data_match in ( ) ) zur weiteren Verwendung benannt, wobei die Reihenfolge der Werte wichtig ist. Der erste Wert in ( ) wird nach dem ersten Label dieser Option benannt usw. .
checks.[checkname].ok_condition gibt an, welches Label ( s.o. checks.[checkname].data_labels) welchen Wert haben muss, damit der Check als ok gilt. Hier werden wieder Regex erwartet.
checks.[checkname].output_string schliesslich gibt wieder an, wie die einzelnen Checks in Nagios angezeigt werden.
Wer wie ich, bei Perl Regex, ein paar Auffrischungen benötigt, kann z.B. bei Steve Litt nachschlagen.
check_prtdiag ist übrigens nicht sehr gesprächig, wenn Fehler in diesem Konfigurationsfile vorliegen, was Sinn macht, da der gesamte Output ja an Nagios übermittelt würde, würde man nicht zuvor durch lokales Ausführen des Plugins via Shell testen ( was *immer* zu empfehlen ist, bevor man neue Plugins in Nagios einbindet). Insbesondere checks.[checkname].begin_match und checks.[checkname].end_match verhindern bei Fehlern einfach, dass der Check in check_prtdiag überhaupt ausgeführt wird. Beim Schreiben neuer Konfig zahlt es sich also aus, nur den Check in system.checks zu belassen, an dem man gerade arbeitet. Erhält man nur die Meldung, dass keine Checks definiert wurden, findet sich höchstwahrscheinlich ein Fehler im Check.
Kommentare
check_prtdiag für T5120
Super, genau das habe ich gesucht, vielen Dank !
Neuen Kommentar schreiben