Ignorer les ressources non désirées dans APM

Les services gèrent souvent des endpoints dont vous ne souhaitez peut-être pas tracer le trafic (par exemple, les vérifications de santé). Ce guide explique les approches suivantes pour exclure ce trafic :

  • Échantillonnage : Utilisez lorsque vous souhaitez que les requêtes restent visibles dans les métriques de trace, mais réduisez le volume d’ingestion des traces.
  • Filtrage dans l’Agent Datadog : Utilisez pour exclure complètement les requêtes (y compris des métriques de trace) dans tous les services rapportant à l’Agent.
  • Configuration du traceur : Utilisez lorsque la logique de filtrage doit être appliquée par service ou dépend du contexte spécifique à l’application (par exemple, les attributs de requête ou l’état d’exécution).

Si vous avez besoin d’aide pour décider quelle option est la plus pertinente pour votre cas d’utilisation, contactez le support Datadog.

Échantillonnage

Si vous souhaitez que le span soit inclus dans les métriques de trace mais que vous ne voulez pas qu’il soit ingéré, utilisez des règles d’échantillonnage. Pour plus d’informations sur l’échantillonnage, consultez Contrôles d’ingestion.

Utilisation des règles d’échantillonnage

L’approche recommandée est d’utiliser des règles d’échantillonnage, qui vous permettent d’échantillonner les traces en fonction des noms de ressources, des noms de services, des balises et des noms d’opération :

DD_TRACE_SAMPLING_RULES='[{"resource": "GET healthcheck", "sample_rate": 0.0}]'

Ou d’échantillonner en fonction des balises d’URL HTTP :

DD_TRACE_SAMPLING_RULES='[{"tags": {"http.url": "http://.*/healthcheck$"}, "sample_rate": 0.0}]'
Les décisions d'échantillonnage sont déterminées en utilisant le premier span dans une trace. Si le span contenant la balise sur laquelle vous souhaitez filtrer n'est pas un Une span est dite « racine de trace » lorsqu'elle représente la première span d'une trace. La span racine constitue le point d'entrée de la requête tracée. Sa création marque le début de la trace.Glossary, cette règle n'est pas appliquée.

Filtrage dans l’Agent Datadog

Si vous ne souhaitez pas que le span soit ingéré ou reflété dans les métriques de trace, utilisez le filtrage dans l’Agent Datadog.

Le composant Trace Agent au sein de l’Agent Datadog dispose de deux méthodes pour empêcher l’envoi de certaines traces : filtrage par balises de span ou filtrage par ressources. Si des traces sont supprimées en raison de ces paramètres, les métriques de trace excluent ces requêtes.

Configurer l’Agent de Trace pour ignorer certaines traces ou ressources s’applique à tous les services qui envoient des traces à cet Agent Datadog. Si vous avez des exigences spécifiques à l’application, utilisez la configuration du Tracer à la place.

Si aucune des options de ce guide ne répond à vos exigences, envisagez d'ajouter un tag de span personnalisé dans votre application et de l'utiliser pour supprimer des traces à l'Agent.

Ignorer les traces basées sur des balises de span

À partir de l’Agent Datadog 6.27.0/7.27.0, l’option balises de filtre supprime les traces avec des spans racines qui correspondent aux balises de span spécifiées. Cette option s’applique à tous les services qui envoient des traces à cet Agent Datadog. Les traces qui sont supprimées en raison des balises de filtre ne sont pas incluses dans les métriques de trace.

Des spans individuels au sein d'une trace ne peuvent pas être supprimés sélectivement ; si le span racine correspond aux critères de filtre, la trace complète est rejetée.

Comportement de correspondance :

L’option des balises de filtre nécessite une correspondance exacte de chaîne. Pour le filtrage basé sur des regex, voir Ignorer en fonction des ressources.

Lorsque vous spécifiez plusieurs balises, le filtre utilise la logique OU: les traces sont supprimées si le span racine correspond à l’une des balises. Pour faire correspondre plusieurs conditions simultanément, ajoutez une balise personnalisée qui représente ces critères combinés.

Configuration :

Vous pouvez spécifier des balises de span à exiger ou à rejeter en utilisant une liste de clés et de valeurs séparées par des espaces dans les variables d’environnement :

