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>
は何に使うのか忘れたので,現状未実装.