たごもりすメモ

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

fluent-mixin-config-placeholders released! もしくは fluentd mixin gemの話

fluent-plugin-webhdfs で path にホスト名を使いたいなーと思った*1ところ、全員にいちいち fluent-plugin-config-expander を hostname のためだけに使えというのも無いなということで、Mixin化して設定の解釈にプレースホルダを提供することにした。で、書いたのでリリースした。

fluent-mixin-config-placeholders | RubyGems.org | your community gem host
tagomoris/fluent-mixin-config-placeholders · GitHub

使いかたは簡単。依存関係に上記 gem を含めておいた上で、プラグインソースコードで以下のようにするだけ。

require 'fluent/mixin/config_placeholders'

class HogeInput < Fluent::Input
  # ...
  config_param :hogefield, :string

  include Fluent::Mixin::ConfigPlaceholders

  def configure(conf)
    super # ここ以降、設定文字列に書かれているプレースホルダが全部展開した状態で参照できる

    @hogefield #=> 'xxx.server.local.zzz'
  end
end

この mixin はプラグインの設定全域(ただし文字列に限る)でプレースホルダの使用を可能にする。*2

上記のプラグインについて以下の設定を適用したとする。

<source>
  type hoge
  hogefield xxx.${hostname}.zzz
</source>

すると HogeInput#configure 内において(superの呼び出し後に) @hogefield を参照すると ${hostname} は実際のホスト名*3で置き換えられた後の文字列となっているはず。
また他に ${uuid:random} , ${uuid:hostname} , ${uuid:timestamp} や ${uuid}*4 も使えるようにしてある。ホスト名はいらないけど実行時にはノード毎に別々の文字列が欲しい、というときに使えるはず。

こういうのが欲しいケースもままあるんじゃないでしょうか。どうぞお使いください。

なお、これを取り込んだ状態で fluent-plugin-webhdfs v0.1.0 もリリースしてある。

fluentd mixin をもっと作ろうよ、の話

じつはこのテの fluentd plugin で使える mix-in をリリースしたのは初めてではなかったりする。out_file_alternative や out_hoop, out_webhdfs で共通してプレーンテキストでのログ出力のフォーマットに使えるものがあって、これはくくりだしてmixin化してある。

fluent-mixin-plaintextformatter | RubyGems.org | your community gem host
tagomoris/fluent-mixin-plaintextformatter · GitHub

ログ出力時の整形といった処理はいろいろな出力プラグインで必要になることは多分明らかで、そのときにこういう形でmixin gem化してあれば、新しい出力先に対応する output plugin を書く人は書き出し先へのアクセス制御に集中することが可能で、データの整形という、本気でやればそれだけでかなり面倒くさい処理の記述をいっきにバイパスすることができる。

で、自分の言いたいのは plaintextformatter を使えということではなくて。いかにも共通で必要になりそうな処理はmixinとしてみんなで共有しようぜ、ということ。
もちろん他のプラグインがやっていることをコピペして自分のプラグインに持ってきてもいいけど、コピペ元でその部分がアップデートされたりしたら追随も面倒だし、そもそもコピペ元のアップデートに気付かなくて仕様の差ができたりしたらユーザも混乱する。

だから「あのプラグインのあの処理いいな」と思ったら、みんなでがんがん外部mixin化して共有すればいいと思う。メンテも楽になるしプラグイン作成も楽になる。いいことだらけだと思う。

*1:複数ノードからHDFS上のひとつのファイルに書き込みに行くと高確率でひどいことになるので、書き込み先を分けたい、という要求による

*2:特定の設定項目だけで有効にするという指定方法があってもいいかな、と今おもった……

*3:hostname コマンドの実行結果

*4:これは uuid:random のalias