FluentdのpingメッセージをNagiosで監視
Fluentdの監視については、
Fluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例や、
#fluentdの死活監視を ping message + ping message checker で - tagomorisのメモ置き場がとても参考になります。
これらの情報を大いに参考にさせていただいて構成した環境の監視設定についてまとめます。
当方環境
・各APPサーバなどからはfluent-agent-liteによってログとping messageが送られてくる
・受信側のFluentdサーバはシングルノード、シングルプロセス
・APPサーバ、Fluentdサーバ、Nagiosサーバはそれぞれ別のサーバ
監視方針
監視はなるべくシンプルにしたいので、こんな感じにしています。
・TCP/UDPポート監視
・プロセス監視はしない
・通知はNagiosから
プロセス監視をしないのは、ポート監視で十分条件は満たしているし、td-agentのプロセス重複起動問題も現在のバージョンでは修正されているからです。
また、ping_message_checkerによってメッセージがしっかりと送られてきていることを確認出来るので、flowcounterを併用した確認もしていません。*1
当方環境では監視にNagiosを使っています。
out_ikachanやout_mailなどは使わず、ping_message_checkerによってemitされた情報をファイルに書き出し、そのファイルをcheck_log3で監視します。
送信側の設定
fluent-agent-liteの場合、バージョン0.5からping messageの出力が出来るようになりました。
以下のような設定を入れます。
/etc/fluent-agent-lite.conf(一部) PING_TAG=ping PING_DATA=`hostname` PING_INTERVAL=60
Fluentdをお使いの場合は、こんな感じで。
<source> type ping_message tag ping data NODENAME </source> <match ping> type forward flush_interval 15s host logserver </match>
受信側の設定
このように設定しておきます。
これにより、一度ping messageが届いたあと3600秒(デフォルト値)の間に再度同じ種類のping messageが届かなかった場合に、アラートメッセージが/var/log/fluentd/missing.ping.logに吐き出されます。
デフォルトでは3回分のアラートメッセージがファイルに吐き出されますが、1回でよい場合はping_message_checkerの設定で「notification_times 1」としてあげればよいです。
<match ping.**> type copy <store> type ping_message_checker tag missing.ping notifications yes </store> <store> type file_alternative 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 file_alternative path /var/log/fluentd/missing.ping.log* time_slice_format flush_interval 1s output_include_time true output_include_tag false output_data_type attr:data </match>
Nagios設定
監視設定を入れていきます。
Nagios標準のcheck_logプラグインは少しおバカさんなので*2、check_log3.pl - Nagios Exchangeを代わりに使います。
実際のNagiosの設定です。
etc/objects/commands.cfg
define command{ command_name check_tcp command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ -w $ARG2$ -c $ARG3$ } define command{ command_name check_udp command_line $USER1$/check_udp -H $HOSTADDRESS$ -p $ARG1$ -s $ARG2$ -e $ARG3$ } define command{ command_name check_log3 command_line $USER1$/check_log3 -l $ARG1$ -s $ARG2$ -p $ARG3$ -w $ARG4$ }
etc/objects/services.cfg
define service{ use generic-service host_name logserver service_description Fluentd missing messages max_check_attempts 1 is_volatile 1 flap_detection_enabled 0 notification_options w check_command check_nrpe!check_log3!/var/log/fluentd/missing.ping.log /var/log/fluentd/seek.file ".*" 1 } define service{ use generic-service host_name logserver service_description Fluentd TCP port 24224 check check_command check_tcp!24224!3!5 } define service{ use generic-service host_name logserver service_description Fluentd UDP port 24224 check check_command check_udp!24224!hello!'' }
(logserverの)etc/nrpe.cfg
command[check_log3]=/usr/local/nagios/libexec/check_log3 -l $ARG1$ -s $ARG2$ -p $ARG3$ -w $ARG4$
通知
こんな感じで来ます。
***** Nagios ***** Notification Type: PROBLEM Service: Fluentd missing messages Host: logserver Address: ***.***.***.*** State: WARNING Date/Time: Tue Feb 5 17:41:59 JST 2013 Additional Info: WARNING: Found 1 lines (limit=1/1000): 2013-02-05T02:55:12Z webserver01 /var/log/app/error_log
*1:flowcounterを用いた監視はFluentd Meetup #2 @外道父 Fluentdを優しく見守る監視事例が参考になります。
*2:LOGがローテーションされると、シークファイルがリセットされないままなので最初の異常を見逃すことがあったり、ひっかけるキーワードに正規表現を使えないなどなにかと不便。