Datadog Metrics Without Limits: 「高カーディナリティの呪い」を解き、コストを支配するアーキテクチャ戦略
オブザーバビリティの現場において、多くのエンジニアが直面する悪夢がある。それは「カスタムメトリクスの爆発」だ。ユーザーID、リクエストID、あるいはデプロイメントのコンテキストをタグとして付与した瞬間、Datadogの請求書は指数関数的に跳ね上がる。
かつて我々は、このコストと引き換えに「どのタグを捨てるか」という苦渋の決断を迫られていた。だが、Metrics Without Limits (MWL) の登場により、そのパラダイムは完全に崩壊した。
今日は、単なる管理画面の設定方法ではない。Datadogの内部構造を理解し、この機能をハックして「コストと解像度を完全に制御下におく」ための、伝説的なアーキテクチャ論を語ろう。
—
1. なぜ「高カーディナリティ」は破壊的なのか
まず、コストの正体を見極めねばならない。Datadogの課金体系は「メトリクスの数(カーディナリティ)」に依存している。
- 罠の正体: `api.request.count{user_id: “…”}` を無防備に放り込めば、ユーザー数分だけ時系列データが生成される。100万人のユーザーがいれば、100万個の時系列データだ。
- 現場の痛み: 以前なら、ここで「`user_id`タグを削除する」という前処理(statsdでの集約やDogStatsDのフィルタリング)を強いられた。だが、それは「障害発生時の根本原因調査」というオブザーバビリティの核心を放棄する行為に等しい。
MWLは、この「全データを送るか、捨てるか」という二元論を破壊し、「取り込み(Ingestion)は全量、保存・課金は必要分のみ」という分離モデルを実現した。
—
2. MWLの内部アーキテクチャ:インデックス化の分離
MWLの肝は、インジェスト・パイプラインとインデックス・ストアのデカップリングにある。
通常、DogStatsDから送られたメトリクスは即座にインデックスされ、クエリ可能な状態になる。しかしMWLを有効にすると、データは「取り込みパイプライン」を通過する際、タグベースのフィルタリングと集約ルールを適用され、必要な分だけが「課金対象のインデックス」へとルーティングされる。
導入の極意:タグの選別ルール(Custom Metrics Indexing)
以下のJSON設定をAPI経由で定義することで、コストを最適化する。
// インデックス戦略の定義例 (Datadog API)
{
“name”: “high-cardinality-filter”,
“filter”: {
“query”: “metric:my.app.custom.request.”
},
“exclusion_filters”: [
{
“name”: “exclude-dev-and-test”,
“filter”: “env:(dev|test)” // 開発・テスト環境のタグはインデックスせず、コストを削減
}
],
“tag_configuration”: {
“tags”: [“service”, “region”, “endpoint”] // 必要なタグのみをインデックスに残し、不要な高カーディナリティ・タグを捨てる
}
}
—
3. 「 Metrics Without Limits」を骨の髄まで掌握するハック
ただ設定するだけでは、真のエキスパートとは言えない。以下の運用ノウハウこそが、現場で震えるほど役立つ知見だ。
① インジェスト・ログによる「カーディナリティ探索」
どのメトリクスがコストを圧迫しているのか? 管理画面を眺めるのはやめろ。Datadogの `Metric Metadata API` を叩き、カーディナリティの急上昇を検知するスクリプトをCI/CDパイプラインに組み込むのだ。
特定のメトリクスのタグ値の組み合わせ数を取得するワンライナー
curl -X GET “https://api.datadoghq.com/api/v1/metrics?metric_name=my.custom.metric” \
-H “DD-API-KEY: ${DD_API_KEY}” \
-H “DD-APPLICATION-KEY: ${DD_APP_KEY}” | jq ‘.metadata.tag_set | length’
これがある閾値を超えたらSlackへアラートを飛ばす。これが「見えないコスト」を制御する第一歩だ。
② 「全量保存」を捨てる勇気、クエリ時に「再集約」する知恵
MWLの真価は、「生のデータはバックエンド(S3等)に投げておき、Datadog上はダッシュボードで見るべきものだけをインデックスする」という運用にある。
- 戦略:
1. 全ての高カーディナリティ・データをStatsDから投げる。
2. MWLで「集約用タグ(`env`, `service`)」のみをインデックスする。
3. 詳細な調査(`user_id`レベル)が必要な場合のみ、Datadogの「Logs」や「Trace」と紐付け、スパンのタグを活用する。
メトリクスをメトリクスとして保存するな。メトリクスは指標であり、コンテキストはトレースに持たせる。これが分散トレーシング時代の鉄則だ。
—
4. 最後に:伝説的アーキテクトからの忠告
オブザーバビリティとは「監視」ではない。「システムの内部状態を理解すること」だ。
MWLは、コストの制約から我々を解放したが、同時に「何を残し、何を捨てるか」というアーキテクトとしての判断力をより一層鋭く求めている。全てのタグをインデックスすることは、結局のところ「何も理解していない」ことと同義になりかねない。
- 自動化せよ: メトリクスの命名規則を徹底し、不要なタグはインジェスト段階で落とせ。
- 計測せよ: 課金額とクエリパフォーマンスの相関を常にダッシュボードで監視せよ。
- シンプルに保て: 複雑な集約ルールを作るよりも、コード側のメトリクス生成ロジックを見直す方が、長期的には運用コストが低い。
君たちが設計するシステムが、たとえどれほど高負荷であっても、Datadogの壁に阻まれることはもうない。この力を使い、完璧な可観測性を手に入れてくれ。
現場からは以上だ。コードを書きに行こう。