Archive for the ‘Nagios’ Category

h1

Debugging Nagios Plugins

9. Juni 2009

Heute war Debugging-Tag für die NetApp-Plugins für Nagios. Am meisten Probleme bereitete mir mein Ehrgeiz sie im ePN (Embedded Perlinterpreter for Nagios) laufen zu lassen. Bei einer Kundeninstallation wurden die Performancedaten nicht mehr verarbeitet, wenn das Script im ePN läuft – ein Fehler den ich bisher nicht nachvollziehen konnte, ich tippe hier auf eine fehlenden Kennzeichnung  (#nagios: -epn) im performance-Parser. Aber wer weiss …

Der andere Fehler waren einige Scripts, die sich im Nagios mit „Service check did not exit properly“ meldeten, während sie auf der Commandline problemlos liefen. Zunächst einmal drehte ich das Debugging im Nagios auf, indem ich in der nagios.cfg diese Werte setzte:

debug_level=16
debug_verbosity=1
debug_file=/usr/local/nagios/var/nagios.debug

Somit bekam ich dan schon alle Infos frei Haus geliefert, um die Fehler einzugrenzen. Z.B.
Embedded Perl failed to compile /usr/local/nagios/libexec/check_netapp_hardware.pl, compile error **ePN failed to compile /usr/local/nagios/libexec/check_netapp_hardware.pl: „Variable „$object“ will not stay shared at (eval 3969) line 240,“ at /usr/local/nagios/bin/p1.pl line 248.
– skipping plugin

Bei der Nachsicht in dem Plugin entdeckte ich, dass in einer Subroutine auf die mit my im Hauptprogramm definierte Variable (eben jene $object) zugegriffen wurde, was nicht 100%-ig sauber ist. Nach einer Änderung auf local our $object; lief das Plugin durch, bis zum nächsten Fehler, der dann sinngemäß gleich zu beheben war.

Anschliessend bekam ich dann noch die Meldung Check of service ‚CPU-Utilization‘ on host ’simbig‘ could not be performed due to a fork() error: ‚Cannot allocate memory‘! bzw. etwas ähnliches mit „too many open files“ was sich aber durch einen Neustart von Nagios beheben ließ.

Interessant auch, dass es schon ein Reihe von Wrapper-Scripts für Plugins gibt; die Folgenden habe ich gefunden aber sie für diese Debugging-Session dann gar nicht benötigt:

http://www.nagios.org/faqs/viewfaq.php?faq_id=379

http://www.waggy.at/nagios/capture_plugin.htm

h1

Nagios: Monitoring the lag-time of SnapMirrors on NetAppFiler

5. Mai 2009

I just finished a new version of check_netapp_snapmirror. You can use it to monitor the lag-time of several or all snap mirrors on a netapp-filer.

Some examples:

$ check_netapp_snapmirror.pl -H toaster -u nagios%pass
Checks the lag-time of all snampmirror-sources on toaster with the default-thresholds.

$ check_netapp_snapmirror.pl -H netapp11 -u nagios%pass -X netapp11:vol4
Checks the lag-time of all snapmirror-sources on netapp11 with the exception of vol4 using the default-thresholds.

$ check_netapp_snapmirror.pl -H netapp11 -u nagios%pass -X netapp11:vol2 -X netapp11:vol4 -w 120 -c 240
Checks the lag-time of all snapmirror-sources on netapp11 with the exception of vol2 and vol4 – thresholds are set to 120 and 240 sec.

$ check_netapp_snapmirror.pl -H toaster -u nagios%pass -l vo1 -e pair_state –ok_pairstate=snapmirrored –ok_pairstate=uninitialized –w_pairstate=source
Checks vol1, ok if state is either snapmirrored or uninitialized, warning if source.

$ check_netapp_snapmirror.pl -H toaster -u nagios%pass -e last_transfer_duration -w 360 -c 1800
Checks the last-transfer-duration of all snampmirror-sources on toaster. Warning if more than 5 minutes (360s) and critical if more than 1 hour (1800s).
http://ingo.lantschner.name/NetappNagiosPlugins.html

h1

Nagios-Plugins für NetApp: Usage und Beispiele online

20. Februar 2009

Ich habe heute die Seite mit den Nagios-Plugins für NetApp-Filer wesentlich erweitert und übsichtlicher gestaltet. Die Daten dazu werden per Perlscript drirekt aus dem git gezogen und sind somit leicht und präzise aktulell zu halten.

Um die Beispiele und Usage unabhängig vom Browser und der Fenstergröße auf einen Blick erfassbar zu machen, war es wichtig, dass keine unerwünschten Zeilenumbrüche gemacht werden. Dabei hat sich das via regex eingesetzte <nobr>-Attribut als sehr hilfreich erwiesen. Die subroutine lautet:

sub nobr {
    # hält die Bereiche der Parameter (-H host, --help, ...) zusammen
    s/\[?\-+\w+[\ = \]]\S*/<nobr>$&<\/nobr>/g;
}

Link http://ingo.lantschner.name/NetappNagiosPlugins.html

h1

Nagios-Plugins für NetApp verfügbar

13. Februar 2009

Seit heute kann man sich über die von mir erstelle Suite an Nagios-Plugins für NetApp Speichergeräte (Filer) auf meiner Homepage informieren.

Diese Plugins wurden auf Basis der NetApp-API (Manage ONTAP SDK) erstellt, holen ihre Daten über HTTP und sind daher auch mit zukünftigen Versionen von DATA ONTAP kompatibel.

Für weitere Informationen

http://ingo.lantschner.name/NetappNagiosPlugins.html

h1

Mehrsprachige Perlscripte

30. Juni 2008

Ein Perlscript, wie z.B. ein Plugin für Nagios zu schreiben, das in mehreren Sprachen seine Meldungen ausgibt, ist an sich einfach. Nur die Doku dazu ist eher mager und zu allererst steht man vor dem Problem, welches Modul man denn dafür am besten nehmen soll. Ich entschied mich dann für Locale::TextDomain – eine high-level Schnittstelle zu anderen Modulen.

Folgend ein kleines Beispiel:

#!/usr/bin/perl -w
use strict;
use warnings;
use lib "/opt/local/lib/perl5/site_perl/5.8.8";  # plattformspezifische Zeile
use Locale::TextDomain "en"; #  "./LocaleXData";
## einfaches Beispiel
my $translated = __"Hallo Welt!";
print "$translated\n";
## Anhängen eines Zeilenumbruchs (der zu übersetzende String muss in Klammern!)
print __("Mir geht's gut.") . "\n";
# Schön ist, dass man auch Umlaute verwenden kann -
# bei der Erstellung der po-Datei mit xgettext
# --out-format=UTF-8 angeben!
print __("Täglicher Unsinn mit scharfem ß.") . "\n";
## Variablen können auch übersetzt werden
my $msg = "Hallo Welt!";
print __$msg;
print "\n";
my $world = "Welt!";
print __"Hallo $world";
print "\n";

Dieses Script gibt folgende Ausgabe aus, wenn man ein paar Vorbereitungen getroffen hat:

$ export LANG=de_AT
$ ./world2.pl
Hallo Welt!
Mir geht's gut.
Täglicher Unsinn mit scharfem ß.
Hallo Welt!
Hallo Welt!

So und nun schalten wir auf English um:

$ export LANG=en_US
$ ./world2.pl
Hello World!
Mir geht's gut.
Daily nonsens with non-ASCII
Hello World!
Hello World!

Es wurden also die Texte „Hallo Welt!“ und „Täglicher Unsinn …“ übersetzt – letzterer etwas eigenwillig. Für „Mir geht’s gut.“ gabe s keine vor bereitet Übersetzung – daher wurde der deutsche Originaltext ausgegeben.

Die nötigen Vorarbeiten für dieses kleine „Wunder“ waren der Reihe nach:

  1. Installation von Locale::Textdomain mit cpan
  2. Anlegen eines Unterverzeichnisses LocaleData im Arbeitsverzeichnis des Scripts. Heisst das Verzeichnis anders, oder liegt es nicht in einem der @INC-Pfade muss es dediziert angegeben werden:
  3. use Locale::TextDomain "en",  "./mylocales";
  4. Export der zu übersetzenden Strings mit xgettext in ein po-File
  5. Übersetzeung dieser Strings (mit einem Editor) – der Text „Mir geht’s gut“ wurde dabei ausgelassen.
  6. Umwandlung des po in ein mo-File (binär) mittels msgfmt. Dieses ist exakt mit diesem Namen und Pfad LocaleData/<locale_name>/LC_MESSAGES/<localename>.mo abzulegen. Der locale-Name kommt also sowohl im Verzeichnis unterhalb von LocaleData als auch im Namen der Datei vor! Es kann allerdings auch en für en_US usw. verwendet werden.
  7. Im Script dann das Locale referenzieren. (Will man mehrere refrerenzieren, muss man das mit einer if-Abfrage machen.)

ABER: So ganz komplett ist die Sache nicht, denn vor allem die Mischung aus Fixtext und Variablen kann man man so nicht sauber übersetzen. Wie das nun geht sieht man am besten in diesem Beispiel:

#!/usr/bin/perl -w

use strict;
use warnings;

use lib "/opt/local/lib/perl5/site_perl/5.8.8";  # plattformspezifische Zeile
use Locale::TextDomain "en"; #  "./LocaleXData";

## einfaches Beispiel

my $translated = __"Hallo Welt!";
print "$translated\n";

## Anhängen eines Zeilenumbruchs (der zu übersetzende String muss in Klammern!)

print __("Mir geht's gut.") . "\n";

# Schön ist, dass man auch Umlaute verwenden kann - 
# bei der Erstellung der po-Datei mit xgettext 
# --out-format=UTF-8 angeben!
print __("Täglicher Unsinn mit scharfem ß.") . "\n";

## Variablen können auch übersetzt werden

my $msg = "Hallo Welt!";
print __$msg;
print "\n";

# Schwieriger wird es bei Variablen, die gemeinsam mit Fixtext ausgegeben
# werden sollen. Das folgende Beispiel funktioniert mehr oder weniger zufällig,
# und nur hier, da "Hallo Welt!" oben schon übersetzt wurde. Aber xgettext 
# würde sich dagegen sträuben ("world2.pl:37: ungültige Interpolation einer 
# Variablen bei »$«") 
my $world = "Welt!";
#print __"Hallo $world";  # muss für parsing mit xgettext auskomentiert werden
						  # danach könnte man es wieder aktivieren - Perl käme damit zurecht
						  # aber Lösung ist das natürlich keine ...
print "\n";

# Richtig ist die Mischung von Fixtext und Variablen so:
print __x ("Hallo {person}!\n",
	person => "Franz");

Dieses Script kann man nun so parsen:

$ xgettext world3.pl --from-code=UTF-8 --keyword=__ --keyword=__x

Und bekommt dann ein po-file, das man so übersetzt:

#: world3.pl:12
msgid "Hallo Welt!"
msgstr "Hello World!"

#: world3.pl:18
msgid "Mir geht's gut."
msgstr "I am fine."

#: world3.pl:23
msgid "Täglicher Unsinn mit scharfem ß."
msgstr "Daily nonsens with non-ASCII."

#: world3.pl:44
#, perl-brace-format
msgid "Hallo {person}!\n"
msgstr "Hello {person}!\n"

Und es dann ganz einfach in ein mo umwandelt und dieses wie oben schon beschrieben ablegt.

Und Die Ausgabe schaut dann so aus:

$ ./world3.pl 
Hallo Welt!
Mir geht's gut.
Täglicher Unsinn mit scharfem ß.
Hallo Welt!

Hallo Franz!

$ export LANG=en_US

$ ./world3.pl 
Hello World!
I am fine.
Daily nonsens with non-ASCII.
Hello World!

Hello Franz!
h1

OpsMgr an Nagios …

9. August 2007

OpsMgr meldet an Nagios

System Center Operations Manager 2007 ist der von Microsoft vertriebene Systemmonitor. SCOM ist Nachfolger des MOM und seit kurzem verfügbar. Uns interessiert inwieweit dieser mit der bewährten Open Source Lösung Nagios interoperabel ist.

Na endlich, nach etlichen Irrwegen die wegen mangelnder Dokumentation des OpsMgr (Kurzname für den System Center Operations Manager oder SCOM2007) alle im Sande verliefen, haben wir nun einen gangbaren Weg gefunden, über den der OpsMgr dem Nagios den Zustand seiner Schäfchen signalisieren kann. Dazu wurde ein eigener SMTP-Handler entwickelt, der die vom OpsMgr versendeten Alert-Emails empfängt und an Nagios als Passivcheck übergibt.

SCOM(OpsMgr)-Nagios-Schnittstelle entwickelt in Zusammenarbeit mit der NTx BackOffice Consulting Group, 1010 Wien

h1

Ein kleiner, feiner Systemmonitor

22. Juli 2007

Nagios auf einer Soekris Box – geht das?

Die kurze Antwort – ja es geht! Die längere: Ja es geht aber, … Doch berichten wir der Reihe nach.

Nagios, der Open Source Monitor für alles was irgendwie elektrisch messbar ist läuft wie man weiss auf jeder Art von UNIX. Die üblichen Plattformen sind Server – seien sie nun virtuell oder physische Kraftbrocken. Bei vielen Implementation würde man mit einem Pentium III und 128 MB Arbeitsspeicher auskommen – damit lassen sich hunderte Hosts überwachen. Doch so einen Server wird man kaum noch bekommen, weshalb man öfter mal auf virtuelle Server umsteigt. Und hier beginnt das Problem, denn der Systemmonitor als Alarmanlage der IT sollte so unabhängig wie nur möglich betrieben werden.

Wo ist hier der Lüfter?

Also machte ich mich auf die Suche nach einer Hardware, die supereinfach und stabil konstruiert ist. Das heißt: Keine Lüfter, keine Festplatten, keine unnötigen Steckkontakte und minimaler Stromverbrauch, so dass wir das Ding aus einem Akku betreiben können. Fündig wurde ich bei Soekris, einer Plattform mit Zielgruppe Netzwerdevices.

Nagios Box Hardware (in meinem Büro in Wien)

Software

Auf der Box wird ein Linux installiert und Nagios 3.0 das zur Zeit als Alpha Version vorliegt. Dazu kommen die rrdtools und drraw für die Trendanalyse und einige angepasste Nagios-Plugins.
Nagios Box Software

Erfahrungen

Die ersten Erfahrungen sind gemischt: Eine kleine Anzahl von Hosts und Diensten lässt sich damit überwachen. Bei ca. 10 Hosts a 5 Services steht die CPU-Auslastung bei 80% und die Load klettert auf über 1. Leider ist in der Nagios-Alpha ein Bug, der verhindert, dass der embedded Perl-Interpreter kompiliert wird. Somit sind wir auf das externe Perl angewiesen und das kostet eben hübsch Performance.

Stabilität

Mit rrdtool und drraw scheint die Last auf Dauer zu heftig zu sein – alle 2 Wochen stürzt das System ab. Das ist nicht akzeptabel. Nimmt man die Komponenten für die Trendanalyse der Box wieder ab und lässt nur das Nagios darauf laufen, so läuft das System wie ein Glöckerl – über Monate hinweg. Und nebenbei hostet es auch noch meinen Mailserver am Wiener Standort.

Weitere Tests wären spannend, wenn der EPN-Interpreter des Nagios wieder kompilierbar ist – das ist er in der derzeitigen Alphaversion von Nagios 3 nicht.