Fluentdから監視ツールSensuにチェックを送るプラグインを書きました

ログ収集ツールである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の通知を受けることにしましょう。

これは、次図の構成で実現できます。

http://d.hatena.ne.jp/miyakawa_taku/files/2015-08-31_fluent-plugin-sensu-deployment.png?d=.png

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>

データフローは次図のとおりです。

http://d.hatena.ne.jp/miyakawa_taku/files/2015-08-31_fluent-plugin-sensu-dataflow.png?d=.png

代替策

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は必要ありません。

フィードバック

Githubリポジトリに課題を挙げるか、プルリクエストを送ってください。

Twitter@miyakawa_takuにフィードバックしていただくのも歓迎です。