LoginSignup
3
4

More than 5 years have passed since last update.

fluentdで苦労している点

Last updated at Posted at 2016-10-24

v0.14系を使用しているがそもそも書き方で及び0.12系の書き方との差もソース見ながら四苦八苦。現在悩んでいることのメモ

テキストとバイナリの混在

使用しているのはmulti_tailなんだが、たまにバイナリが出てくるテキストで正規表現でこけるようなのだが、その結果tagがnilになる模様。

in_forwardのskip_invalid_eventで集約サーバ側は無視できるがこれがクライアント側に残り続ける(chunk?)。

in_tail前に事前処理

scrubで無効化すればいいんだがinputプラグイン前に割り込むってどうすればいいのだろうか。in_tail拡張するしかないのかなぁ?

10/29追記

v0.14なのでparseだけ拡張する形で対応
MultilineParserを利用して必要部分だけ変更

def parse(text, &block)
  unless text.valid_encoding?
    log.info "invalid byte sequence is replaced in `#{text}`"
    text = text.scrub('?')
  end
  super(text, &block)
end

def firstline?(text)
  unless text.valid_encoding?
    log.info "invalid byte sequence is replaced in `#{text}`"
    text = text.scrub('?')
  end
  super(text)
end

で指定側

<source>
  @type tail
  省略
  <parser>
    @type 作ったparser
    format_firstline 正規表現
    format1 正規表現
  </parser>
</source>

下記の通り、多分そのうちマージされるだろうからそれまでの暫定対応
https://github.com/fluent/fluentd/issues/1285#thread-subscription-status

失敗をトラップしてから再実行

これもscrubして同様になんだろうが
どうやって検知するもんだろうか。
エラー吐くプラグインとかあると思うがこのハンドリングとリカバリの仕方とかがわからない

単純にレコード捨てても良いのだがこのハンドリングの仕方がはっきりしないとどうにも対応できない

time sliced

大量にログを吐く環境でちょいと止まっているとすぐにnofに引っかかってしまう。
chunkの数を減らすのに使えないかと試してみたがintervalかつみたいなことはできないのだろうか

イメージはqueueなんだけどこのqueueを指定した時間は一つにまとめてくれる的な、まとめてくれなくてもintervalが来たら今あるものは送信を試みて、その間にきたものは指定したtime_keyに指定したものにまとめるとか。

time_key指定してもintervalにしたらこの時点でtime slicedとしては動かないみたいだし

forestの置き換え

どうも見る限りforest使用せずで記載することを想定しているようだがbufferのpath(ファイル名)とかにtag埋めたいとかできるのだろうか${tag}.*.logみたいな

out_secondary_file

time slicedのところにかぶるが、一定期間駄目だったらこちらでファイルに書き出して、nof対策とできないか?ただこれを再度投入するのにどうしたら良いかまだ調査出来てない。
fluent-binlog-readerなるものが追加されてるのでこれを使うんだろうが

3
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4