🐶

Datadog でコンテナ内のログファイルを収集する

2022/08/20に公開

はじめに

Datadog でコンテナのログを収集する際、stdout/stderr に出力されるログは比較的簡単に収集が可能ですが、コンテナ内に出力されたファイルからログを収集するにはひと手間必要です。
このあたりの設定方法は以下の公式ドキュメントに記載されてはいるのですが、少し分かりづらかったのでこの記事でまとめてみようと思います。
https://docs.datadoghq.com/ja/containers/docker/log/?tab=containerinstallation

なお、以降は Datadog Agent を Docker コンテナとして実行した場合の設定方法について説明します。
(ホストに直接インストールした場合については試していないため)

設定する内容

先に以降で設定する内容についてまとめておきます。
コンテナ内のログファイルを Datadog で収集するには以下の設定が必要となります。

  1. 収集対象のコンテナと Datadog Agent コンテナ間でログファイルを共有する
  2. 収集対象のコンテナに、ログ収集設定をラベルとして設定する

1.については、収集対象のコンテナと Datadog Agent との間で同じボリュームをマウントし、そこにログを出力するようにします。

2.についてはログ収集設定の JSON 文字列をラベルとしてコンテナに設定します。

収集対象のコンテナと Datadog Agent コンテナ間でログファイルを共有する

Datadog Agent がログファイルを参照するためには、同じボリュームまたはホストのディレクトリをマウントし、そこにログを出力する必要があります。
以下では対象のコンテナが /var/log/app 以下にログを出力すると仮定します。

ボリュームをマウントする場合

以下のように Docker ボリュームを作成し、収集対象のログ出力ディレクトリ(/var/log/app)にマウントします。

services:
  application:
    (snip)
    volumes:
      - app_logs:/var/log/app

volumes:
  app_logs:
    name: app_logs
    driver: local

Datadog Agent からも同じボリュームをマウントします。
マウント先はどこでも良いのですが、収集対象のログ出力ディレクトリと同じパスにしておいたほうがわかりやすいと思います。
また、Datadog Agent からは書き込みできないよう :ro をつけてマウントするのが良いと思います。

docker run \
  (snip)
  -v app_logs:/var/log/app:ro \
  gcr.io/datadoghq/agent:latest

(公式ドキュメントに倣って、Datadog Agent は docker run で起動するようにしています)

ホストのディレクトリをマウントする場合

ホスト上でもログを確認したい場合などは、ホストのディレクトリをマウントして共有することも可能です。
この場合、パーミッションの問題などがあるため注意が必要です。

services:
  application:
    (snip)
    volumes:
      - /path/to/host:/var/log/app
docker run \
  (snip)
  -v /path/to/host:/var/log/app:ro \
  gcr.io/datadoghq/agent:latest

収集対象のコンテナに、ログ収集設定をラベルとして設定する

収集対象のコンテナに対して、ログ収集設定の JSON 文字列をラベルとして設定します。
設定するラベルは以下のようなものです。

services:
  application:
    (snip)
    labels:
      com.datadoghq.ad.logs: '[{"type": "docker", "service": "application"}, {"type": "file", "service": "application", "path": "/var/log/app/*"}]'

ここでは2つの設定をおこなっています。

1つ目は

{"type": "docker", "service": "application"}

です。
これはコンテナの stdout/stderr を収集するための設定です。
Datadog Agent をコンテナとしてデプロイして DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true の設定をしている場合基本的には自動で stdout/stderr が収集されますが、ファイルから収集する設定を行う場合はこのように明示的に指定してあげる必要があります。
もし stdout/stderr を収集する必要がなければ、この指定は不要です。

2つ目は

{"type": "file", "service": "application", "path": "/var/log/app/*"}

で、こちらがファイルからのログ収集設定となります。
"path" に収集するログファイルのパスを指定します。
注意点としては、このパスは Datadog Agent コンテナ内から見たパス である点です。
つまり、上記で Datadog Agent コンテナにマウントしたパスを指定する必要があります。
(マウント先を同じパスにしておくとわかりやすいと言ったのはこのためです)

この例のように、ワイルドカードを使って複数のファイルを対象とすることも可能です。
ログ収集に関しては他にも様々な設定が可能なので、詳細については以下のドキュメントを参照してください。
https://docs.datadoghq.com/ja/agent/logs/advanced_log_collection/?tab=docker

さいごに

上記2つの設定を行うと Docker コンテナ内のログファイルを Datadog で収集することが可能です。
まとめてみると単純ですが、公式ドキュメントを見てもいまいち分かりづらかったため、誰かのお役に立てたら幸いです。

Discussion