Ignorar los recursos no deseados en APM

Un servicio puede administrar una variedad de solicitudes, algunas de las cuales puede que no desees que se rastreen o se incluyan en las métricas de traces (trazas). Un ejemplo de esto son, posiblemente, los checks de estado en una aplicación web. Esta documentación cubre dos opciones principales: muestreo y filtrado.

Si necesitas ayuda para decidir cuál opción es la más adecuada para tu caso de uso, ponte en contacto con asistencia técnica de Datadog.

Muestreo

Si deseas que el span (tramo) se incluya en las métricas de traces (trazas) pero no deseas que se ingiera, utiliza reglas de muestreo. Para obtener más información sobre el muestreo, consulta Controles de ingesta.

Utilización de reglas de muestreo

El enfoque de recomendado consiste en utilizar reglas de muestreo, que permiten muestrear traces (trazas) en función de los nombres de los recursos, los nombres de los servicios, las etiquetas (tags) y los nombres de las operaciones:

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

O para realizar un muestreo basado en las etiquetas (tags) de la URL HTTP:

DD_TRACE_SAMPLING_RULES='[{"tags": {"http.url": "http://.*/healthcheck$"}, "sample_rate": 0.0}]'
Nota: Las decisiones de muestreo se determinan utilizando el primer span (tramo) de una trace (traza). Si el span (tramo) que contiene la etiqueta sobre la que se deseas filtrar no es una trace root span (span de origen de traza), esta regla no se aplica.

Filtrado

Si no deseas que se ingiera el span (tramo) y no deseas que se refleje en las métricas de traces (trazas), utiliza el filtrado.

Existen dos formas de especificar que un punto de conexión de este tipo no debe rastrearse y debe excluirse de las métricas de trazas:

Opciones de configuración del Trace Agent

El componente Trace Agent dentro del Datadog Agent tiene dos métodos para evitar que aparezcan ciertas trazas: ignorar etiquetas (tags) de tramos (spans) o ignorar recursos. Si se descartan trazas debido a esta configuración, las métricas de trazas excluyen estas solicitudes.

La configuración del Trace Agent para ignorar ciertos tramos o recursos se aplica a todos los servicios que envían trazas a este Datadog Agent particular. Si tienes requisitos específicos de la aplicación, utiliza, en su lugar, el método de Configuración del rastreador.

Ignorar en función de las etiquetas de tramos

Empezando con el Datadog Agent 6.27.0/7.27.0, con la opción filtrar por etiquetas, se descartan trazas con tramos de raíz que coincidan con etiquetas de tramos especificadas. Esta opción se aplica a todos los servicios que envían trazas a este Datadog Agent particular. Las trazas que se descartan debido al filtro por etiquetas no se incluyen en las métricas de trazas.

Si puedes identificar mediante programación un conjunto de trazas que sabes que no deseas enviar a Datadog y ninguna otra opción de esta guía resuelve tu necesidad, puedes considerar añadir una etiqueta de tramo personalizada para poder descartar las trazas. Ponte en contacto con el servicio de soporte técnico para tratar tu caso de uso con más detalle, de modo que Datadog pueda seguir ampliando esta funcionalidad.

La opción de filtrar por etiquetas requiere una coincidencia exacta de las cadenas. Si tu caso de uso requiere ignorar por expresiones regulares, consulta Ignorar en función de los recursos.

Puedes especificar etiquetas de tramos para requerir o rechazar utilizando un lista de claves y valores separados por espacios en variables de entorno:

DD_APM_FILTER_TAGS_REQUIRE
Recopila solo las trazas que tienen tramos de raíz con una coincidencia exacta con las etiquetas de tramos y valores especificados. Si no coincide con esta regla, se descarta la traza. Por ejemplo, DD_APM_FILTER_TAGS_REQUIRE="key1:value1 key2:value2". En el Datadog Agent 7.49+, las expresiones regulares pueden estar provistas de DD_APM_FILTER_TAGS_REGEX_REQUIRE.
DD_APM_FILTER_TAGS_REJECT
Rechaza las trazas que tienen tramos de raíz con una coincidencia exacta con las etiquetas de tramos y valores especificados. Si coincide con esta regla, se descarta la traza. Por ejemplo, DD_APM_FILTER_TAGS_REJECT="key1:value1 key2:value2". En el Datadog Agent 7.49+, las expresiones regulares pueden estar provistas de DD_APM_FILTER_TAGS_REGEX_REJECT.

También las puedes configurar en la configuración del Agent con una lista separada por comas:

datadog.yaml

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

Por ejemplo, para ignorar comprobaciones de estado donde la http.url coincide con este punto conexión:

Datadog.yaml

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

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

Al filtrar trazas de esta manera, se eliminan estas solicitudes de las métricas de trazas. Para obtener más información sobre cómo reducir el consumo sin afectar las métricas de trazas, consulta Controles de consumo.

