Notes / Observability / Reference

What is Jaeger

CNCF-graduated distributed tracing system built at Uber in 2015, Dapper-lineage like Zipkin before it — and, since Jaeger v2, rebuilt on top of the OpenTelemetry Collector rather than bespoke ingestion code.

Updated July 12, 2026 · §202607121601-3 ·

Jaeger is a distributed tracing system originally built at Uber in 2015, open-sourced and later CNCF-graduated. It sits in the same lineage as Zipkin (Twitter, earlier) — both trace models trace back to Google’s Dapper paper — but Jaeger became the reference implementation most tracing tooling (including OpenTracing, its predecessor API standard) was validated against.


Classic architecture

Instrumented service
     │  spans (UDP, historically via a per-host Agent sidecar)

Jaeger Collector
     │  validates, batches

Storage (Cassandra / Elasticsearch / Kafka as a durable buffer)


Query service  ──▶  Jaeger UI

The per-host Agent (a lightweight UDP relay) has been deprecated in newer deployments in favor of direct OTLP export from the instrumented service — one fewer hop, and it drops the requirement that every host run a sidecar just to batch spans.

The storage dependency is the operational cost

Jaeger’s tag-based search (find every trace where http.status_code=500 and service=checkout) requires an actual search index — Cassandra or Elasticsearch, sized, retained, and upgraded like any other stateful cluster. That’s the direct tradeoff against What is Tempo, which was built specifically to avoid this: Tempo gives up instant full-history tag search in exchange for needing nothing but object storage.

ConcernJaeger
StorageCassandra / Elasticsearch (indexed) or Badger (embedded, local)
Tag/attribute searchFull index — strong ad hoc search across all retained history
Operational surfaceAn index cluster to run, in addition to Jaeger itself
Ingest protocolsOTLP-native since v2; Jaeger thrift/proto for legacy clients

Jaeger v2: rebuilt on the OpenTelemetry Collector

The significant architectural shift: Jaeger v2 (2024) is no longer a bespoke ingestion pipeline — it’s distributed as an OpenTelemetry Collector configuration, reusing the same receivers/processors/exporters framework as any other OTel Collector deployment. Jaeger-the-project now contributes storage backends as OTel Collector exporters rather than maintaining a parallel ingestion codebase, which converges Jaeger’s ingest path with the rest of the OTel ecosystem instead of running alongside it as a separate implementation.

OTel Collector (Jaeger distribution)
     │  receivers: otlp, jaeger, zipkin
     │  exporters: jaeger_storage (Cassandra/ES/Badger/...)

Jaeger Query + UI

Where a “Jaeger” mention actually points

In practice, when a vendor SDK or legacy service says it “exports to Jaeger,” it almost always means it emits the Jaeger wire protocol (Thrift/UDP or gRPC), not that a full Jaeger deployment is required downstream — What is Tempo‘s Jaeger receiver ingests that same protocol directly, which is why Tempo was explicitly designed as a drop-in destination for Jaeger-protocol traffic.

Why it matters here: ShipSolid runs Tempo, not a standalone Jaeger deployment — but any third-party service or older SDK that talks about “Jaeger” is describing the wire protocol, and Tempo’s Jaeger receiver is the actual ingestion point. Knowing the difference is what stops a “do we need to stand up Jaeger” conversation from turning into unnecessary infrastructure.

Local graph

Full graph →

Linked from 7 notes

7 — Distributed Tracing Backend

How spans that arrive out of order, from different services, get assembled into one trace — and the two competing storage models (indexed search vs. object storage plus a trace-ID lookup) that trade query flexibility for cost.

What is Tempo

Grafana Labs' distributed tracing backend — the radical simplification vs. Jaeger's classic architecture: no dedicated index, just object storage and a trace-ID lookup, queried with TraceQL and linked from metrics via exemplars.

Local Deployment

Step-by-step guide to deploying the full lab locally on k3d via deploy-local.sh, including cluster setup and mode switching.

Testing

Reference for signal-forge's 140 automated tests across all four services, including setup commands, per-suite coverage, and known gaps.

Observability Engineering

A book-shaped table of contents for observability engineering: foundations through architecture, metrics, logging, tracing, profiling, OpenTelemetry, instrumentation, Kubernetes/cloud, data platforms, visualization, alerting, SRE integration, cost, security, platform engineering, AI-driven operations, and MAANG interview preparation — cross-linking existing prometheus/grafana-cloud/kubernetes/sre/platform-engineering notes instead of duplicating them.

Exemplars

How exemplars link histogram metric observations to sampled traces end-to-end, from SDK emission through Prometheus/Mimir to Grafana.

Service: notification-svc

notification-svc's RabbitMQ consumer architecture, dead-letter routing, idempotency handling, and OTel instrumentation.