サービスでは、トレースから除外したいトラフィック (たとえば、健全性チェック) があるエンドポイントを扱うことがよくあります。このガイドでは、そのトラフィックを除外するために以下のアプローチを説明します。
サンプリング : トレースメトリクスにリクエストを表示させたいものの、トレースの取り込み量を減らしたい場合に使用します。Datadog Agent でのフィルタリング : Agent に報告するすべてのサービスで、リクエストを完全に除外するために使用します (トレースメトリクスからも除外します)。トレーサーの構成 : フィルタリングロジックをサービスごとに適用する必要がある場合や、アプリケーション固有のコンテキストに依存する場合 (たとえば、リクエスト属性やランタイム状態) に使用します。どのオプションがユーザーのユースケースに最も適しているか判断にお困りの場合は、Datadog サポート にご連絡ください。
サンプリング トレースメトリクスにスパンを含めたいものの、トレースから除外したい場合は、サンプリングルールを使用します。サンプリングに関する詳細は、Ingestion Control を参照してください。
サンプリングルールの使用 推奨されるアプローチは、リソース名、サービス名、タグ、およびオペレーション名に基づいてトレースをサンプリングできるサンプリングルールを使用することです。
DD_TRACE_SAMPLING_RULES = '[{"resource": "GET healthcheck", "sample_rate": 0.0}]'
または、HTTP URL タグに基づいてサンプリングします。
DD_TRACE_SAMPLING_RULES = '[{"tags": {"http.url": "http://.*/healthcheck$"}, "sample_rate": 0.0}]'
サンプリングの決定は、トレース内の最初のスパンを使用して行われます。フィルタリングするタグを含む スパンが trace_root_span ではない場合、このルールは適用されません。
Datadog Agent でのフィルタリング スパンが取り込まれないようにする場合、またはトレースメトリクスに反映されないようにする場合は、Datadog Agent でフィルタリングを使用します。
Datadog Agent 内の Trace Agent コンポーネントには、特定のトレースが送信されないようにするための 2 つの方法が用意されています。スパンタグによるフィルタリングまたはリソースによるフィルタリングです。これらの設定によりトレースが削除される場合、トレースメトリクスはこれらのリクエストを除外します。
特定のトレースやリソースを無視するように Trace Agent を構成すると、この Datadog Agent にトレースを送信するすべてのサービスに適用されます。アプリケーション固有の要件がある場合は、代わりにトレーサー構成 を使用します。
このガイドのいずれのオプションもユーザーの要件を満たさない場合は、アプリケーションに
カスタムスパンタグ を追加し、それを使用して Agent でトレースを削除することを検討してください。
Datadog Agent 6.27.0/7.27.0 以降では、フィルタータグ オプションによって、指定されたスパンタグに一致するルートスパンを伴うトレースを削除します。このオプションは、この Datadog Agent にトレースを送信するすべてのサービスに適用されます。フィルタータグのために削除されたトレースは、トレースメトリクスには含められません。
トレース内の個々のスパンを選択して削除することはできません。ルートスパンがフィルタリング基準に一致する場合、トレース全体が破棄されます。
一致する動作:
フィルタータグオプションには、正確な文字列一致が必要です。正規表現に基づくフィルタリングについては、Ignoring based on resources を参照してください。
複数のタグを指定すると、フィルターは OR ロジック を使用します: ルートスパンがいずれか のタグに一致する場合、トレースは削除されます。複数の条件を同時に一致させるには、それらの組み合わせ基準を表すカスタムタグを追加してください。
構成:
環境変数でキーと値をスペースで区切ったリストを使用して、require または reject するスパンタグを指定することができます。
DD_APM_FILTER_TAGS_REQUIRE指定されたスパンのタグと値が完全に一致するルートスパンがあるトレースのみを収集します。このルールに一致しない場合、トレースは削除されます。たとえば、DD_APM_FILTER_TAGS_REQUIRE="key1:value1 key2:value2" の場合です。Datadog Agent 7.49 以降では、正規表現を DD_APM_FILTER_TAGS_REGEX_REQUIRE で指定できます。 DD_APM_FILTER_TAGS_REJECT指定されたスパンのタグと値が完全に一致するルートスパンがあるトレースを拒否します。このルールに一致する場合、トレースは削除されます。たとえば、DD_APM_FILTER_TAGS_REJECT="key1:value1 key2:value2" の場合です。Datadog Agent 7.49 以降では、正規表現を DD_APM_FILTER_TAGS_REGEX_REJECT で指定できます。 Datadog Operator Copy
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 Copy
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
これらの値を Agent の構成ファイルでカンマで区切られたリストを使用して設定することもできます。
Copy
apm_config :
filter_tags :
require : [ "db:sql" , "db.instance:mysql" ]
reject : [ "outcome:success" , "key2:value2" ] たとえば、http.url がこのエンドポイントと一致する健全性チェックを無視するように設定するには次のようにします。
Copy
apm_config :
filter_tags :
reject : [ "http.url:http://localhost:5050/healthcheck" ] バックエンドでは、Datadog は取り込み後のスパンに次のスパンタグを作成します。
注 : これらのタグは、Datadog Agent レベルでトレースを削除するために使用することはできません。Agent は、取り込み前に利用可能なタグに基づいてのみフィルタリングを行います。
名前 説明 http.path_grouphttp.url タグからの完全な URL パスhttp.url_details.hosthttp.url タグのホスト名部分http.url_details.pathHTTP リクエスト行で渡された完全なリクエスト対象、またはそれに相当するもの http.url_details.schemehttp.url タグからのリクエストスキームhttp.url_details.queryStringhttp.url タグからのクエリ文字列部分http.url_details.porthttp.url タグからの HTTP ポートhttp.useragent_details.os.familyUser-Agent によって報告された OS ファミリー http.useragent_details.browser.familyUser-Agent によって報告されたブラウザファミリー http.useragent_details.device.familyUser-Agent によって報告されたデバイスファミリー
2022 年 10 月 1 日以降、Datadog のバックエンドでは
スパンタグのセマンティック
を、すべての取り込まれたスパンにわたるすべてのトレーサーに適用するために再マッピングを実施します。Datadog Agent レベルでルートスパンタグに基づいてトレースを削除したい場合は、
リマップ元 列のタグを使用してください。
ネットワーク通信 名前 リマップ元 network.host.iptcp.local.address - Node.jsnetwork.destination.ipout.host - すべての言語network.destination.portgrpc.port - Pythontcp.remote.port - Node.jsout.port - すべての言語
HTTP リクエスト 名前 リマップ元 http.routeaspnet_core.route - .NETaspnet.route - .NETlaravel.route - PHPsymfony.route - PHPhttp.useragentuser_agent - Java、C++http.url_details.queryStringhttp.query.string - Python
データベース 名前 リマップ元 db.systemdb.type - Java、Python、Node.js、Goactive_record.db.vendor - Rubysequel.db.vendor - Rubydb.instancemongodb.db - Pythonsql.db - Pythondb.name - すべての言語db.statementcassandra.query - Goconsul.command - Pythonmemcached.query - Pythonmongodb.query - Python、.NET、Goredis.command - Pythonredis.raw_command - Pythonsql.query - Python、PHP、Node.js、Javadb.row_countcassandra.row_count - Pythondb.rowcount - Python、PHPmongodb.rows - Pythonsql.rows - Pythondb.cassandra.clustercassandra.cluster - Python、Godb.cassandra.consistency_levelcassandra.consistency_level - Python、Godb.cassandra.tablecassandra.keyspace - Python、Godb.redis.database_indexdb.redis.dbIndex - Javaout.redis_db - Python、Rubydb.mongodb.collectionmongodb.collection - Python、.NET、Ruby、PHPdb.cosmosdb.containercosmosdb.container - .NET
メッセージキュー 名前 リマップ元 messaging.destinationamqp.destination - Node.jsamqp.queue - .NETmsmq.queue.path - .NETaws.queue.name - .NETmessaging.urlaws.queue.url - .NET、Javamessaging.message_idserver_id - Gomessaging.message_payload_sizemessage.size - .NET、Javamessaging.operationamqp.command - .NETmsmq.command - .NETmessaging.rabbitmq.routing_keyamqp.routing_key - Javaamqp.routingKey - Node.jsmessaging.rabbitmq.delivery_modemessaging.rabbitmq.exchange - .NETmessaging.msmq.message.transactionalmsmq.message.transactional - .NETmessaging.msmq.queue.transactionalmsmq.queue.transactional - .NETmessaging.kafka.consumer_groupkafka.group - Javamessaging.kafka.tombstonekafka.tombstone - .NETtombstone - Javamessaging.kafka.partitionkafka.partition - .NETpartition - Node.js、Go、Javamessaging.kafka.offsetkafka.offset - .NETmessaging.msmq.message.transactionalmsmq.message.transactional - .NET
リモートプロシージャコール 名前 リマップ元 rpc.servicegrpc.method.service - Python、.NETrpc.methodgrpc.method.name - Python、.NET、Gorpc.grpc.packagegrpc.method.package - Python、.NET、Gorpc.grpc.status_codegrpc.code - Gostatus.code - Python、.NET、Node.jsgrpc.status.code - Python、.NET、Node.jsrpc.grpc.kindgrpc.method.kind - Python、Node.js、Go、.NETrpc.grpc.pathrpc.grpc.path - Python、Node.js、Go、.NETrpc.grpc.request.metadata.*grpc.request.metadata.* - Python、Node.jsrpc.grpc.request.metadata - Gorpc.grpc.response.metadata.*grpc.response.metadata.* - Python、Node.js
エラー 名前 リマップ元 error.messageerror.msg - すべての言語
リソースに基づいてトレースを無視する リソースを無視 オプションは、トレースのグローバルルートスパンが特定の基準に一致する場合にリソースを除外できるようにします。リソースを収集から除外する を参照してください。このオプションは、この特定の Datadog Agent にトレースを送信するすべてのサービスに適用されます。リソースを無視が原因で削除されたトレースは、トレースメトリクスに含まれません。
無視するリソースは、Agent の構成ファイル datadog.yaml 内で指定するか、DD_APM_IGNORE_RESOURCES 環境変数で指定します。以下の例を参照してください。
datadog.yaml を使用する。
Copy
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" ] DD_APM_IGNORE_RESOURCES を使用する。
DD_APM_IGNORE_RESOURCES = "(GET|POST) /healthcheck,API::NotesController#index"
注 :
環境変数形式 (DD_APM_IGNORE_RESOURCES) を使用する場合、値はカンマ区切りの文字列のリストとして指定する必要があります。 Trace Agent が受け入れる正規表現の構文は、Go の regexp によって評価されます。 デプロイ戦略によっては、特殊文字をエスケープして正規表現を調整しなければならない場合があります。 Kubernetes で専用コンテナを使用している場合は、ignore resource オプションの環境変数が trace-agent コンテナに適用されていることを確認してください。 例 トレースから除外する /api/healthcheck への呼び出しを含むトレースを考えてみましょう。
グローバルルートスパンのリソース名に注意してください。
オペレーション名: rack.request リソース名: Api::HealthchecksController#index Http.url: /api/healthcheck リソースを無視オプションを正しく使用するには、記載かれた正規表現ルールがリソース名 Api::HealthchecksController#index と一致する必要があります。いくつかの正規表現オプションが可能ですが、このリソースからトレースを現状のまま正確にフィルタリングする場合、使用可能な正規表現は、Api::HealthchecksController#index$ です。
デプロイ方法に応じて、構文は少しずつ異なります。
Copy
apm_config :
ignore_resources : Api::HealthchecksController#index$ 複数の値の場合:
Copy
apm_config :
ignore_resources : [ "value1" , "Api::HealthchecksController#index$" ] Datadog Agent コンテナの環境変数リストに DD_APM_IGNORE_RESOURCES を追加し、以下の例のようなパターンを使用します。Docker Compose には、$ などの特殊文字を使用する際に考慮すべき独自の 変数置換 があります。
Copy
environment :
// other Datadog Agent environment variables
- DD_APM_IGNORE_RESOURCES=Api::HealthchecksController#index$$ 複数の値の場合:
Copy
environment :
// other Datadog Agent environment variables
- DD_APM_IGNORE_RESOURCES="value1","Api::HealthchecksController#index$$" Datadog Agent をスピンアップするための docker run コマンドに DD_APM_IGNORE_RESOURCES を追加します。
Copy
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複数の値の場合:
Copy
-e DD_APM_IGNORE_RESOURCES=["value1","Api::HealthchecksController#index$"] \ trace-agent 専用コンテナに環境変数 DD_APM_IGNORE_RESOURCES を追加します。
Copy
- 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$" 複数の値の場合:
Copy
- name : DD_APM_IGNORE_RESOURCES
value : '"value1","Api::HealthchecksController#index$"' values.yaml ファイルの traceAgent セクションで、env セクションに DD_APM_IGNORE_RESOURCES を追加し、その後 通常通り helm をスピンアップします 。
Copy
traceAgent :
# agents.containers.traceAgent.env -- Additional environment variables for the trace-agent container
env :
- name : DD_APM_IGNORE_RESOURCES
value : Api::HealthchecksController#index$ 複数の値の場合:
Copy
- name : DD_APM_IGNORE_RESOURCES
value : value1, Api::HealthchecksController#index$ または、helm install コマンドに agents.containers.traceAgent.env を設定することもできます。
Copy
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/datadogAmazon ECS を使用している場合 (たとえば、EC2 上で)、Datadog Agent のコンテナ定義に環境変数 DD_APM_IGNORE_RESOURCES を追加し、その値が次のような JSON に評価されるようにします。
Copy
"environment" : [
// other environment variables for the Datadog Agent
{
"name" : "DD_APM_IGNORE_RESOURCES" ,
"value" : "Api::HealthchecksController#index$"
}
] トレーサーの構成 一部の言語トレーサーは、Datadog Agent に送信される前にトレースを除外する場合があります。アプリケーション固有の要件がある場合は、このオプションを使用してください。
1. リクエストが分散されたトレースに関連付けられている場合、これらのフィルタリングルールを通じて部分的に除外すると、結果として得られるトレースのサンプリングが不正確になる場合があります。
2. この方法でトレースをフィルタリングすると、これらのリクエストが
トレースメトリクス から削除されます。トレースメトリクスに影響を与えずに取り込みを削減する方法については、
Ingestion Control を参照してください。
Ruby トレーサーには、特定の基準を満たすトレースを削除する後処理パイプラインがあります。詳細情報と例は、トレースの後処理 を参照してください。
たとえば、リソース名が Api::HealthchecksController#index の場合、リソース名を含むトレースを削除するには Datadog::Tracing::Pipeline::SpanFilter クラスを使用します。このフィルターは、スパンオブジェクト に利用可能な他のメタデータに対して一致させる目的でも使用できます。
Datadog::Tracing.before_flush(
Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.resource =~ /Api::HealthchecksController#index/ }
)
Python トレーサーは、不要なトレースをフィルタリングするオプションを提供します。
カスタムフィルターの使用 高度なユースケースでは、カスタムフィルターを作成できます。
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$' )])
Http プラグインにブロックリストを構成します。API ドキュメントでブロックリストと一致するものをメモしてください。たとえば、受信する Http リクエストは URL パスと一致するため、トレースの http.url スパンタグが http://<domain>/healthcheck の場合、healthcheck URL に一致するルールを作成します。
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
統合する SDK 構成は、そのインスツルメンテーションモジュールがインポートされる前 に行う必要があります。
Java トレーサーには、特定のスパンをフィルタリングするためのカスタム TraceInterceptor オプションがあります。トレーサーの拡張 を参照してください。
たとえば、リソース名が GET /healthcheck の場合、このリソース名を含むトレースを除外するトレースインターセプターを作成します。ユースケースに一致するようロジックを調整してください。
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
}
});
}
}