第3章 フルスタック構成:Collector、Jaeger v2、Prometheus、Grafana の統合環境
本章では、OpenTelemetry Collector を中核に据え、トレースを Jaeger v2、メトリクスを Prometheus と Grafana へ集約・可視化するフルスタック運用環境を構築します。
アーキテクチャの全体像
システムの全体像とデータフローは以下の通りです。
+-----------------------+ +-----------------------+
| Python アプリケーション | | C# アプリケーション |
+-----------------------+ +-----------------------+
| |
+--------------+--------------+
| OTLP (4317 / 4318)
v
+-----------------------------+
| OpenTelemetry Collector |
| - Receivers: OTLP |
| - Processors: Batch |
| - Exporters: OTLP / Prom |
+-----------------------------+
| |
OTLP (:4317) | | Metrics Scrape (:8889)
v v
+-----------+ +------------+
| Jaeger v2 | | Prometheus |
| (Traces) | | (Metrics) |
+-----------+ +------------+
^ ^
| |
+--------+--------+
|
+-----------+
| Grafana |
| Dashboards|
+-----------+
各コンポーネントの役割は以下の通りです。
- OpenTelemetry Collector: アプリケーションから OTLP でトレースとメトリクスを一括受信し、加工・中継します。
- Jaeger v2: Collector から転送されたトレースデータ(スパン)を保存し、分散処理のタイムラインを提供します。
- Prometheus: Collector が公開するエンドポイントからメトリクスデータを定期的に収集(スクレイプ)し、時系列データベースに保存します。
- Grafana: Prometheus のメトリクスグラフと Jaeger のトレースタイムラインを 1 つの画面に統合して表示します。
ディレクトリ構成
環境構築に必要な設定ファイル群を以下の構成で配置します。
fullstack/
├── docker-compose.yaml
├── otel-collector-config.yaml
├── prometheus.yml
└── grafana/
└── provisioning/
└── datasources/
└── datasources.yaml
設定ファイルの作成
1. Collector 設定(otel-collector-config.yaml)
Collector のパイプラインを定義します。受信(receivers)、加工(processors)、出力(exporters)を組み合わせて設定します。
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 1s
send_batch_size: 1024
memory_limiter:
check_interval: 1s
limit_percentage: 75
spike_limit_percentage: 20
exporters:
# トレースを Jaeger v2 へ OTLP で転送
otlp/jaeger:
endpoint: jaeger:4317
tls:
insecure: true
# メトリクスを Prometheus がスクレイプできるように公開
prometheus:
endpoint: 0.0.0.0:8889
namespace: app
# デバッグ用標準出力
debug:
verbosity: basic
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/jaeger, debug]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus, debug]
2. Prometheus 設定(prometheus.yml)
Prometheus が Collector のエンドポイントから定期的にメトリクスを取得するように設定します。
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: "otel-collector"
static_configs:
- targets: ["otel-collector:8889"]
3. Grafana データソース自動登録(grafana/provisioning/datasources/datasources.yaml)
Grafana の起動時に、Prometheus と Jaeger を自動登録します。
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
- name: Jaeger
type: jaeger
access: proxy
url: http://jaeger:16686
isDefault: false
editable: true
4. Docker Compose 設定(docker-compose.yaml)
すべてのコンポーネントを同一ネットワーク内で起動します。
services:
# OpenTelemetry Collector Contrib
otel-collector:
image: otel/opentelemetry-collector-contrib:0.118.0
container_name: otel-collector
command: ["--config=/etc/otelcol-contrib/config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otelcol-contrib/config.yaml
ports:
- "4317:4317" # OTLP gRPC 受信
- "4318:4318" # OTLP HTTP 受信
- "8889:8889" # Prometheus メトリクス公開ポート
depends_on:
- jaeger
# Jaeger v2
jaeger:
image: jaegertracing/jaeger:2.3.0
container_name: jaeger-v2
ports:
- "16686:16686" # Web UI
environment:
- METRICS_STORAGE_TYPE=memory
# Prometheus
prometheus:
image: prom/prometheus:v3.2.1
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090" # Prometheus Web UI
# Grafana
grafana:
image: grafana/grafana:11.5.2
container_name: grafana
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
ports:
- "3000:3000" # Grafana Web UI
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
depends_on:
- prometheus
- jaeger
環境の起動と疎通確認
以下のコマンドを実行して一括起動します。
docker compose up -d
起動後、各サービスの Web 画面にアクセスして正常性を確認します。
- Jaeger v2:
http://localhost:16686 - Prometheus:
http://localhost:9090(Status -> Targets を開き、otel-collectorが UP になっていることを確認) - Grafana:
http://localhost:3000(ユーザー名:admin、パスワード:adminでログインし、Connections -> Data Sources に Prometheus と Jaeger が登録されていることを確認)
これで、アプリケーションからのテレメトリデータを受け入れる準備が完了しました。