ログ収集ツールであるFluentdから、監視ツールであるSensuにチェックを送信するプラグインを書きました。このプラグインを使うと、異常なログ出力がSensu経由で通知できるようになります。
このプラグインは、Nagios/NSCA向けのプラグインであるfluent-plugin-nscaとほぼ同じ機能を提供します。
※この記事は8月31日の記事「Fluentd plugin to send checks to Sensu monitoring system」を日本語で書きなおしたものです。
インストール
fluent-plugin-sensuという名前のgemをインストールしてください。
ユースケース: 「サーバエラー多過ぎ」アラート
ウェブサーバで次のサービスが走っているものとします。
- Apache HTTP server
- Fluentd
- sensu-client
また、監視サーバで次のサービスが走っているものとします。
- Redis
- RabbitMQ
- sensu-server
ここで、Apacheが返す5xxのサーバエラーが多すぎるとき、通知を受けたいとします。たとえば、1分に5つ以上のサーバエラーが発生したらWARNING、50以上のサーバエラーが発生したらCRITICALの通知を受けることにしましょう。
これは、次図の構成で実現できます。
Fluentdの設定
次の設定はfluent-plugin-datacounter、fluent-plugin-record-reformer、そしてfluent-plugin-sensuを使っています。最初にこれらのプラグインのgemをインストールしてください。
ついで、Fluentdの設定ファイルに次の内容を追加してください。
# アクセスログの追尾 <source> type tail tag access format apache2 # The paths vary by setup path /var/log/httpd/access_log pos_file /var/lib/fluentd/pos/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> # sensu-clientにチェックを送る <match server_errors> type sensu server localhost port 3030 check_name server_errors check_type standard check_status_field level check_ttl 100 </match>
データフローは次図のとおりです。
代替策
Fluentd 0.12.0以降であれば、fluent-plugin-record-reformerの代わりにrecord_transformerフィルタが使えます。
スケーラビリティを気にする場合は、datacounterとrecord_reformerの組み合わせよりも、fluent-plugin-norikra経由でNorikraに集計させる方が良いかもしれません。
別の構成としては、fluent-plugin-graphiteを用いてメトリクスDBであるGraphiteにエラー数を送信した上で、check-data.rbを用いてSensuからGraphite上のメトリクスを監視することが考えられます。この構成の場合、fluent-plugin-sensuは必要ありません。