Jaeger is open source software for tracing transactions between distributed services. It’s used for monitoring and troubleshooting complex microservices environments.
Distributed tracing is a way to see and understand the whole chain of events in a complex interaction between microservices.
Modern, cloud-native software development relies on microservices: independent services that each provide a different core function. When a user makes a request in an app, many individual services respond to produce a result.
A single call in an app can invoke dozens of different services that interact with each other. How can developers and engineers isolate a problem when something goes wrong or a request is running slow? We need a way to keep track of all the connections.
That’s where distributed tracing comes in. It’s often run as part of a service mesh, which is a way to manage and observe microservices.
Jaeger uses distributed tracing to follow the path of a request through different microservices. Rather than guessing, we can see a visual representation of the call flows.
Organized information about transactions is useful for debugging and optimization. Jaeger includes tools to monitor distributed transactions, optimize performance and latency, and perform root cause analysis (RCA), a method of problem solving.
As an open source project, Jaeger benefits from a community of hundreds of contributors. Jaeger is based on the vendor-neutral OpenTracing APIs and instrumentation.
Ridesharing company Uber developed Jaeger as an open source project in 2015. It was accepted as a Cloud Native Computing Foundation (CNCF) Incubation project in 2017 and promoted to graduated status in 2019.
Jaeger presents execution requests as traces. A trace shows the data/execution path through a system.
A trace is made up of one or more spans. A span is a logical unit of work in Jaeger. Each span includes the operation name, start time, and duration. Spans may be nested and ordered.
Jaeger includes several components that work together to collect, store and visualize spans and traces.
Jaeger Client includes language-specific implementations of the OpenTracing API for distributed tracing. These can be used manually or with a variety of open source frameworks.
Jaeger Agent is a network daemon that listens for spans sent over User Datagram Protocol. The agent is meant to be placed on the same host as the instrumented application. This is usually implemented through a sidecar in container environments like Kubernetes.
Jaeger Collector receives spans and places them in a queue for processing.
Collectors require a persistent storage backend, so Jaeger also has a pluggable mechanism for span storage.
Query is a service that retrieves traces from storage.
Jaeger Console is a user interface that lets you visualize your distributed tracing data.
This distributed tracing implementation brings a series of benefits. Jaeger integrates with Kiali, an observability console for Istio. The Jaeger backend is designed for high scalability with no single points of failure. Jaeger can connect data from different components to create a complete end-to-end trace. Jaeger also offers backwards compatibility with Zipkin.