先日のFluentd meetup #2からこっちFluentdの監視熱が高まっている昨今ですが、みなさんFluentdの監視してますか。暑いですね。
ところで監視といえばプロセス監視とかは当然やってたんですが、まあやっぱりメッセージ飛ばしてみて実際に飛ぶかどうかとか確認したいよねって思いますよね。当然ですよね。
で、当日調子に乗って out_ping_message を書いたものの、いざFluentdの各プロセスからpingを流してみたら毎分数十以上のメッセージが流れてきてファイルに書いても1周目の目視確認すら困難な状況になったので、ちゃんとping message到着してるか(正確には到着しなくなっちゃったものが無いか)をチェックしてくれる out_ping_message_checker を書いて fluent-plugin-ping-message に追加しました。
fluent-plugin-ping-message | RubyGems.org | your community gem host
tagomoris/fluent-plugin-ping-message · GitHub
これにより、たとえば check_interval 3600 としておくと、その一度届いたあとで期間内に一度も ping message が届かないようになったらアラート用のメッセージを emit してくれるようになります。デフォルトでは3回分のアラートメッセージを流したあとで沈黙します。あとはこのメッセージを適当な output plugin で目につくところに流してやればいいわけですね!
ということで手元ではこんな感じで設定。
# 全fluentdでこんな感じの設定
# たいていサーバに複数プロセス立ってるので data に in_forward がlistenしてるポート番号を含めてる
<source>
type ping_message
tag ping
data NODENAME:PORTNUM
</source>
<match ping>
type forward
flush_interval 15s
<server>
host watcher01.local
</server>
<server>
host watcher02.local
standby yes
</server>
</match>
# watcher側でこれを監視する設定
<match ping.**>
type copy
<store>
type ping_message_checker
tag missing.ping
notifications yes # watcher02 側では no にして、稀にpingがそっちに飛んでもアラート出さないよう抑制する
</store>
<store>
type file_alternative # チェックと同時にファイルに落とす(fluentd起動中のノード一覧がこれで取れる)
path /var/log/fluentd/ping.%Y%m.log
flush_interval 1s
localtime
output_include_time true
output_include_tag false
output_data_type attr:data
</store>
</match>
<match missing.ping>
type ikachan # pingアラートが出たらIRCに流す
host ikachan.local
port 80
channel watching
out_keys data
message Fluentd node down(ping missing): %s
</match>まあみなさん、何も言わずにこの設定を自分のFluentdの設定ファイルにコピペするといいと思いますね。
fluent-agent-lite v0.5
さて Fluentd はこれでいいとして、自分の場合はログの送出は fluent-agent-lite に頼っているので、こいつからも ping message を送れるようにしたい。と思ったので、した。
https://github.com/tagomoris/fluent-agent-lite/tags の v0.5
https://github.com/downloads/tagomoris/fluent-agent-lite/fluent-agent-lite.v0.5.tar.gz
コマンドラインから起動する場合は -P オプション(と-Sオプション)が関係する。設定ファイル+init scriptでの起動の場合は PING_TAG などの行を設定して起動すると ping message の送信が行われることになる。
fluent-agent-lite で複数ファイルからの読み込みの場合は複数のプロセスが立ち上がるので、強制的に ping message の data フィールドの内容を PING_DATA + (スペースを入れて) 読み込みファイルのパス、としてある。こうすればどのファイルを読んでいるプロセスが落ちたのかがping messageを見るだけでわかる。*1
ということで fluent-agent-lite v0.5 はおすすめです。お使いのかたはアップデートをおすすめします。yum install でインストールしなおしても設定ファイルは上書きされないので、ping まわりの設定値は自分で書き足す必要がありますが。