L’ingestion OTLP dans l’Agent est un moyen d’envoyer des données de télémétrie directement depuis des applications instrumentées avec les SDK OpenTelemetry vers l’Agent Datadog. Depuis les versions 6.32.0 et 7.32.0, l’Agent Datadog peut ingérer des traces OTLP et des métriques OTLP via gRPC ou HTTP. Depuis les versions 6.48.0 et 7.48.0, l’Agent Datadog peut ingérer des journaux OTLP via gRPC ou HTTP.

L’ingestion OTLP dans l’Agent vous permet d’utiliser les fonctionnalités d’observabilité dans l’Agent Datadog. Les données provenant d’applications instrumentées avec le SDK OpenTelemetry ne peuvent pas être utilisées dans certains produits propriétaires de Datadog, tels que App and API Protection, Continuous Profiler, et Ingestion Rules. Les métriques d’exécution OpenTelemetry sont prises en charge pour certains langages.

Diagramme : Le SDK OpenTelemetry envoie des données via le protocole OTLP à un Collector avec le Datadog Exporter, qui les transfère vers la plateforme Datadog.
Pour voir quelles fonctionnalités de Datadog sont prises en charge avec cette configuration, consultez le tableau de compatibilité des fonctionnalités sous OTel vers l'Agent Datadog (OTLP).

Configuration initiale

Pour commencer, vous devez d’abord instrumenter votre application avec les SDK OpenTelemetry. Ensuite, exportez les données de télémétrie au format OTLP vers l’Agent Datadog. La configuration de cela varie en fonction du type d’infrastructure sur laquelle votre service est déployé, comme décrit sur la page ci-dessous. Bien que l’objectif soit d’être compatible avec la dernière version d’OTLP, l’ingestion OTLP dans l’Agent n’est pas compatible avec toutes les versions d’OTLP. Les versions d’OTLP compatibles avec l’Agent Datadog sont celles qui sont également prises en charge par le récepteur OTLP dans le Collecteur OpenTelemetry. Pour vérifier les versions exactes prises en charge, consultez la version go.opentelemetry.io/collector dans le fichier go.mod de l’Agent.

Lisez la documentation d’instrumentation OpenTelemetry pour comprendre comment diriger votre instrumentation vers l’Agent. La receiver section décrite ci-dessous suit le schéma de configuration du récepteur OTLP du Collecteur OpenTelemetry.

La configuration prise en charge est un Agent d'ingestion déployé sur chaque hôte générant des données OpenTelemetry. Vous ne pouvez pas envoyer de télémétrie OpenTelemetry depuis des collecteurs ou des applications instrumentées s'exécutant sur un hôte vers un Agent sur un hôte différent. Cependant, à condition que l'Agent soit local au collecteur ou à l'application instrumentée par SDK, vous pouvez configurer plusieurs pipelines.

Activation de l’ingestion OTLP sur l’Agent Datadog

L’ingestion OTLP est désactivée par défaut, et vous pouvez l’activer en mettant à jour votre datadog.yaml fichier de configuration ou en définissant des variables d’environnement. Les configurations suivantes datadog.yaml activent les points de terminaison sur les ports par défaut. Lorsqu’elle est activée, l’ingestion des métriques et des traces est activée par défaut. L’ingestion des journaux est désactivée par défaut pour éviter des frais imprévus liés aux journaux.

The following examples use 0.0.0.0 as the endpoint address for convenience. This allows connections from any network interface. For enhanced security, especially in local deployments, consider using localhost instead. For more information on secure endpoint configuration, see the OpenTelemetry security documentation.

Pour gRPC, port par défaut 4317 :

otlp_config:
  receiver:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
  logs:
    enabled: false

Pour HTTP, port par défaut 4318 :

otlp_config:
  receiver:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
  logs:
    enabled: false

Alternativement, configurez les points de terminaison en fournissant le port via les variables d’environnement :

  • Pour gRPC (localhost:4317) : DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT
  • Pour HTTP (localhost:4318) : DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT

Ceux-ci doivent être transmis à la fois aux processus de l’Agent principal et de l’Agent de traces. Si vous exécutez dans un environnement conteneurisé, utilisez 0.0.0.0 au lieu de localhost pour garantir que le serveur est disponible sur des interfaces non locales.