En el backend, Datadog crea y añade las siguientes etiquetas (tags) de spans (tramos) a los spans (tramos) después de la ingesta. Ten en cuenta que estas etiquetas (tags) no se pueden utilizar para eliminar traces (trazas) en el nivel del Datadog Agent, ya que el Agent sólo filtra en función de las etiquetas (tags) disponibles antes de la ingesta.

NombreDescripción
http.path_groupLa ruta de acceso de URL completa desde la etiqueta http.url.
http.url_details.hostLa parte del nombre de host de la etiqueta http.url.
http.url_details.pathEl destino completo de la solicitud tal y como se pasa en una línea de solicitud HTTP o equivalente.
http.url_details.schemeEl esquema de solicitud de la etiqueta http.url.
http.url_details.queryStringLa parte de la cadena de consulta de la etiqueta http.url.
http.url_details.portEl puerto HTTP de la etiqueta http.url.
http.useragent_details.os.familyLa familia del SO informada por el User-Agent.
http.useragent_details.browser.familyLa familia de navegadores informada por el User-Agent.
http.useragent_details.device.familyLa familia de dispositivos informada por el User-Agent.
Nota: Desde el 1.º de octubre de 2022, el backend Datadog aplica una reasignación para aplicar la Semántica de etiquetas (tags) de spans (tramos) a través de rastreadores en todos los spans (tramos) ingeridos. Si deseas descartar spans (tramos) en función de las etiquetas (tags) en el nivel del Datadog Agent, utiliza las etiquetas (tags) en la columna Reasignar desde.
Comunicaciones de red
NombreReasignar desde
network.host.iptcp.local.address - Node.js
network.destination.ipout.host - Todos los lenguajes
network.destination.portgrpc.port - Python
tcp.remote.port - Node.js
out.port - Todos los lenguajes
Solicitudes HTTP
NombreReasignar desde
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 datos
NombreReasignar desde
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 - Todos los lenguajes
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
Cola de mensajes
NombreReasignar desde
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 - Nodes.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
Llamadas a procedimientos remotos
NombreReasignar desde
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
Errores
NombreReasignar desde
error.messageerror.msg - Todos los lenguajes

Ignorar en función de los recursos

La opción ignorar recursos permite excluir recursos si el tramo de raíz global de la traza coincide con determinados criterios. Consulta Excluir recursos de la recopilación. Esta opción se aplica a todos los servicios que envían trazas a este Datadog Agent particular. Las trazas que se descartan porque se ignoran recursos no se incluyen en las métricas de trazas.

Puedes especificar los recursos que deseas ignorar en el archivo de configuración del Agent, datadog.yaml o con la variable de entorno DD_APM_IGNORE_RESOURCES. Consulta los ejemplos siguientes.

Utilización de Datadog.yaml:

Datadog.yaml

apm_config:
## @param ignore_resources - lista de cadenas - opcional
## Se puede proporcionar un lista de expresiones regulares para excluir determinados trazas en función del nombre del recurso.
## Todas las entradas deben ir entre comillas dobles y separadas por comas.

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

Utilización de DD_APM_IGNORE_RESOURCES:

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

Notas:

  • Cuando se utiliza el formato de variable de entorno (DD_APM_IGNORE_RESOURCES), los valores deben proporcionarse como una lista de cadenas separadas por comas.
  • La sintaxis de las expresiones regulares que acepta el Trace Agent se evalúa con expresiones regulares de Go.
  • Según cuál sea tu estrategia de despliegue, puedes tener que ajustar la expresión regular escapando caracteres especiales.
  • Si utilizas contenedores dedicados con Kubernetes, asegúrate de que la variable de entorno para la opción de ignorar recursos se esté aplicando al contenedor del Trace-Agent.
Ejemplo

Considera una traza que contiene llamadas a /api/healthcheck desde la cual no deseas trazas:

Gráfica de llamas de un recurso que deseas que el rastreador ignore

Toma nota del nombre del recurso del tramo de raíz global.

  • Nombre de la operación: rack.request
  • Nombre del recurso: Api::HealthchecksController#index
  • Http.url: /api/healthcheck

Para utilizar correctamente la opción de ignorar recurso, la regla de la expresión regular escrita debe coincidir con el nombre del recurso, Api::HealthchecksController#index. Existen varias opciones de expresiones regulares posibles, pero para filtrar trazas desde este recurso tal como está, una posible expresión regular que puedes utilizar es Api::HealthchecksController#index$.

Según cuál sea tu forma de despliegue, la sintaxis será un poco diferente:

Datadog.yaml

apm_config:
  ignore_resources: Api::HealthchecksController#index$

Para valores múltiples:

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

En la lista de variables de entorno del contenedor del Datadog Agent, añade DD_APM_IGNORE_RESOURCES con un patrón como el del ejemplo siguiente. Docker Compose tiene su propia sustitución de variables para tener en cuenta cuando utilices caracteres especiales como $.

   environment:
      // otras variables de entorno del Datadog Agent
      - DD_APM_IGNORE_RESOURCES=Api::HealthchecksController#index$$

