вторник, 26 апреля 2011 г.

Пишем свой плагин для Nagios

Разработка плагинов для Nagios - дело нехитрое. Прочитав официальный мануал http://nagiosplug.sourceforge.net/developer-guidelines.html я переписал вчерашний скрипт для проверки состояния репликации для использования из под Nagios.

Сразу предупрежу, что не претендую на абсолютную правильность реализации. Часть требований из манула я намеренно проигнорировал.
А теперь суть изменений:
  1. Вывод должен быть в одну строку и не более 80 символов
  2. Код возврата должен соответсвовать таблице http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN76
  3. Добавлены флаги для порогов WARNING, CRITICAL
  4. Добавлена подсказка по использованию

#!/usr/local/bin/perl -w

use strict;
use DBI;
use Getopt::Long;
sub usage();
my $user   = "";
my $password = "";
my $hostname = "localhost";
my $warning = 360;
my $critical = 1800;
my $opt_help;
GetOptions ("H=s" => \$hostname,
            "u=s" => \$user,
            "p=s"   => \$password,
            "w=i" => \$warning,
            "c=i" => \$critical,
            "help" => \$opt_help );

if ($opt_help) {
        usage();
        exit 0;
}

my $dsn="DBI:mysql:host=$hostname";
my ($sql_running, $io_running, $seconds_behind);
my ($res, $text);
my $dbh=DBI->connect($dsn, $user, $password);
if (!  $dbh) {
    print $!;
    exit 3; # unknown
}
my  $sth=$dbh->prepare("SHOW SLAVE STATUS") ;
if ( ! $sth) {
    print $!;
    $dbh->disconnect();
    exit 3;
}
if (! $sth->execute()) {
    print $!;
    $dbh->disconnect();
    exit 3;
}
if (my $ref = $sth->fetchrow_hashref()) {
    for (keys %{$ref}) {
        $io_running = $ref->{$_} || "n/a" if /Slave_IO_Running/;
        $sql_running =  $ref->{$_} || "n/a" if /Slave_SQL_Running/;
        $seconds_behind =  $ref->{$_} || "n/a" if /Seconds_Behind_Master/;
    }
    if ($io_running eq "Yes" && $sql_running eq "Yes") {
        if ($seconds_behind < $warning) {
            $res = 0; #OK
        }
        elsif ($seconds_behind < $critical) {
            $res = 1; #WARNING
        }
        else {
            $res = 2; #CRITICAL
        }
    }
    else {
        $res = 2; #CRITICAL
    }
    $text = sprintf("Slave_IO_Running: %s, Slave_SQL_Running: %s, Seconds_Behind_Master: %s\n", $io_running, $sql_running, $seconds_behind);
}
else {
    $res = 3;  #UKNOWN
    $text = "Empty set";
}
$sth->finish;
$dbh->disconnect();
print $text;
exit $res;

sub usage() {
    printf "$0 -H -u -p -c -w \n";


Комментариев нет:

Отправить комментарий