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

たごもりすメモ

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

fluent-plugin-numeric-monitor v0.1.0 and fluent-plugin-numeric-counter v0.1.0 released!

fluent

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 に該当するものすべてがカウントされる