OpenTelemetry and Jaeger are both open-source CNCF graduated projects used in distributed tracing, but they operate at completely different layers. OpenTelemetry is an instrumentation and collection framework. Jaeger is a distributed tracing storage and visualization backend.
The relationship between them has also changed significantly with Jaeger v2 (released November 2024, current stable v2.18.0 as of May 2026): Jaeger v2 is now built directly on the OpenTelemetry Collector framework, accepts OTLP natively, and ships as a single binary. Jaeger v1 reached end-of-life on December 31, 2025 and will no longer receive updates.
Key Takeaways
- OpenTelemetry handles instrumentation and transport. Jaeger handles trace storage, querying, and visualization. They are complementary, not competing
- Jaeger v2 (latest: v2.18.0, May 2026) is built on the OpenTelemetry Collector framework. It is a distribution of the OTel Collector with Jaeger-specific storage and query extensions added
- Jaeger v1 reached end-of-life on December 31, 2025 and will no longer receive security updates or bug fixes. Upgrade to v2 if you are still running v1
- The standard production pattern is: instrument with OTel SDKs, route through the OTel Collector, and export traces to Jaeger via OTLP. No Jaeger-specific client libraries are needed in your application code
- Jaeger only handles traces. It does not store metrics or logs. OpenTelemetry supports traces, metrics, logs, and profiling (beta)
- The primary supported distributed storage backends in Jaeger v2 are Cassandra, Elasticsearch, and OpenSearch. ClickHouse is supported as an experimental backend behind a feature gate. Kafka is supported as an intermediary buffer, not as a primary storage backend
What Each Tool Does
OpenTelemetry

OpenTelemetry is the instrumentation and collection layer. It provides language-specific SDKs for generating traces, metrics, and logs from application code, the OpenTelemetry Protocol (OTLP) for transporting that data, and the Collector for receiving, processing, and routing it to any backend.
What OpenTelemetry does not do: it has no storage engine, no query interface, no trace visualization UI, and no alerting system. It is a pipeline that feeds backends.
Jaeger

