Docker ログの収集
Datadog の調査レポート: サーバーレスの状態 レポート: サーバーレスの状態

Docker ログの収集

概要

Datadog Agent 6 以降は、コンテナからログを収集します。2 通りのインストレーション方法があります。

  • Agent が Docker 環境の外部にあるホスト
  • コンテナ化された Agent の Docker 環境へのデプロイ

環境コンテナからすべてのログを収集することも、コンテナイメージ名またはコンテナラベルで絞り込んで、収集するログを選別することもできます。

本ドキュメントでは、実行中のすべてのコンテナからログを収集する方法と共に、オートディスカバリーを活用しログインテグレーションを有効にする方法を紹介します。

セットアップ

コンテナログのすべてを収集するためのシングルステップインストール

まず最初に、Agent(コンテナバージョンおよび直接ホストバージョンともに) のインストレーションと、すべてのコンテナのログ収集を有効にします。

Datadog Agent を埋め込みホストを監視する Docker コンテナ を実行するには、次のコマンドを使用します。

docker run -d --name datadog-agent \
           -e DD_API_KEY="<DATADOG_API_キー>" \
           -e DD_LOGS_ENABLED=true \
           -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \
           -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \
           -v /var/run/docker.sock:/var/run/docker.sock: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 \
           datadog/agent:latest

最新版の Datadog Agent の使用が推奨されます。Docker Hub で利用できる 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 ソケットの stdout/stderr コンテナから収集されます。

ホストに最新版の Agent 6 をインストールします。Agent は ホスト上のファイル または stdout/stderr コンテナからログを収集できます。

デフォルトの状態では、Datadog Agent でのログ収集は 無効 になっています。有効にするには、datadog.yaml 構成ファイルに次の行を加えます。

logs_enabled: true
listeners:
  - name: docker
config_providers:
  - name: docker
    polling: true
logs_config:
  container_collect_all: true

Agent を再起動 し、Datadog のコンテナログを確認します。

重要:

  • Datadog Agent 6.8 以降では、sourceservice の初期値は short_image タグの値となります。 下で説明するように、ソースやサービスの値はオートディスカバリーで上書きすることができます。source 値をインテグレーション名に設定すると、ログをパースして関連情報を抽出するインテグレーション Pipelines がインストールされます。

  • コンテナ Stderr からのログは Error の状態がデフォルトとなります。

  • Docker のデフォルトである json-file ログドライバーではなく、journald ログドライバーを使用する場合は、コンテナ環境の設定に関するドキュメント journald インテグレーション をご覧ください。

インテグレーションのためのログ収集を有効にする

Datadog Agent 6.8 以降では、sourceservice の初期値は short_image タグの値となります。これにより、Datadog は各コンテナのログソースを特定でき、対応するインテグレーションを自動的にインストールできます。

コンテナのショートイメージ名とカスタムイメージのインテグレーション名が一致しない場合があります。アプリケーションにふさわしい名前に上書きするには、Datadog オートディスカバリーKubernetes ポッドアノテーション またはコンテナラベルを使います。

オートディスカバリーは、ファイルの種類に応じてラベルが以下の形式となることを前提とします。

Dockerfile に以下のLABEL を追加します:

LABEL "com.datadoghq.ad.logs"='[<ログコンフィギュレーション>]'

docker-compose.yaml ファイルに以下のラベルを追加します:

labels:
  com.datadoghq.ad.logs: '["<ログコンフィギュレーション>"]'

実行コマンドとして次のラベルを追加します:

-l com.datadoghq.ad.logs='[<ログコンフィギュレーション>]'

<LOG_CONFIG> がログ収集コンフィギュレーションの場合、インテグレーション構成ファイルにあります。詳細は、ログ収集コンフィギュレーションを参照してください。

次の 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])"}]}]'

複数行の処理規則には、他にもさまざまなパターンが記載されています。

Kubernetes を実行している場合、ポッドアノテーションを利用できます。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      annotations:
        ad.datadoghq.com/nginx.logs: '[{"source":"nginx","service":"webapp"}]'
      labels:
        app: webapp
      name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest

オートディスカバリーに関する手順、一例、詳細に関しては、オートディスカバリーガイドを参照してください。

: オートディスカバリー機能は、DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL 環境変数の有無にかかわらず使用できます。次のオプションの中から 1 つを選択してください。

  • コンテナラベルまたはポッドアノテーションを使い、ログを収集するコンテナを選択します。
  • 環境変数を使いすべてのコンテナからログを集め、デフォルトの source 値と service 値を上書きします。
  • 必要とする一部のコンテナの処理規則を追加します。

コンテナを絞り込む

以下の方法で、ログ、メトリクス、オートディスカバリーの絞り込みができます。これにより、Datadog Agent ログの収集を防ぐことができます。

イメージまたはコンテナ名で絞り込んだコンテナ一覧を含めたり除く際に使える環境変数が 2 つあります。

  • DD_AC_INCLUDE: 常に対象に入れるコンテナのホワイトリスト
  • DD_AC_EXCLUDE: 除外するコンテナのブラックリスト

このオプションは、スペース区切り文字列形式です。たとえば、2 つのイメージのみをモニターして残りを除外したい場合、以下のようにします。

DD_CONTAINER_EXCLUDE = "image:.*"
DD_CONTAINER_INCLUDE = "image:cp-kafka image:k8szk"

特定のコンテナ名を除外するには、以下のようにします。

DD_CONTAINER_EXCLUDE = "name:datadog-agent"

datadog.yaml にパラメーターが 2 つあり、イメージまたはコンテナ名で絞り込まれたコンテナ一覧を含めたり除外できます。

  • ac_exclude: 常に含めるコンテナのホワイトリスト
  • ac_include: 除外するコンテナのブラックリスト

たとえば、2 つのイメージのみをモニターして残りを除外したい場合、以下のようにします。

ac_exclude: ["image:.*"]
ac_include: ["image:cp-kafka", "image:k8szk"]

Datadog Agent を除外するには、以下のようにします。

ac_exclude = ["name:datadog-agent"]

存続期間が短いコンテナ

Docker 環境では、Agent は Docker イベントによりコンテナのアップデートをリアルタイムに受け取ります。Agent は 1 秒ごとにコンテナラベル(オートディスカバリー)からコンフィギュレーションを抽出しアップデートします。

Agent v6.14 以降、Agent はすべてのコンテナ(実行中かは問わず)のログを収集します。つまり、直近の 1 秒間に開始し停止した存続期間の短いコンテナのログは、削除されるまで収集されます。

Kubernetes 環境には、Kubernetes 存続期間が短いコンテナのドキュメントを参照してください。

その他の参考資料