AWS Distro for OpenTelemetryがログをサポートしたので収集してみた
こんにちは。
ご機嫌いかがでしょうか。
"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 に転送する意味はあまり無いですが、そういうツッコミはなしで)
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