What Is Jaeger in OpenTelemetry?
Jaeger is an open-source tool that stores, searches and draws the journey of a request through your software. OpenTelemetry creates the trace data, and Jaeger is one of the places where that data is stored and explored. This guide explains how the two fit together, from zero, with analogies, diagrams and real-world patterns.
Imagine you order a pizza and it arrives cold. You call the shop and ask what went wrong. The shop could have lost time in many places: taking the order, making the dough, baking, waiting for a driver, or the ride itself. Without a record of when each step started and ended, nobody can answer. Now imagine each pizza carries a little slip of paper, and every worker writes the time they started and finished their step on it. At the end you can lay the slip on a table and see exactly where the minutes went. In software, OpenTelemetry is the habit of writing on the slip, and Jaeger is the table where you lay the slip out and read it.
1The Problem: Where Did the Time Go?
Modern software is a team of programs, and slowness hides in the gaps between them.
Long ago, an application was one big program. If a page was slow, a developer opened that one program and looked for the slow part. Today, a single click on a website might wake up a dozen small programs, called services. One checks who you are, another looks up your cart, another calculates the price, another talks to a payment company, and each of them may ask a database for help. This style is called a microservices architecture.
It brings a new puzzle. When the page takes four seconds, which of those twelve services was slow? Each service keeps its own diary of what it did, but the diaries are on different machines and written in different times. Reading all of them and stitching a story together by hand is slow, tiring and often impossible when an incident is happening.
Think of a relay race where each runner keeps a private stopwatch in a pocket. After the race, the team lost, but nobody can say which runner was slow because the stopwatches were never compared. Distributed tracing is like giving the baton a single clock that every runner stamps as they pass it on.
2A Quick Refresher: Traces and Spans
You need two words before Jaeger makes sense.
A span is a record of one piece of work. It has a name, such as “load cart”, a start time, an end time, and some labels called attributes that add detail, like which user or which database table was involved. A span also remembers which span started it, called its parent.
A trace is the whole family of spans that belong to one request, from the first click to the final answer. Every span in the family carries the same trace ID, which is a long unique number, and that shared number is how a tool knows the spans belong together. The spans are arranged like a family tree, with the first span as the ancestor and the others as children, grandchildren and so on.
Span
One timed step of work, with a name, a start, a duration and labels.
Trace
All the spans that belong to a single request, joined by one shared trace ID.
Attribute
A key and value attached to a span, such as the HTTP status code or a customer region.
Context propagation
Passing the trace ID from one service to the next, usually inside a request header, so the spans stay connected.
A trace is a story and spans are its sentences. The trace ID is the title written at the top of every page so the pages never get mixed up with another story.
3So, What Exactly Is Jaeger?
Jaeger is a distributed tracing backend with a web screen on top.
Jaeger is an open-source platform for receiving, storing, searching and visualizing traces. The word is German for “hunter”, and the name fits, because engineers use it to hunt down the cause of slowness and errors. It was created at Uber to understand its huge web of services, was released as open source, and later became a graduated project of the Cloud Native Computing Foundation, the same neutral foundation that hosts Kubernetes and OpenTelemetry.
It is important to see what Jaeger does and does not do. Jaeger does not create the spans. Your application, helped by OpenTelemetry, creates them. Jaeger sits at the other end of the pipe. It accepts the finished spans, keeps them in a database, and offers a web page where you can search for traces and see them drawn out as a timeline.
If OpenTelemetry is the camera that records what happened, Jaeger is the photo album and the viewing table. The camera does not keep the pictures forever and does not help you browse them. The album does.
Jaeger is not part of OpenTelemetry, and OpenTelemetry is not part of Jaeger. They are two separate open-source projects that work well together. You can use OpenTelemetry with many other backends, and Jaeger can receive data from sources other than OpenTelemetry.
4How Jaeger and OpenTelemetry Fit Together
One creates and ships, the other stores and shows.
OpenTelemetry, often shortened to OTel, is a vendor-neutral standard and a set of tools for producing telemetry, which means traces, metrics and logs. It gives you libraries for many programming languages, a standard data format and protocol called OTLP, and a separate program called the Collector. It is deliberately not a storage or display tool.
That gap is where Jaeger belongs. Your services use the OpenTelemetry libraries to create spans. The spans are sent over OTLP, either straight to Jaeger or through a Collector. Jaeger then stores the spans and shows them in its screen. Because OTLP is a shared language, you could later swap Jaeger for another tracing tool without changing your application code.
flowchart LR
A["Your services with OpenTelemetry libraries"] -->|"OTLP"| C["OpenTelemetry Collector"]
C -->|"OTLP"| J["Jaeger"]
J --> S[("Trace storage")]
U["Engineer in a browser"] --> UI["Jaeger web screen"]
UI --> J
Read the diagram from left to right. The services on the left create spans. They hand them to a Collector, which is an optional middle helper that can batch, filter and forward the data. The Collector passes the spans to Jaeger. Jaeger writes them into storage, and an engineer, shown at the bottom, opens the web screen to search the stored traces.
| Question | OpenTelemetry | Jaeger |
|---|---|---|
| Creates spans inside the application? | Yes, through its libraries | No |
| Defines the data format and protocol? | Yes, including OTLP | Accepts OTLP |
| Stores traces for later? | No | Yes, through a storage backend |
| Offers a search and timeline screen? | No | Yes |
| Owned by one vendor? | No | No |
5A Short History
Knowing where Jaeger came from explains why it looks the way it does.
Large internet companies discovered the tracing problem early. Google published a well-known research paper about its internal tracing system, and that paper inspired a wave of open-source tools. Jaeger was one of them, built inside Uber, where thousands of services needed to be understood together.
Born at a ride-sharing company
Jaeger was created to trace requests across a very large number of services, and it was later released as open source.
Joins the cloud native foundation
It became a hosted project of the Cloud Native Computing Foundation and later reached the top maturity level, called graduated, showing that it is widely used and well governed.
Own client libraries retired
Jaeger once shipped its own libraries for creating spans. As OpenTelemetry matured, the Jaeger project recommended using OpenTelemetry libraries instead and retired its own clients.
Native OTLP and a Collector-based rebuild
Jaeger gained the ability to accept OTLP directly. A newer major version, often called Jaeger version 2, rebuilt its core on top of the OpenTelemetry Collector framework.
Older blog posts talk about Jaeger client libraries and special Jaeger formats. Today the advice is simple: instrument with OpenTelemetry, send OTLP, and let Jaeger be the backend. If you see old advice that disagrees, check the date.
6Core Concepts Inside Jaeger
A small vocabulary unlocks the whole screen.
Service
A named program that produces spans. Jaeger groups traces by service name, so choosing good names matters.
Operation
The name of a kind of work inside a service, such as “GET /cart” or “charge card”.
Tags and process
Labels on a span, plus labels describing the program that produced it, such as its host and version.
Logs on a span
Small time-stamped notes attached to one span, called events in OpenTelemetry language.
Reference
A link from one span to another, most often child to parent, which builds the family tree.
Sampling
Deciding which traces to keep, because keeping every trace of a busy system is costly.
Notice how the words line up with OpenTelemetry. A span is a span in both worlds. What Jaeger calls a tag is an attribute in OpenTelemetry, and what Jaeger calls a log is an event. When Jaeger receives OTLP data it translates these names so everything appears in its familiar screen.
A service is a department in a company, and an operation is a task that department performs. A trace is a document that travels from department to department, collecting a stamp at every desk.
7Architecture: The Classic Layout
Jaeger was designed as a few small parts that can be scaled separately.
The first generation of Jaeger split the job into separate programs. Understanding them is still useful, because many production systems and many articles describe this layout, and because the same jobs exist in newer versions even when they are packaged differently.
Agent
A small helper that ran next to your application, received spans locally and forwarded them. It is now largely replaced by the OpenTelemetry Collector.
Collector
The receiving program. It accepts spans, validates them, and writes them to storage or to a queue. Do not confuse it with the OpenTelemetry Collector.
Ingester
An optional program that reads spans from a queue such as Kafka and writes them to storage at a steady pace.
Query service
The program that reads traces back from storage and answers the questions asked by the screen.
UI
The web page where humans search and view traces.
Storage
The database that actually holds the spans, chosen by you.
flowchart LR
APP["Application"] --> AG["Agent"]
AG --> COL["Jaeger Collector"]
COL --> Q["Queue such as Kafka"]
Q --> ING["Ingester"]
ING --> DB[("Storage")]
COL -.->|"direct write in small setups"| DB
DB --> QS["Query service"]
QS --> UI["Web UI"]
The dotted line is important. In small systems the collector writes directly to storage and the queue and ingester are skipped. In busy systems the queue acts as a shock absorber. If traffic spikes, spans pile up in the queue instead of overwhelming the database, and the ingester drains them at a safe speed.
Picture a restaurant. The collector is the waiter taking orders, the queue is the ticket rail above the kitchen, the ingester is the cook who works through tickets one by one, storage is the pantry, and the query service is the person who fetches a dish when a guest asks for it again.
Two different things are called a collector in this world. The Jaeger Collector is a part of Jaeger. The OpenTelemetry Collector is a separate general-purpose program. Always say which one you mean when discussing with teammates.
8Jaeger Version 2: Built on the OpenTelemetry Collector
The newest design makes Jaeger and OpenTelemetry even closer relatives.
In the newer major version, Jaeger is packaged as a single program that is assembled from OpenTelemetry Collector building blocks. Instead of separate agent, collector and ingester programs, one binary can play several roles depending on how it is configured. The receiving side uses the same receivers found in the OpenTelemetry Collector, which is why OTLP support is natural and complete. The storage side and the query side are added as extensions designed for Jaeger.
This has practical benefits. You can use the familiar processors from the OpenTelemetry world, such as batching and tail-based sampling, inside Jaeger itself. You manage one kind of configuration file, using the same ideas of receivers, processors and exporters that Collector users already know.
flowchart LR
IN["OTLP receiver"] --> P1["Processors such as batch and sampling"]
P1 --> EX["Storage exporter"]
EX --> ST[("Storage backend")]
QE["Query extension"] --> ST
QE --> UIX["Web UI"]
In the diagram, spans enter through a receiver, pass through processors that tidy or thin them out, and leave through a storage exporter into the database. A separate extension reads the same database to serve the web screen. The receive-process-export shape is exactly the one used by the OpenTelemetry Collector.
If you are starting fresh today, begin with the current major version and its OTLP support. If you inherit an older installation, expect to see the separate agent, collector and ingester programs, and plan a gradual move.
9Data Flow: The Life of a Span
Follow one span from birth to the screen.
A request arrives
The first service receives a request, and the OpenTelemetry library creates the first span and a new trace ID.
Context travels
When that service calls another, the trace ID and parent span ID travel along in a request header, so the next service creates a child span in the same trace.
Spans finish and are batched
When each unit of work ends, its span is finished. The library collects finished spans in a small buffer and sends them in groups, which is cheaper than sending one by one.
Delivery to Jaeger
The exporter sends the batch over OTLP to a Collector or directly to Jaeger.
Storage
Jaeger writes the spans to its storage backend, indexing them by trace ID, service, operation, time and chosen attributes so they can be found quickly.
Search and display
An engineer searches in the web screen. The query service finds the trace IDs, gathers all spans for each, and the screen draws them as a timeline.
sequenceDiagram
participant W as Web service
participant P as Payment service
participant L as OTel library
participant J as Jaeger
W->>P: Call with trace ID in header
P-->>W: Reply
W->>L: Span finished
P->>L: Child span finished
L->>J: Send batch of spans over OTLP
J->>J: Store and index
The sequence shows that the services never talk to Jaeger directly about each other. They only talk to each other normally, passing the trace ID along. Each one reports its own span separately, and Jaeger reassembles the family because every span carries the same trace ID. Spans may arrive out of order or from different machines, and that is fine.
10Getting Data In: OTLP and Friends
Jaeger understands the standard language of OpenTelemetry.
OTLP, the OpenTelemetry Protocol, is the standard way to carry telemetry between programs. It comes in two flavors on the wire: one uses a fast binary connection called gRPC, and the other uses ordinary web requests called HTTP. The usual port numbers are 4317 for the first and 4318 for the second. Jaeger can listen on both.
Direct from the application
The simplest path. The OpenTelemetry exporter inside each service points straight at Jaeger. Good for learning, demos and small systems, because there is nothing else to run.
Through an OpenTelemetry Collector
The usual production path. Services send to a nearby Collector, which batches, filters and forwards to Jaeger. If you later add a second backend or change vendors, only the Collector changes.
Through a queue
For very high volume, spans are written to Kafka first and drained into storage by an ingester, so that sudden bursts do not hurt the database.
Because OTLP is the shared language, your services do not need to know that Jaeger exists. They just speak OTLP. Jaeger is simply the listener at the other end today, and it could be a different listener tomorrow.
11Where Jaeger Keeps Its Data: Storage Choices
Jaeger is the viewer and manager; the database is a separate choice.
Jaeger does not invent its own database. It plugs into existing ones. Which one you choose changes cost, speed, and how much work you do to run it. Supported choices have changed over time, so always confirm the current list in the official documentation before deciding.
| Storage | Good for | Watch out for |
|---|---|---|
| In-memory | Learning, demos, quick tests | All data is lost when the program restarts |
| Local embedded store such as Badger | A single machine with modest traffic | Not designed for scaling across many machines |
| Elasticsearch or OpenSearch | Rich searching across many attributes, medium to large systems | Needs careful sizing, index management and regular cleanup |
| Cassandra | Very large write volumes with simple lookups | Searching across arbitrary attributes is more limited |
| Column-oriented analytic stores | Fast analysis of large amounts of trace data | Support and maturity vary, so verify the current status |
Choosing storage is like choosing where to keep your photographs. A shoebox is cheap and quick but fragile. A filing cabinet is organized but needs tidying. A professional archive is powerful but costs money and staff.
Traces pile up fast. Decide how many days you keep them, such as seven or fourteen, and set up automatic cleanup. A tracing system with no retention plan quietly turns into a storage bill.
12The Jaeger Screen: Searching and Reading
The web page is where the whole effort pays off.
The Jaeger web screen, by default served on port 16686, begins with a search form. You choose a service, optionally an operation, a time range, and filters such as a minimum duration or a particular attribute value. Typical searches are “show me slow checkouts in the last hour” or “show me traces with errors from the payment service”.
Search results
A scatter-style summary and a list of matching traces, with their length and number of spans.
Trace timeline
The star feature. Every span is a horizontal bar placed along a time ruler, indented under its parent.
Span detail
Click a bar to see its attributes, events, errors and details about the process that produced it.
Compare
Place two traces side by side to see what changed between a fast request and a slow one.
Dependency graph
A diagram of which services call which, built from many traces.
How to read a timeline
Look at the top bar first. It is the whole request, and its length is the total time. Beneath it, the child bars show the steps. Bars that sit side by side in the same column of time ran in parallel. Bars that step down like stairs ran one after another. The long bar is where most time went, and the thin gap between a parent starting and its first child starting is often time spent waiting or doing work inside the parent itself.
The timeline looks like a project plan chart with tasks laid across a calendar. Your eye goes to the longest bar and the longest empty gap, exactly as a manager would when asking why a project ran late.
13A Detective Story: Solving a Slow Checkout
A made-up but realistic example of using Jaeger to find a cause.
An online shop notices that some checkouts take six seconds while most take one. Support receives complaints but cannot reproduce the problem. An engineer opens Jaeger, picks the checkout service, and filters for traces longer than five seconds.
flowchart TD
A["Checkout request 6.0 s"] --> B["Check login 0.1 s"]
A --> C["Load cart 0.2 s"]
A --> D["Calculate price 0.3 s"]
A --> E["Charge card 5.2 s"]
E --> F["Fraud check 0.2 s"]
E --> G["Call bank 4.9 s"]
The picture tells the story in seconds. Out of six seconds in total, charging the card takes five. Inside that step, the call to the bank is the culprit at almost five seconds. Login, cart and pricing are innocent. Instead of guessing and debugging twelve services, the team now talks to the bank integration owner and checks timeouts and retries.
Filter
Search for slow traces only, so the screen shows the interesting examples.
Open one
Pick a representative trace and look for the longest bar.
Drill down
Follow the long bar to its deepest child and read its attributes for clues such as the server address or the retry count.
Compare
Place a fast trace next to a slow one and note what differs.
14Service Dependencies and Performance Views
Many traces together reveal the shape of the whole system.
One trace shows one request. A thousand traces together show how the whole system is wired. Jaeger can use the traces it holds to draw a dependency graph, a map where each circle is a service and each arrow means one service calls another. New team members find this map valuable, because the real wiring is often different from the old architecture drawing nobody updated.
Jaeger can also present a performance overview per service, showing request rate, error rate and duration, the familiar trio often called RED metrics. These figures are typically derived from the spans by an OpenTelemetry component that turns spans into metrics, called a connector, and stored in a metrics database. Setting this up needs extra pieces, so treat it as an optional step after basic tracing works.
A single trace is one taxi route. The dependency graph is the whole city map assembled from thousands of taxi routes, showing which roads are actually used and which are busy.
The map is only as complete as your instrumentation. A service that creates no spans is invisible, and the arrows into it will look like they lead to a mystery box.
15Sampling: You Cannot Keep Everything
Choosing which traces to store is the key cost-control decision.
A busy system may create millions of traces an hour. Storing all of them is expensive, and most of them are boring successful requests. Sampling means keeping only a fraction. The skill is keeping the right fraction.
Head-based sampling
The decision is made at the very start of the request, for example keep one in ten. It is cheap and simple, but it cannot know yet whether the request will turn out slow or broken.
Tail-based sampling
The decision is made after the trace is complete, so the system can keep every trace with an error or high latency. It needs a component that holds spans until the trace ends, which costs memory.
Remote sampling
Jaeger can hand sampling rules to applications from a central place, so rates can be changed without redeploying services, where the chosen setup supports it.
Head-based sampling is a security guard who checks every tenth visitor at the door. Tail-based sampling is a guard who waits until visitors leave and then reviews only those who caused trouble. The second guard catches more, but needs a bigger waiting room.
Sampling too aggressively at the head means the rare, important failures are thrown away before anyone knows they were important. Many teams combine a modest head rate with tail-based rules that always keep errors and slow requests.
16Deployment Options
From a laptop to a large cluster.
All-in-one for learning
Jaeger offers a single package that bundles receiving, in-memory storage, querying and the screen. It starts in moments and is perfect for learning and local development. It is not meant for production because data vanishes on restart.
Single-node production
A single Jaeger instance with a durable storage backend. Suitable for small teams with modest traffic, and easy to reason about.
Scaled-out production
Several receivers behind a load balancer, an optional queue, several query instances, and a properly sized storage cluster. Each part scales on its own according to its bottleneck.
On Kubernetes
Many teams run Jaeger inside Kubernetes, often using an operator or a packaged chart that manages the pieces and upgrades for them. Check which installation methods the current Jaeger documentation recommends.
flowchart LR
S1["Services"] --> OC["OpenTelemetry Collectors"]
OC --> LB["Load balancer"]
LB --> J1["Jaeger instance 1"]
LB --> J2["Jaeger instance 2"]
J1 --> DB[("Storage cluster")]
J2 --> DB
DB --> Q1["Query instances"]
Q1 --> UI["Web UI behind login"]
This picture shows the mature layout. Application traffic first meets nearby OpenTelemetry Collectors, which smooth out bursts and apply rules. A load balancer spreads the work among several Jaeger instances. They all write to the same shared storage, and a separate group of query instances serves humans, with the web screen placed behind a login.
17Security
Traces are a detailed diary of your system, so protect them like one.
A trace can contain internal service names, database queries, user identifiers, and sometimes things a careless developer put in an attribute, such as an email address or a token. Anyone who can read your traces learns a great deal about your system.
Protect the screen
The web page itself usually has no login built in. Put it behind a proxy or gateway that handles sign-in, such as single sign-on.
Encrypt in transit
Use TLS on the connections between services, collectors, Jaeger and storage, so spans cannot be read on the network.
Clean the data
Remove or mask sensitive attributes before storage, using processors in a Collector, and teach developers what never to put into spans.
Limit who can send
Do not expose the receiving ports to the open internet. Require authentication or keep them on a private network.
Secure storage
Apply access control, encryption at rest and backups to the database, as for any sensitive data store.
The most common leak is not a hacker. It is an innocent attribute holding a full web address with a secret key in it, copied into every trace and visible to every engineer with screen access. Scrub at the Collector, not by hoping nobody makes the mistake.
18Monitoring Jaeger Itself
The tool that watches everything also needs watching.
If Jaeger silently stops saving spans, you will discover it in the middle of an incident, which is the worst moment. Jaeger exposes its own health and performance numbers, and these should be collected and alarmed like any other production system.
| What to watch | Why it matters |
|---|---|
| Spans received per second | A sudden drop may mean services stopped sending, a sudden jump may signal a runaway loop |
| Spans dropped or rejected | Shows that Jaeger is overloaded or that data is malformed |
| Storage write errors and latency | The database is the usual bottleneck |
| Queue depth, if a queue is used | A growing backlog means the ingester cannot keep up |
| Query latency | Slow searches frustrate engineers and hide problems |
| Storage size and growth | Predicts the cost and when cleanup must happen |
A security camera room needs its own check that the cameras are switched on. A dark screen is more dangerous than no cameras, because people think they are being watched over.
A useful trick is to send a tiny, steady test trace on a schedule and check that it appears in Jaeger within a minute. This end-to-end heartbeat catches problems that individual numbers can miss, such as a broken network path between services and the receiver.
19Jaeger Compared with Other Choices
Jaeger is one of several good backends for OpenTelemetry traces.
Because OTLP is a shared language, choosing a backend is not a lifelong marriage. Here is a fair comparison of common options. Features change often, so use this as a starting map and not as a final verdict.
| Option | Type | Strengths | Consider carefully |
|---|---|---|---|
| Jaeger | Open source, self-run | Mature, focused on traces, strong timeline view, flexible storage | You operate and pay for the storage and infrastructure |
| Zipkin | Open source, self-run | Older and simple, easy to start | Smaller feature set in some areas |
| Grafana Tempo | Open source, self-run | Stores traces cheaply in object storage, fits well with Grafana dashboards | Searching depends on how it is configured and indexed |
| Commercial platforms | Paid service | No servers to run, extra features such as alerting and metrics in one place | Ongoing cost and some dependence on the vendor |
Advantages of Jaeger
- Free and open source, with a neutral foundation behind it
- A well-loved trace timeline and comparison view
- Native OTLP support, so no special client libraries
- Choice of storage backends to match your skills and budget
- Large community and many real-world production users
Disadvantages and Trade-offs
- You run and scale it yourself, including storage
- It focuses on traces, so metrics and logs need other tools
- Built-in login and access control are limited
- Large trace volumes need planning for sampling and retention
20Patterns and Anti-patterns
Repeating good habits and avoiding well-known traps.
Pattern: Collector in front of Jaeger
Applications send to an OpenTelemetry Collector, never straight to the backend. You gain batching, retries, filtering and the freedom to change or add backends in one place.
Pattern: Consistent service names and attributes
Agree on one naming style across all teams. Searching is easy only when “checkout” is always spelled the same way.
Pattern: Keep errors and slow traces
Use tail-based rules so the traces you will want most during an incident are always stored.
Pattern: Link traces to logs
Put the trace ID in application logs, so an engineer can jump from a log line to the whole request, and the other way around.
Problem
The all-in-one demo package is left running in production with in-memory storage.
Why It’s Harmful
Every restart wipes all traces, and memory fills up under real traffic, so evidence disappears exactly when an incident occurs.
Correct Approach
Use the demo setup only for learning. In production, choose a durable storage backend with a defined retention period.
Problem
Every attribute, including whole request bodies, is attached to every span.
Why It’s Harmful
Storage costs balloon, searches slow down, and sensitive data leaks into a place many people can read.
Correct Approach
Attach a small set of meaningful attributes, avoid personal data, and scrub sensitive values in a Collector.
Problem
Tracing is added to only a few services, leaving gaps in the middle of the request path.
Why It’s Harmful
The trace breaks into disconnected pieces, and the missing step is exactly where the problem may hide.
Correct Approach
Instrument every service on the main paths, and make sure the trace ID is passed through every call, including queues and background jobs.
21Best Practices and Common Mistakes
A practical checklist for the first months.
Start small
Trace one important user journey end to end before spreading everywhere. A working example convinces teams faster than a plan.
Use automatic instrumentation first
OpenTelemetry can create spans for common web frameworks and database drivers with little effort. Add hand-written spans later for important business steps.
Choose storage deliberately
Estimate daily trace volume and retention before picking a database, and test a realistic load.
Decide sampling early
Agree on the rules and revisit them after a month of real data.
Teach people to read traces
A short session on the timeline view turns a tool installed by one person into a habit shared by the whole team.
Do
- Name services clearly and consistently
- Include the trace ID in logs
- Protect the screen with sign-in
- Set retention and monitor storage growth
- Test the pipeline with a heartbeat trace
Do Not
- Keep every trace forever
- Expose receiving ports publicly
- Put secrets or personal data in attributes
- Rely on old Jaeger-specific client libraries for new work
Run the all-in-one package on a laptop, point a sample application at it, and click through one trace. Fifteen minutes of hands-on time teaches more than an hour of reading.
22Real-World Examples
How different kinds of teams use Jaeger.
Online retail: finding the slow step
A shop with dozens of services uses Jaeger to find that rare slow checkouts come from one payment partner. The team adds a timeout and a backup path and can prove the improvement with before-and-after traces.
Ride and delivery platforms: understanding the web of services
The origin story of Jaeger. With thousands of services, nobody can hold the wiring in their head. Dependency maps and traces show which services really talk to each other.
Banking and insurance: audit and error hunting
Teams trace transactions across old and new systems, keeping error traces longer and masking personal data before storage to satisfy privacy rules.
Platform teams: a shared service for everyone
A central platform team runs Jaeger and Collectors as an internal product. Product teams only need to enable OpenTelemetry and pick a service name, and they get tracing without running anything.
Developers on a laptop
Engineers run the all-in-one package locally to see the effect of a code change on request flow before it ever reaches a shared environment.
23Frequently Asked Questions
No. They are separate open-source projects, both hosted by the Cloud Native Computing Foundation. OpenTelemetry produces telemetry, and Jaeger stores and visualizes traces. They work together through OTLP.
No. OpenTelemetry works with many backends. Jaeger is one popular choice for traces, and it is free to use.
Jaeger is focused on traces. Metrics and logs are normally kept in other tools, although Jaeger can show some performance views derived from spans.
The Jaeger project has moved away from its own client libraries and recommends OpenTelemetry libraries for creating spans. New work should use OpenTelemetry.
Not strictly. Applications can send OTLP straight to Jaeger. A Collector is recommended in production because it adds batching, retries, filtering and flexibility.
Commonly 4317 for OTLP over gRPC, 4318 for OTLP over HTTP, and 16686 for the web screen. Always confirm against your version and configuration.
Start with the in-memory all-in-one setup for learning. For a real system, Elasticsearch or OpenSearch is a common starting point because of flexible searching, provided your team can operate it.
Common reasons are sampling that dropped it, the time range being too narrow, a different service name than expected, spans not reaching Jaeger because of a network or port mistake, or data already removed by the retention rule.
Usually the trace ID was not passed along one of the calls, for example through a message queue or a library that was not instrumented. Fix the propagation at that hop.
There is a small cost for creating and sending spans. Batching, sampling and sending to a nearby Collector keep it low for most systems.
Many teams keep a few days to a couple of weeks, because most investigations happen soon after an incident. Longer retention for error traces is a common refinement.
Yes, if you use OTLP and OpenTelemetry libraries. Only the destination changes, ideally in one Collector setting, while application code stays the same.
24Summary and Key Takeaways
Jaeger answers a simple but vital question: where did the time go inside a request that touched many services? OpenTelemetry supplies the spans and carries them over OTLP. Jaeger receives them, stores them in a database of your choice, and presents them as a searchable timeline, a comparison view and a map of service dependencies. The two projects are neighbors, not one product, and the shared protocol between them keeps you free to change either side.
Key Takeaways
- Jaeger is a tracing backend — it stores, searches and draws traces, but it does not create them.
- OpenTelemetry creates and ships the spans — libraries in your application produce them and OTLP carries them.
- Use OpenTelemetry libraries, not old Jaeger clients — Jaeger accepts OTLP directly and the newer version is built on the OpenTelemetry Collector framework.
- Put a Collector in front in production — batching, filtering, scrubbing and backend flexibility all live there.
- Plan storage, retention and sampling — they decide the cost and whether the right traces survive.
- Protect the screen and the data — add sign-in, encryption and scrubbing of sensitive attributes.
- Learn to read the timeline — find the longest bar and the longest gap, and you will find most causes of slowness.