この記事はFluentd plugin to send NSCA / Nagios service checksの日本語版です。
FluentdからNSCA / Nagiosの監視サーバにサービスチェックを送るプラグインを書きました。このプラグインを使って、Fluentd上のログの異常について、Nagiosで通知を上げることができます。
インストール
fluent-plugin-nscaというgemをインストールしてください。
このプラグインはNSCAクライアントのRuby実装を使っているため、send_nscaコマンドをインストールする必要はありません。
ユースケース: 「サーバエラー多すぎ」アラート
次の環境を前提します。
Apacheが返す5xxのサーバエラーが多すぎるとき、通知を受けたいとします。例として、1分に5つ以上のサーバエラーが発生したらWARNING、50以上のサーバエラーが発生したらCRITICALの通知を受けたいとします。
これは次図のように実現できます。
「monitor」サーバ上のNagiosの設定
次の内容を含むweb.cfgファイルを、Nagiosの設定ディレクトリに放り込んでください。
# ファイル: web.cfg # "web"サーバの定義 define host { use generic-host host_name web alias web address 192.168.42.123 } # サーバエラーのサービス define service { use generic-service name server_errors active_checks_enabled 0 passive_checks_enabled 1 flap_detection_enabled 0 max_check_attempts 1 check_command check_dummy!0 } # 他の場所でcheck_dummyコマンドが定義されている場合、この節を消してください define command { command_name check_dummy command_line $USER1$/check_dummy $ARG1$ }
「web」サーバ上のFluentdの設定
次の設定はfluent-plugin-datacounter、fluent-plugin-record-reformer、そしてfluent-plugin-nscaを使っています。最初にこれらのプラグインのgemをインストールしてください。
ついで、Fluentdの設定ファイルに次の内容を追加してください。
# Apacheのアクセスログをパース <source> type tail tag access format apache2 # パスは環境によって異なります path /var/log/httpd/access_log pos_file /var/log/fluentd/httpd-access_log.pos </source> # 分あたりの5xxエラーを数える <match access> type datacounter tag count.access unit minute aggregate all count_key code pattern1 error ^5\d\d$ </match> # サービスの状態を計算 <match count.access> type record_reformer tag server_errors enable_ruby true <record> level ${error_count < 5 ? 'OK' : error_count < 50 ? 'WARNING' : 'CRITICAL'} </record> </match> # NSCAにサービスチェックを送る <match server_errors> type nsca server 192.168.42.210 port 5667 password peng! host_name web service_description server_errors return_code_field level </match>
Fluentd上のデータフローは次図のとおりです。
Fluentd 0.12.0以降では、fluent-plugin-record-reformerの代わりにrecord_transformerフィルタが使えます。
スケーラビリティが問題になる場合は、record_reformerの代わりにfluent-plugin-norikraを使うほうが良いかもしれません。
作った動機
Fluentdには、メールで通知するためのプラグインや、Hipchatで通知するためのプラグインがあります。これらを使ってログ異常の通知を実現することは可能です。
しかし、既にNagiosの監視サーバを構築している場合は、通知をNagiosに寄せたいはずです。通知先の定義を統合でき、またダウンタイム定義などの機能が使えるからです。
ということで、無いので作りました。