fluentd-plugin-concatのtimeout_labelについて

前回までのまとめ

前回、分割されたdockerのログをどのようにして結合したかを記載しました。

今回はfluentd-plugin-concatの設定で用いたtimeout_labelについて記載します。

timeoutエラーが大量に発生する

最初はtimeout_labelを設定していませんでした。それでも正しく動作したのですが、CloudWatchのログを確認すると、大量のERRORが発生していました。

1
2
Throughput limits for the delivery stream may have been exceeded.
294 records failed to be delivered. Will retry.

結合されたログが正しくkinesisに出力されていなかったようです。

timeout_labelを追加する

timeout_labelを設定するとログを再ルーティングできると書いてあったので、ログを結合する箇所に timeout_labelを設定しました。そのlabelの先では、通常(タスク定義ファイルで設定した)通り、kinesisへデータを送るように設定します。

設定した箇所のconfを掲載します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter firelens**>
@type concat
key log
stream_identity_key partial_id
multiline_start_regexp /{"JSONの先頭":/
multiline_end_regexp /"JSONの終点"}$/
separator ""
timeout_label @TIMEOUT
</filter>

<label @TIMEOUT>
<match **>
@type kinesis_firehose
delivery_stream_name kinesis-data-stream
region ap-northeast-1
</match>
</label>

timeout_labelの設定をしなければ、filterディレクティブだけで設定は完了です。実際に転送するkinesisの設定は、タスク定義ファイルで行うからです。

しかし、今回timeout_labelの設定を行なって、その転送先として、タスク定義ファイルと同じ設定をしています。

これでtimeout_labelに引っかかったログは、正しい転送先へ送られます。

timeout_labelに引っかかったということはCloudWatchを見ると確認できます。

1
adding match in @TIMEOUT pattern="**" type="kinesis_firehose"

まとめ

Dockerのログが16kで切れてしまう問題について、記載してきました。fluentd-plugin-concatの設定が実際のログデータに依存してしまっているので、その辺りをDockerのログであるという普遍的なデータ(partial_idやpartial_lastなど)を用いて結合できるように設定できるとよりスマートかなと思います。今後はその辺りも調査していきたいと思います。