読者です 読者をやめる 読者になる 読者になる

俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

td-agentのlogをslackで監視 - 日報 #126

続々と日本中から花粉が集まっております。
集合場所は俺の粘膜だそうで、
村を上げての大祭りです。

さて、本日はFluentd先生のお話。

せっかくfluentd使ってログ取得しているんだから、
td-agent自体のログもfluentdで回収したいものです。
というより、fluentdで生じたエラーに対して俊敏に反応したいものです。
そうじゃないと大事なログをロストしたり、大量のログ吐き出しによってディスク容量が圧迫されたりしちゃうかもしれないですしね。

ということで、td-agent.logを何とか監視したいものです。
td-agent.logをtailしてみているcronスクリプトみたいなのでもいいですが、
fluentd自体で自らのログをタグ付けで拾う機能があったはずなので、
それを使ってもっと簡単にやってみます。

おおまかな流れとしては、
自分のhostに対してtd-agentログを送信して、
自分で受信する。
その後適当にフィルタ条件を設定して、
気になるものだけをslackで投げる。
的な感じにしてみます。
素晴らしいプラグインたちのお陰で、案外簡単です。

使うプラグイン達は4つくらいです。
まずは送信元fluentdが複数個あることを想定して、
レコードを個別にするためrecord-modifierを使用します。
その後、大量にきちゃうことを想定して、
それらをsuppressを使って一旦まとめます。
最終的にそれらメッセージをslackプラグインで送信します。
slackのサービスはIncoming WebHooksを使います。
ということで、まずプラグインを全部インストールしましょう。

# install fluent-plugin-record-modifier
fluent-gem install fluent-plugin-record-modifier

# install fluent-plugin-suppress
fluent-gem install fluent-plugin-suppress

# install fluent-plugin-slack
fluent-gem install fluent-plugin-slack

# install fluent-plugin-filter
fluent-gem install fluent-plugin-filter

その後、config設定します。
例えばこんな感じ。

# for logging td-agent
<match fluent.**>
  type record_modifier
  tag internal.message

  host ${hostname}
  include_tag_key
  tag_key original_tag
</match>

<match internal.message>
  type       filter
  all        allow
  deny       message: /^detected rotation of/, message: /^following tail of/, message: /^out_forest plants new output/
  add_prefix filtered
</match>

<match filtered.internal.message>
  type              suppress
  interval          10
  num               2 
  attr_keys         host,message
  remove_tag_prefix filtered.
  add_tag_prefix    slack.suppressed.
</match>

<match slack.**>
  type buffered_slack
  webhook_url https://hooks.slack.com/services/xxxx/xxxx
  team xxxx
  channel %23fluentd_warn # %23 means '#'
  username xxxx
  color danger
  icon_emoji :fluentd:
  buffer_path /tmp/td_slack_buffer
  flush_interval 5s
</match>

これでfluent-catでわざとエラーを発生させてslackが飛ぶかを確認しましょう。
これでfluentdが何か不思議な挙動をしたときは、把握できるようになります。
あぁ安心。