fluentdでメッセージ送信失敗した場合のハンドリングをどうするか

fluentdは普段元気に動いていて特に問題は無いのですが、私の環境ではごくまれに数ヶ月に1回くらい使用メモリが徐々に増大してqueue size exceeds limitというバッファ溢れを起こすときがあります。この場合メッセージ送信が失敗しますしfluentdのログが爆発します。

対処策としてはfluentdを再起動すればOKなのですが、毎回手動で再起動するのも面倒なので現在は自動化しています。もっとも自動化してからはまだqueue size exceeds limitは起きてないので自動化がうまくいっていったかどうかは未確認です。

どういうふうに自動化しているかというとfluentdのログをcronで定期的にチェックしてqueue size exceeds limitがあったらfluentdを再起動するというものです。

またさらにメッセージ送信失敗したデータがあるのでこれを別途hadoopコマンドでputします。言い忘れましたが私の環境ではredisからデータを取ってきて fluent-logger-rubyを使ってfluentdにpostし、webhdfs経由でHDFSにデータを送っています。使用しているのはfluentd 0.10.30, fluent-logger-ruby 0.4.3です。

注意点としては以下のように書くとうまくいきません。postに失敗した場合は例外をthrowしないからです。

log = Fluent::Logger::FluentLogger.new(...)
begin
  log.post(...)
rescue Exception => ex
  #送信に失敗した場合にデータをローカルに書き出し。
end

なのでこんな感じに書きます。

log = Fluent::Logger::FluentLogger.new(...)
result=log.post(...)
if !result
  #送信に失敗した場合にデータをローカルに書き出し。
end