🐾

[Docker] Datadog Agent コンテナによるログ収集の仕組み

2024/09/18に公開

まえがき

Datadog Agent コンテナのログ収集の仕組みについて解説する。

ログ収集の仕組み

Dockerコンテナのログは、ホストの /var/lib/docker/containers に保存される。
Datadog Agentコンテナは、ホストの /var/lib/docker/containers をコンテナ上にマウントし、そこからログを読み取る。

より具体的な例を見てみる。
以下は、Datadog Agentコンテナを走らせるdocker run

docker run -d --name datadog-agent \
           --cgroupns host \
           --pid host \
           -e DD_API_KEY=<DATADOG_API_KEY> \
           -e DD_LOGS_ENABLED=true \
           -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \
           -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \
           -e DD_SITE=<DD_SITE>
           -v /var/run/docker.sock:/var/run/docker.sock:ro \
           -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
           -v /proc/:/host/proc/:ro \
           -v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \
           -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
           gcr.io/datadoghq/agent:latest



上記の -v /var/lib/docker/containers:/var/lib/docker/containers:ro の行に注目してほしい。
ホストの /var/lib/docker/containersをコンテナ上にマウントしていることが見て取れる。


つまり、ログ収集の流れは:
1/ アプリケーションコンテナのログが、ホストの/var/lib/docker/containersに保存される。
2/ Datadog Agentがそのディレクトリをコンテナ上にマウントし、ログを読み取る。


それでは、アプリケーションコンテナが、/var/lib/docker/containers以外のPathにログを出力している場合、どのようにログを取得すれば良いのだろうか。

ホスト上の任意のPathからログを取る方法

例えば、nginxコンテナのログを、ホストの /test/test.log に出力する場合。

/test/test.logを取得するための設定は以下の 2steps。

1/ /test/をAgentコンテナにマウント (-v /test/:/test/:ro)

docker run -d --name datadog-agent \
           --cgroupns host \
           --pid host \
           -e DD_API_KEY=<DATADOG_API_KEY> \
           -e DD_LOGS_ENABLED=true \
           -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \
           -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \
           -e DD_SITE=<DD_SITE>
           -v /var/run/docker.sock:/var/run/docker.sock:ro \
           -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
           -v /test/:/test/:ro \
           -v /proc/:/host/proc/:ro \
           -v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \
           -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
           gcr.io/datadoghq/agent:latest

2/ アプリケーションコンテナ(nginx)に--label com.datadoghq.ad.logsをつける

docker run --name=nginx-test --label com.datadoghq.ad.logs='[{"type":"file", "source": "nginx", "service": "taromn-nginx", "path": "/test/test.log"}]' -p 80:80 -d nginx

Datadog Agentは、アプリケーションコンテナのcom.datadoghq.ad.logsラベルから、ログ収集の設定(どのPathからログを取れば良いか、タグ情報など) を読み込む。

まとめ

  • Datadog Agentコンテナは、ログファイルを含むホストのディレクトリをマウントし、ログを読む。
  • アプリケーションコンテナにつけるラベルによって、ログ収集の設定をコントロール出来る。

Discussion