💬

AWS Distro for OpenTelemetryがログをサポートしたので収集してみた

2023/11/28に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

AWS Distro for OpenTelemetry (ADOT) がログをサポートしました。
ADOT Collector または OpenTelemetry SDK (Java, Java Script, .NET, Python) を使ってログを収集し、OTLP をサポートしているバックエンドへ転送が可能になります。

Fluent Bit があるからいいや、と思う人がいるかもしれません。まぁまぁそう言わずアップデートを見てみてください。
トレースやメトリクスを ADOT Collector や OTEL SDK を使って収集しているなら、ログも一緒にどうでしょうかという考えになるかもしれません。

また、トレースやメトリクスに付与している OTEL メタデータをログにも付与できれば、それぞれの紐付けができ、解析に役立つ可能性はあります。

ただ、Stability は beta となっています。Breaking Changes はあるかもしれないのでご留意ください。
AWS CloudWatch Logs Exporter

やってみた

ECS にアプリコンテナとサイドカー (ADOT Collector) を立てて /var/log/logFile.log に吐き出したログファイルを CloudWatch Logs に転送します。
CloudWatch Logs が一番お手軽なのでそうしていますが、バックエンドは OTLP をサポートしていれば OK です。(CloudWatch Logs に転送する意味はあまり無いですが、そういうツッコミはなしで)

img

ECS

今回は ECS on Fargate で試します。

ECS タスク定義は以下のようにしました。必要な箇所だけ書いています。省略した項目はよしなに設定してください。
ポイントは、volumes でタスクストレージを定義し、2つのコンテナで同じボリュームを見せています。アプリが出力したログファイルを OTEL Collector が読めるようにこうしています。

{
    "containerDefinitions": [
        {
            "name": "aws-otel-collector",
            "image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.35.0",
            "mountPoints": [
                {
                    "sourceVolume": "varlog",
                    "containerPath": "/var/log"
                }
            ],
            "secrets": [
                {
                    "name": "AOT_CONFIG_CONTENT",
                    "valueFrom": "adotconfig"
                }
            ]
        },
        {
            "name": "your_app",
            "image": "your_image:tag",
            "mountPoints": [
                {
                    "sourceVolume": "varlog",
                    "containerPath": "/var/log"
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "varlog",
            "host": {}
        }
    ]
}

SSM パラメータストア

SSM パラメータストアには ADOT Collector の Config を格納しています。
Filelog receiver で /var/log/*.log を拾っています。
AWS CloudWatch Logs Exporter でロググループ等の指定をしています。

receivers:
  filelog:
    include: [ /var/log/*.log ]

processors:
  batch:

  memory_limiter:
    limit_mib: 100
    check_interval: 5s


exporters:
  awscloudwatchlogs:
    log_group_name: "/ecs/your_app"
    log_stream_name: "logfile"
    region: "us-west-2"
    log_retention: 7

service:
  pipelines:
    logs:
      receivers: [filelog]
      processors: [memory_limiter,batch]
      exporters: [awscloudwatchlogs]

アプリケーションログ

あとはアプリケーション側で /var/log/ にログファイルを出力してあげれば OK です。
ログローテーションはアプリケーションで実装します。

まとめ

ADOT のログサポートを試してみました。
他の仕組みでログ転送は実現できていたかと思いますが、ADOT Collector だけで基本3種、ログ・トレース・メトリクスを取得できるようになったのは嬉しいケースがあるかもしれません。

参考

Container Logs Collector Configuration
AWS CloudWatch Logs Exporter
バインドマウント

Discussion