Jaeger統合実装パターン - all-in-oneから本番構成まで
Jaegerはオープンソースの分散トレーシングシステムで、OpenTelemetryの標準的なバックエンドとして広く採用されています。このセクションでは、OpenTelemetryから収集したトレースデータをJaegerに送信する複数の実装パターンを、小規模な開発環境から本番運用まで段階的に解説します。
Jaegerのアーキテクチャ概要
Jaegerは複数のコンポーネントで構成されています。実装パターンにより、これらのコンポーネントの配置が異なります。
┌──────────────────────────────┐
│ アプリケーション │
│ (OpenTelemetry SDK) │
└──────────────┬───────────────┘
│
├─→ [パターン1] Jaeger Collector (直接送信)
│
├─→ [パターン2] Jaeger Agent → Collector
│
└─→ [パターン3] OpenTelemetry Collector → Jaeger
(フィルタリング・サンプリング)
↓
┌──────────────────┐
│ Jaeger Collector │
│ + Storage │
│ + Query (UI) │
└──────────────────┘パターン1:All-in-One構成(開発環境)
最もシンプルな構成です。Jaegerの全機能(Collector、Storage、Query)が単一プロセスで動作します。
用途: 開発環境、動作確認、トレーシング技術の学習
Dockerで起動:
docker run -d \
--name jaeger \
-p 16686:16686 \
-p 4317:4317/tcp \
jaegertracing/all-in-one:latestこのコマンドでJaegerが起動します:
- ポート16686: Web UI(トレース検索・可視化)
- ポート4317: OpenTelemetry Protocol (OTLP) gRPC エンドポイント
アプリケーション設定:
OpenTelemetryで収集したトレースを、環境変数でJaegerに送信するよう設定します。
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317アプリケーション側では、OpenTelemetry SDKを初期化する際にこの設定が自動的に使用されます。実際の設定方法は使用言語によって異なりますが、基本的にはこれだけで十分です。
メリット・デメリット:
- ✅ セットアップが極めてシンプル
- ✅ 追加インフラ不要
- ❌ ストレージはメモリのみ(再起動で消失)
- ❌ スケーラビリティなし(本番環境には不適切)
パターン2:Collector構成(小〜中規模本番環境)
OpenTelemetry CollectorをJaegerの前段に配置し、フィルタリング・サンプリング・バッチ処理を行う構成です。
┌──────────────────────────┐
│ アプリケーション群 │
│ (OpenTelemetry計装) │
└──────────────┬───────────┘
│ OTLP gRPC
┌─────▼─────┐
│ OTel │
│ Collector │ (サンプリング、フィルタリング)
└─────┬─────┘
│ Jaeger Protocol
┌─────▼──────────────────┐
│ Jaeger Collector │
│ + Elasticsearch/ │
│ Cassandra │
└────┬───────────────────┘
│
┌────▼────────┐
│ Jaeger UI │
│ (Query) │
└─────────────┘YAML設定例(OpenTelemetry Collector):
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
processors:
batch:
timeout: 10s
send_batch_size: 1024
sampling:
sampling_percentage: 10
exporters:
jaeger:
endpoint: jaeger-collector:14250
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, sampling]
exporters: [jaeger]重要なプロセッサー:
- Batch: トレースをバッチで送信。ネットワークオーバーヘッド削減
- Sampling: 全トレースの10%のみを保存。大規模環境でストレージ削減
メリット・デメリット:
- ✅ データ処理をCollectorで一元化
- ✅ サンプリングでストレージコスト削減
- ✅ Collectorが複数インスタンスで水平スケール可能
- ❌ セットアップが複雑化
- ❌ Collectorの運用が追加負担
パターン3:分散構成(大規模本番環境)
複数のJaeger Agentをホスト上にデプロイし、Collectorに集約する構成です。スケーラビリティと耐障害性に優れています。
┌────────────────────────────────────────┐
│ 複数ホスト / コンテナ │
├────────────────┬─────────────────────┤
│ Host A │ Host B / Host C... │
│ ┌─────────┐ │ ┌─────────┐ │
│ │アプリ │ │ │アプリ │ │
│ └────┬────┘ │ └────┬────┘ │
│ │ │ │ │
│ ┌────▼─────┐ │ ┌────▼─────┐ │
│ │Jaeger │ │ │Jaeger │ │
│ │Agent │ │ │Agent │ │
│ └────┬─────┘ │ └────┬─────┘ │
│ │ │ │ │
└───────┼────────┼───────┼────────────┘
│ │ │
│ └─→ [OpenTelemetry Collector]
│
└─────────────┬──────────────┐
│ (バッチ化) │
┌────▼────────────┐
│Jaeger Collector │
│+ Elasticsearch/ │
│ Cassandra │
└────┬────────────┘
│
┌────▼──────┐
│Jaeger UI │
│(Query) │
└───────────┘デプロイ方法(Docker Compose例):
各ホスト上でJaeger Agentをサイドカーコンテナとして実行:
agent:
image: jaegertracing/jaeger-agent:latest
ports:
- "6831:6831/udp"
- "16686:16686"
command: ["--reporter.logLevel=debug"]
environment:
- COLLECTOR_ZIPKIN_HOST_PORT=collector:9411メリット・デメリット:
- ✅ ホスト単位でのローカルエージェントによる低レイテンシ
- ✅ ネットワーク分断時のローカルバッファリング
- ✅ スケーラビリティに優れた構成
- ❌ 全ホストへのAgentデプロイが必要
- ❌ インフラ管理の複雑さ増加
Kubernetes環境でのデプロイ
Kubernetesでは、Helm ChartやKubernetesマニフェストを使用してJaegerをデプロイできます。
Helm Chartを使用した導入(推奨):
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm install jaeger jaegertracing/jaeger \
--namespace observability \
--create-namespaceアプリケーションポッドでのOTLP設定:
apiVersion: v1
kind: Pod
metadata:
name: sample-app
spec:
containers:
- name: app
image: myapp:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://jaeger-collector:4317
- name: OTEL_SERVICE_NAME
value: sample-serviceメリット・デメリット:
- ✅ Kubernetes OperatorやHelm Chartで簡潔にデプロイ
- ✅ スケーラビリティはクラスタで自動管理
- ✅ セルフヒーリング機能あり
- ❌ Kubernetesクラスタが前提
- ❌ Namespace管理など追加設定が必要
トレース送信方式の比較
実装パターン間でのトレース送信方式に違いがあります。
┌────────────────────────────────────────┐
│ アプリケーション │
│ (OpenTelemetry SDK) │
└────────────────┬───────────────────────┘
│
┌───────────┼────────────┐
│ │ │
│ [方式A] │ [方式B] │ [方式C]
│ 直接送信 │ Agent経由 │ Collector経由
│ │ │
▼ ▼ ▼
Jaeger Jaeger OpenTelemetry
Collector Agent Collector
│ │ │
├──────────┼────────────┤
│ │ │
└──────────┼────────────┘
▼
Jaeger Collector
+ Storage- 方式A(直接送信): レイテンシが低いが、Collectorは単一障害点
- 方式B(Agent経由): Agentがローカルバッファリング。ネットワーク耐性向上
- 方式C(Collector経由): サンプリング等の処理が可能。高度なデータ制御に向く
実装上の注意点
サンプリング戦略
本番環境ではサンプリング率を調整してストレージコストを削減します。
- 開発環境: 100%(全トレース記録)
- ステージング環境: 10-50%
- 本番環境: 1-10%(高トラフィック環境では0.1%未満も検討)
リテンション管理
Jaeger UIで確認できる保持期間を設定します。
- 開発環境: 1-7日
- 本番環境: 7-30日
古いトレースデータはストレージから自動削除します。
認証・セキュリティ
本番環境では認証とTLS暗号化は必須です:
exporters:
jaeger:
endpoint: https://jaeger-collector.example.com:14250
tls:
insecure: false
cert_file: /path/to/cert.pem
key_file: /path/to/key.pemまとめ:パターン選択ガイド
実装パターンの選択は環境規模と要件で判断します:
| パターン | 環境 | スケール | セットアップ複雑性 |
|---|---|---|---|
| All-in-One | 開発 | 小 | 最小 |
| Collector | 本番(小〜中) | 中 | 中 |
| 分散構成 | 本番(大規模) | 大 | 高 |
| Kubernetes | クラウド | 中〜大 | 中 |
実装のポイント:
- 最初はAll-in-Oneで動作確認
- 本番環境ではCollectorまたはKubernetesパターンを採用
- サンプリング率は環境に応じて細かく調整
- セキュリティ対策を早期から組み込む
次の記事: トレース検索・分析ワークフロー では、収集したトレースデータから効率的に問題を特定し、パフォーマンス分析を行う実務的なワークフローを解説します。