1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🚀 Datadog APMでELBのヘルスチェックを除外する方法(ECS Fargate対応)

Posted at

はじめに

AWS ECS Fargate + ALB 構成で Datadog APM を導入していると、
トレースに以下のように ELB-HealthChecker/2.0 が大量に記録されることがあります。

スクリーンショット 2025-10-27 14.43.14.png
スクリーンショット 2025-10-24 16.59.21.png

この記事では、それらを トレースから除外する安全な方法 を整理します。

🎯 対象読者

  • 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 /loginGET /api/... は除外されません。
  • 複数指定はカンマ区切りでOK。
リソース名 除外される?
GET /
GET /login
GET /api/v1/data

🧩 理由:これが最も安全で汎用的

DD_APM_IGNORE_RESOURCESDatadog Agent が持つ標準機能で、すべての言語・フレームワークで有効 です。
タスク定義の修正だけで運用チーム側が統一管理できます。

✅ 対策2:User-Agentで除外(アプリ側で実装)

より厳密に User-Agent: ELB-HealthChecker/2.0 のみを除外したい場合は、
アプリコード内で Datadog トレーサを初期化するときにフィルタを設定します。

Node.js(dd-trace)
const tracer = require('dd-trace').init({
  plugins: false
});

tracer.use('http', {
  blocklist: [
    req => req.headers['user-agent']?.startsWith('ELB-HealthChecker')
  ]
});
Python(ddtrace)
from ddtrace import patch_all, config
patch_all()

config.http_server["ignore_request"] = lambda request: \
    request.headers.get("User-Agent", "").startswith("ELB-HealthChecker")
Go(dd-trace-go)
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 画面で非表示 すぐできる データ送信は止まらない

🧾 設定例

ALBヘルスチェックが /health の場合
{
  "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 トレース数が多い」「ノイズが多い」場合の最初のチューニングとしてこの設定を入れておけば、モニタリングの精度と可読性が大幅に上がると思います。

📘 参考ドキュメント

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?