分散トレーシング
Distributed Tracing
GPT-4.icon
分散トレーシング(Distributed Tracing)とは、マイクロサービスや分散システム全体でリクエストの流れを追跡(トレース)する技術です。
🔍 なぜ必要なのか?
モノリシックなアプリケーションでは、ログを見れば1つのプロセス内で完結するため、どこが遅いかなどを比較的簡単にわかります。
しかし、マイクロサービスや分散アーキテクチャになると以下のような課題が発生します:
リクエストが複数サービスをまたぐ
API や非同期キュー、DB、外部サービスなど多様な処理が絡む
ログだけではどのリクエストがどこを通ったのか分からない
👉 分散トレーシングは、リクエストがどのサービス・処理を通ったのかを「一本の線」で可視化してくれる技術です。
🧠 基本概念
分散トレーシングでは、リクエストごとに トレース(Trace) という ID を持ちます。
トレースは複数の スパン(Span) に分かれます:
Trace: リクエスト全体の追跡単位
Span: 各サービス・関数・外部呼び出しの処理単位
Parent-Child関係: スパンは階層構造を持ち、親スパン → 子スパンの関係でつながる
code:_
Trace ID: 12345
├── Span A (API Gateway)
│ ├── Span B (Auth Service)
│ ├── Span C (User Service)
│ │ └── Span D (DB Query)
🌐 どうやって情報を渡すの?
HTTPヘッダーなどを使って トレースIDやスパンIDを伝播します。よくある標準:
traceparent header(W3C Trace Context)
x-datadog-trace-id や x-b3-traceid(Datadog や Zipkin の独自実装)
🛠️ ツール例
table:_
ツール 特徴
dd-trace 商用。UIが強力でサポートも豊富
OpenTelemetry CNCF発、業界標準のトレーシングライブラリ(各種ベンダー対応)
Jaeger OSS。軽量で導入しやすい
Zipkin 古参のトレーシングシステム。簡素だが高速
✅ メリット
リクエストの遅延の原因を可視化(どこで時間かかってる?)
サービス間の依存関係を明確化
障害発生時にどのサービスが原因かすぐわかる
🚫 デメリット・注意点
初期導入のコスト(各サービスへのインストルメンテーション)
トレースデータの量が多くなりがち(集約・保管の工夫が必要)
外部公開 API に trace ヘッダーを渡す際の情報漏洩注意
🎨 イメージ図(簡略)
code:_
Client --> API Gateway --> User Service --> DB
|
--> Email Service
この一連の流れを「一本のトレース」として可視化できます。