Ignorar los recursos no deseados en APM

Un servicio puede manejar una variedad de solicitudes, algunas de las cuales puede que no quieras que se rastreen o se incluyan en métricas de trazas (traces). Un ejemplo de esto son, posiblemente, las comprobaciones de estado en una aplicación web.

Hay 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:

Nota: Mediante el filtro de trazas utilizando cualquiera de las siguientes opciones 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, consulte los controles de consumo.

Si necesitas asistencia, ponte en contacto con soporte técnico de Datadog.

Opciones de configuración de 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, la opción filtrar etiquetas descarta 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 de etiquetas no se incluyen en las métricas de trazas.

Si puedes identificar mediante programación un conjunto de trazas que sabes que no quieres enviar a Datadog y ninguna otra opción de esta guía resuelve tu necesidad, puedes considerar la posibilidad de 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 filtro de etiquetas requiere una coincidencia exacta de las cadenas. Si tu caso de uso requiere ignorar por regex, 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 entornos:

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 Datadog Agent 7.49+, las expresiones regulares pueden estar provistas de DD_APM_FILTER_TAGS_REGEX_REQUIRE.
DD_APM_FILTER_TAGS_REJECT
Rechaza 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 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:
    requerir: ["db:sql", "db.instance:mysql"]
    rechazar: ["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:
    rechazar: ["http.url:http://localhost:5050/healthcheck"]

Datadog Operator

datadog-agent.yaml

apiVersion: datadoghq.com/v2alpha1
clase: DatadogAgent
metadatos:
  nombre: datadog
spec:
  sustituir:
    nodeAgent:
      contenedores:
        trace-agent:
          env:
            - nombre: DD_APM_FILTER_TAGS_REJECT
              valor: 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

agentes:
  contenedores:
    traceAgent:
      env:
        - nombre: DD_APM_FILTER_TAGS_REJECT
          valor: 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

Mediante el filtrado de trazas de esta manera, se eliminan estas solicitudes de 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 de tramos a tramos después del consumo. Estas etiquetas no pueden utilizarse para descartar trazas en el nivel del Datadog Agent .

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 Agent de usuario.
http.useragent_details.browser.familyLa familia de navegadores informada por el Agent de usuario.
http.useragent_details.device.familyLa familia de dispositivos informada por el Agent de usuario.
Nota: Desde el 1.º de octubre de 2022, el backend Datadog aplica una reasignación para aplicar la Semántica de etiquetas de tramos a través de rastreadores en todos los tramos consumidos. Si deseas descartar tramos basados en etiquetas en el nivel del Datadog Agent, utiliza etiquetas 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
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.

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"]

Notas:

  • La sintaxis expresiones regulares que acepta el Trace Agent se evalúa con regexp 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 Contenedor.

Ejemplo

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

Gráfica de llamas de un recurso que quieres 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. Hay varias opciones de expresiones regulares posibles, pero para filtrar trazas desde este recurso tal como está, una posible expresión regular es Api::HealthchecksController#index$.

Según 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 a tener en cuenta cuando utilices caracteres especiales como $.

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

Para valores múltiples:

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

En tu comando de 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 de Trace Agent dedicado, añade la variable de entorno DD_APM_IGNORE_RESOURCES:

    - nombre: trace-agent
        imagen: "gcr.io/datadoghq/agent:latest"
        imagePullPolicy: IfNotPresent
        comando: ["trace-agent", "-config=/etc/datadog-agent/datadog.yaml"]
        recursos: {}
        puertos:
        - containerPort: 8126
          hostPort: 8126
          nombre: traceport
          protocolo: TCP
        env:
        - nombre: DD_API_KEY
          valueFrom:
            secretKeyRef:
              nombre: "datadog-secret"
              clave: api-key
        - nombre: DD_KUBERNETES_KUBELET_HOST
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - nombre: KUBERNETES
          valor: "yes"
        - nombre: DOCKER_HOST
          valor: unix:///host/var/run/docker.sock
        - nombre: DD_LOG_LEVEL
          valor: "INFO"
        - nombre: DD_APM_ENABLED
          valor: "true"
        - nombre: DD_APM_NON_LOCAL_TRAFFIC
          valor: "true"
        - nombre: DD_APM_RECEIVER_PORT
          valor: "8126"
        - nombre: DD_KUBELET_TLS_VERIFY
          valor: "false"
        - nombre: DD_APM_IGNORE_RESOURCES
          valor: "Api::HealthchecksController#index$"

Para valores múltiples:

        - nombre: DD_APM_IGNORE_RESOURCES
          valor: '"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 de trace-agent
      env:
        - nombre: DD_APM_IGNORE_RESOURCES
          valor: Api::HealthchecksController#index$

Para valores múltiples:

        - nombre: DD_APM_IGNORE_RESOURCES
          valor: value1, Api::HealthchecksController#index$

Como alternativa, puedes configurar agents.containers.traceAgent.env en el comando helm install:

helm install dd-agent -f values.yaml \
  --configurar datadog.apiKeyExistingSecret="datadog-secret" \
  --configurar 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:

    "entorno": [
    // otras variables de entorno para el Datadog Agent
        {
          "nombre": "DD_APM_IGNORE_RESOURCES",
          "valor": "Api::HealthchecksController#index$"
        }
     ]
Nota: Mediante el filtrado de trazas de esta manera, se eliminan estas solicitudes de 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.

Importante: Si la solicitud está asociada a una traza distribuida, la traza resultante puede tener imprecisiones de muestreo si descartas partes de ella debido a estas reglas de filtrado.

El rastreador de Ruby tiene un pipeline de posprocesamiento que elimina trazas que cumplen ciertos criterios. 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 de Python tiene un filtro FilterRequestsOnUrl que puedes configurar para eliminar trazas de ciertos puntos de conexión. Como alternativa, puedes escribir un filtro personalizado. Consulta Filtrar trazas para obtener más información.

Supongamos que la etiqueta de tramo http.url del tramo de raíz tenga un valor de http://<domain>/healthcheck. Utiliza la siguiente expresión regular para que coincida con cualquier punto de conexión que termine en healthcheck:

desde ddtrace importa el rastreador
desde ddtrace.filters importa FilterRequestsOnUrl
tracer.configure(settings={
    'FILTROS': [
        FilterRequestsOnUrl(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 URL, entonces, si la etiqueta de tramo http.url de la traza es http://<domain>/healthcheck, escribe una regla que coincida con la URL healthcheck:

const tracer = require('dd-trace').init();
tracer.use('http', {
  // las solicitudes http entrantes coinciden en la ruta
  servidor: {
    lista de bloqueados: ['/healthcheck']
  },
  // las solicitudes http salientes coinciden en una URL completa
  cliente: {
    lista de bloqueados: ['https://telemetry.example.org/api/v1/record']
  }
})

//importar 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.

clase pública GreetingController {
   estático {
       // En un bloque estático de clase para evitar initializar muchas veces.
       GlobalTracer.get().addTraceInterceptor(new TraceInterceptor() {
           @Override
           public Collection<? extends MutableSpan> onTraceComplete(Collection<? amplía MutableSpan> traza) {
               para (tramo MutableSpan : traza) {
                   si ("OBTENER /healthcheck".contentEquals(span.getResourceName())) {
                       devolver Collections.emptyList();
                   }
               }
               devolver traza;
           }
           @Override
           prioridad int pública() {
               devolver 200;  // Algún número único
           }
       });
   }
}
Nota: Mediante el filtrado de trazas de esta manera, se eliminan estas solicitudes de métricas de trazas. Para obtener información sobre cómo reducir el consumo sin afectar las métricas de trazas, consulta los controles de consumo.