my syntax suger

i have an unbeknown dictionary. everything is up to me.

Fluentd trouble shooting

随時更新。

buffer enqueue中にtd-agentのconfを書き換えてrestartしてはいけなかった

  • OS: Windows Server2016
  • td-agent: 3.1.1

何かしら例えばchunkがenqueue出来ずbufferに溜まり続ける事象が発生し、その場でconfを変更しfluentdのthreadを再起動した場合、conf変更前と変更後のchunkが存在しenqueueする時に不整合が発生してしまい当該事象が直らない可能性がある。

confを変更した後は、一度fluentdをstopしてからchunkをflush、もしくは削除し、キレイになってからstartした方が良いとのこと。

chunkのlimit sizeを指定しない場合発生する可能性のある問題

  • OS: Windows Server2016
  • td-agent: 3.1.1

以下のエラーが td-agent.log に出力されている。

[error]: #0 unexpected error while checking flushed chunks. ignored. error_class=NoMethodError error="undefined method `<' for nil:NilClass"
[warn]: #0 failed to flush the buffer. retry_time=0 next_retry_seconds=yyyy-mm-dd tt:mm:ss +0900 chunk="xxx" error_class=Elasticsearch::Transport::Transport::Errors::RequestEntityTooLarge error="[413] {\"Message\":\"Request size exceeded 104857600 bytes\"}"
[error]: #0 unexpected error error_class=Errno::EMFILE error="Too many open files - C:/path/to/log/iis_httperr.pos"

恐らく以下の流れ。

  • confのformatに合わないログの出力があり [error] NoMethodError error="undefined method が出力される。
    • これに関してはformatの正規表現をちゃんとする。
  • 当該時間帯からchunkがbufferに溜まり始める。
  • 更にElasticsearch側がHTTPリクエスト可能なpayload dataサイズが100 MiBまでである為、それを超えるchunkもElasticsearch側が受け付けず溜まり始める。
    • node sizeにより最大サイズは異なる。
  • chunkがbufferに溜まり続け、 [error] Too many open files のエラーが大量に出始める。

chunkを確認したところ、数百MBにもなるchunkが存在した。この状態ではfluentdを再起動しても failed to flush the buffer が出続ける。

そこで chunk_limit_size を100MiB以内に抑えfluentdを再起動。生成されるchunkは指定したサイズ以下で生成されるようになり、当該エラーは解消された。

flush_intervalを指定してもflushされない場合

  • OS: Windows Server2016
  • td-agent: 3.1.1

flush_interval を設定している場合、chunkサイズが指定した閾値を超えたか、flush_intervalの時間を超過した場合にflushされる。 flush_interval の設定が無い場合もchunkサイズが指定閾値を超えた場合はflushされるが、加えてtimekey(+timekey_wait)で指定した時間を超過した場合にflushされる。

はずだったが、 flush_interval の指定間隔でflushされない事象が発生。一部のstoreで当該オプションが効いていない模様。 flush_interval を指定せず、timekey方式でflushすることに。