fluent-plugin-jstatを作った

jstatの結果を入力とするfluent-plugin-jstatを作りました。

GitHub - wyukawa/fluent-plugin-jstat
fluent-plugin-jstat | RubyGems.org | your community gem host

JavaアプリケーションのモニタリングというとJMXが思い浮かぶと思いますが、
JMXはアプリ起動時に-Dcom.sun.management.jmxremoteとか指定しないといけないし、
JMXほど大げさじゃなくてもっとカジュアルにモニタリングしたい時もあると思います。

そんなときにはjstatが使えます。
jstatを使ったモニタリングは下記に詳しいです。ここではjstatの結果をderived経由でGrowthforecastに送っています。
derivedがプラグインアーキテクチャになってGrowthForecastに直接POSTできるようになったので、Javaのヒープのモニタリングをしてみた - blog.nomadscafe.jp

上記ブログのようなことをfluentdでやれないかな〜と思ってちょっと試してみました。
僕はhiveserverのモニタリングで試してみました。

fluentdのin_execでjstatの結果を受け取ってGrowthforecastに送るということも出来ると思いますが、
ものは試しでプラグイン作ってみました。

プラグインは簡単に作れました。in_gc_stat.rbをコピペしてちょろっと修正しただけですw

設定はこんな感じ。

<source>
  type jstat
  option -gcutil
  emit_interval 60
  tag hiveserver.jstat
  pid_path /var/run/hive-thrift.pid
  scale 100
</source>

jstatには監視対象のプロセスIDを渡さないといけないのでそこはpidファイルを指定するようにしました。
scaleはjstatコマンドの結果を何倍かしたいときに使います。

scaleのデフォルトは1、つまりjstatの結果をそのまま使います。out_stdoutで出力するとこんな感じです。

2014-03-17 13:44:36 +0900 hiveserver.jstat: {"S0":0.0,"S1":0.0,"E":1.25,"O":41.29,"P":63.54,"YGC":253.0,"YGCT":1.519,"FGC":252.0,"FGCT":137.145,"GCT":138.665}

scaleを100つまり100倍にするとこんな感じです。

2014-03-17 13:44:36 +0900 hiveserver.jstat: {"S0":0.0,"S1":0.0,"E":125.0,"O":4129.0,"P":6354.0,"YGC":25300.0,"YGCT":151.9,"FGC":25200.0,"FGCT":13714.5,"GCT":13866.5}

100倍したものをGrowthforecastに送って、Growthforecast側で1/100にします。

Growthforecastに送る設定はこんな感じ。ヒープ使用率とFull GC回数を送ってます。ホスト名を入れたかったのでfluent-plugin-forestも使いました。

<match hiveserver.jstat>
  type forest
  subtype growthforecast
  <template>
    gfapi_url http://example.com:5125/api/
    service hiveserver
    section jstat_${hostname}
    name_keys O,FGC
  </template>
</match>

グラフはこんな感じ

Full GCによりがつっとヒープが減ってますね。