FireLens/fluentbit構成の見直しと改修


FireLensの記事は一旦完了したのですが、気になる部分を改修します。4回目の記事です。
修正済みのリソースをV2ブランチに反映しました。
https://github.com/antennix/firelens/tree/v2

1回目 firelensを使用した、ログ分割と監視処理
2回目 ローカルで、datadog/S3へデータを転送できるdockerイメージを作成する
3回目 Firelensで、datadog/S3へデータを転送できるdockerイメージを作成する

改修箇所

datadogからS3にアップロードせず、全てfluentbitからS3にアップロードする

図表ではLogB,LogCはdatadogを経由し、S3へアップロードされる想定でしたが
ログアップロードの通信をAWS内で完結させようと考えました。
その為、datadogはリアルタイムアラートのみ対応し、その後ログを破棄します。

以前の構成(1回目)

今回

webコンテナのログ出力をJSON形式→文字列に戻す

必ずしもJSONでログを出力する必要は無く、通常の文字列の出力に戻すことにしました。
より疎結合で良いかと思います。

三種類のログをfluentbitで受け取る部分は同じですが、分類方法を見直します。

1. LogA(アクセスログ):stdoutのもの
2. LogB(エラーログ):stderrのもの
3. LogC(アプリケーションログ):stdout/stderrに関わらず、ログの先頭に「application」の識別子が付与されているもの

fluent-bitのstream-processor見直し

stream-processorも再設計します。
この処理の流れは一見分かりにくく、フローを図にしました。概ね下記の様な流れになると認識しています。

docker-composeで付与タグの定義

前回の構成では、webコンテナから標準出力されたログにTagが付与されていない状態でした。
FireLensの挙動に合わせ、docker-composeレベルでTagを定義し、ログの照合に使用します。

docker-compose.yml
    logging:
      driver: fluentd    
      options:
        tag: "service-firelens-xxx"
        fluentd-address: "localhost:24224"
        fluentd-async-connect: "true"

ログのプロセス

以上の処理の結果、ログが下記のように出力されます。
書式がこんな感じで変わるというイメージだけ掴んで頂ければと思います。

LogA
web-container-out
172.23.0.1 - - [16/Dec/2019:15:44:49 +0000] GET / HTTP/1.1 200 23578 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 8956
fluentbit-continer-in
[0] xxx-firelens-xxx: [1576511089.000000000, {"source"=>"stdout", "log"=>"172.23.0.1 - - [16/Dec/2019:15:44:49 +0000] GET / HTTP/1.1 200 23578 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 8956", "container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1"}]
fluentbit-continer-out
[0] access: [1576511781.000000000, {"source"=>"stdout", "message"=>"172.23.0.1 - - [16/Dec/2019:15:56:21 +0000] GET /?exception HTTP/1.1 200 - - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 2209", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"access"}]
LogB
web-container-out
exception
fluentbit-continer-in
[0] xxx-firelens-xxx: [1576511122.000000000, {"container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1", "source"=>"stderr", "log"=>"exception"}]
fluentbit-continer-out
[0] error: [1576511781.000000000, {"source"=>"stderr", "message"=>"exception", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"error"}]

LogC

web-container-out
application error error-text
fluentbit-continer-in
[1] xxx-firelens-xxx: [1576511198.000000000, {"log"=>"application error error-text", "container_id"=>"a8b309523a4352f95164b67ab0b19cfd9104b76e51cab930a8ac7060d8707c41", "container_name"=>"/firelens_web_1", "source"=>"stderr"}]
fluentbit-continer-out
[0] application: [1576511737.000000000, {"status"=>"error", "message"=>"error-text", "source"=>"stderr", "container_id"=>"b6fcbeebca39a0b06822f7b16df1de80cd1245521392354fe48b2f915a421834", "container_name"=>"/firelens_web_1", "service"=>"application"}]

その他改修

fluentbitのS3アップロードプラグインのバージョンアップに伴い
追加の修正を行いました。
S3 Prefixのバグや、複数箇所へのS3のアップロードに対応できているようです。

まとめ

当初理解が不足していた部分を補完し、反映できました。
宜しくお願いいたします。