# Jaeger
Uber Technologies が発案・開発し、現在は CNCF(Cloud Native Computing Foundation)が管理するオープンソースの分散トレーシングシステム。
## 概要
- gRPC・Thrift・REST など複数の RPC プロトコルに対応。
- **トレースコンテキスト(Trace ID)** を RPC に付与してインバンドで伝播させ、各スパンの開始/終了タイムスタンプを収集。
- スパンはアウトオブバンド(非同期)でコレクターへ送信され、永続化後にトレース ID で相関付けて 1 トレースにまとめる。
- Uber での利用: 全サービスに計装済み。アダプティブサンプリング率 < 1%。1 日あたり 8.4 億トレース・2,100 億スパン(約 300 万スパン/秒)を処理。
## Uber 本番での構成(CRISP 論文より)
- **jaeger-agent**: 各ホストで稼働。アプリケーションから UDP でスパンを受信。
- **jaeger-collector**: jaeger-agent からスパンを受け取り、Kafka へバッファリング。
- **jaeger-ingester**: Kafka から Docstore(分散 SQL DB)へ挿入し、完全なトレースを検索可能にする。
- **jaeger-indexer**: Sawmill(スキーマ非依存のログ基盤)へ挿入し、フィールド検索を可能にする。
- 処理規模: 1 秒あたり約 40 万〜100 万スパン、1 日あたり約 20TB。
### スパン形式の既知の制約(CRISP 論文より)
- 親スパン(呼び出し元)は子スパンの依存情報を持たない。最後に終了した子スパンの情報は直接記録されていない。
- 異なるホストのクロックはドリフトするため、子スパンの終了順序の推定に誤差が生じる可能性がある(Uber 本番: 118K トレース中 50% 超でスパンオーバーラップ、P50=204µs、最大 1696µs)。
- テールベースサンプリングに非対応(CRISP 論文執筆時点)。ヘッドベースの適応的サンプリングを採用。
## 登場ソース
- [[@2024__PACMCAS__The Tale of Errors in Microservices]] — 非致命的 RPC エラー研究の観測基盤として使用。LR Estimator の入力データを提供
- [[@2022__USENIX ATC__CRISP - Critical Path Analysis of Large-Scale Microservice Architectures]] — [[CRISP]] の入力トレース基盤として使用。スパン形式の制約とクロックスキューへの対処を詳細に分析