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
機能比較表
| 比較項目 | Jaeger | SigNoz | OpenTelemetry |
|---|---|---|---|
| 役割 | トレーシングUI・バックエンド | フルスタックAPM | SDK・標準 |
| メトリクス | ❌ | ✅ | ✅(SDK) |
| ログ統合 | ❌ | ✅ | ✅(SDK) |
| アラート | ❌ | ✅ | ❌ |
| サービスマップ | ✅ | ✅ | ❌ |
| ストレージ | Elasticsearch/Cassandra | ClickHouse | 不問 |
| GitHub Stars | 21k+ | 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.jsにinstrumentationHook: trueを設定してinstrumentation.tsからSDKを初期化する方法が推奨されています。Vercel上ではVercel Telemetry(OTel互換)を使いOTLP経由でSigNozに転送できます。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| ベンダーロックインなしの計装標準 | OpenTelemetry SDK |
| トレース特化・K8sネイティブ | Jaeger |
| Datadog代替・トレース+メトリクス+ログ統合 | SigNoz |