fluent-plugin-numeric-monitor v0.1.0 and fluent-plugin-numeric-counter v0.1.0 released!
Fluentdメッセージ中の数値の統計・集計をとるためのプラグインをふたつリリースしたのでその話。numeric-monitorは前に 0.0.x 系のバージョンでいちおう出してたけど、自分の手元でもちゃんと使い始めたので v0.1.0 として改めてリリースした。
fluent-plugin-numeric-counter
fluent-plugin-numeric-counter | RubyGems.org | your community gem host
tagomoris/fluent-plugin-numeric-counter · GitHub
このプラグインは数値の上下範囲にマッチするメッセージをカウントする。数値版の datacounter みたいなものだと思えばよい。出力も datacounter の出力内容とまったく同じ。
Fluentd Casualのときの @fujiwara さんの話にあったレスポンスタイム毎の割合のグラフ化はやってなかったので真似ようと思ったんだけど、datacounter で正規表現を使って無理矢理数値を評価するというのはちょっとアレな気がする、と思ってたので、ついでにさくっと作った。
機能としては簡単、パターン毎に数値をふたつ(x, y)指定しておくと x <= N < y に該当する数値をもっているメッセージの数をカウントする。最後のパターンに限っては上限値を指定しないこともできる*1。文字列でも数値化して検査するし、小数点が含まれていてもOK。負数もいちおう大丈夫(のはず)。バイト数などを検査する場合には 10k のような指定もできる(基数は1024)。
fluent-plugin-numeric-monitor
fluent-plugin-numeric-monitor | RubyGems.org | your community gem host
tagomoris/fluent-plugin-numeric-monitor · GitHub
指定したフィールド(の数値)について、min/max/avg および指定したパーセンタイル値を算出する。パーセンタイル値は複数指定できるので、たとえば 90, 95, 98, 99 パーセンタイル値をそれぞれ出力したりできる。(また単純に検査対象になったメッセージ数 num も出力する pullreq もmergeした。thx @kentaro !)
これにやはりレスポンスタイムの数値を食わせてやったりすると、時系列でWebサービスのレスポンスがどのように推移するかがばっちりわかる。95パーセンタイル値はたいして変わってないけど98パーセンタイル値が極端に悪化しててなんだこれ、みたいなのが見えてきて割と面白い。
レスポンスタイムの集計・統計と可視化
これらのプラグインを使って以下のように設定することで、サービス毎にレスポンスタイムの推移をがっつり可視化することができるわけですね!
<match accesslog.**> type copy <store> type numeric_monitor input_tag_remove_prefix accesslog unit minute tag monitor.responsetime aggregate tag monitor_key duration percentiles 50,90,95,98,99 </store> <store> type numeric_counter input_tag_remove_prefix accesslog unit minute tag numcount.responsetime aggregate tag count_key duration pattern1 u100ms 0 100000 pattern2 u500ms 100000 500000 pattern3 u1s 500000 1000000 pattern4 u3s 1000000 3000000 pattern5 long 3000000 </store> </match> <match {monitor.responsetime,numcount.responsetime}> type forest subtype growthforecast <template> gfapi_url http://growthforecast.local/api/ service accesslog tag_for section </template> <case monitor.responsetime> remove_prefix monitor name_key_pattern .*_(min|max|avg|percentile_\d+)$ </case> <case numcount.responsetime> remove_prefix numcount name_key_pattern .*_percentage$ </case> </match>
これだけでこんな感じのグラフがサービスごとに作成されてやっほう! というように大変お仕事が捗ります。
500ms以上かかってるリクエストがけっこうあるようですね! あと2〜4時のあいだに何か起きてるように見える。というようなことが一目瞭然ですね!!!!!
どうぞお使いください。
*1:x <= N に該当するものすべてがカウントされる