流れてくるメッセージから指定したフィールドの値を定数倍して再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 を使ってる。たいへん便利。
こんな感じで、負荷を抑えつつさくさくと監視をあれこれやりたいなあ、という人にはたいへん向いているのではないかと思う。