AI

OSSの分散トレーシング比較:Jaeger vs SigNoz vs OpenTelemetry でマイクロサービスのボトルネックを可視化する

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

OSSの分散トレーシング比較:Jaeger vs SigNoz vs OpenTelemetry でマイクロサービスのボトルネックを可視化する

Datadog APM(月$31/ホスト〜)・New Relic(月$25/ユーザー〜)に対して、Jaeger(最も普及したOSS分散トレーシング)・SigNoz(DatadogのOSS代替)・OpenTelemetry(観測可能性の共通標準)はOSSのAPM・分散トレーシングツールです。

分散トレーシングが解決する問題

マイクロサービスで「なぜこのAPIが遅いか」を特定する具体的なケース:

  • レイテンシの根本原因: リクエストがAuth→UserService→DBの3ホップで遅いとき、どのホップに何ms消費しているか
  • エラー連鎖の追跡: UserServiceのエラーがOrderServiceのタイムアウトを引き起こしていることを確認
  • N+1クエリ検出: ループ内で100回DBクエリが発行されていることをトレースで発見
  • SLA違反の証拠: p95レイテンシが500msを超えているエンドポイントを特定してSREに報告

主要ツールの概要

OpenTelemetry (OTel)

2019年にOpenTracingとOpenCensusが統合されて誕生したCNCFのOSSプロジェクトです。GitHubスター4k+(仕様リポジトリ)。分散トレーシング・メトリクス・ログの共通標準で、アプリにSDKを組み込むだけでJaeger・SigNoz・Datadog・New Relicなど任意のバックエンドにデータを送れます。ベンダーロックインなしの観測可能性を実現するデファクトスタンダードです。

# Node.js アプリへのOpenTelemetry SDK組み込み
npm install   @opentelemetry/sdk-node   @opentelemetry/auto-instrumentations-node   @opentelemetry/exporter-trace-otlp-http   @opentelemetry/resources   @opentelemetry/semantic-conventions
// tracing.js - アプリのエントリポイントより先に読み込む
import { NodeSDK } from "@opentelemetry/sdk-node";
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";

const sdk = new NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: "my-nextjs-api",
    [SemanticResourceAttributes.SERVICE_VERSION]: "1.0.0",
    "deployment.environment": process.env.NODE_ENV,
  }),
  traceExporter: new OTLPTraceExporter({
    url: "http://otel-collector:4318/v1/traces",
    headers: {},
  }),
  instrumentations: [
    getNodeAutoInstrumentations({
      // HTTP, Express, fetch, pg, mysql, mongodb を自動計装
      "@opentelemetry/instrumentation-http": { enabled: true },
      "@opentelemetry/instrumentation-express": { enabled: true },
      "@opentelemetry/instrumentation-pg": { enabled: true },
    }),
  ],
});

sdk.start();
process.on("SIGTERM", () => sdk.shutdown());

// package.json scripts に追加:
// "start": "node --require ./tracing.js server.js"
// カスタムスパンで任意の処理を計測
import { trace, context, SpanStatusCode } from "@opentelemetry/api";

const tracer = trace.getTracer("my-api");

async function processOrder(orderId) {
  // カスタムスパン作成
  return tracer.startActiveSpan("process-order", async (span) => {
    try {
      span.setAttributes({
        "order.id": orderId,
        "order.source": "web",
      });

      // 子スパン(DBクエリ)
      const order = await tracer.startActiveSpan("db.get_order", async (dbSpan) => {
        dbSpan.setAttribute("db.statement", "SELECT * FROM orders WHERE id = $1");
        const result = await db.query("SELECT * FROM orders WHERE id = $1", [orderId]);
        dbSpan.end();
        return result;
      });

      // 子スパン(決済API)
      await tracer.startActiveSpan("payment.charge", async (paySpan) => {
        paySpan.setAttributes({
          "payment.provider": "stripe",
          "payment.amount": order.total,
        });
        await stripe.charges.create({ amount: order.total, currency: "jpy" });
        paySpan.end();
      });

      span.setStatus({ code: SpanStatusCode.OK });
      return order;
    } catch (error) {
      span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
      span.recordException(error);
      throw error;
    } finally {
      span.end();
    }
  });
}

Jaeger

2015年にUberが開発したOSSの分散トレーシングシステムです。GitHubスター21k+。KubernetesネイティブなCNCFプロジェクトで、Spanの収集・ストレージ(Cassandra/Elasticsearch/In-memory)・UIの一体型ツール。OpenTelemetryからのデータを受信してサービスマップ・レイテンシ分布・エラー率を可視化します。

# docker-compose.yml - Jaeger + OTel Collector
version: '3.8'
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"   # Jaeger UI
      - "14268:14268"   # Jaeger Collector HTTP
      - "4317:4317"     # OTLP gRPC
      - "4318:4318"     # OTLP HTTP
    environment:
      COLLECTOR_OTLP_ENABLED: "true"
      SPAN_STORAGE_TYPE: badger     # 開発用(本番はElasticsearch)
      BADGER_EPHEMERAL: "false"
      BADGER_DIRECTORY_VALUE: /badger/data
      BADGER_DIRECTORY_KEY: /badger/key
    volumes:
      - jaeger_data:/badger

  # 本番: Elasticsearch バックエンド
  # jaeger-collector:
  #   image: jaegertracing/jaeger-collector:latest
  #   environment:
  #     SPAN_STORAGE_TYPE: elasticsearch
  #     ES_SERVER_URLS: http://elasticsearch:9200