Configurez soit gRPC soit HTTP pour cette fonctionnalité. Voici une application exemple qui montre la configuration pour les deux.

  1. Suivez la configuration de l’Agent Docker Datadog.

  2. Pour le conteneur de l’Agent Datadog, définissez les variables d’environnement de point de terminaison suivantes et exposez le port correspondant :

    • Pour gRPC : Définissez DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT sur 0.0.0.0:4317 et exposez le port 4317.
    • Pour HTTP : Définissez DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT sur 0.0.0.0:4318 et exposez le port 4318.
Problème connu : À partir de la version 7.61.0 de l'Agent, les pipelines d'ingestion OTLP peuvent échouer à démarrer dans des environnements Docker, affichant l'erreur : Error running the OTLP ingest pipeline: failed to register process metrics: process does not exist.

Si vous utilisez une version affectée, vous pouvez utiliser l'une de ces solutions de contournement :

1. Définissez la variable d'environnement HOST_PROC par /proc dans votre conteneur Docker Agent.
2. Supprimez /proc/:/host/proc/:ro de volumes dans votre conteneur Docker Agent.
3. Définissez pid par host dans votre conteneur Docker Agent.

Ces configurations peuvent être appliquées soit par le docker commande ou le fichier Docker compose.
  1. Suivez le guide d’installation de l’Agent Kubernetes pour l’installation de base.

  2. Activez le protocole préféré gRPC ou HTTP dans le manifeste de votre Operator datadog-agent.yaml :

    Pour gRPC :

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      # (...)
      features:
        otlp:
          receiver:
            protocols:
              grpc:
                enabled: true
    

    For HTTP:

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      # (...)
      features:
        otlp:
          receiver:
            protocols:
              http:
                enabled: true
    

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

Cela active chaque protocole sur le port par défaut (4317 pour OTLP/gRPC et 4318 pour OTLP/HTTP). Les métriques et les traces sont activées par défaut.

  1. Suivez le guide d’installation de l’Agent Kubernetes pour l’installation de base.

  2. Activez le protocole préféré gRPC ou HTTP dans le fichier datadog-values.yaml de votre Helm :

    Pour gRPC :

    datadog:
      # (...)
      otlp:
        receiver:
          protocols:
            grpc:
              enabled: true
    

    For HTTP:

    datadog:
      # (...)
      otlp:
        receiver:
          protocols:
            http:
              enabled: true
    

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

Cela active chaque protocole sur le port par défaut (4317 pour OTLP/gRPC et 4318 pour OTLP/HTTP). Les métriques et les traces sont activées par défaut.

  1. Suivez le guide d’installation manuelle de Kubernetes pour l’installation de base.

  2. Configurez les variables d’environnement suivantes dans le conteneur trace-agent et le conteneur principal agent :

    Pour gRPC :

    name: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT # enables gRPC receiver on port 4317
    value: "0.0.0.0:4317"
    

    For HTTP:

    name: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT # enables HTTP receiver on port 4318
    value: "0.0.0.0:4318"
    
  3. Mappez les ports du conteneur 4317 ou 4318 au port de l’hôte pour le conteneur principal agent :

    Pour gRPC :

    ports:
      - containerPort: 4317
        hostPort: 4317
        name: traceportgrpc
        protocol: TCP
    

    For HTTP

    ports:
      - containerPort: 4318
        hostPort: 4318
        name: traceporthttp
        protocol: TCP
    

Pour des instructions détaillées sur l’utilisation d’OpenTelemetry avec AWS Lambda et Datadog, y compris :

  • Instrumenter vos fonctions Lambda avec OpenTelemetry
  • Utiliser le support de l’API OpenTelemetry dans les SDK Datadog
  • Envoyer des traces OpenTelemetry à l’extension Lambda de Datadog

Consultez la documentation Serverless pour AWS Lambda et OpenTelemetry.

Activer l’ingestion des journaux OTLP

L’ingestion des journaux OTLP est désactivée par défaut pour éviter des frais inattendus. Pour l’activer, vous devez explicitement activer à la fois la collecte des journaux et l’ingestion des journaux OTLP.

  1. Activez la collecte des journaux en suivant Host Agent Log collection setup :

    logs_enabled: true
    
  2. Définir otlp_config.logs.enabled sur vrai :

    otlp_config:
      logs:
        enabled: true
    

