In verteilten Umgebungen mit Nagios Servern die ihre Ergebnisse als Passive Checks an eine zentrale Nagiosinstanz übermitteln, kann man manchmal beobachten das die Satelliten eine sehr hohe Service Check Latency haben, obwohl die Server noch lange nicht ausgelastet sind. Der Grund für dieses Problem könnte sein das der NSCA Daemon zu lange braucht um seine Ergebnisse zu übertragen, und damit Nagios blockiert. Denn in der Standard Konfiguration von NSCA wird jedes Ergebnis einzelnen übertragen, was zu einem Overhead sowohl auf dem Satelliten als auch auf dem Zentralen Nagios Server führt.
Die Lösung für dieses Problem ist der ocsp_sweeper von Jason Lancaster. Der Daemon cached die Check Ergebnisse in einer Pipe und überträgt sie dann gesammelt an den Zentralen Nagios Server. Dies reduziert den Übertragungsoverhead auf beiden Seiten und macht den Nagios Prozess auf den Satelliten unabhängig von der Ausführungsgeschwindigkeit der NSCA Übertragung.
Der Daemon und das Init Script dazu können bei NagiosExchange heruntergeladen werden. Ich habe die beiden Scripte geringfügig angepasst. Meine Version kann hier heruntergeladen werden. Die weiteren Ausführungen beziehen sich auf diese Version.
Das Init Script im dafür vorgesehenen Ordner ablegen (meistens /etc/init.d). Den Daemon ocsp_sweeper.pl habe ich in /usr/local/nagios/ocsp_sweeper abgelegt. Nachdem die Files ihren Platz gefunden haben, muss das Init Skript angepasst werden.
Die wichtigsten Punkte sind dabei die IP Adresse des zentralen Nagios Servers und der Pfad für das Cache File. Sollte die Pipe nicht vorhanden sein, wird sie beim Start automatisch erzeugt.
# IP address of the master nagios server my $master = '192.168.0.1'; # Where to store the cache file (named pipe) my $fifo = '/var/nagios/rw/ocsp.cmd';
Außerdem kann hier der User ausgewählt werden mit dessen Rechten ocsp_sweeper laufen soll. Ich verwende hierfür den gleichen User wie für den Nagios Hauptprozess
# OCSP is built to run as a specific user, therefore we can assume it will only # run as the following user. my $user = "nagios";
Diese Variante sollte eingesetzt werden, wenn nicht für alle Checks Performance Daten verarbeitet werden. Damit Nagios seine Check-Ergebnisse weiterreicht ist in der nagios.cfg die Option obsess_over_services zu aktiveren und ein Check Kommando dazu zu defineren.
# OBSESS OVER SERVICE CHECKS OPTION obsess_over_services=1 # OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND ocsp_command=submit_service_check
Das dazugehörige Check Kommando sieht dann so aus:
define command{
command_name submit_service_check
command_line /usr/bin/printf "%b" "$HOSTNAME$,$SERVICEDESC$,$SERVICESTATEID$,$SERVICEOUTPUT$ | $SERVICEPERFDATA$\n" >> /var/nagios/rw/ocsp.cmd
}
Dieses Verfahren kann genutzt werden wenn für alle Checks Performance Daten ausgewertet werden. Das bedeutet, dass sowohl in der nagios.cfg die Option process_performance_data, als auch in der Service Definition process_perf_data aktiviert sein muss. Diese Variante hat den Vorteil das Nagios direkt in die Pipe des ocsp_sweepers schreibt, ohne zusätzlich ein Shell Kommando (printf) aufrufen zu müssen. Dazu nutzen wir die Möglichkeiten von service_perfdata_file_template.
Aus der Nagios Doku:
Format: service_perfdata_file_template=<template> This option determines what (and how) data is written to the service performance data file. The template may contain macros, special characters (\t for tab, \r for carriage return, \n for newline) and plain text. A newline is automatically added after each write to the performance data file.
Damit Nagios direkt in die Pipe schreibt ist Folgendes in die nagios.cfg einzutragen:
service_perfdata_file=/var/nagios/rw/ocsp.cmd service_perfdata_file_template=$HOSTNAME$,$SERVICEDESC$,$SERVICESTATEID$,$SERVICEOUTPUT$ | $SERVICEPERFDATA$ service_perfdata_file_mode=a
Nach einem Reload schreibt Nagios nun alle Ergebnisse in die Pipe. Dort werden sie vom ocsp_sweeper Daemon wieder ausgelesen und gesammelt an den Hauptserver übertragen.
Martin Hefter NETWAYS GmbH - 27 Feb 2007