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 を使ってる。たいへん便利。
こんな感じで、負荷を抑えつつさくさくと監視をあれこれやりたいなあ、という人にはたいへん向いているのではないかと思う。