はじめに
AWS ECS Fargate + ALB 構成で Datadog APM を導入していると、
トレースに以下のように ELB-HealthChecker/2.0 が大量に記録されることがあります。
この記事では、それらを トレースから除外する安全な方法 を整理します。
🎯 対象読者
- ECS Fargate で Datadog APM を使っている方
- ALBのヘルスチェックが
/や/healthに設定されている - トレースデータのノイズを減らしたい
- コスト最適化(不要なトレース削減)をしたい
💡 結論:おすすめの対策は2通り
| 対策 | 特徴 | 難易度 |
|---|---|---|
| 1. URLパスで除外(推奨) | Datadog Agent側で簡単設定。ほぼ全言語で共通。 | ⭐️ 簡単 |
| 2. User-Agentで除外 | ELBヘルスチェックのみを厳密に除外できる。アプリ側コード変更が必要。 | ⚙️ 中 |
✅ 対策1:URLパスで除外(DD_APM_IGNORE_RESOURCES)
ECS Fargate の Datadog Agent コンテナに以下の環境変数を設定します。
{
"name": "datadog-agent",
"image": "public.ecr.aws/datadog/agent:latest",
"essential": true,
"environment": [
{ "name": "DD_API_KEY", "value": "<your_api_key>" },
{ "name": "DD_APM_ENABLED", "value": "true" },
{ "name": "DD_LOGS_ENABLED", "value": "true" },
// ヘルスチェック用パスを除外
{ "name": "DD_APM_IGNORE_RESOURCES", "value": "GET /health,HEAD /health" }
],
"portMappings": [{ "containerPort": 8126, "protocol": "tcp" }]
}
もし ALB のヘルスチェックパスが / の場合は、次のようにします。
{ "name": "DD_APM_IGNORE_RESOURCES", "value": "GET /,HEAD /" }
🧠 注意点
-
DD_APM_IGNORE_RESOURCESは 完全一致 でマッチします。
部分一致や正規表現ではありません。 - そのため
GET /を指定してもGET /loginやGET /api/...は除外されません。 - 複数指定はカンマ区切りでOK。
| リソース名 | 除外される? |
|---|---|
| GET / | ✅ |
| GET /login | ❌ |
| GET /api/v1/data | ❌ |
🧩 理由:これが最も安全で汎用的
DD_APM_IGNORE_RESOURCES は Datadog Agent が持つ標準機能で、すべての言語・フレームワークで有効 です。
タスク定義の修正だけで運用チーム側が統一管理できます。
✅ 対策2:User-Agentで除外(アプリ側で実装)
より厳密に User-Agent: ELB-HealthChecker/2.0 のみを除外したい場合は、
アプリコード内で Datadog トレーサを初期化するときにフィルタを設定します。
const tracer = require('dd-trace').init({
plugins: false
});
tracer.use('http', {
blocklist: [
req => req.headers['user-agent']?.startsWith('ELB-HealthChecker')
]
});
from ddtrace import patch_all, config
patch_all()
config.http_server["ignore_request"] = lambda request: \
request.headers.get("User-Agent", "").startswith("ELB-HealthChecker")
import "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
mux := httptrace.NewServeMux()
handler := httptrace.WrapHandler(mux, "web",
httptrace.WithSpanOptions(httptrace.SpanOpts{
IgnoreRequest: func(req *http.Request) bool {
return strings.HasPrefix(req.UserAgent(), "ELB-HealthChecker")
},
}),
)
💡 補足
この方法はフレームワークや言語ごとに実装が必要ですが、
User-Agent 単位で柔軟に除外できるのが強みです。
たとえば「監視ツールの Ping だけ除外」「特定クライアントだけ除外」なども可能です。
🧩 DD_TRACE_EXCLUDE との違い
一部ブログや古い記事では DD_TRACE_EXCLUDE が紹介されていますが、
これは古い Datadog ライブラリ(特に Python <1.0)でのみ利用できる非推奨設定です。
| 環境変数 | 現行サポート | 用途 |
|---|---|---|
| DD_APM_IGNORE_RESOURCES | ✅ 正式・全言語共通 | Resource名で除外 |
| DD_TRACE_EXCLUDE | ⚠️ 非推奨・一部限定 | 旧バージョン互換 |
💰 効果
- 不要なトレース(特にヘルスチェック)が Datadog に送られなくなる
- ノイズが減り、サービスの応答時間やトランザクション分析が明確化
- APMコスト削減にも直結(送信データ量が減る)
✅ まとめ
| 対策 | 方法 | メリット | デメリット |
|---|---|---|---|
| DD_APM_IGNORE_RESOURCES | URL パス単位で無視 | 簡単・言語に依存しない | User-Agent 単位では除外不可 |
| ignore_request (コード) | User-Agent ベースで無視 | 柔軟・精密除外可能 | アプリ改修が必要 |
| UIフィルタ (一時的) | Datadog 画面で非表示 | すぐできる | データ送信は止まらない |
🧾 設定例
{
"name": "datadog-agent",
"image": "public.ecr.aws/datadog/agent:latest",
"essential": true,
"environment": [
{ "name": "DD_API_KEY", "value": "<your_api_key>" },
{ "name": "DD_APM_ENABLED", "value": "true" },
{ "name": "DD_LOGS_ENABLED", "value": "true" },
{ "name": "DD_APM_IGNORE_RESOURCES", "value": "GET /health,HEAD /health" }
]
}
🧭 まとめ
-
User-Agent単位では Agent 設定だけでは除外できない - URL 単位除外(
DD_APM_IGNORE_RESOURCES)が最も手軽 - アプリ内フックで ELB ヘルスチェック専用除外も可能
🎁 おわりに
「Datadog トレース数が多い」「ノイズが多い」場合の最初のチューニングとしてこの設定を入れておけば、モニタリングの精度と可読性が大幅に上がると思います。
📘 参考ドキュメント