DD_APM_FILTER_TAGS_REQUIRE
Collecte uniquement les traces qui ont des spans racines avec une correspondance exacte pour les balises de span et les valeurs spécifiées. Si cela ne correspond pas à cette règle, la trace est supprimée. Par exemple, DD_APM_FILTER_TAGS_REQUIRE="key1:value1 key2:value2". Dans l’Agent Datadog 7.49+, des expressions régulières peuvent être fournies avec DD_APM_FILTER_TAGS_REGEX_REQUIRE.

DD_APM_FILTER_TAGS_REJECT Rejette les traces qui ont des spans racines avec une correspondance exacte pour les balises de span et valeurs spécifiées. Si cela correspond à cette règle, la trace est supprimée. Par exemple, DD_APM_FILTER_TAGS_REJECT="key1:value1 key2:value2". Dans Datadog Agent 7.49+, des expressions régulières peuvent être fournies avec DD_APM_FILTER_TAGS_REGEX_REJECT.

Opérateur Datadog

datadog-agent.yaml

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  override:
    nodeAgent:
      containers:
        trace-agent:
          env:
            - name: DD_APM_FILTER_TAGS_REJECT
              value: tag_key1:tag_val2 tag_key2:tag_val2

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

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

Helm

datadog-values.yaml

agents:
  containers:
    traceAgent:
      env:
        - name: DD_APM_FILTER_TAGS_REJECT
          value: tag_key1:tag_val2 tag_key2:tag_val2

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

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

Vous pouvez également définir ces valeurs dans le fichier de configuration de l’Agent en utilisant une liste séparée par des virgules :

datadog.yaml

apm_config:
  filter_tags:
    require: ["db:sql", "db.instance:mysql"]
    reject: ["outcome:success", "key2:value2"]

Par exemple, pour ignorer les vérifications de santé où le http.url correspond à ce point de terminaison :

datadog.yaml

apm_config:
  filter_tags:
    reject: ["http.url:http://localhost:5050/healthcheck"]

Balises de span disponibles

Sur le backend, Datadog crée les balises de span suivantes sur les spans après ingestion.

Remarque : Ces balises ne peuvent pas être utilisées pour supprimer des traces au niveau de l’Agent Datadog. L’agent filtre uniquement en fonction des balises disponibles avant l’ingestion.

