Tracing d'applications ECS

Configuration

Après avoir suivi les instructions d’installation de l’agent Amazon ECS, activez la collecte de traces en suivant les instructions ci-dessous.

  1. Configurez les paramètres suivants dans la définition de tâche pour le conteneur gcr.io/datadoghq/agent. Définissez le port du host/conteneur portMappings sur 8126 avec le protocole tcp :

    containerDefinitions": [
      {
        "name": "datadog-agent",
        "image": "gcr.io/datadoghq/agent:latest",
        "cpu": 100,
        "memory": 256,
        "essential": true,
        "portMappings": [
          {
            "hostPort": 8126,
            "protocol": "tcp",
            "containerPort": 8126
          }
        ],
        ...
      

    Pour vous assurer que l’Agent envoie les données au bon site Datadog, définissez la variable d’environnement suivante, en remplaçant <SITE_DATADOG> par votre site  :

    "environment": [
        ...
      {
        "name": "DD_SITE",
        "value": "<DATADOG_SITE>"
      },
      ...
      ]
    ...
    

    Si vous utilisez l’Agent v7.17 ou une version inférieure, ajoutez les variables d’environnement suivantes :

    "environment": [
          ...
        {
          "name": "DD_APM_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_APM_NON_LOCAL_TRAFFIC",
          "value": "true"
        },
        ...
        ]
    ...
    

    Consulter l’ensemble des variables d’environnement disponibles pour la collecte de traces via l’Agent.

  2. Attribuez l’adresse IP privée utilisée par chaque instance sous-jacente sur laquelle vos conteneurs sont exécutés dans votre conteneur d’application à la variable d’environnement DD_AGENT_HOST. Les traces de votre application seront ainsi transmises à l’Agent.

L’endpoint de métadonnées EC2 d’Amazon permet de découvrir des adresses IP privées. Pour obtenir l’adresse IP privée de chaque host, effectuez un curl sur l’URL suivante :

curl http://169.254.169.254/latest/meta-data/local-ipv4

Le fichier de métadonnées des conteneurs ECS d’Amazon permet de découvrir des adresses IP privées. Pour obtenir l’adresse IP de chaque host, exécutez la commande suivante :

cat $ECS_CONTAINER_METADATA_FILE | jq -r .HostPrivateIPv4Address

Définissez le résultat comme la variable d’environnement de hostname de votre Agent de trace pour chaque conteneur d’application qui transmet des traces à l’APM :

os.environ['DD_AGENT_HOST'] = <IP_PRIVÉE_EC2>

Variables au moment du lancement

Si les variables de votre application ECS sont définies au moment du lancement, vous devez définir le hostname en tant que variable d’environnement avec DD_AGENT_HOST. Vous pouvez également définir le hostname dans le code source de votre application pour Python, Javascript ou Ruby. Pour Java et .NET, vous pouvez définir le hostname dans la tâche ECS. Par exemple :

import requests
from ddtrace import tracer


def get_aws_ip():
  r = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4')
  return r.text

tracer.configure(hostname=get_aws_ip())

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

const tracer = require('dd-trace').init();
const axios = require('axios');

(async () => {
  const { data: hostname } = await axios.get('http://169.254.169.254/latest/meta-data/local-ipv4');
  tracer.setUrl(`http://${hostname}:8126`);
})();

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

require 'ddtrace'
require 'net/http'

Datadog.configure do |c|
  c.agent.host = Net::HTTP.get(URI('http://169.254.169.254/latest/meta-data/local-ipv4'))
end
package main

import (
    "net/http"
    "io/ioutil"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
)

resp, err := http.Get("http://169.254.169.254/latest/meta-data/local-ipv4")
        bodyBytes, err := ioutil.ReadAll(resp.Body)
        host := string(bodyBytes)
  if err == nil {
        //set the output of the curl command to the DD_Agent_host env
        os.Setenv("DD_AGENT_HOST", host)
        // tell the trace agent the host setting
        tracer.Start(tracer.WithAgentAddr(host))
        defer tracer.Stop()

Copiez ce script dans le champ entryPoint de votre définition de tâche ECS en mettant à jour les valeurs avec le fichier JAR et les flags d’argument de votre application.

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); java -javaagent:/app/dd-java-agent.jar <APPLICATION_ARG_FLAGS> -jar <APPLICATION_JAR_FILE/WAR_FILE>"
]

Pour découvrir comment définir le hostname de l’Agent dans d’autres langages, consultez les exemples de la section Modifier le hostname de l’Agent.

"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); dotnet ${APP_PATH}"
]
"entryPoint": [
  "sh",
  "-c",
  "export DD_AGENT_HOST=$(curl http://169.254.169.254/latest/meta-data/local-ipv4); php-fpm -F"  
]

Apache

Pour Apache et mod_php dans VirtualHost ou dans un fichier de configuration de serveur, utilisez PassEnv pour définir DD_AGENT_HOST ainsi que d’autres variables d’environnement. Vous pouvez notamment définir les variables de tagging de service unifié indiquées dans l’exemple suivant :

PassEnv DD_AGENT_HOST
PassEnv DD_SERVICE
PassEnv DD_ENV
PassEnv DD_VERSION

FPM PHP

Lorsque le paramètre ini est défini sur clear_env=on, vous devez également configurer des variables d’environnement dans le fichier de workers du pool www.conf, afin qu’ils puissent être lus à partir du host. Profitez-en pour définir DD_AGENT_HOST ainsi que d’autres variables d’environnement. Vous pouvez notamment définir les variables de tagging de service unifié indiquées dans l’exemple suivant :

env[DD_AGENT_HOST] = $DD_AGENT_HOST
env[DD_SERVICE] = $DD_SERVICE
env[DD_ENV] = $DD_ENV
env[DD_VERSION] = $DD_VERSION

Pour aller plus loin