たごもりすメモ

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

fluent-plugin-amplifier-filter released!

流れてくるメッセージから指定したフィールドの値を定数倍して再emitする fluent-plugin-amplifier-filter をリリースした。

tagomoris/fluent-plugin-amplifier-filter · GitHub
fluent-plugin-amplifier-filter | RubyGems.org | your community gem host

なんに使うものかというと、以前作った fluent-plugin-sampling-filter と組み合わせるため。具体的に書くと以下のような構造になる。

  • 監視系の fluentd は基本的に統計的な処理しかしない
    • 全件データはいらないから sampling-filter を通した一部のログだけを流したい
  • datacounter の出力を使って監視とかやりたい
    • datacounter はパーセンテージとレート(msg/sec)を出す
  • 監視やるときにサンプリングレートのことを考えたくない
    • 流量の多いサービスと少ないサービスでは sampling-filter のサンプリングレートを変えてある
    • あまりにサンプル数が少ないと適切な統計量が取れなくなるので
    • しかし監視を設定するときに、サンプリングレートまで考慮したレートを閾値に指定したり値を読ませたりするのは混乱を招く

このような動機があり、監視系で流量を抑えるためにサンプリングはしたい、しかし指標値は実メッセージ数ベースで出したい(近似値でよい)、という目的を満たすためにこのようなプラグインを書いた。
だいたい以下のような感じで使ってる。

# 全件流れてる側のFluentd
<match hoge.**>
  type copy
  <store>
    # 全件に必要な処理
  </store>
  <store>
    type sampling-filter
    interval 10
    add_prefix sampled.10
  </store>
</match>
# 別のタグで sampled.100 などもある
<match sampled.**>
  type forward
  # 監視系に送る
</match>

監視側では以下のように。(まだ実際には設定してないパターンもあるけど、だいたいこんな感じで使う、という話)

<source>
  type forward
</source>

<match sampled.10.*>
  type route
  remove_prefix sampled.10
  <route {service1,service2}>
    add_tag_prefix referer_count.10
    copy
  </route>
  <route service2>
    add_tag_prefix url_user_register_count.10
    copy
  </route>
  # 以下チェックしたい個別の内容ごとに add_tag_prefix + copy して流してやる
  <route *>
    add_tag_prefix httpstatus_count.10
    copy
  </route>
</match>

<match sampled.100.*>
  # sampled.10 と同様に書いていく
</match>

<match referer_count.10>
  type datacounter
  tag 10.datacount.referer
  aggregate tag
  input_tag_remove_prefix referer_count.10
  count_key referer
  pattern1 yahoo ^https?://[-.a-zA-Z0-9]\.yahoo\.co(m|\.jp)(/|$)
  # 以下パターン
</match>
# 以下監視内容毎に datacounter を tag RATE.datacount.HOGE のようなタグ出力で記述

<match 10.datacount.*>
  type amplifier_filter
  ratio 10
  remove_prefix 10
  key_pattern .*_(rate|count)$
</match>
<match 100.datacount.*>
  type amplifier_filter
  ratio 100
  remove_prefix 100
  key_pattern .*_(rate|count)$
</match>

<match datacount.*>
  # 以下 GrowthForecast などへの出力
</match>

このように SAMPLING_RATE.tag のようなタグにしておくことで、最後の方で一括して amplifier-filter にかけて実レート値への変換をやっておける。便利。なお監視項目への振り分けは https://twitter.com/#!/frsyuki/statuses/171795899297697792:out_route を使ってる。たいへん便利。

こんな感じで、負荷を抑えつつさくさくと監視をあれこれやりたいなあ、という人にはたいへん向いているのではないかと思う。