Fluentd meetup in Japanに参加してきたのでplugin書いてみた

“the missing log collector”ということで昨今話題のfluentdですが、日本での使用事例も増えてきたこともあり大規模なセミナーが開かれたので参加してきました。

内容はとても充実していて、作者の古橋さんによるfluentdの概要から始まり、pluginの書き方、実例と続いていて1日でfluentdに詳しくなれるすばらしいイベントだったと思います。古橋さんのセッションで今までよくわかってなかったbuffer pluginもイメージが持てましたし、@repeatedlyさんのプラグイン作りの指南書のおかげで何を作れば自分のやりたいことができるのかが分かってきました。cookpadとNHN*2の実例は非常に聴き応えのある内容だったので、もう一度資料見返しておこうと思います。

懇親会でfujiwaraさんにカヤックでの利用も聞いたり、doryokujinさんや古橋さんに色々とfluentやTDの話も聞けたし、fluentの生死監視はどうするのがいいだろうとかも盛り上がってすごい有益でした。

fluent-aggregate-filter plugin書いてみた

さて、前々からfluentdをサーバの統計情報収集ツールとして使いたいと思っていました。どういうものかというと、例えばvmstat 1の結果をfluentdに投げ続けると、1分毎に集計して最大最小や平均、95パーセンタイルなどにして1分間を代表する1レコードとして投げてくれるというもの。

今回セッションを聞いてFluent::TimeSlicedOutputを継承して、outputせずにもう一度emitするpluginを書けばoutputは自由なplugin使えるので良さそうと思い立って、1日費やして初めてのrubyをやってました。

まず、テスト駆動で書きたかったのでtagomorisさんの下記エントリを参考にして自分のllenvの環境下に作業環境を準備。

色々やってたらなんとかllenv exec rake -- testが通る様になったので無事書き始めました。rubyは慣れてくると書きやすいなぁという印象ですが、慣れるまで苦労しました。。。

というわけで、とりあえずそれっぽく動くかもしれないものはできました。

使い方としては以下の様なconfigになります。

<match debug.**>
  type aggregate_filter
  add_prefix aggregated  # optional(default aggregated)
  percentile 95          # optional(default 95)
</match>
<match aggregated.**>
  type stdout
</match>

こうすることで、

$  echo '{"aaa":1, "bbb":2}' | llenv exec fluent-cat debug.test
$  echo '{"aaa":3, "bbb":1}' | llenv exec fluent-cat debug.test
$  echo '{"aaa":5, "bbb":9}' | llenv exec fluent-cat debug.test
$  echo '{"aaa":1, "bbb":9}' | llenv exec fluent-cat debug.test

2012-02-05 22:25:00 +0900 aggregated.debug.test: {"aaa":{"num":4,"min":1,"max":5,"pct95":3,"sum":10.0,"avg":2.5,"var":2.75},"bbb":{"num":4,"min":1,"max":9,"pct95":9,"sum":21.0,"avg":5.25,"var":14.1875}}

みたいな感じで1分間のレコードをそれっぽく集計しています。初めてのrubyでも大体6時間くらいあればこのくらいまで作れるfluentdはすばらしいですね。このpluginはもうちょっとブラッシュアップしていこうと思います。