fluentd pluginを作ってみて
最近elasticsearchやらfluentdやらのことについて勉強していて、理解が浅いことに気づいたので、とりあえずfluentdのpluginを作ってみた。
fluent-plugin-nested-hash-filter | RubyGems.org | your community gem host
作ってみて気づいたことをメモ的にまとめておく。間違っていることもおおいにあるだろう。
テストはtest-unit
で
rspec
も使えるらしい記事はいろいろ出ているけど、guard
を併用するとなんか色々めんどくさい(というか諦めた)。
その煩わしさを味合うのは、rspec
を使って気持よく開発をする目的に反するきがしたので、test-unit
を使うことにした。
そもそもfluentdがベーシックにサポートしているのがtest-unit
だから、まぁいいんじゃないか、と。
普通のrubygemsとは異なるディレクトリ構造
普通なら、lib/{gem_name}.rb
を作ってメインでrequire
させるソースを用意して、追加のライブラリはさらにlib/{gem_name}/...
につくってくと思う。
fluentd用のソースは、基本がlib/fluent/plugin/
の下に作っていく。一つのプラグインでinputとoutputをそれぞれ提供するなら、lib/fluent/plugin/
の下に2つ(以上)のソースファイルができることになる。
名前空間を切っておこうとか、あまり考えないほうが楽そう。
fluentdに登録するプラグインのtype
登録するプラグインの種類と、typeの名前、そのソースファイル名は連動している。
https://github.com/fluent/fluentd/blob/master/lib/fluent/plugin.rb
def try_load_plugin(name, type) case name when 'input' path = "fluent/plugin/in_#{type}" when 'output' path = "fluent/plugin/out_#{type}" when 'filter' path = "fluent/plugin/filter_#{type}" when 'buffer' path = "fluent/plugin/buf_#{type}" else return end end
そこんとこ自分は、ドキュメントで読み飛ばしていたかもしれなくて、プラグインが読み込まれないと言って、時間を使ってしまった。
outputプラグインをfilter的に使う場合
タグの名前を変更できるようにするなり、何か工夫しないと、タグの名前が常に同一になるため、ループしてしまう。
今回は、タグ名にプレフィックスをつけてもらうようにしてみた。