NomDescription
http.path_groupLe chemin d’URL complet à partir de la balise http.url.
http.url_details.hostLa partie nom d’hôte de la balise http.url.
http.url_details.pathLa cible de requête complète telle que transmise dans une ligne de requête HTTP ou équivalent.
http.url_details.schemeLe schéma de requête à partir de la balise http.url.
http.url_details.queryStringLa partie de chaîne de requête à partir de la balise http.url.
http.url_details.portLe port HTTP à partir de la balise http.url.
http.useragent_details.os.familyLa famille de systèmes d’exploitation rapportée par l’User-Agent.
http.useragent_details.browser.familyLa famille de navigateurs rapportée par l’User-Agent.
http.useragent_details.device.familyLa famille de dispositifs rapportée par l’User-Agent.
À partir du 1er octobre 2022, le backend de Datadog applique un remappage afin d'appliquer la sémantique des balises de span. à travers les traceurs sur tous les spans ingérés. Si vous souhaitez supprimer des traces basées sur les balises de span racine au niveau de l'Agent Datadog, utilisez des balises dans la colonne Remap from.
Communications réseau
NomRemap from
network.host.iptcp.local.address - Node.js
network.destination.ipout.host - Tous les langages
network.destination.portgrpc.port - Python
tcp.remote.port - Node.js
out.port - Tous les langages
Requêtes HTTP
NomRemap from
http.routeaspnet_core.route - .NET
aspnet.route - .NET
laravel.route - PHP
symfony.route - PHP
http.useragentuser_agent - Java, C++
http.url_details.queryStringhttp.query.string - Python
Base de données
NomRemap from
db.systemdb.type - Java, Python, Node.js, Go
active_record.db.vendor - Ruby
sequel.db.vendor - Ruby
db.instancemongodb.db - Python
sql.db - Python
db.name - Tous les langages
db.statementcassandra.query - Go
consul.command - Python
memcached.query - Python
mongodb.query - Python, .NET, Go
redis.command - Python
redis.raw_command - Python
sql.query - Python, PHP, Node.js, Java
db.row_countcassandra.row_count - Python
db.rowcount - Python, PHP
mongodb.rows - Python
sql.rows - Python
db.cassandra.clustercassandra.cluster - Python, Go
db.cassandra.consistency_levelcassandra.consistency_level - Python, Go
db.cassandra.tablecassandra.keyspace - Python, Go
db.redis.database_indexdb.redis.dbIndex - Java
out.redis_db - Python, Ruby
db.mongodb.collectionmongodb.collection - Python, .NET, Ruby, PHP
db.cosmosdb.containercosmosdb.container - .NET
File d’attente de messages
NomRemap from
messaging.destinationamqp.destination - Node.js
amqp.queue - .NET
msmq.queue.path - .NET
aws.queue.name - .NET
messaging.urlaws.queue.url - .NET, Java
messaging.message_idserver_id - Go
messaging.message_payload_sizemessage.size - .NET, Java
messaging.operationamqp.command - .NET
msmq.command - .NET
messaging.rabbitmq.routing_keyamqp.routing_key - Java
amqp.routingKey - Node.js
messaging.rabbitmq.delivery_modemessaging.rabbitmq.exchange - .NET
messaging.msmq.message.transactionalmsmq.message.transactional - .NET
messaging.msmq.queue.transactionalmsmq.queue.transactional - .NET
messaging.kafka.consumer_groupkafka.group - Java
messaging.kafka.tombstonekafka.tombstone - .NET
tombstone - Java
messaging.kafka.partitionkafka.partition - .NET
partition - Node.js, Go, Java
messaging.kafka.offsetkafka.offset - .NET
messaging.msmq.message.transactionalmsmq.message.transactional - .NET
Appels de procédure à distance
NomRemap from
rpc.servicegrpc.method.service - Python, .NET
rpc.methodgrpc.method.name - Python, .NET, Go
rpc.grpc.packagegrpc.method.package - Python, .NET, Go
rpc.grpc.status_codegrpc.code - Go
status.code - Python, .NET, Node.js
grpc.status.code - Python, .NET, Node.js
rpc.grpc.kindgrpc.method.kind - Python, Node.js, Go, .NET
rpc.grpc.pathrpc.grpc.path - Python, Node.js, Go, .NET
rpc.grpc.request.metadata.*grpc.request.metadata.* - Python, Node.js
rpc.grpc.request.metadata - Go
rpc.grpc.response.metadata.*grpc.response.metadata.* - Python, Node.js
Erreurs
NomRemappage depuis
error.messageerror.msg - Tous les langages

Ignorer les traces basées sur les ressources

L’option ignore resources permet d’exclure les ressources si le span racine global de la trace correspond à certains critères. Voir Exclure les ressources de la collecte. Cette option s’applique à tous les services qui envoient des traces à cet Agent Datadog particulier. Les traces qui sont ignorées en raison des ressources à ignorer ne sont pas incluses dans les métriques de trace.

Vous pouvez spécifier les ressources à ignorer soit dans le fichier de configuration de l’Agent, datadog.yaml, soit avec la variable d’environnement DD_APM_IGNORE_RESOURCES. Voir les exemples ci-dessous.

Utilisation de datadog.yaml :

datadog.yaml

apm_config:
## @param ignore_resources - list of strings - optional
## A list of regular expressions can be provided to exclude certain traces based on their resource name.
## All entries must be surrounded by double quotes and separated by commas.

  ignore_resources: ["(GET|POST) /healthcheck","API::NotesController#index"]

Utilisation de DD_APM_IGNORE_RESOURCES :

DD_APM_IGNORE_RESOURCES="(GET|POST) /healthcheck,API::NotesController#index"

Notes :

  • Lors de l’utilisation du format de variable d’environnement (DD_APM_IGNORE_RESOURCES), les valeurs doivent être fournies sous forme de liste de chaînes séparées par des virgules.
  • La syntaxe regex que l’Agent de Trace accepte est évaluée par regexp de Go.
  • Selon votre stratégie de déploiement, vous devrez peut-être ajuster la regex en échappant les caractères spéciaux.
  • Si vous utilisez des conteneurs dédiés avec Kubernetes, assurez-vous que la variable d’environnement pour l’option de ressource à ignorer est appliquée au conteneur trace-agent.

Exemple

Considérez une trace qui contient des appels à /api/healthcheck dont vous ne souhaitez pas avoir de traces :

Flame graph d'une ressource que vous souhaitez que le SDK ignore

