Présentation

L’Agent Datadog 6 (et ses versions ultérieures) est capable de recueillir des logs à partir de conteneurs. Pour recueillir des logs à partir de conteneurs ECS, il est recommandé d’activer la collecte de logs dans la définition de tâche de votre Agent. Une manière de procéder consiste à modifier le fichier de définition de tâche utilisé précédemment et à enregistrer votre définition de tâche modifiée. Vous pouvez également modifier la définition de tâche directement depuis l’interface Web Amazon.

Une fois la collecte activée, le conteneur de l’Agent Datadog recueille les logs générés par les autres conteneurs d’application sur le même host. Cette collecte est toutefois limitée aux logs émis vers les flux de logs stdout et stderr avec le pilote de logging default ou json-file.

Installation

Définition de tâche ECS

Pour recueillir tous les logs à partir de vos conteneurs ECS exécutés, mettez à jour la définition de tâche de votre Agent issue de la configuration ECS d’origine en spécifiant les variables d’environnement et les montages ci-dessous.

Utilisez datadog-agent-ecs-logs.json comme modèle de référence pour connaître la configuration de base requise. Votre définition de tâche doit contenir les lignes suivantes :

{
  "containerDefinitions": [
    {
      (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/opt/datadog-agent/run",
          "sourceVolume": "pointdir",
          "readOnly": false
        },
        {
          "containerPath": "/var/lib/docker/containers",
          "sourceVolume": "containers_root",
          "readOnly": true
        }
      ],
      "environment": [
        (...)
        {
          "name": "DD_LOGS_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
          "value": "true"
        }
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "host": {
        "sourcePath": "/opt/datadog-agent/run"
      },
      "name": "pointdir"
    },
    {
      "host": {
        "sourcePath": "/var/lib/docker/containers/"
      },
      "name": "containers_root"
    }
  ],
  "family": "datadog-agent-task"
}

Utilisez datadog-agent-ecs-win-logs.json comme modèle de référence pour connaître la configuration de base requise. Votre définition de tâche doit contenir les lignes suivantes :

{
  "containerDefinitions": [
    {
      (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "C:/programdata/datadog/run",
          "sourceVolume": "pointdir",
          "readOnly": false
        },
        {
          "containerPath": "c:/programdata/docker/containers",
          "sourceVolume": "containers_root",
          "readOnly": true
        }
      ],
      "environment": [
        (...)
        {
          "name": "DD_LOGS_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
          "value": "true"
        }
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "name": "pointdir",
      "dockerVolumeConfiguration": {
        "autoprovision": true,
        "scope": "shared",
        "driver": "local"
      }
    },
    {
      "host": {
        "sourcePath": "c:/programdata/docker/containers"
      },
      "name": "containers_root"
    }
  ],
  "family": "datadog-agent-task"
}

Ces définitions de tâche définissent la variable d’environnement DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true pour recueillir les logs depuis chaque conteneur découvert par l’Agent. Définissez cette variable d’environnement sur false pour ne recueillir que les logs des conteneurs qui possèdent des étiquettes Autodiscovery.

Si vous disposez d’un fichier local pour la définition de tâche de votre Agent, vous pouvez répéter ces étapes pour enregistrer votre définition de tâche modifiée. Cette opération entraînera la création d’une révision. Vous pourrez ensuite ajouter une référence à cette nouvelle révision dans le service daemon de l’Agent Datadog.

Collecte de logs personnalisée

Étiquettes Autodiscovery

Si la variable d’environnement DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true est définie, l’Agent recueille les logs de tous les conteneurs qu’il découvre par défaut. Les tags service et source de ces logs sont définis sur le nom d’image raccourci de leur conteneur respectif. Vous pouvez spécifier des étiquettes Docker sur vos conteneurs d’application ECS pour qu’Autodiscovery personnalise la configuration de collecte utilisée par l’Agent pour le conteneur correspondant.

Consultez la section Collecte de logs avec Docker pour découvrir comment utiliser les configurations Autodiscovery. Par exemple, la configuration de collecte de logs suivante remplace les tags source et service des logs recueillis :

