FluentdからNSCA / Nagiosにサービスチェックを送るプラグインを書きました

この記事はFluentd plugin to send NSCA / Nagios service checksの日本語版です。

FluentdからNSCA / Nagiosの監視サーバにサービスチェックを送るプラグインを書きました。このプラグインを使って、Fluentd上のログの異常について、Nagiosで通知を上げることができます。

インストール

fluent-plugin-nscaというgemをインストールしてください。

このプラグインはNSCAクライアントのRuby実装を使っているため、send_nscaコマンドをインストールする必要はありません。

ユースケース: 「サーバエラー多すぎ」アラート

次の環境を前提します。

  • 「web」サーバ (192.168.42.123): Apache HTTP Server, Fluentd
  • 「monitor」サーバ (192.168.42.210): Nagios, NSCA

Apacheが返す5xxのサーバエラーが多すぎるとき、通知を受けたいとします。例として、1分に5つ以上のサーバエラーが発生したらWARNING、50以上のサーバエラーが発生したらCRITICALの通知を受けたいとします。

これは次図のように実現できます。

http://d.hatena.ne.jp/miyakawa_taku/files/2015-03-07_deployment.png?d=.png

「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-datacounterfluent-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上のデータフローは次図のとおりです。

http://d.hatena.ne.jp/miyakawa_taku/files/2015-03-07_fluentd.png?d=.png

Fluentd 0.12.0以降では、fluent-plugin-record-reformerの代わりにrecord_transformerフィルタが使えます。

スケーラビリティが問題になる場合は、record_reformerの代わりにfluent-plugin-norikraを使うほうが良いかもしれません。

作った動機

Fluentdには、メールで通知するためのプラグインや、Hipchatで通知するためのプラグインがあります。これらを使ってログ異常の通知を実現することは可能です。

しかし、既にNagiosの監視サーバを構築している場合は、通知をNagiosに寄せたいはずです。通知先の定義を統合でき、またダウンタイム定義などの機能が使えるからです。

ということで、無いので作りました。

フィードバック

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

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