Services often handle endpoints whose traffic you may not want to trace (for example, health checks). This guide explains the following approaches for excluding that traffic:
Sampling: Use when you want requests to remain visible in trace metrics, but reduce trace ingestion volume.
Filtering in the Datadog Agent: Use to exclude requests entirely (including from trace metrics) across all services reporting to the Agent.
Tracer configuration: Use when filtering logic must be applied per service or depends on application-specific context (for example, request attributes or runtime state).
If you need assistance deciding which option is the most relevant for your use case, contact Datadog support.
Sampling
If you want the span included in the trace metrics but don’t want it ingested, use sampling rules. For more information on sampling, see Ingestion Controls.
Using sampling rules
The recommended approach is to use sampling rules, which allow you to sample traces based on resource names, service names, tags, and operation names:
Sampling decisions are determined using the first span in a trace. If the span containing the tag you want to filter on is not a A span is a trace root span when it is the first span of a trace. The root span is the entry-point method of the traced request. Its start marks the beginning of the trace.Glossary, this rule is not applied.
Filtering in the Datadog Agent
If you don’t want the span ingested or reflected in trace metrics, use filtering in the Datadog Agent.
The Trace Agent component within the Datadog Agent has two methods to prevent certain traces from being sent: filtering by span tags or filtering by resources. If traces are dropped due to these settings, the trace metrics exclude these requests.
Configuring the Trace Agent to ignore certain traces or resources applies to all services that send traces to this Datadog Agent. If you have application-specific requirements, use Tracer configuration instead.
If none of the options in this guide meet your requirements, consider adding a custom span tag in your application and using it to drop traces at the Agent.
Ignoring traces based on span tags
Starting with Datadog Agent 6.27.0/7.27.0, the filter tags option drops traces with root spans that match specified span tags. This option applies to all services that send traces to this Datadog Agent. Traces that are dropped because of filter tags are not included in trace metrics.
Individual spans within a trace cannot be selectively dropped; if the root span matches the filter criteria, the complete trace is discarded.
Matching behavior:
The filter tags option requires an exact string match. For regex-based filtering, see Ignoring based on resources.
When you specify multiple tags, the filter uses OR logic: traces are dropped if the root span matches any of the tags. To match multiple conditions simultaneously, add a custom tag that represents those combined criteria.
Configuration:
You can specify span tags to require or reject by using a list of keys and values separated by spaces in environment variables:
DD_APM_FILTER_TAGS_REQUIRE
Collects only traces that have root spans with an exact match for the specified span tags and values. If it does not match this rule, the trace is dropped. For example, DD_APM_FILTER_TAGS_REQUIRE="key1:value1 key2:value2". In Datadog Agent 7.49+, regular expressions can be provided with DD_APM_FILTER_TAGS_REGEX_REQUIRE.
DD_APM_FILTER_TAGS_REJECT
Rejects traces that have root spans with an exact match for the specified span tags and values. If it matches this rule, the trace is dropped. For example, DD_APM_FILTER_TAGS_REJECT="key1:value1 key2:value2". In Datadog Agent 7.49+, regular expressions can be provided with DD_APM_FILTER_TAGS_REGEX_REJECT.
On the backend, Datadog creates the following span tags on spans after ingestion.
Note: These tags cannot be used to drop traces at the Datadog Agent level. The agent only filters based on tags available before ingestion.
Name
Description
http.path_group
The full URL path from the http.url tag.
http.url_details.host
The host name portion of the http.url tag.
http.url_details.path
The full request target as passed in an HTTP request line or equivalent.
http.url_details.scheme
The request scheme from the http.url tag.
http.url_details.queryString
The query string portion from the http.url tag.
http.url_details.port
The HTTP port from the http.url tag.
http.useragent_details.os.family
The OS family reported by the User-Agent.
http.useragent_details.browser.family
The browser family reported by the User-Agent.
http.useragent_details.device.family
The device family reported by the User-Agent.
Starting from October 1st 2022, Datadog backend applies a remapping in order to apply Span Tags Semantics
across tracers on all ingested spans. If you want to drop traces based on root span tags at the Datadog Agent level, use tags in the Remap from column.
Network communications
Name
Remap from
network.host.ip
tcp.local.address - Node.js
network.destination.ip
out.host - All languages
network.destination.port
grpc.port - Python tcp.remote.port - Node.js out.port - All languages
grpc.request.metadata.* - Python, Node.js rpc.grpc.request.metadata - Go
rpc.grpc.response.metadata.*
grpc.response.metadata.* - Python, Node.js
Errors
Name
Remap from
error.message
error.msg - All languages
Ignoring traces based on resources
The ignore resources option allows resources to be excluded if the global root span of the trace matches certain criteria. See Exclude resources from being collected. This option applies to all services that send traces to this particular Datadog Agent. Traces that are dropped because of ignore resources are not included in trace metrics.
You can specify resources to ignore either in the Agent configuration file, datadog.yaml, or with the DD_APM_IGNORE_RESOURCES environment variable. See examples below.
Using 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"]
When using the environment variable format (DD_APM_IGNORE_RESOURCES), values must be provided as a comma-separated list of strings.
The regex syntax that the Trace Agent accepts is evaluated by Go’s regexp.
Depending on your deployment strategy, you may have to adjust the regex by escaping special characters.
If you use dedicated containers with Kubernetes, make sure that the environment variable for the ignore resource option is being applied to the trace-agent container.
Example
Consider a trace that contains calls to /api/healthcheck that you don’t want traces from:
Take note of the resource name of the global root span.
Operation name: rack.request
Resource name: Api::HealthchecksController#index
Http.url: /api/healthcheck
To use the ignore resource option correctly, the regex rule written must match with the resource name, Api::HealthchecksController#index. A few regex options are possible, but to filter out traces from this resource exactly as is, a potential regex to use is Api::HealthchecksController#index$.
Depending on how you deploy, the syntax looks a little different:
In the Datadog Agent container’s list of environment variables, add DD_APM_IGNORE_RESOURCES with a pattern like the example below. Docker Compose has its own variable substitution to consider when you use special characters like $.
environment:// other Datadog Agent environment variables- DD_APM_IGNORE_RESOURCES=Api::HealthchecksController#index$$
For multiple values:
environment:// other Datadog Agent environment variables- DD_APM_IGNORE_RESOURCES="value1","Api::HealthchecksController#index$$"
In your docker run command to spin up the Datadog Agent, add DD_APM_IGNORE_RESOURCES:
If you use Amazon ECS (such as on EC2), in your Datadog Agent container definition, add the environment variable DD_APM_IGNORE_RESOURCES with the values such that the JSON evaluates to something like this:
"environment":[// other environment variables for the Datadog Agent
{"name":"DD_APM_IGNORE_RESOURCES","value":"Api::HealthchecksController#index$"}]
Filtering traces this way removes these requests from trace metrics. For information on how to reduce ingestion without affecting the trace metrics, see ingestion controls.
Tracer configuration
Some language tracers can drop traces before they are sent to the Datadog Agent. Use this option if you have application-specific requirements.
1. If the request is associated with a distributed trace, the resulting trace can have sampling inaccuracy if you drop portions of it due to these filtering rules. 2. Filtering traces this way removes these requests from trace metrics. For information on how to reduce ingestion without affecting the trace metrics, see ingestion controls.
The Ruby tracer has a post-processing pipeline that removes traces that meet certain criteria. More information and examples can be found in Post-processing traces.
For example, if the resource name is Api::HealthchecksController#index, use the Datadog::Tracing::Pipeline::SpanFilter class to remove traces that contain the resource name. This filter can also be used to match on other metadata available for the span object.
The Python tracer provides an option to filter unwanted traces:
Using custom filters
For advanced use cases, you can create custom filters:
fromddtrace.traceimporttracerfromddtrace.traceimportTraceFilterimportreclassCustomFilter(TraceFilter):def__init__(self,pattern):self.pattern=re.compile(pattern)defprocess_trace(self,trace):forspanintrace:ifspan.get_tag('http.url')andself.pattern.match(span.get_tag('http.url')):returnNone# Drop the tracereturntrace# Keep the trace# Configure the tracer with your custom filtertracer.configure(trace_processors=[CustomFilter(r'http://.*/healthcheck$')])
Configure a blocklist on the Http plugin. Take note of what the blocklist matches on from the API docs. For example, incoming Http requests matches on URL paths, so if the trace’s http.url span tag is http://<domain>/healthcheck, write a rule that matches the healthcheck URL:
The tracer configuration for the integration must come before that instrumented module is imported.
The Java tracer has an option for a custom TraceInterceptor to filter out certain spans. See Extending Tracers.
For example, if your resource name is GET /healthcheck, write a trace interceptor that drops traces containing this resource name. Adjust the logic to meet your use case.