[{"source": "example-source", "service": "example-service"}]

Dans le cas d’ECS, cette configuration peut être ajoutée à l’étiquette com.datadoghq.ad.logs dans la section dockerLabels de la définition de tâche associée au conteneur d’application qui émet ces logs.

{
  "containerDefinitions": [
    {
      "name": "<NOM_CONTENEUR>",
      "image": "<IMAGE_CONTENEUR>",
      "dockerLabels": {
        "com.datadoghq.ad.logs": "[{\"source\": \"example-source\", \"service\": \"example-service\"}]"
      }
    }
  ]
}

Vous pouvez aller encore plus loin en ajoutant des tags à votre configuration de collecte de logs en définissant des log_processing_rules pour les options de collecte de logs avancée.

Fichier de log dans un conteneur

Docker (avec le pilote default ou json-file) expose les flux de logs stdout et stderr dans un format facilement identifiable par l’Agent. Toutefois, lorsqu’un conteneur génère un fichier de log au sein de son propre conteneur, l’Agent n’est pas en mesure de voir ce fichier par défaut. Datadog vous conseille d’utiliser les flux de sortie stdout et stderr pour faciliter la collecte des logs des applications conteneurisées. Si ce n’est pas possible, vous pouvez modifier la configuration Autodiscovery afin de spécifier le chemin d’accès au fichier. Vous devrez vous assurer que le conteneur de l’Agent et le conteneur de l’application partagent un répertoire sur le host contenant le fichier de log.

La configuration de collecte de logs ci-dessous indique à l’Agent de recueillir ce fichier de log personnalisé en accédant au chemin /var/log/example/app.log.

[{
  "type": "file",
  "path": "/var/log/example/app.log",
  "source": "example-source",
  "service": "example-service"
}]

Par exemple, on constate que la définition de tâche ci-dessous :

  • Écrit des logs vers le fichier /var/log/example/app.log
  • Contient une section dockerLabels pour configurer la collecte de logs
  • Spécifie les paramètres volumes et mountPoints pour le répertoire /var/log/example
{
  "containerDefinitions": [
    {
      "name": "example-logger",
      "image": "busybox",
      "entryPoint": ["/bin/sh", "-c", "--"],
      "command": ["while true; do sleep 1; echo `date` example file log >> /var/log/example/app.log; done;"],
      "mountPoints": [
        {
          "containerPath": "/var/log/example",
          "sourceVolume": "applogs"
        }
      ],
      "dockerLabels": {
        "com.datadoghq.ad.logs": "[{\"type\":\"file\",\"path\":\"/var/log/example/app.log\",\"source\":\"example-source\",\"service\":\"example-service\"}]"
      }
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/var/log/example"
      },
      "name": "applogs"
    }
  ],
  "family": "example-logger"
}

Les chemins d’accès dans la configuration sont toujours relatifs à l’Agent. Les mêmes paramètres volume et mountPoint doivent également être ajoutés à la définition de tâche de l’Agent pour que le fichier de log en question soit visible.

Consultez la documentation AWS sur les bind mounts pour en savoir plus sur la gestion des volumes avec ECS.

Remarque : lorsque vous utilisez ce type de configuration avec un conteneur, les flux de logs stdout et stderr ne sont pas recueillis automatiquement depuis le conteneur (ils sont uniquement recueillis depuis le fichier). Si vous souhaitez que les logs soient recueillis à la fois depuis les flux du conteneur et un fichier, vous devez activer explicitement cette option dans la configuration. Par exemple :

[
  {
    "type": "file",
    "path": "/var/log/example/app.log",
    "source": "example-file",
    "service": "example-service"
  },
  {
    "source": "example-stream",
    "service": "example-service"
  }
]

Activer les intégrations de collecte de logs

L’attribut source sert à identifier l’intégration à utiliser pour chaque conteneur. Contournez-le directement dans vos étiquettes de conteneurs pour commencer à utiliser les intégrations de collecte de logs Datadog. Lisez notre guide sur l’utilisation d’Autodiscovery pour les logs pour en savoir plus sur ce processus.

Pour aller plus loin