fluent-plugin-parameterized-path を作成した

fluent-plugin-parameterized-path という fluentd のプラグインを作成した。

どんなプラグイン

  • ログをファイルに出力するプラグイン
  • 指定したキーの値から、出力するファイルのパスを決定する。
  • out_file とほぼほぼ同じ機能がある。symlink_path は未実装。

例えば以下の設定を書き 

<match dummy>
    @type parameterized_path
    path_prefix /var/log/subs
    path_key path_is_here
</match>

次のレコードが送られてきた場合

{"path_is_here": "/oh/my/log", "message": "hello"}

/var/log/subs/oh/my/log.2016121416.log というファイルが作成され、内容は 2016-12-14T16:18:20[TAB]dummy[TAB]{"message":"hello"} のようになる。

なぜ作ったのか

最初は fluent-plugin-forest を使おうと考えていたのだが、送られてくるタグの数を計算してみると 1000 を超えそうだった。fluent-plugin-forest はタグごとにスレッドを作成するようで、タグが1000ということはスレッドが1000ということで、こりゃまずい、と。メモリ使用量も気になるけど、コンテキストスイッチのコストの方が気になる。

で、対応方針としては

  1. タグの数を減らす
  2. fluentd をマルチプロセス化して、負荷を分散させる(メモリ使用量は変わらないけど)
  3. 問題を解決してくれるプラグンインを使う

あたりかなと。

02 は他の方針と併用できそうなのでキープしておきつつ、根本的な対応としては 01 か 03 のどちらかかなと考えた。 01 だとちょっと利便性が下がりそうだったので、03 かな〜と思ってプラグインを探してみるも、思ったようなプラグインが見つからなかった。

なので作成した、というのが理由。