v11は互換性が無かったためガリガリと実装出来たが,v1ではそれは出来ないため,必要な機能だけうまくマージする必要がある.
プラグイン群の実行単位としてAgentを導入して,Engineはそのrootを指すようにした.ラベルもAgentの一部で,いくつかの処理はrootに委譲する. RootAgentはsourceを持てるが,Labelなどは実装的に持てなくなっている.
名前はcontextとかの方がいいかもしれない?
v11でなんでこれらがAgentだったのか設計は覚えていないのだけど,多分問題ない?Inputがネストしたmatchを持てたからかな…?
もちろんHasNestedMatchモジュールも削除
Agentの中で実際にtagをルーティングする所.Filterもこの中でハンドリングする.OutputもFilter群も,キャッシュすればそれなりに高速に動くはず
上から順番に適用される
class Filter
def filter(tag, time, record)
# record_reformerなどレコード本体を弄る向け
# recordを返り値にすべき?
end
def filter_stream(tag, es)
# filter_streamはデフォルトではfilterメソッドを呼ぶ
# esを返す必要がある
# grepなどのプラグインはこちらをoverwriteする
end
end
v11でOutputやFilterをまとめてこう呼んでいたので,一部でこの名前をそのまま変数名やドキュメントで流用している.v11ではCollectorとしてAPIと提供していたが,v1ではFilterとOutputでAPIを同じにするのは難しいため,今回は入れてない
<label @ERROR>
があれば,デフォルトのemitエラー時の例外を投げるだけの処理を,Outputプラグインに投げるように置き換えることが出来る.
<label @LOG>
は何に使うのか忘れたので,現状未実装.
Agentは、起動/終了操作のために追加したもの。ネストしたAgentを持つAgent(≒ネストしたoutputプラグインを持つoutputプラグイン。例えばout_copyとか)があるときに、その起動と終了をプラグイン側でなくFluentdコア(Worker)で処理するため。主にはマルチプロセス対応で必要だった。
HasNestedMatchは、RootAgentとLabelでコードを共通化する目的が主。lib/plugin/*以下にあるモジュールでは無いので、プラグイン向けAPIではない。
filter_streamメソッドを入れるか否かは、
<label @ERROR>
をどう実装するかを一度考慮した方が良いと思う。grep系はfilterでnilを返しても良いので。<label @LOG>
は、fluent.* の置き換え。<match **>
で fluent.* が混じるのを避けたい人向け。あと
<label @LOG>
内の<match PLUGIN_NAME>
で、特定プラグインからのログだけを収集できるようにする目論見もあった。