概要
Datadog Agent 6+ は、コンテナからログを収集します。2 種類のインストールが用意されています。
ログ収集の構成は、現在の環境によって異なります。開始するには、次のいずれかのインストールを選択してください。
このページの CLI コマンドは Docker ランタイム用です。containerd ランタイムは docker を nerdctl に、Podman ランタイムは podman に置き換えてください。containerd と Podman のログ収集のサポートは限定的です。
インストール
Datadog Agent を埋め込みホストをモニターする Docker コンテナを実行するには、それぞれの OS で次のコマンドを使用します。
Linux
下記の構成については、<DD_SITE> を以下に置き換えてください 。
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 \
registry.datadoghq.com/agent:latest
Windows
下記の構成については、<DD_SITE> を以下に置き換えてください 。
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 \\.\pipe\docker_engine:\\.\pipe\docker_engine \
-v c:\programdata\docker\containers:c:\programdata\docker\containers:ro
registry.datadoghq.com/agent:latest
macOS
Docker Desktop -> Settings -> Resources -> File sharing に /opt/datadog-agent/run というパスを追加します。
下記の構成については、<DD_SITE> を以下に置き換えてください 。
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_LOGS_CONFIG_DOCKER_CONTAINER_USE_FILE=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 /opt/datadog-agent/run:/opt/datadog-agent/run:rw \
registry.datadoghq.com/agent:latest
最新版の Datadog Agent の使用が推奨されます。GCR で利用できる Agent v6 のイメージリストを参照してください。
ログ収集に関連するコマンド:
-e DD_LOGS_ENABLED=truetrue に設定すると、ログ収集が有効になります。Agent は構成ファイルのログ命令を探します。-e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true- すべてのコンテナに対してログ収集を有効化するログコンフィギュレーションを追加します。
-v /opt/datadog-agent/run:/opt/datadog-agent/run:rw- 再起動中またはネットワーク障害発生時のコンテナログの紛失を防ぎます。このディレクトリで各コンテナについて収集されたログの最終行がホスト上に保存されます。
-e DD_CONTAINER_EXCLUDE="name:datadog-agent"- Datadog Agent がそれ自身のログとメトリクスを収集および送信することを回避します。Datadog Agent のログまたはメトリクスを収集する場合はこのパラメーターを削除してください。このパラメーター値は正規表現をサポートしています。
-v /var/run/docker.sock:/var/run/docker.sock:ro- Docker daemon に接続してコンテナを探し、Docker ソケットから
stdout/stderr を収集します。 -v /var/lib/docker/containers:/var/lib/docker/containers:ro- ファイルからコンテナログを収集します。Datadog Agent 6.27.0/7.27.0 以降で利用可能です
注: Docker Compose を使用する場合、DD_CONTAINER_EXCLUDE の値は引用符で囲んではいけません。以下の例のように、docker-compose.yaml ファイルに環境変数を構成してください。
environment:
- DD_CONTAINER_EXCLUDE=image:datadog/agent:*
最新バージョンの Agent をホストにインストールします。
デフォルトの状態では、Datadog Agent でのログ収集は_無効_になっています。有効にするには、datadog.yaml 構成ファイルに次の行を加えます。
logs_enabled: true
listeners:
- name: docker
config_providers:
- name: docker
polling: true
logs_config:
container_collect_all: true
Windows 10 のみ: Docker コンテナで作業を行うアクセス許可を得るには、Datadog Agent ユーザーが docker-users グループのメンバーである必要があります。管理者コマンドプロンプトから net localgroup docker-users "ddagentuser" /ADD を実行するか、Docker ユーザーグループのコンフィギュレーション手順に従ってください。
Agent を再起動して、Datadog ですべてのコンテナログを確認します。
最新バージョンの Agent をホストにインストールします。
カスタムログ収集のドキュメントに従って、ログのファイルを調整します。
<PATH_LOG_FILE>/<LOG_FILE_NAME>.log に保存されているログを <APP_NAME> アプリケーションから収集するには、Agent’ の構成ディレクトリのルートに以下の内容の <APP_NAME>.d/conf.yaml ファイルを作成します。
logs:
- type: file
path: "<PATH_LOG_FILE>/<LOG_FILE_NAME>.log"
service: "<APP_NAME>"
source: "<SOURCE>"
Agent を再起動して、Datadog ですべてのコンテナログを確認します。
注: カスタムログ構成のコンテナによって生成されたログを Agent が収集するためには、ログがホストからアクセス可能なボリュームに書き込まれる必要があります。コンテナログは、自動的に収集できるように stdout と stderr に書き込むことをお勧めします。
重要な注意事項:
- コンテナメタデータはカスタムログ収集では取得されないため、Agent はコンテナタグをログに自動的に割り当てません。カスタムタグを使用してコンテナタグを作成します。
Datadog Agent 6.8 以降では、- sourceや service の初期値は short_image タグの値となります。下で説明するように、ソースやサービスの値はオートディスカバリーで上書きすることができます。source 値をインテグレーション名に設定すると、ログをパースして関連情報を抽出するインテグレーション Pipelines がインストールされます。
ログインテグレーション
Datadog Agent 6.8 以降では、source や service の初期値は short_image タグの値となります。これにより、Datadog は各コンテナのログソースを特定でき、対応するインテグレーションを自動的にインストールできます。
コンテナのショートイメージ名とカスタムイメージのインテグレーション名が一致しない場合があります。アプリケーションにふさわしい名前に上書きするには、Datadog Autodiscoveryや Kubernetes ポッドアノテーションまたはコンテナラベルを使います。
Autodiscovery は、ファイルの種類に応じてラベルが以下の形式となることを前提とします。
Dockerfile に以下のLABEL を追加します。
LABEL "com.datadoghq.ad.logs"='[<LOGS_CONFIG>]'
docker-compose.yaml ファイルに以下のラベルを追加します。
labels:
com.datadoghq.ad.logs: '["<LOGS_CONFIG>"]'
実行コマンドとして次のラベルを追加します。
-l com.datadoghq.ad.logs='[<LOGS_CONFIG>]'
<LOG_CONFIG> がログ収集コンフィギュレーションの場合、インテグレーション構成ファイルにあります。詳細については、ログ収集コンフィギュレーションを参照してください。
注: Datadog では、Docker ラベルを使い service 値を設定する際のベストプラクティスとして、unified service tagging の使用をお勧めしています。unified service tagging は、env、service、version の 3 つの標準タグを使用して、ログを含むすべての Datadog テレメトリと結合します。ご使用環境で統合タグ付けを構成する方法に関する詳細については、unified service tagging のドキュメントを参照してください。
例
次の Dockerfile は対応するコンテナにおける NGINX ログインテグレーションを有効にします (service の値は変更できます)。
LABEL "com.datadoghq.ad.logs"='[{"source": "nginx", "service": "webapp"}]'
メトリクスとログ、両 NGINX インテグレーションを有効にする方法
LABEL "com.datadoghq.ad.check_names"='["nginx"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"nginx_status_url": "http://%%host%%:%%port%%/nginx_status"}]'
LABEL "com.datadoghq.ad.logs"='[{"source": "nginx", "service": "webapp"}]'
スタックトレースのような複数行のログのため、Agent には複数の行を 1 行に集約する複数行の処理ルールがあります。
ログの一例 (Java スタックトレース):
2018-01-03T09:24:24.983Z UTC Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
下にあるように、コンテナで com.datadoghq.ad.logs ラベルを使用し、上記のログが正確に収集されているかを確かめます。
labels:
com.datadoghq.ad.logs: '[{"source": "java", "service": "myapp", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern" : "\\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])"}]}]'
複数行の処理ルールには、他にもさまざまなパターンが記載されています。
Agent v7.25.0 以降/6.25.0 以降では、コンテナの Autodiscovery ラベルに基づくファイルから直接ログを収集できます。このようなログを収集するには、以下のようにコンテナに com.datadoghq.ad.logs ラベルを使用して /logs/app/prod.log を収集します。
labels:
com.datadoghq.ad.logs: '[{"type":"file", "source": "sample_app", "service": "sample_service", "path": "/logs/app/prod.log"}]'
ファイルから収集されたログは、コンテナのメタデータとともにタグ付けされます。ログ収集はコンテナのライフサイクルにリンクされ、コンテナが停止するとそのファイルからのログ収集も停止します。
注:
ファイルパスは Agent に相対的であるため、ファイルを含むディレクトリは、アプリケーションを実行しているコンテナと Agent コンテナの間で共有される必要があります。たとえば、コンテナが /logs をマウントする場合、ファイルにログを作成する各コンテナはログファイルが書き込まれる場所に /logs/app のようなボリュームをマウントする場合があります。
このようなラベルをコンテナに使用する場合、その stderr/stdout ログは自動的に収集されません。stderr/stdout およびファイルの両方から収集する必要がある場合は、ラベルを使用して明示的に有効にします。たとえば、
labels:
com.datadoghq.ad.logs: '[{"type":"file", "source": "java", "service": "app", "path": "/logs/app/prod.log"}, {"type": "docker", "source": "app_container", "service": "app"}]'
- このような組み合わせを使用しているとき、
source と service にデフォルト値はなく、Autodiscovery のラベルで明示的に設定する必要があります。
注: オートディスカバリー機能は、DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL 環境変数の有無にかかわらず使用できます。次のいずれかのオプションを選択します。
- コンテナラベルまたはポッドアノテーションを使用して、ログを収集するコンテナを選択します。
- 環境変数を使いすべてのコンテナからログを集め、デフォルトの
source 値と service 値を上書きします。 - 必要とする一部のコンテナの処理ルールを追加します。
高度なログの収集
Autodiscovery ログラベルを使用して、高度なログ収集の処理ロジックを適用します。例えば、以下のようにします。
ファイルからの Docker コンテナログ収集
Docker コンテナのログ収集は、Docker ソケット経由の収集の代わりに、ファイルからの収集が可能です。ファイルベースの収集は、ソケットベースの収集よりも優れたパフォーマンスを提供します。
バージョン 7.27.0/6.27.0+ では、Docker コンテナログをファイルから収集するように Agent を構成することができます。バージョン 6.33.0+/7.33.0+ では、Agent はデフォルトでファイルから Docker コンテナログを収集します。
ファイルベースの収集では、Docker コンテナログを格納するディレクトリを次の場所で Agent に公開する必要があります: /var/lib/docker/containers (Windows では c:\programdata\docker\containers)。詳細については、Docker ログ収集トラブルシューティングガイドを参照してください。
注:
- Docker ソケットベースのコンテナログ収集からファイルベースのログ収集に移行すると、新しいコンテナのみがそのファイルから追跡されるようになります。環境変数
DD_LOGS_CONFIG_DOCKER_CONTAINER_FORCE_USE_FILE を true に設定すると、Agent が全てのコンテナログをファイルから収集するよう強制することができます。Agent がファイルからすべてのコンテナログを収集するように強制すると、既存のコンテナのログが重複することがあります。 - Agent をコンテナファイルのログ収集から Docker ソケット経由の収集に戻した場合、既存のコンテナのログが重複して表示される可能性があります。
コンテナを絞り込む
ログの収集元となるコンテナを管理することができます。これは、たとえば Datadog Agent のログを収集しないようにするのに役立ちます。詳細については、コンテナ検出の管理を参照してください。
存続期間が短いコンテナ
Docker 環境では、Agent は Docker イベントによりコンテナのアップデートをリアルタイムに受け取ります。Agent は 1 秒ごとにコンテナラベル (Autodiscovery) からコンフィギュレーションを抽出してアップデートします。
Agent v6.14 以降、Agent はすべてのコンテナ (実行中かは問わず) のログを収集します。つまり、直近の 1 秒間に開始して停止した存続期間の短いコンテナのログは、削除されるまで収集されます。
Kubernetes 環境には、Kubernetes 存続期間が短いコンテナのドキュメントを参照してください。
トラブルシューティング
トラブルシューティング手順については、コンテナログ収集トラブルシューティングを参照してください。
参考資料