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なるものが追加されてるのでこれを使うんだろうが