What Is Jaeger in OpenTelemetry?

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.

Simple Analogy

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.

12
services behind one click
4 s
total page time, cause unknown
1
trace that explains it all

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.

Term 1

Span

One timed step of work, with a name, a start, a duration and labels.

Term 2

Trace

All the spans that belong to a single request, joined by one shared trace ID.

Term 3

Attribute

A key and value attached to a span, such as the HTTP status code or a customer region.

Term 4

Context propagation

Passing the trace ID from one service to the next, usually inside a request header, so the spans stay connected.

i
Beginner Tip

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.

Simple Analogy

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.

!
Common Misconception

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
        
FIG 1 — OpenTelemetry produces and ships spans, Jaeger stores and shows them

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.

QuestionOpenTelemetryJaeger
Creates spans inside the application?Yes, through its librariesNo
Defines the data format and protocol?Yes, including OTLPAccepts OTLP
Stores traces for later?NoYes, through a storage backend
Offers a search and timeline screen?NoYes
Owned by one vendor?NoNo

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.

1

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.

2

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.

3

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.

4

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.

i
Why This Matters

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.

A small vocabulary unlocks the whole screen.

Concept 1

Service

A named program that produces spans. Jaeger groups traces by service name, so choosing good names matters.

Concept 2

Operation

The name of a kind of work inside a service, such as “GET /cart” or “charge card”.

Concept 3

Tags and process

Labels on a span, plus labels describing the program that produced it, such as its host and version.

Concept 4

Logs on a span

Small time-stamped notes attached to one span, called events in OpenTelemetry language.

Concept 5

Reference

A link from one span to another, most often child to parent, which builds the family tree.

Concept 6

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.

Simple Analogy

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.

Part 1

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.

Part 2

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.

Part 3

Ingester

An optional program that reads spans from a queue such as Kafka and writes them to storage at a steady pace.

Part 4

Query service

The program that reads traces back from storage and answers the questions asked by the screen.

Part 5

UI

The web page where humans search and view traces.

Part 6

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"]
        
FIG 2 — The classic Jaeger layout, with an optional queue between receiving and storing

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.

Simple Analogy

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.

!
Naming Trap

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"]
        
FIG 3 — Jaeger version 2 assembled from Collector-style building blocks

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.

i
Practical Advice

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.

1

A request arrives

The first service receives a request, and the OpenTelemetry library creates the first span and a new trace ID.

2

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.

3

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.

4

Delivery to Jaeger

The exporter sends the batch over OTLP to a Collector or directly to Jaeger.

5

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.

6

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
        
FIG 4 — Spans from two services reaching Jaeger as one trace

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.

“Services only pass a number to each other; Jaeger rebuilds the whole story from that number.”

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.

i
Why OTLP Is the Right Choice

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.

StorageGood forWatch out for
In-memoryLearning, demos, quick testsAll data is lost when the program restarts
Local embedded store such as BadgerA single machine with modest trafficNot designed for scaling across many machines
Elasticsearch or OpenSearchRich searching across many attributes, medium to large systemsNeeds careful sizing, index management and regular cleanup
CassandraVery large write volumes with simple lookupsSearching across arbitrary attributes is more limited
Column-oriented analytic storesFast analysis of large amounts of trace dataSupport and maturity vary, so verify the current status
Simple Analogy

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.

!
Retention Reminder

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”.

View 1

Search results

A scatter-style summary and a list of matching traces, with their length and number of spans.

View 2

Trace timeline

The star feature. Every span is a horizontal bar placed along a time ruler, indented under its parent.

View 3

Span detail

Click a bar to see its attributes, events, errors and details about the process that produced it.

View 4

Compare

Place two traces side by side to see what changed between a fast request and a slow one.

View 5

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.

Simple Analogy

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"]
        
FIG 5 — A trace tree where one deep step explains almost all the delay

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.

1

Filter

Search for slow traces only, so the screen shows the interesting examples.

2

Open one

Pick a representative trace and look for the longest bar.

3

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.

4

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.

Simple Analogy

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.

i
Good to Know

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.

Style 1

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.

Style 2

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.

Style 3

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.

Simple Analogy

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.

!
Common Mistake

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"]
        
FIG 6 — A scaled-out layout with collectors, a load balancer and shared storage

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.

Guard 1

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.

Guard 2

Encrypt in transit

Use TLS on the connections between services, collectors, Jaeger and storage, so spans cannot be read on the network.

Guard 3

Clean the data

Remove or mask sensitive attributes before storage, using processors in a Collector, and teach developers what never to put into spans.

Guard 4

Limit who can send

Do not expose the receiving ports to the open internet. Require authentication or keep them on a private network.

Guard 5

Secure storage

Apply access control, encryption at rest and backups to the database, as for any sensitive data store.

!
Real Risk

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 watchWhy it matters
Spans received per secondA sudden drop may mean services stopped sending, a sudden jump may signal a runaway loop
Spans dropped or rejectedShows that Jaeger is overloaded or that data is malformed
Storage write errors and latencyThe database is the usual bottleneck
Queue depth, if a queue is usedA growing backlog means the ingester cannot keep up
Query latencySlow searches frustrate engineers and hide problems
Storage size and growthPredicts the cost and when cleanup must happen
Simple Analogy

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.

OptionTypeStrengthsConsider carefully
JaegerOpen source, self-runMature, focused on traces, strong timeline view, flexible storageYou operate and pay for the storage and infrastructure
ZipkinOpen source, self-runOlder and simple, easy to startSmaller feature set in some areas
Grafana TempoOpen source, self-runStores traces cheaply in object storage, fits well with Grafana dashboardsSearching depends on how it is configured and indexed
Commercial platformsPaid serviceNo servers to run, extra features such as alerting and metrics in one placeOngoing 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.

ANTI-PATTERN-01 Avoid
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.

ANTI-PATTERN-02 Avoid
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.

ANTI-PATTERN-03 Avoid
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.

1

Start small

Trace one important user journey end to end before spreading everywhere. A working example convinces teams faster than a plan.

2

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.

3

Choose storage deliberately

Estimate daily trace volume and retention before picking a database, and test a realistic load.

4

Decide sampling early

Agree on the rules and revisit them after a month of real data.

5

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
i
Quick Win

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

Q1Is Jaeger part of OpenTelemetry?

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.

Q2Do I need Jaeger to use OpenTelemetry?

No. OpenTelemetry works with many backends. Jaeger is one popular choice for traces, and it is free to use.

Q3Does Jaeger store metrics and logs too?

Jaeger is focused on traces. Metrics and logs are normally kept in other tools, although Jaeger can show some performance views derived from spans.

Q4Can I still use Jaeger client libraries?

The Jaeger project has moved away from its own client libraries and recommends OpenTelemetry libraries for creating spans. New work should use OpenTelemetry.

Q5Do I need the OpenTelemetry Collector between my apps and Jaeger?

Not strictly. Applications can send OTLP straight to Jaeger. A Collector is recommended in production because it adds batching, retries, filtering and flexibility.

Q6Which ports does Jaeger use?

Commonly 4317 for OTLP over gRPC, 4318 for OTLP over HTTP, and 16686 for the web screen. Always confirm against your version and configuration.

Q7Which storage should a beginner pick?

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.

Q8Why can I not find my trace?

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.

Q9Why does my trace look broken into pieces?

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.

Q10Does tracing slow my application?

There is a small cost for creating and sending spans. Batching, sampling and sending to a nearby Collector keep it low for most systems.

Q11How long should I keep traces?

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.

Q12Can I switch from Jaeger to another backend later?

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.