読者です 読者をやめる 読者になる 読者になる

Hobbitで独自監視スクリプト

Hobbit

サーバ監視には Hobbit を使ってます (Nagios は設定ファイルを書くのが面倒で挫折)。

独自の監視スクリプト (クライアントサイド) を作る必要があったので、「Hobbit監視 - 自作の監視スクリプトはどうやって作りますか?」を参考に書いてみた。

上記の例は shell script なので Perl で書き直して、ついでに使い回せるようにモジュール化。

package HobbitClientScript;

use strict;
use warnings;
use Carp;
use base qw/ Class::Accessor::Fast /;

__PACKAGE__->mk_accessors(qw/ column color message title /);

sub new {
    my $class = shift;
    my $self  = $class->SUPER::new(@_);
    $self->green('green') unless defined $self->color;
    $self->message('')    unless defined $self->message;
    $self->title('')      unless defined $self->title;
    return $self;
}

sub green  { shift->color('green')  }
sub yellow { shift->color('yellow') }
sub red    { shift->color('red')    }

sub add_message {
    my ( $self, $message ) = @_;
    $self->message( $self->message. $message );
}

sub report {
    my $self = shift;
    # Tell Hobbit about it
    my $report = sprintf(
        "status %s.%s %s %s\n\n%s\n\n%s",
        $ENV{MACHINE} || $ENV{HOSTNAME},
        $self->column, $self->color, scalar localtime,
        $self->title,
        $self->message,
    );

    if ( defined $ENV{BB} && defined $ENV{BBDISP} ) {
        system( $ENV{BB}, $ENV{BBDISP}, $report );
    }
    else {
        croak("env BB or BBDISP is not defined.");
    }
}
1;

使い方。title, column を定義してオブジェクトを作って、add_message() でメッセージ追加。
red, yellow, green メソッドでステータスを更新して (default green)、report() で hobbit に報告。

#!/usr/bin/perl
use HobbitClientScript;
my $hobbit = HobbitClientScript->new({
    column  => 'mytest',
    title   => 'mytest status',
});
if ( OK ) {
    $hobbit->add_message('ok');
}
elsif ( WARNING ) {
    $hobbit->add_message('alert!');
    $hobbit->yellow;
}
else { # NG
    $hobbit->add_message('emergency!!');
    $hobbit->red;
}
$hobbit->report();

このスクリプトを ~hobbit/client/ext に置いて、~hobbit/client/etc/clientlaunch.cfg に登録する。

[myscript]
	ENVFILE $HOBBITCLIENTHOME/etc/hobbitclient.cfg
	CMD $HOBBITCLIENTHOME/ext/myscript.pl
	LOGFILE $HOBBITCLIENTHOME/logs/myscript.log
	INTERVAL 5m