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的に使う場合

タグの名前を変更できるようにするなり、何か工夫しないと、タグの名前が常に同一になるため、ループしてしまう。

今回は、タグ名にプレフィックスをつけてもらうようにしてみた。