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>
は何に使うのか忘れたので,現状未実装.
v11の実装でWorker側で処理出来るのは理解したけど,これって今のrootから順番に辿ってどんどん起動/終了していく,だとなんかまずい所がある?Worker側で直接start/shutdown/close呼ぶ必要がある?
grep系みたいにストリーム全体に対して行うフィルターはこれ系が必須だと思われる(過去のemits相当?).
<label @ERROR>
の場合,デフォルトだと失敗したEventStreamをそのまま渡すのが,現状のAPIを維持したままだとベターかなと.v11のようにemit(tag, time, record)が全体通して統一されていないv1(v0.10)だと,本当に1レコードずつ@ERROR
に流すなら,router.error_emit()みたいな便利メソッドを提供するか,format周りで適宜begin - rescue
を挟む感じになるかなと思っているああ,なるほど.しかし今のところ
<match fluent**>
で苦情は来てない感じがするし,当分は問題なさそう?