Jaeger is a distributed tracing backend. It stores trace data, provides a query API for retrieving traces, and a UI at port 16686 for visualizing individual traces, service dependency graphs, and latency distributions.
What Jaeger does not do: it has no instrumentation API, no SDK, no metrics storage, and no log storage. It handles traces only.
The Core Differences
| OpenTelemetry | Jaeger | |
| What it is | Instrumentation and collection framework | Distributed tracing storage and visualization backend |
| Signals supported | Traces, metrics, logs, profiling (beta) | Traces only |
| Instrumentation | Yes (APIs and SDKs for 11+ languages) | No |
| Storage | None | Yes (Cassandra, Elasticsearch, OpenSearch as primary backends; ClickHouse experimental; Kafka as buffer) |
| Query interface | None | Yes (HTTP API and gRPC API) |
| Visualization UI | None | Yes (port 16686) |
| Wire protocol | OTLP (gRPC port 4317, HTTP port 4318) | OTLP natively in v2 |
| Vendor lock-in | None | None (open source, data portable) |
| Latest version | SDK per language (all stable as of 2026) | v2.18.0 (May 2026) |
How Jaeger v2 Changed the Relationship
Before Jaeger v2, the two tools were architecturally separate. Applications were instrumented with either OTel SDKs or Jaeger’s own client libraries, and data flowed to the Jaeger collector via Jaeger Thrift protocol. Teams running OTel needed the OTel Collector’s Jaeger exporter to translate OTLP into Jaeger Thrift.
Jaeger v2 eliminated this separation. The key changes confirmed from the official Jaeger release blog and CNCF announcement:
- Jaeger v2 is a distribution of the OTel Collector. The Jaeger team built v2 by taking the OTel Collector as the foundation and adding Jaeger-specific extensions: jaeger_storage (pluggable trace storage), jaeger_query (the query service and UI), and jaeger_storage_exporter. The cmd/jaeger binary assembles both standard OTel Collector components and these Jaeger-specific components into a single executable.
- Jaeger v2 accepts OTLP natively end-to-end. There is no longer a translation layer between OTLP and Jaeger’s internal format. Traces arrive as OTLP, are stored in an OTLP-compatible data model, and served via the query API.
- Multiple v1 binaries replaced by one. Jaeger v1 required separate processes for the agent, collector, query, and ingester. Jaeger v2 ships as a single binary configured through a single YAML file using the same configuration format as the OTel Collector.
- Jaeger v1 is end-of-life. As of December 31, 2025, Jaeger v1 receives no further updates, security patches, or bug fixes. The official download page states this explicitly.
How to Send Traces from OTel to Jaeger v2
Routing through the OTel Collector to Jaeger v2
The standard production setup routes traces from your application SDK through the OTel Collector and into Jaeger v2 via OTLP:
# otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
otlp/jaeger:
endpoint: jaeger:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/jaeger]Jaeger v2 configuration
Jaeger v2 is configured as an OTel Collector distribution using a single YAML file:
# jaeger-config.yaml
service:
extensions: [jaeger_storage, jaeger_query]
pipelines:
traces:
receivers: [otlp]
exporters: [jaeger_storage_exporter]
extensions:
jaeger_storage:
backends:
some_store:
memory:
max_traces: 100000
jaeger_query:
storage:
traces: some_store
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
jaeger_storage_exporter:
trace_storage: some_store
Run Jaeger v2:
docker run -d \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-v $(pwd)/jaeger-config.yaml:/etc/jaeger/config.yaml \
jaegertracing/jaeger:2.18.0 \
--config /etc/jaeger/config.yamlBecause Jaeger v2 is itself an OTel Collector distribution, you can also point your OTel SDK directly at Jaeger v2’s OTLP endpoint without routing through a separate Collector. This simplifies small deployments:
OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318 \
OTEL_SERVICE_NAME=order-service \
java -javaagent:opentelemetry-javaagent.jar -jar app.jarJaeger v1 Migration: What Changes
If you are still running Jaeger v1, these are the key changes:
| Jaeger v1 | Jaeger v2 | |
| Binary count | Multiple (agent, collector, query, ingester) | Single binary |
| Configuration format | Environment variables per binary | Single YAML file (OTel Collector format) |
| Native ingestion protocol | Jaeger Thrift (UDP/6831, HTTP/14268), Zipkin | OTLP (gRPC/4317, HTTP/4318) |
| Application instrumentation | Jaeger client libraries (deprecated) or OTel SDK | OTel SDK only |
| Kubernetes deployment | Jaeger Operator | OTel Operator using OpenTelemetryCollector CRD |
| Cassandra | Yes | Yes |
| Elasticsearch and OpenSearch | Yes | Yes |
| Badger (in-memory, all-in-one only) | Yes | Yes |
| ClickHouse | No | Yes (experimental, behind feature gate) |
| Kafka (as buffer, not storage) | Yes | Yes |
| UI port | 16686 | 16686 (unchanged) |
| End-of-life status | EOL December 31, 2025 | Actively maintained |
Jaeger v2 Storage Backends
The official Jaeger v2 docs (last updated April 2026) describe the backends as follows:
| Backend | Status | Best for |
| Cassandra | Primary supported | Large-scale production deployments already running Cassandra |
| Elasticsearch | Primary supported | Teams already running Elasticsearch; recommended for large-scale production |
| OpenSearch | Primary supported | Teams running OpenSearch; feature-compatible with Elasticsearch backend |
| Badger | Supported (all-in-one only) | Local development and testing; not suitable for production |
| Memory | Supported (all-in-one only) | Demo and quick-start only; traces lost on restart |
| ClickHouse | Experimental (feature gate) | Evaluation only; not recommended for production until stable |
| Kafka | Buffer only (not storage) | High-throughput deployments where Kafka sits between collectors and storage |
Jaeger vs Other Trace Backends
| Backend | Signals supported | Storage | Best for |
| Jaeger v2 | Traces only | Cassandra, Elasticsearch, OpenSearch (primary) | Teams wanting an open-source dedicated trace backend with a rich UI |
| Grafana Tempo | Traces only | Object storage (S3, GCS, Azure Blob) | Teams already in the Grafana stack. Very cost-effective at scale |
| Zipkin | Traces only | In-memory, MySQL, Cassandra, Elasticsearch | Simpler setups; predates OTel |
| OpenSearch with Data Prepper | Traces, logs | Self-hosted or managed | Teams wanting unified trace and log search |
Common Setup Problems
| Problem | Likely cause | Fix |
| Still running Jaeger v1 | v1 reached end-of-life December 31, 2025 | Migrate to Jaeger v2. Replace multiple binaries with a single binary and convert env-based config to the OTel Collector YAML format |
| Traces not appearing in Jaeger UI | OTel Collector exporter pointing at wrong port, or TLS mismatch | Confirm the OTLP exporter points at Jaeger’s OTLP port (4317 for gRPC, 4318 for HTTP). Check Jaeger logs for connection errors |
| Jaeger v2 config file errors | Using v1 environment variable names in v2 | Jaeger v2 uses the OTel Collector YAML format. All configuration is in a single file, not environment variables per component |
| Kubernetes deployment using v1 Jaeger Operator | Jaeger Operator uses v1 architecture | Switch to the OTel Operator with an OpenTelemetryCollector CRD using the Jaeger v2 image |
| Jaeger Thrift data not accepted | Sending Thrift to Jaeger v2 | Jaeger v2 accepts OTLP, not Thrift natively. Migrate instrumentation to OTel SDKs. The OTel Collector’s jaegerreceiver can accept Thrift and forward as OTLP if migration is not yet complete |
When You Need More Than Traces: Where CubeAPM Fits