Para valores múltiples:

   environment:
      // otras variables de entorno del Datadog Agent
      - DD_APM_IGNORE_RESOURCES="value1","Api::HealthchecksController#index$$"

En tu comando Docker run para hacer girar el Datadog Agent, añade 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 \
              gcr.io/datadoghq/agent:latest

Para valores múltiples:

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

En el contenedor del Trace Agent dedicado, añade la variable de entorno DD_APM_IGNORE_RESOURCES:

    - name: trace-agent
        image: "gcr.io/datadoghq/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$"

Para valores múltiples:

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

En la sección traceAgent del archivo values.yaml, añade DD_APM_IGNORE_RESOURCES en la sección env y, a continuación, haz girar helm como de costumbre.

values.yaml

    traceAgent:
      # agents.containers.traceAgent.env -- Variables de entorno adicionales para el contenedor del trace-agent
      env:
        - name: DD_APM_IGNORE_RESOURCES
          value: Api::HealthchecksController#index$

Para valores múltiples:

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

También puedes configurar agents.containers.traceAgent.env en el comando 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 utilizas Amazon ECS (como en EC2), en tu definición del contenedor del Datadog Agent, añade la variable de entorno DD_APM_IGNORE_RESOURCES con los valores necesarios para que el JSON evalúe de la siguiente manera:

    "environment": [
    // otras variables de entorno para el Datadog Agent
        {
          "name": "DD_APM_IGNORE_RESOURCES",
          "value": "Api::HealthchecksController#index$"
        }
     ]
Nota: Al filtrar trazas de esta manera, se eliminan estas solicitudes de las métricas de trazas. Para obtener información sobre cómo reducir el consumo sin afectar las métricas de trazas, consulta controles de consumo.

Opciones de configuración del rastreador

Algunos de los rastreadores específicos del lenguaje tienen una opción para modificar tramos antes de que se envíen al Datadog Agent. Utiliza esta opción si tienes requisitos específicos de la aplicación y utilizas uno de los lenguajes que se enumeran a continuación.

Notas:
1. Si la solicitud está asociada a una trace (traza) distribuida, la trace (traza) resultante puede tener imprecisiones de muestreo si se descartan partes de ella debido a estas reglas de filtrado.
2. Filtrar traces (trazas) de esta manera elimina estas solicitudes de las métricas de traces (trazas) . Para obtener información sobre cómo reducir la ingesta sin afectar a las métricas de traces (trazas), consulta los controles de ingesta.

El rastreador de Ruby tiene un pipeline de posprocesamiento que elimina trazas que cumplen ciertos criterios. Puedes obtener más información y ejemplos en Trazas de posprocesamiento.

Por ejemplo, si el nombre del recurso es Api::HealthchecksController#index, utiliza la clase Datadog::Tracing::Pipeline::SpanFilter para eliminar trazas que contengan el nombre del recurso. Este filtro también puede utilizarse para hacer coincidir otros metadatos disponibles para el objeto de tramo.

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

El rastreador Python ofrece una opción para filtrar los traces (trazas) no deseadas:

Uso de filtros personalizados

Para casos de uso avanzados, puedes crear filtros personalizados:

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 tracer with your custom filter
tracer.configure(trace_processors=[CustomFilter(r'http://.*/healthcheck$')])

Configura una lista de bloqueados en la extensión Http. Toma nota de las coincidencias de la lista de bloqueados en los documentos de la API. Por ejemplo, las solicitudes Http entrantes coinciden con las rutas de acceso URL, entonces, si la etiqueta de tramo http.url de la traza es http://<domain>/healthcheck, escribe una regla de acceso que coincida con la 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
Nota: La configuración del rastreador para la integración debe venir antes de que se importe ese módulo instrumentado.

El rastreador de Java tiene una opción para que un TraceInterceptor personalizado filtre determinados tramos. Consulta Ampliar los rastreadores.

Por ejemplo, si el nombre de tu recurso es GET /healthcheck, escribe un interceptor de trazas que descarte trazas que contengan este nombre del recurso. Ajusta la lógica para adaptarla a tu caso de uso.

public class GreetingController {
   static {
       // En un bloque estático de clase para evitar inicializar muchas veces.
       GlobalTracer.get().addTraceInterceptor(new TraceInterceptor() {
           @Override
           public Collection<? extends MutableSpan> onTraceComplete(Collection<? extends MutableSpan> trace) {
               para (MutableSpan span : trace) {
                   si ("GET /healthcheck".contentEquals(span.getResourceName())) {
                       devolver Collections.emptyList();
                   }
               }
               devolver traza;
           }
           @Override
           public int priority() {
               devolver 200;  // Algún número único
           }
       });
   }
}