監視ツールMonのアラートをIRCに通知する方法!

一般的に言えば監視ツールは


のような有名所のものがありますが(他に抜けてたらすいません)、最近Monという監視ツールを触っています。
NagiosやZabbix同様障害をアラートメールで通知してくれる機能を備えています。

大きな企業であればSkypeメッセンジャーなどのチャットシステムではなく
IRCサーバを構築し社内で利用しているところは多いと思います。

MonはGoogle先生でも「Mon」を含む単語やMondayの「Mon」に引っかかって結構検索が難しいと思います。
実際私も今苦戦していますw

MonのアラートをIRCにも通知できないかな〜って思っていてMonサーバをいろいろ調べていました。
mon.cfの中でデフォルトの設定であれば


alert mail.alert root@localhost


と書いてあると思います。
上司に質問していたら「alert」というのは複数書けるようです。
そこで気づいたのが(半分くらい教えてもらった感じ)
mail.alertってなんぞ?なんか他にも○○.alertってありそうだなと
findコマンドなどを利用して探し当てたのが


/usr/lib64/mon/alert.d/irc.alert


である。(yumでインストールしたのでこのパスにあります)
ソースで入れると書きパスにあります


/usr/local/mon/alert.d/irc.alert


/usr/localは./configureする時にprefixで指定しているパスになります。
中身を見るとperlで書かれており、perlが読めない私でも気づけたところは下記の変数定義のところになります。


my $CHAN = $opt{"c"} || "mon";
my $NICK = $opt{"n"} || "mon";
my $USER = $opt{"U"} || $NICK;
my $SERVER = $opt{"S"} || die "must supply server via -S\n";
my $NICK_TRIES = $opt{"N"} || 5;
my $PAUSE = $opt{"p"} || 0;
my $TIMEOUT = 10;


これはチャンネルやらNICKなどの設定をしていますね。
ですのでIRCサーバでmonというチャンネルを作成すればいいわけです。

IRCサーバの設定が完了したらmon.cfの設定に入ります。
私はシンプルな設定ファイルにしてあります。


cfbasedir = /etc/mon
pidfile = /var/run/mon.pid
statedir = /var/lib/mon/state.d
logdir = /var/lib/mon/log.d
dtlogfile = /var/lib/mon/log.d/downtime.log
alertdir = /usr/lib64/mon/alert.d
mondir = /usr/lib64/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 60s
authtype = pam
userfile = /etc/mon/userfile


hostgroup servers localhost

watch servers
service http
interval 4m
monitor http.monitor -p 80 -t 10 -u /
allow_empty_group
period wd {Sun-Sat}
upalert mail.alert -S web server is back up mis
alertevery 10m
alert mail.alert root@localhost
alert irc.alert -s http -g server -h localhost -c mon -S localhost -U mon -n mon -d


と、このようになりました。


            alert irc.alert -s http -g server -h localhost -c mon -S localhost -U mon -n mon -d


この部分のオプションはirc.alertに説明が書いてありますので使用目的などに合わせて書き換えます

下記がオプションの説明になります。


# options are:
# -s service
# -g group
# -h "host1 host2 host3..."
# -t tmnow
# -u (if upalert)
# -T (if trap)
# -O (if traptimeout)
#
# -j join the channel before doing PRIVMSG
# (some channel modes prevent PRIVMSG from
# user who hasn't joined the channel)
# -c channel name of the channel (without leading #)
# -S server irc server
# -U user user for irc server
# -n nick nick
# -d post alert detail to irc channel
# -N num try num different nicks before giving up
# -p secs when showing detail, pause secs between
# sending each line. secs may be fractional.


そしたらmonの再起動を行います


/etc/rc.d/init.d/mon stop
/etc/rc.d/init.d/mon start


これで反映が完了しました。

試しに監視対象のApacheを落としてみました。
そしたらこのようにIRCにも通知がされる様になりました。

リカバリーについては通知されないのでその辺はまた調べていきたいと思います^^


※この本にMonについて少し書いてあります。

MySQLによるタフなサイトの作り方

MySQLによるタフなサイトの作り方