volumes:
  jaeger_data:

# Jaeger UI: http://localhost:16686
# トレース送信先: http://localhost:4318/v1/traces

SigNoz

2021年に公開されたOSSのフルスタック観測可能性プラットフォームです。GitHubスター19k+。Datadog/New Relicに最も近いOSS代替で、トレース・メトリクス・ログを1つのUIで統合管理。ClickHouseをストレージに使って高速なクエリを実現。APMダッシュボード・アラート・サービスマップが標準装備されています。

# SigNozをDockerで起動
git clone https://github.com/SigNoz/signoz
cd signoz/deploy

# docker-compose で全コンポーネントを起動
docker compose up -d

# 起動後の確認
docker compose ps

# SigNoz UI: http://localhost:3301
# OTel Collector: http://localhost:4318

# アプリのOTLP送信先を SigNoz に設定
# OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318

機能比較表

比較項目JaegerSigNozOpenTelemetry
役割トレーシングUI・バックエンドフルスタックAPMSDK・標準
メトリクス✅(SDK)
ログ統合✅(SDK)
アラート
サービスマップ
ストレージElasticsearch/CassandraClickHouse不問
GitHub Stars21k+19k+4k+

SigNozのメトリクスとトレースをGrafanaと組み合わせるにはDevOpsカテゴリ/categories/devopsのGrafana+Prometheusと統合できます。アプリのエラートレースをSlackに通知するにはCommunicationカテゴリ/categories/communicationのSlack Webhookを使います。

FAQ

Q. OpenTelemetry・Jaeger・SigNozの関係性を教えてください

A. 役割が異なります。OpenTelemetry(OTel): アプリにSDKを入れてトレース・メトリクス・ログデータを生成・送信するための標準。バックエンドはない(送信先として任意のツールを指定)。Jaeger: OTelで収集したトレースデータを受信・保存・可視化するバックエンド+UI。トレース専用。SigNoz: OTelデータを受信して保存・可視化するフルスタックAPM。トレース+メトリクス+ログを1UIで管理。つまり正しい組み合わせは「OTel SDK(アプリ内)→ SigNoz or Jaeger(バックエンド)」です。OTelがDopplerなら、JaegerはGrafana、SigNozはDatadogに相当するイメージです。

Q. Pythonアプリ(FastAPI)にOpenTelemetryを組み込むには?

A. FastAPIの自動計装が最短です。

pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
# FastAPIアプリの起動コマンドを変更するだけ
# 変更前: uvicorn main:app --host 0.0.0.0 --port 8000
# 変更後:
# OTEL_RESOURCE_ATTRIBUTES="service.name=my-fastapi"
# OTEL_EXPORTER_OTLP_ENDPOINT="http://signoz:4318"
# opentelemetry-instrument uvicorn main:app --host 0.0.0.0 --port 8000

# カスタムスパン(任意の処理を計測)
from opentelemetry import trace
tracer = trace.get_tracer(__name__)

async def recommend_products(user_id: str):
    with tracer.start_as_current_span("recommend-products") as span:
        span.set_attribute("user.id", user_id)
        recommendations = await ml_model.predict(user_id)
        span.set_attribute("recommendations.count", len(recommendations))
        return recommendations

Q. Jaegerのトレースデータをどのくらいの期間保存できますか?

A. ストレージバックエンドによって異なります。Badger(開発用): デフォルト72時間(設定変更可)。Cassandra: TTLで設定(デフォルト2日、拡張可)。Elasticsearch: インデックス保存期間に従う(ILMポリシーで30日・90日等を設定)。本番環境ではElasticsearch + ILMポリシー(30日保存・古いインデックスを自動削除)が最もコスト効率が良い構成です。保存コスト試算: 1日あたり100万スパン × 30日 = 約3GB(Elasticsearchで)。SigNozはClickHouseを使うため圧縮率が高くElasticsearchの1/3〜1/5のストレージで同等の保存が可能です。

Q. OpenTelemetryでNext.js App Router(Edge Runtime)は計装できますか?

A. Edge Runtimeは制限があります。Node.js Runtimeなら@opentelemetry/sdk-nodeで全自動計装が可能。Edge RuntimeはNode.js APIを持たないため、@opentelemetry/apiのみ使えますが自動計装はできません(手動スパンのみ)。next.config.jsinstrumentationHook: trueを設定してinstrumentation.tsからSDKを初期化する方法が推奨されています。Vercel上ではVercel Telemetry(OTel互換)を使いOTLP経由でSigNozに転送できます。

まとめ

ユースケース推奨ツール
ベンダーロックインなしの計装標準OpenTelemetry SDK
トレース特化・K8sネイティブJaeger
Datadog代替・トレース+メトリクス+ログ統合SigNoz

関連外部リソース

他の記事も読む

Let's Build Together

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

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