Notez le nom de ressource de la span racine globale.

  • Nom de l’opération : rack.request
  • Nom de la ressource : Api::HealthchecksController#index
  • Http.url : /api/healthcheck

Pour utiliser correctement l’option de ressource à ignorer, la règle regex écrite doit correspondre au nom de la ressource, Api::HealthchecksController#index. Quelques options regex sont possibles, mais pour filtrer exactement les traces de cette ressource telles qu’elles sont, une regex potentielle à utiliser est Api::HealthchecksController#index$.

La syntaxe peut varier en fonction de votre déploiement 

datadog.yaml

apm_config:
  ignore_resources: Api::HealthchecksController#index$

Pour plusieurs valeurs :

apm_config:
  ignore_resources: ["value1","Api::HealthchecksController#index$"]

Dans la liste des variables d’environnement du conteneur de l’Agent Datadog, ajoutez DD_APM_IGNORE_RESOURCES avec un modèle comme l’exemple ci-dessous. Docker Compose a sa propre substitution de variables à prendre en compte lorsque vous utilisez des caractères spéciaux comme $.

    environment:
      // other Datadog Agent environment variables
      - DD_APM_IGNORE_RESOURCES=Api::HealthchecksController#index$$

Pour plusieurs valeurs :

    environment:
      // other Datadog Agent environment variables
      - DD_APM_IGNORE_RESOURCES="value1","Api::HealthchecksController#index$$"

Dans votre commande docker run pour démarrer l’Agent Datadog, ajoutez DD_APM_IGNORE_RESOURCES :

docker run -d --name datadog-agent \
              --cgroupns host \
              --pid host \
              -v /var/run/docker.sock:/var/run/docker.sock:ro \
              -v /proc/:/host/proc/:ro \
              -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
              -e DD_API_KEY=<> \
              -e DD_APM_IGNORE_RESOURCES="Api::HealthchecksController#index$" \
              -e DD_APM_ENABLED=true \
              -e DD_APM_NON_LOCAL_TRAFFIC=true \
              registry.datadoghq.com/agent:latest

Pour plusieurs valeurs :

              -e DD_APM_IGNORE_RESOURCES=["value1","Api::HealthchecksController#index$"] \

Dans le conteneur dédié de trace-agent, ajoutez la variable d’environnement DD_APM_IGNORE_RESOURCES :

    - name: trace-agent
        image: "registry.datadoghq.com/agent:latest"
        imagePullPolicy: IfNotPresent
        command: ["trace-agent", "-config=/etc/datadog-agent/datadog.yaml"]
        resources: {}
        ports:
        - containerPort: 8126
          hostPort: 8126
          name: traceport
          protocol: TCP
        env:
        - name: DD_API_KEY
          valueFrom:
            secretKeyRef:
              name: "datadog-secret"
              key: api-key
        - name: DD_KUBERNETES_KUBELET_HOST
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: KUBERNETES
          value: "yes"
        - name: DOCKER_HOST
          value: unix:///host/var/run/docker.sock
        - name: DD_LOG_LEVEL
          value: "INFO"
        - name: DD_APM_ENABLED
          value: "true"
        - name: DD_APM_NON_LOCAL_TRAFFIC
          value: "true"
        - name: DD_APM_RECEIVER_PORT
          value: "8126"
        - name: DD_KUBELET_TLS_VERIFY
          value: "false"
        - name: DD_APM_IGNORE_RESOURCES
          value: "Api::HealthchecksController#index$"

Pour plusieurs valeurs :

        - name: DD_APM_IGNORE_RESOURCES
          value: '"value1","Api::HealthchecksController#index$"'

Dans la section traceAgent du fichier values.yaml, ajoutez DD_APM_IGNORE_RESOURCES dans la section env, puis démarrez helm comme d’habitude.

values.yaml

    traceAgent:
      # agents.containers.traceAgent.env -- Additional environment variables for the trace-agent container
      env:
        - name: DD_APM_IGNORE_RESOURCES
          value: Api::HealthchecksController#index$

Pour plusieurs valeurs :

        - name: DD_APM_IGNORE_RESOURCES
          value: value1, Api::HealthchecksController#index$

Alternativement, vous pouvez définir agents.containers.traceAgent.env dans la commande helm install :

helm install dd-agent -f values.yaml \
  --set datadog.apiKeyExistingSecret="datadog-secret" \
  --set agents.containers.traceAgent.env[0].name=DD_APM_IGNORE_RESOURCES, \
    agents.containers.traceAgent.env[0].value="Api::HealthchecksController#index$" \
  datadog/datadog

