Jaeger — open-source distributed tracing system from Uber (2015), CNCF graduated since 2019. Shows the path of one request across many microservices as a tree of spans with timings. Used for: debugging slow requests, finding bottlenecks, understanding service dependencies. Alternatives: Zipkin (Twitter, similar), Tempo (Grafana, cheaper storage).
Below: details, example, related terms, FAQ.
Free online tool — HTTP header checker: instant results, no signup.
// Python example (OpenTelemetry)
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span('payment.charge') as span:
span.set_attribute('user.id', user_id)
result = stripe.charge(amount)
span.set_status(Status(StatusCode.OK))Jaeger operates on a microservices architecture, providing a robust platform for distributed tracing. At its core, Jaeger consists of several key components:
When an application sends a request, the Jaeger client generates a unique trace ID and records spans, which represent the time taken by each operation. These spans are sent to the Jaeger Agent, which forwards them to the Collector. The Collector processes this data and stores it in the configured storage backend. The Jaeger UI can then be used to visualize the traces, showing the request flow across services and highlighting performance bottlenecks.
Integrating Jaeger into your application can significantly enhance your tracing capabilities. Here’s how to set it up using different programming languages:
To instrument a Java application, include the Jaeger client dependency in your pom.xml:
<dependency>
<groupId>io.jaegertracing</groupId>
<artifactId>jaeger-client</artifactId>
<version>1.6.0</version>
</dependency>Then, initialize the tracer in your application:
import io.jaegertracing.Configuration;
import io.opentracing.Tracer;
Tracer tracer = Configuration.fromEnv().getTracer();For a Python application, install the Jaeger client using pip:
pip install jaeger-clientThen, set up the tracer as follows:
from jaeger_client import Config
config = Config(config={'sampler': {'type': 'const', 'param': 1}, 'logging': True})
tracer = config.initialize_tracer()With these setups, you can begin creating spans around your requests to trace their execution across microservices.
Jaeger is invaluable in microservices environments, providing insights that enhance performance and reliability. Here are some common use cases:
These use cases illustrate how Jaeger can be leveraged to improve microservices architecture, leading to more resilient and efficient applications.
Similar. Jaeger has more active development (Uber/CNCF), Zipkin older + simpler UI. Both support OpenTelemetry.
With 1% sampling: 500 req/s app → ~5 traces/s → few GB/day. At higher samples — TB/week.
Grafana Tempo — cheaper (block storage, not DB), integrates with Grafana. Used by DoorDash, Reddit. New stack: Tempo instead of Jaeger.
Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.