Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プラグイン開発者から見るfluentd v1.0の活用法

プラグイン開発者から見るfluentd v1.0の活用法

TD Tech Talk 2018 OSS Day

Tomohiro Hashidate

February 17, 2018
Tweet

More Decks by Tomohiro Hashidate

Other Decks in Programming

Transcript

  1. self.inspect @joker1007 Repro inc. CTO やってること DB のスキーマ改善、データ仕様の変更 fluentd を中心にしたデータフローの設計構築

    Bigquery やhive, presto を使ったバッチフローの設計構築 インフラのコード化とメンテ Docker, ECS の利用環境を整備 外向きの技術発表 最近、ハンター業が忙しい
  2. プラグイン開発者から見たv1.0 の利点 parser, formatter, buffer が明確に分離され、 config セクションとして独立したこと 今迄、input やoutput

    プラグインの中でフラットに設定が記述され ていて、標準的なやり方が無かった。 v1.0 になることで、それらを選択設定する方法の標準ができたの で、各プラグインに対するポータビリティがめっちゃ向上した。 filter で頑張って加工したりmixin を突っ込まなくても、データの入 出力に任意のフォーマットを利用できる。
  3. プラグイン開発者がやるべきこと 独自のパース処理やフォーマット処理ではなくplugin helper を利用 する f o r m a

    t t e r _ c o n f i g = c o n f . e l e m e n t s ( " f o r m a t " ) [ 0 ] @ f o r m a t t e r = f o r m a t t e r _ c r e a t e ( u s a g e : ' o u t _ b i g q u e r y _ f o r _ l o a d ' , c o n f : f o r m a t t e r _ c o n f i g , d e f a u l t _ t y p e : ' j s o n ' ) d e f f o r m a t ( t a g , t i m e , r e c o r d ) @ f o r m a t t e r . f o r m a t ( t a g , t i m e , r o w ) e n d
  4. v1.0 のoutput プラグイン開発 最も大きく機能が変わったのがoutput プラグインのAPI metadata を利用したchunk をサポート これによりTimeSliced の区別が無くなる

    delay commit のサポート chunk_limit_records のサポート 加えて各種プラグインヘルパーにより開発がとても楽になった。
  5. chunk with metadata v1.0 からmetadata をキーにしてbuffer chunk を分けられる様になっ た。 metadata

    とは以下のものを差す。 tag time record のproperty そして、キーに利用したメタデータはconfig 上でplaceholder として 利用可能になる。
  6. fluent­plugin­bigquery の例 < m a t c h b q

    . { h t t p _ l o g s , a p p _ l o g s } > @ t y p e b i g q u e r y t a b l e $ { t a g [ 1 ] } $ % Y % m % d s c h e m a _ p a t h s c h e m a s / $ { t a g [ 1 ] } . j s o n < b u f f e r t a g , t i m e > t i m e k e y 1 d < / b u f f e r > < / m a t c h >
  7. プラグイン側の対応方法 p l a c e h o l d

    e r _ v a l i d a t e ! と e x t r a c t _ p l a c e h o l d e r s を利用する p l a c e h o l d e r _ p a r a m s = " p r o j e c t = # { @ p r o j e c t } / d a t a s e t = # { @ d a t a s e t } / . . . 省略" p l a c e h o l d e r _ v a l i d a t e ! ( : b i g q u e r y , p l a c e h o l d e r _ p a r a m s ) p r o j e c t = e x t r a c t _ p l a c e h o l d e r s ( @ p r o j e c t , c h u n k . m e t a d a t a ) d a t a s e t = e x t r a c t _ p l a c e h o l d e r s ( @ d a t a s e t , c h u n k . m e t a d a t a )
  8. helper によるデータ加工方法の共通化 よく利用する処理がplugin helper として再利用可能になり、config の項目も標準化されたため、プラグインでのデータ加工が簡単に なった。 利用しやすいものは以下。 extract (

    レコードからタグや時間として利用するものを抽出す る) inject ( レコードにタグやタイムスタンプ等のメタデータを注 入する) record_accessor ( レコードの中のデータを文字列のフォーマ ットを利用して取得する) これらを利用することで、プラグイン独自に対応しなければいけ ない範囲はかなり少なくなる
  9. その他プラグイン開発で意識すること 多機能化はダメ絶対! fluent­plugin­bigquery は悪い例 私がload とか追加してしまったので、整理したい…… 組込のhelper やその組み合わせで解決できないか考える thread や子プロセスを利用する場合のハンドリング等

    大分便利になってるので、plugin_helpers 以下は一通り読 んでおくと良い 無理にマルチバージョンサポートをしない 0.12 系はそろそろ機能追加等を打ち切って良いと思う 設定の互換性は維持できても、同一のコードベースでは placeholder 等が使えない どうにもメンテできない場合は、人に譲る