Skip to content

Instantly share code, notes, and snippets.

@frsyuki
Created September 24, 2012 03:20
Show Gist options
  • Save frsyuki/3774036 to your computer and use it in GitHub Desktop.
Save frsyuki/3774036 to your computer and use it in GitHub Desktop.
Fluentd v11 の実装状況

Fluentd v11 の実装状況

リポジトリ:https://github.com/frsyuki/fluentd-v11

Fluentdコアのコード行数が v10 の行数(3800行くらい)を超える前に、いったんα版をリリースしたいところ(gem install -v でバージョンを指定しないとインストールされないやつ)。もう3565行なのでわりと既に危ない。

概要:コアはだいたい動くようになったが、標準プラグイン群とプラグインの実装を支援するモジュールが未実装。

Fluentdコア

マルチプロセス

  • ProcessManager: だいたいできた。ProcessManager#runにheartbeatを追加すれば完了か。コードが激しく環境依存なので、WindowsやJRubyで動かすためにシングルプロセス用の実装が別途必要。
  • SocketManager: だいたいできた。シングルプロセス実装のProcessManagerではインスタンス化しない。
  • Supervisor: だいたいできた。live restart をサポート。デーモン化するコードが未実装。子プロセスの自動再起動を担当する #reboot_server メソッドに各種リミッタが未実装。

メッセージルーティング

  • MessageBus, LabeledMessageBus: できた。ただInputプラグインからラベル付きでemitする方法がないので、たぶん MessageBus#labeled_open メソッドの実装が必要。MessageBus に LabeledMessageBus を所有させるか。
  • フィルタ系: フィルタプラグインを扱う仕組みはできた。ただ、フィルタプラグインで tag の変更はできないので注意する必要がある(再emitが必要)。たぶんこの仕様のままで行く。

プラグインAPI

  • Plugin: できた。Plugin をグローバルな定数にしてしまっているけど、たぶん別な変数に入れた方が良い。どうしよう。
  • BufferedOutput: BufferプラグインのAPIが変わったのでリトライ周りが変更になっているが、だいたい旧コードからのコピペ。configure が未実装。secondary の実装がまだ無い。
  • TimeSlicedなんとか: 未実装。実はフィルタプラグインで実装できるのでは無いかと思っているのだけど、厳しいかも。
  • Mixin系: 何も無い。mixinを充実させるより、フィルタプラグインをたくさん作った方がずっと有用だと思っているので、あまり作らない方針にしたい。
  • テストフレームワーク: ぜんぜん未着手。誰か…

互換性維持系

  • OutputBackwardCompatWrapper: 新Engineが旧Outputプラグインがにemitするためのラッパ。動いている。
  • OutputForwardCompatWrapper: 旧プラグイン群が新Outputプラグインをインスタンス化して利用するするためのラッパ。動いている。
  • InputBackwardCompatWrapper: 新Engineが旧Inputプラグインをインスタンス化して利用するためのラッパ。動いている。
  • InputForwardCompatWrapper: 旧Inputプラグインが新Engineにemitするためのラッパ。動いている。
  • Engineの初期化: Cool.io のデフォルトループ以外は動いている。デフォルトループはどこで走らせるか迷う。

設定ファイル

  • Config::Parser: ほぼできた。変数展開用のruby_contextが未実装。
  • Config::ValueParser: リテラルパーサ。ELEMENT_ARG_STRING_CHARSET と NONQUOTED_STRING_CHARSET に少々迷いが見られるが、たぶん初版リリース後に考える。
  • Configurable: 未着手。設定ファイルにリテラルが導入されて型付きになった関係上、たぶん :time や :int への型マッピングの実装は少々膨らむ。型マッピングはプラガブルにしたい。

その他

  • ロガーがない。グローバル変数($log)を使うのはあまり良く無さそうだが、どこに入れよう。Rails 風に Fluentd.logger?
  • dRuby によるデバッグインタフェースを付けたいが、とりあえず後回しで。

標準プラグイン

  • buf_memory: 動いている。
  • buf_file: 空虚
  • in_tail: 空虚。なんとかする
  • in_http: 空虚。なんとかする
  • in_exec: 空虚。とりあえず旧APIの互換性維持レイヤーで凌ぐ予定
  • in_syslog: 空虚。とりあえず旧APIの互換性維持レイヤーで良いのでは
  • out_copy: 空虚。なんとかするが、fil_copy に大半の出番を奪われることになる。
  • out_roundrobin: 空虚。なんとかする
  • in/out_stream: 空虚。とりあえず旧APIの互換性維持レイヤーで凌ぐ予定。あとでin/out_unixだけなんとかする。
  • in/out_forward: 空虚。なんとかする

こんなプラグインが欲しい

  • fil_set: キー対応する値をセットするフィルタ。値には変数展開を使用できる。コンテキストに依存した値が展開される:タグや時刻、ホスト名などをセットできる。
  • fil_rewrite: キーに対応する値を書き換えるフィルタ。フィルタリングルールは正規表現か。型変換もサポート。
  • out_sqlite_buffer: SQLiteにバッファリングするOutputプラグイン。一定時間/一定数のレコードをバッファリングしたら、SQLを実行して集約されたデータをemitする。SQLによるストリーミング処理が目的。
  • buf_rdbms: リモートのRDBMSにバッファリングするBufferプラグイン。信頼性の高い共有バッファを作ることが目的。自分が欲しい。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment