Skip to content

Instantly share code, notes, and snippets.

@repeatedly
Last active August 29, 2015 14:05
Show Gist options
  • Save repeatedly/35cb03647b2ca01644e2 to your computer and use it in GitHub Desktop.
Save repeatedly/35cb03647b2ca01644e2 to your computer and use it in GitHub Desktop.
v1でのラベル and フィルタの実装

v11は互換性が無かったためガリガリと実装出来たが,v1ではそれは出来ないため,必要な機能だけうまくマージする必要がある.

Agent

プラグイン群の実行単位としてAgentを導入して,Engineはそのrootを指すようにした.ラベルもAgentの一部で,いくつかの処理はrootに委譲する. RootAgentはsourceを持てるが,Labelなどは実装的に持てなくなっている.

名前はcontextとかの方がいいかもしれない?

InputもOutputもAgentではない

v11でなんでこれらがAgentだったのか設計は覚えていないのだけど,多分問題ない?Inputがネストしたmatchを持てたからかな…?

もちろんHasNestedMatchモジュールも削除

EventRouter

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

Collector

v11でOutputやFilterをまとめてこう呼んでいたので,一部でこの名前をそのまま変数名やドキュメントで流用している.v11ではCollectorとしてAPIと提供していたが,v1ではFilterとOutputでAPIを同じにするのは難しいため,今回は入れてない

特別なラベル

<label @ERROR>があれば,デフォルトのemitエラー時の例外を投げるだけの処理を,Outputプラグインに投げるように置き換えることが出来る.

<label @LOG>は何に使うのか忘れたので,現状未実装.

@frsyuki
Copy link

frsyuki commented Aug 19, 2014

Worker側で直接start/shutdown/close呼ぶ必要がある?
いや、必要は無い。プラグインの実装は簡単になる。
以前(かなり前)のマルチプロセス実装だと、ネストしたoutputプラグインの内の子outputだけを別プロセスに割り付ける…みたいな設定が可能だったので、必要だった。

router.error_emit()みたいな便利メソッドを提供するか,format周りで適宜begin - rescue
便利メソッドを提供するのは良さそう。
そうするとoutputプラグイン側にもrouter(と言うか@ERRORラベルへのcollector)を持たせる必要があって、@ERRORラベル内のoutputがエラーを吐いたら無限ループしてマズイ…という話が起きうるので、RootAgentProxyWithoutErrorCollectorのようなハックがあった。

@repeatedly
Copy link
Author

ネストしたoutputプラグインの内の子outputだけを別プロセスに割り付ける…みたいな設定が可能だったので、必要だった。

OK. 把握した

flowcounterみたいなプラグインがあるから,それもどうするかだなぁ.結局routerが必要か…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment