AI

分散トレース比較:Jaeger vs Zipkin vs OpenTelemetry Collector で分散トレースを実装する

オープンソースラボ編集部2026年6月14日

分散トレース比較:Jaeger vs Zipkin vs OpenTelemetry Collector で分散トレースを実装する

マイクロサービス・Kubernetesアーキテクチャで「どのサービスがボトルネックか」「リクエストが失敗した原因はどこか」を特定するには、**分散トレーシング(Distributed Tracing)**が必須です。Jaeger(CNCF卒業・Uber発祥)・Zipkin(Twitter発祥・最古のOSS分散トレーサー)・OpenTelemetry Collector(ベンダー中立の標準・現代の基盤)の3つが2026年のOSS分散トレーシング主要ツールです。

分散トレーシングが必要な理由

  • 根本原因分析: マイクロサービス間のレイテンシ(Span)を可視化して「どのサービスが遅いか」を特定
  • 依存関係マップ: サービス間の呼び出し関係を自動生成してアーキテクチャを把握
  • P99レイテンシ追跡: 通常は高速でも高レイテンシになる特定リクエストの原因を特定
  • エラー伝播: 1つのサービスの障害が他のサービスにどう影響するか(カスケード障害)を追跡

主要ツールの概要

Jaeger

2017年公開(CNCF/Uber)、Go製のOSSです。GitHubスター20k+。CNCF卒業プロジェクトの代表的な分散トレーシングシステムで、サービスごとのSpan収集・トレースUI・依存グラフ・ホットロードサンプリング設定を提供します。Elasticsearch/Cassandra/Kafkaをバックエンドに使用可能です。

# docker-compose.yml: Jaeger All-in-One(開発・中小規模)
version: "3.8"
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    restart: unless-stopped
    ports:
      - "16686:16686"  # Jaeger UI
      - "4317:4317"    # OTLP gRPC(OpenTelemetry)
      - "4318:4318"    # OTLP HTTP
      - "14268:14268"  # Jaeger HTTP Thrift
      - "6831:6831/udp" # Jaeger UDP(Compact Thrift)
    environment:
      COLLECTOR_OTLP_ENABLED: "true"
      SPAN_STORAGE_TYPE: badger  # 組み込みストレージ(開発用)
      BADGER_EPHEMERAL: "false"
      BADGER_DIRECTORY_VALUE: /badger/data
    volumes:
      - jaeger_data:/badger

volumes:
  jaeger_data:
# Python: OpenTelemetryでJaegerにトレースを送信
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
import httpx

def setup_tracer(service_name: str) -> trace.Tracer:
    '''OpenTelemetry Tracerを設定(JaegerのOTLPエンドポイントにSpanを送信)'''
    resource = Resource.create({'service.name': service_name, 'service.version': '1.0.0'})
    provider = TracerProvider(resource=resource)
    exporter = OTLPSpanExporter(endpoint='http://jaeger:4317', insecure=True)
    provider.add_span_processor(BatchSpanProcessor(exporter))
    trace.set_tracer_provider(provider)
    return trace.get_tracer(service_name)

tracer = setup_tracer('order-service')

async def process_order(order_id: str) -> dict:
    '''注文処理の各ステップをSpanでトレース'''
    with tracer.start_as_current_span('process-order') as span:
        span.set_attribute('order.id', order_id)
        span.set_attribute('service.operation', 'process_order')

        # 在庫確認(子Span)
        with tracer.start_as_current_span('check-inventory') as inv_span:
            inv_span.set_attribute('inventory.check', True)
            async with httpx.AsyncClient() as client:
                inv_resp = await client.get(f'http://inventory-service/items/{order_id}')
            inv_span.set_attribute('inventory.status', inv_resp.status_code)

        # 決済処理(子Span)
        with tracer.start_as_current_span('process-payment') as pay_span:
            pay_span.set_attribute('payment.method', 'credit_card')
            async with httpx.AsyncClient() as client:
                pay_resp = await client.post('http://payment-service/charge',
                                             json={'order_id': order_id})
            if pay_resp.status_code != 200:
                span.record_exception(Exception(f'決済失敗: {pay_resp.status_code}'))
                span.set_status(trace.StatusCode.ERROR)
                raise ValueError('決済エラー')

        return {'order_id': order_id, 'status': 'completed'}

Zipkin

2012年公開(Twitter/OpenZipkin)、Java製のOSSです。GitHubスター17k+。分散トレーシングの草分け的OSSで、シンプルなUIとコンパクトな設計が特徴です。B3 Propagation形式(X-B3-TraceIdX-B3-SpanIdX-B3-Sampled HTTPヘッダー)でトレースコンテキストを伝播します。

# docker-compose.yml: Zipkin + Elasticsearch バックエンド
version: "3.8"
services:
  zipkin:
    image: openzipkin/zipkin:latest
    restart: unless-stopped
    ports:
      - "9411:9411"  # Zipkin UI + API
    environment:
      STORAGE_TYPE: elasticsearch
      ES_HOSTS: http://elasticsearch:9200
    depends_on: [elasticsearch]

  elasticsearch:
    image: elasticsearch:8.12.0
    environment:
      discovery.type: single-node
      xpack.security.enabled: "false"
      ES_JAVA_OPTS: "-Xms512m -Xmx512m"
    volumes:
      - es_data:/usr/share/elasticsearch/data

volumes:
  es_data:

OpenTelemetry Collector

2021年公開(CNCF)、Go製のOSSです。GitHubスター4k+(otel-collector本体)。ベンダー中立のテレメトリデータ(トレース・メトリクス・ログ)の収集・変換・エクスポートパイプラインで、アプリケーションはOTLPを使ってCollectorに送信→CollectorがJaeger・Zipkin・DataDog・New Relicなど任意のバックエンドに転送します。

# docker-compose.yml: OpenTelemetry Collector + Jaeger + Prometheus
version: "3.8"
services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:latest
    restart: unless-stopped
    ports:
      - "4317:4317"   # OTLP gRPC受信
      - "4318:4318"   # OTLP HTTP受信
      - "8889:8889"   # Prometheusメトリクスエクスポート
      - "13133:13133" # ヘルスチェック
    volumes:
      - ./otel-config.yaml:/etc/otel-collector-config.yaml
    command: ["--config=/etc/otel-collector-config.yaml"]

  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"

  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
# otel-config.yaml: Collectorパイプライン設定
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_mib: 400
    spike_limit_mib: 150

exporters:
  jaeger:
    endpoint: jaeger:14250
    tls: { insecure: true }
  prometheus:
    endpoint: "0.0.0.0:8889"
  logging: { loglevel: debug }

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [jaeger, logging]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [prometheus]

機能比較表

比較項目JaegerZipkinOTel Collector
CNCF卒業✅(Incubating)
OTLP対応✅(基盤)
UI✅ 充実✅ シンプル❌(転送のみ)
多バックエンド対応✅ 100+
GitHub Stars20k+17k+4k+

分散トレーシングはDevOpsカテゴリ/categories/devopsのPrometheusメトリクス・Lokiログ集約と組み合わせてLGTMスタック(Loki+Grafana+Tempo+Mimir)でObservability(可観測性)の三本柱(Metrics・Logs・Traces)を構築します。セキュリティカテゴリ/categories/securityのゼロトラストアーキテクチャ・サービスメッシュと組み合わせてリクエストの認証・認可・レイテンシを全Span単位で追跡します。

FAQ

Q. JaegerをKubernetesにHelmでデプロイするには?

A. Jaeger Operatorを使ってKubernetesに本番レディなJaegerクラスターをデプロイします。手順: ①helm repo add jaegertracing https://jaegertracing.github.io/helm-chartshelm install jaeger-operator jaegertracing/jaeger-operator -n observability --create-namespace③JaegerカスタムリソースをYAMLで定義(kind: Jaegerspec.strategy: productionspec.storage.type: elasticsearchspec.storage.options.es.server-urls: http://elasticsearch:9200)→kubectl apply -f jaeger.yamlkubectl get jaeger -n observabilityで起動確認。サイドカー自動注入: NamespaceやDeploymentにsidecar.jaegertracing.io/inject: "true"アノテーション→JaegerのJaeger AgentサイドカーがPodに自動注入→アプリからlocalhost:6831にUDP送信でTraceをCollect。

Q. OpenTelemetryでPythonアプリを自動計装するには?

A. **opentelemetry-instrumentコマンドでPythonアプリを再起動なしに自動計装(Zero-code instrumentation)**できます。インストール: pip install opentelemetry-distro opentelemetry-exporter-otlpopentelemetry-bootstrap -a install(使用ライブラリを自動検出してインストルメンテーションを追加)。起動: OTEL_SERVICE_NAME=my-service OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317 opentelemetry-instrument python app.py→Flask・FastAPI・Django・requests・SQLAlchemy等が自動計装される。手動Span: 自動計装でカバーされないビジネスロジックにwith tracer.start_as_current_span('process-order')で手動Spanを追加。属性: span.set_attribute('user.id', user_id)span.set_attribute('payment.amount', amount)でビジネスコンテキストをSpanに付与→Jaegerでのトレース分析が容易。

Q. JaegerとZipkinのどちらを選ぶべきですか?

A. 新規構築・OTLP対応・大規模マイクロサービスならJaeger既存ZipkinインフラのB3 Propagation互換維持・シンプルさ優先ならZipkinが向いています。Jaeger優位: ①CNCF卒業プロジェクトで長期サポート保証②OTLP(OpenTelemetryプロトコル)ネイティブサポート→最新のOTel SDKと相性最良③Kafka統合でトレースデータのバッファリング・スケールアウト④アダプティブサンプリング(トラフィック量に応じてサンプリングレートを自動調整)。Zipkin優位: ①Spring Cloud Sleuth(Spring Boot)との統合が成熟②B3ヘッダー(X-B3-TraceId)を使う既存コードをそのまま流用③JVM・JAXベースの小規模サービスでJava製ZipkinとWarがマッチ④設定がシンプルで迅速に立ち上げ可能。推奨: 新規プロジェクトはOTel Collector→Jaegerのパイプラインを採用し、既存はZipkin互換レイヤーをOTel Collectorで提供してJaegerに転送する移行パスを使う。

Q. OpenTelemetry CollectorでDataDogやNew Relicに同時送信するには?

A. OTel Collectorのexportersセクションに複数のバックエンドを定義してServiceパイプラインで並列送信します。設定: exportersにdatadogapi.key: ${DD_API_KEY})・otlphttp/newrelicendpoint: https://otlp.nr-data.netheaders.api-key: ${NR_API_KEY})・jaegerを定義→serviceのpipelines.traces.exportersに[jaeger, datadog, otlphttp/newrelic]を追加→CollectorがFanoutしてすべてのバックエンドに送信。コスト制御: samplingプロセッサーで本番トラフィックの5%のみDataDog(有料)に送信してコストを削減→残り100%はJaeger(セルフホスト・無料)に送信→開発時のデバッグはJaegerで行い、本番監視はDataDogのSLO/アラートを活用するハイブリッド構成。

まとめ

ユースケース推奨ツール
新規・OTLP・大規模K8sJaeger
既存Zipkin互換・シンプルZipkin
多バックエンド転送・ベンダー中立OTel Collector

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。