Définissez les variables d’environnement suivantes dans le conteneur de l’agent Datadog :

  • DD_LOGS_ENABLED=true
  • DD_OTLP_CONFIG_LOGS_ENABLED=true

Dans votre fichier datadog-agent.yaml

spec:
  # (...)
  features:
    otlp:
      #(... enable gRPC or HTTP ingestion...)
    logCollection:
      enabled: true
  override:
    nodeAgent:
      containers:
        agent:
          env:
            - name: DD_OTLP_CONFIG_LOGS_ENABLED
              value: "true"

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

Dans votre fichier datadog-values.yaml :

datadog:
  # (...)
  otlp:
    #(... enable gRPC or HTTP ingestion...)
    logs:
      enabled: true
  logs:
    enabled: true

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

Définissez les variables d’environnement suivantes dans le conteneur de l’agent principal :

- name: DD_LOGS_ENABLED
  value: "true"
- name: DD_OTLP_CONFIG_LOGS_ENABLED
  value: "true"

Pour plus d’informations, consultez la collecte des journaux avec votre DaemonSet.

Il existe de nombreuses autres variables d’environnement et paramètres pris en charge dans l’agent Datadog. Pour obtenir un aperçu de toutes, consultez le modèle de configuration.

Envoyer des traces, des métriques et des journaux OpenTelemetry à l’agent Datadog

Après avoir activé l’ingestion OTLP sur l’agent Datadog, configurez votre application instrumentée par OpenTelemetry pour exporter les données de télémétrie vers le point de terminaison OTLP de l’agent. Définissez la variable d’environnement OTEL_EXPORTER_OTLP_ENDPOINT dans votre environnement application pour diriger les données vers l’agent. Sans cette configuration, votre application n’envoie pas de données de télémétrie à l’Agent, même si le récepteur OTLP de l’Agent est activé.

Définissez la variable d’environnement OTEL_EXPORTER_OTLP_ENDPOINT dans l’environnement de votre application :

Pour gRPC :

export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317"

Pour HTTP :

export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318"
  1. Pour le conteneur d’application, définissez la variable d’environnement OTEL_EXPORTER_OTLP_ENDPOINT pour pointer vers le conteneur de l’Agent Datadog. Exemple :

    OTEL_EXPORTER_OTLP_ENDPOINT=http://<datadog-agent>:4318
    
  2. Les deux conteneurs doivent être définis dans le même réseau de pont, ce qui est géré automatiquement si vous utilisez Docker Compose. Sinon, suivez l’exemple Docker dans Tracing Docker Applications pour configurer un réseau de pont avec les ports corrects.

Dans le fichier de déploiement de l’application, configurez le point de terminaison auquel le client OpenTelemetry envoie les traces avec la variable d’environnement OTEL_EXPORTER_OTLP_ENDPOINT.

Pour gRPC :

env:
 - name: HOST_IP
   valueFrom:
     fieldRef:
       fieldPath: status.hostIP
 - name: OTEL_EXPORTER_OTLP_ENDPOINT
   value: "http://$(HOST_IP):4317" # sends to gRPC receiver on port 4317

Pour HTTP :

env:
 - name: HOST_IP
   valueFrom:
     fieldRef:
       fieldPath: status.hostIP
 - name: OTEL_EXPORTER_OTLP_ENDPOINT
   value: "http://$(HOST_IP):4318" # sends to HTTP receiver on port 4318

Remarque : Pour enrichir les balises de conteneur pour des métriques personnalisées, définissez les attributs de ressource appropriés dans le code de l’application où vos métriques OTLP sont générées. Par exemple, définissez l’attribut de ressource container.id sur l’UID du pod.

Lors de la configuration du point de terminaison pour l'envoi des traces, assurez-vous d'utiliser le chemin correct requis par votre bibliothèque OTLP. Certaines bibliothèques s'attendent à ce que les traces soient envoyées à la /v1/traces chemin, tandis que d'autres utilisent le chemin racine /.

Pour aller plus loin