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ということで、こりゃまずい、と。メモリ使用量も気になるけど、コンテキストスイッチのコストの方が気になる。
で、対応方針としては
- タグの数を減らす
- fluentd をマルチプロセス化して、負荷を分散させる(メモリ使用量は変わらないけど)
- 問題を解決してくれるプラグンインを使う
あたりかなと。
02 は他の方針と併用できそうなのでキープしておきつつ、根本的な対応としては 01 か 03 のどちらかかなと考えた。 01 だとちょっと利便性が下がりそうだったので、03 かな〜と思ってプラグインを探してみるも、思ったようなプラグインが見つからなかった。
なので作成した、というのが理由。