Jaeger solves one problem exceptionally well: storing and visualizing distributed traces. When a trace shows a slow span, Jaeger shows you the full trace hierarchy. What it does not show is the infrastructure metric at that moment, the log records from that exact request, or how the trace correlates with the metrics your team already monitors in Prometheus.
Correlating a slow Jaeger trace with infrastructure metrics and logs requires jumping between tools and matching timestamps manually. The shared trace ID that OpenTelemetry provides across signals makes this correlation technically possible, but Jaeger stores only one signal.
CubeAPM accepts OTLP directly from your existing OTel SDK or Collector, the same data you would send to Jaeger, and stores traces, metrics, and logs together. When a slow trace appears, you move from the trace to the infrastructure metric on the affected host to the logs from that exact request without switching tools. It offers distributed tracing and runs self-hosted inside your own infrastructure at $0.15/GB ingestion pricing with no per-user fees, so data never leaves your environment.
Summary
OpenTelemetry and Jaeger are complementary tools at different layers of the observability stack. OpenTelemetry handles instrumentation and collection across all signals. Jaeger handles trace storage, querying, and visualization. Jaeger v2 deepened this relationship by building directly on the OTel Collector framework, accepting OTLP natively, and replacing multiple v1 binaries with a single binary. Jaeger v1 is end-of-life as of December 31, 2025. The primary supported production storage backends in v2 are Cassandra, Elasticsearch, and OpenSearch.
| OpenTelemetry | Jaeger v2 | |
| Role | Instrumentation and collection | Trace storage and visualization |
| Signals | Traces, metrics, logs, profiling (beta) | Traces only |
| Instrumentation | Yes (11+ languages) | No |
| Primary storage backends | None | Cassandra, Elasticsearch, OpenSearch |
| UI | None | Yes (port 16686) |
| Wire protocol | OTLP | OTLP natively (v2 built on OTel Collector) |
| Latest version | Stable per language (2026) | v2.18.0 (May 2026) |
| v1 status | N/A | End-of-life December 31, 2025 |
Disclaimer: Jaeger version (v2.18.0, confirmed from jaegertracing.io/docs/2.18), v1 end-of-life date (December 31, 2025, confirmed from jaegertracing.io/download), storage backend status (Cassandra and Elasticsearch as primary, ClickHouse as experimental, confirmed from jaegertracing.io/docs/2.18/storage and jaegertracing.io/roadmap last modified April 2026), and Jaeger v2 architecture details are verified against official Jaeger documentation as of May 2026.
Also read:
How to Set Up OpenTelemetry in .NET Applications
How to Instrument Django Applications with OpenTelemetry
How to Add OpenTelemetry Tracing to a Spring Boot Application





