たごもりすメモ

コードとかその他の話とか。

#fluentdの死活監視を ping message + ping message checker で

先日のFluentd meetup #2からこっちFluentdの監視熱が高まっている昨今ですが、みなさんFluentdの監視してますか。暑いですね。
ところで監視といえばプロセス監視とかは当然やってたんですが、まあやっぱりメッセージ飛ばしてみて実際に飛ぶかどうかとか確認したいよねって思いますよね。当然ですよね。

で、当日調子に乗って out_ping_message を書いたものの、いざFluentdの各プロセスからpingを流してみたら毎分数十以上のメッセージが流れてきてファイルに書いても1周目の目視確認すら困難な状況になったので、ちゃんとping message到着してるか(正確には到着しなくなっちゃったものが無いか)をチェックしてくれる out_ping_message_checker を書いて fluent-plugin-ping-message に追加しました。

fluent-plugin-ping-message | RubyGems.org | your community gem host
tagomoris/fluent-plugin-ping-message · GitHub

これにより、たとえば check_interval 3600 としておくと、その一度届いたあとで期間内に一度も ping message が届かないようになったらアラート用のメッセージを emit してくれるようになります。デフォルトでは3回分のアラートメッセージを流したあとで沈黙します。あとはこのメッセージを適当な output plugin で目につくところに流してやればいいわけですね!
ということで手元ではこんな感じで設定。

# 全fluentdでこんな感じの設定
# たいていサーバに複数プロセス立ってるので data に in_forward がlistenしてるポート番号を含めてる
<source>
  type ping_message
  tag ping
  data NODENAME:PORTNUM
</source>
<match ping>
  type forward
  flush_interval 15s
  <server>
    host watcher01.local
  </server>
  <server>
    host watcher02.local
    standby yes
  </server>
</match>

# watcher側でこれを監視する設定
<match ping.**>
  type copy
  <store>
    type ping_message_checker
    tag missing.ping
    notifications yes   # watcher02 側では no にして、稀にpingがそっちに飛んでもアラート出さないよう抑制する
  </store>
  <store>
    type file_alternative  # チェックと同時にファイルに落とす(fluentd起動中のノード一覧がこれで取れる)
    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 ikachan               # pingアラートが出たらIRCに流す
  host ikachan.local
  port 80
  channel watching
  out_keys data
  message Fluentd node down(ping missing): %s
</match>

まあみなさん、何も言わずにこの設定を自分のFluentdの設定ファイルにコピペするといいと思いますね。

fluent-agent-lite v0.5

さて Fluentd はこれでいいとして、自分の場合はログの送出は fluent-agent-lite に頼っているので、こいつからも ping message を送れるようにしたい。と思ったので、した。

https://github.com/tagomoris/fluent-agent-lite/tags の v0.5
https://github.com/downloads/tagomoris/fluent-agent-lite/fluent-agent-lite.v0.5.tar.gz

コマンドラインから起動する場合は -P オプション(と-Sオプション)が関係する。設定ファイル+init scriptでの起動の場合は PING_TAG などの行を設定して起動すると ping message の送信が行われることになる。
fluent-agent-lite で複数ファイルからの読み込みの場合は複数のプロセスが立ち上がるので、強制的に ping message の data フィールドの内容を PING_DATA + (スペースを入れて) 読み込みファイルのパス、としてある。こうすればどのファイルを読んでいるプロセスが落ちたのかがping messageを見るだけでわかる。*1

ということで fluent-agent-lite v0.5 はおすすめです。お使いのかたはアップデートをおすすめします。yum install でインストールしなおしても設定ファイルは上書きされないので、ping まわりの設定値は自分で書き足す必要がありますが。

些細な話

ping message まわりの機能、組込みであったらいいなーと思わなくもないですね。pluginじゃなくてfluentdのリポジトリにaddしちゃおうかなー。さすがにアレかなー。どうしよ。

*1:標準入力から読んでいるプロセスが複数ある場合は同じになってしまう。さすがに対応がめんどう……。