Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第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 が登録されていることを確認)

これで、アプリケーションからのテレメトリデータを受け入れる準備が完了しました。