Si vous utilisez Amazon ECS (comme sur EC2), dans la définition de votre conteneur Agent Datadog, ajoutez la variable d’environnement DD_APM_IGNORE_RESOURCES avec des valeurs telles que le JSON évalue à quelque chose comme ceci :

    "environment": [
	// other environment variables for the Datadog Agent
        {
          "name": "DD_APM_IGNORE_RESOURCES",
          "value": "Api::HealthchecksController#index$"
        }
     ]
Filtrer les traces de cette manière supprime ces requêtes des métriques de trace. Pour des informations sur la façon de réduire l'ingestion sans affecter les métriques de trace, voir contrôles d'ingestion.

Configuration du traceur

Certains traceurs de langage peuvent supprimer des traces avant qu’elles ne soient envoyées à l’Agent Datadog. Utilisez cette option si vous avez des exigences spécifiques à l’application.

1. Si la requête est associée à une trace distribuée, la trace résultante peut avoir une inexactitude d'échantillonnage si vous supprimez des portions de celle-ci en raison de ces règles de filtrage.
2. Filtrer les traces de cette manière supprime ces requêtes des métriques de trace. Pour des informations sur la façon de réduire l'ingestion sans affecter les métriques de trace, voir contrôles d'ingestion.

Le traceur Ruby dispose d’un pipeline de post-traitement qui supprime les traces qui répondent à certains critères. Plus d’informations et d’exemples peuvent être trouvés dans Post-traitement des traces.

Par exemple, si le nom de la ressource est Api::HealthchecksController#index, utilisez la classe Datadog::Tracing::Pipeline::SpanFilter pour supprimer les traces contenant le nom de la ressource. Ce filtre peut également être utilisé pour correspondre à d’autres métadonnées disponibles pour l’objet span.

Datadog::Tracing.before_flush(
   Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.resource =~ /Api::HealthchecksController#index/ }
)

Le traceur Python offre une option pour filtrer les traces indésirables :

Utilisation de filtres personnalisés

Pour des cas d’utilisation avancés, vous pouvez créer des filtres personnalisés :

from ddtrace.trace import tracer
from ddtrace.trace import TraceFilter
import re

class CustomFilter(TraceFilter):
    def __init__(self, pattern):
        self.pattern = re.compile(pattern)

    def process_trace(self, trace):
        for span in trace:
            if span.get_tag('http.url') and self.pattern.match(span.get_tag('http.url')):
                return None  # Drop the trace
        return trace  # Keep the trace

# Configure the SDK with your custom filter
tracer.configure(trace_processors=[CustomFilter(r'http://.*/healthcheck$')])

Configurez une liste de blocage sur le plugin Http. Prenez note de ce sur quoi la liste de blocage correspond dans la documentation de l’API. Par exemple, les requêtes Http entrantes correspondent aux chemins d’URL, donc si le tag span http.url de la trace est http://<domain>/healthcheck, écrivez une règle qui correspond à l’URL healthcheck :

const tracer = require('dd-trace').init();
tracer.use('http', {
  // incoming http requests match on the path
  server: {
    blocklist: ['/healthcheck']
  },
  // outgoing http requests match on a full URL
  client: {
    blocklist: ['https://telemetry.example.org/api/v1/record']
  }
})

//import http
La configuration du SDK pour l'intégration doit venir avant que ce module instrumenté soit importé.

Le traceur Java a une option pour un TraceInterceptor personnalisé afin de filtrer certains spans. Voir Étendre les traceurs.

Par exemple, si votre nom de ressource est GET /healthcheck, écrivez un intercepteur de trace qui supprime les traces contenant ce nom de ressource. Ajustez la logique pour répondre à votre cas d’utilisation.

public class GreetingController {
   static {
       // In a class static block to avoid initializing multiple times.
       GlobalTracer.get().addTraceInterceptor(new TraceInterceptor() {
           @Override
           public Collection<? extends MutableSpan> onTraceComplete(Collection<? extends MutableSpan> trace) {
               for (MutableSpan span : trace) {
                   if ("GET /healthcheck".contentEquals(span.getResourceName())) {
                       return Collections.emptyList();
                   }
               }
               return trace;
           }
           @Override
           public int priority() {
               return 200;  // Some unique number
           }
       });
   }
}