The Tracing Tool That Learned to Talk to Your AI Agents
Jaeger · releaseJaeger v2.21.0 is here, and it just gave its AI-agent plumbing a serious upgrade, learned to search traces like a database, and said goodbye to its vintage v1 API — all in one release.
If you run microservices, you already know the pain: a customer says “everything is slow,” and you need to figure out which of your 47 services ate the latency budget. Jaeger is the CNCF-graduated (top-maturity, in foundation terms) distributed tracing platform that answers exactly that question. It follows a request as it hops through your stack and draws you a timeline of every stop. Think of it as the GPS transit app for your microservices — except instead of “train delayed 12 minutes,” it shows you that the inventory service has been sitting on that request for 900ms like it’s a heated pool.
Who uses it? Platform engineers and site-reliability folks at basically any shop that outgrew “just add more logs.” And v2.21.0 (released September 14, 2026) is worth your attention for one big reason: Jaeger is retooling itself for the AI era — it overhauls its experimental MCP server (Model Context Protocol — the standard plug AI agents use to call external tools) so agents can query your traces themselves, renders LLM conversations with images and audio inside the trace view, and lands a whole new structured query filter language. Plus four breaking changes you’ll want to know about before you upgrade.
What’s New in v2.21.0
Jaeger’s MCP Server Grows Up
The headline story: Jaeger’s AI observability stack got real this release. The backend can now serve both MCP mounts from one server and reap its sessions (PR #9216), and it announces the session-scoped MCP endpoint to the AI sidecar over HTTP (PR #9009) — the sidecar being the small helper process riding alongside Jaeger that runs the agent logic. Translation: your observability backend is becoming a tool that autonomous agents can call directly.
Why should you care? Because the “AI assistant debugging production” workflow is no longer a conference demo fantasy — Jaeger is building the plumbing for it. The search_traces tool also learned to omit the service name (PR #9262) with backends declaring support for it (PR #9256) — so an agent can hunt for “slow traces anywhere” without first having to know your service taxonomy. It also serves operator skills from ai.skills_dir (PR #9169) and sends configurable headers on the ACP agent handshake — the greeting between the gateway and the AI agent process (PR #9395).
The tool that watches your system is becoming a tool your AI can use. That’s not a patch note — that’s a plot twist.
Config moved, too: the old ai.enable_mcp flag is replaced by an optional ai.mcp config block (PR #9194) — one of this release’s four breaking changes, covered below.
The Trace Search You Always Wanted: Structured Query Filters
Ever tried finding one weird trace among millions with a single search box? The RFC 0005 series — a dozen-plus PRs, shipped under the release’s experimental banner, so expect the shape to keep moving before GA — fixes that with a structured query filter language: think WHERE clauses for traces, with typed comparisons you can combine, fluent builders, and a Python SDK prototype. Numeric attribute indexing in Elasticsearch makes those comparisons use indexes instead of brute force.
The core pieces: the filter itself is implemented for Elasticsearch (PR #9350), accepted on the api_v3 trace search (PR #9359), with a fluent builder authored by maintainer yurishkuro (PR #9354), a shared filter expression proto (PR #9349), and a prototype Python SDK (PR #9302). Numeric indexing (PR #9321) makes it fast.
# Illustrative sketch of the fluent-builder pattern shipped in PR #9354
# (prototype API, shape may change before GA)
filter = TraceFilter(duration_ms > 500, error=True, order="duration_desc")Yes, “find me every trace over half a second that errored, worst first” becomes one query instead of an afternoon of squinting.
Multimodal LLM Traces: Images, Audio, and Span Pills
If you’re tracing AI workloads, the UI now renders images and audio on request inside the trace view (PR #4313) — you can literally watch what the model was shown and asked. Messages render as the parts they carry (PR #4399), the GenAI tab adds an LLM caption to the meta row and elevates agent attributes (PR #4244), and every LLM span — a span being one hop of work inside a trace, like a single model call — gets a pill showing gen_ai.request.model (PR #3896) — so you can spot the GPT-5-vs-Llama budget difference at a glance.
Backend support lands too: gen_ai.tool.call.arguments and gen_ai.tool.call.result now appear on the gateway’s MCP tool-call spans (PR #9304) and sidecar tool-call spans (PR #9011). Tool calls stop being a black box.
ClickHouse Storage Goes Stable
Quietly huge for scale: the ClickHouse storage backend is promoted to stable (PR #9058). After life behind an experimental feature gate (the opt-in toggle for unfinished features), the column-store whisperer of trace backends is now a first-class Jaeger citizen. If your Elasticsearch trace cluster has ever made your finance team cry, this is the alternative you’ve been waiting for.
Elasticsearch Gets a Grown-Up Write Path
ES users get a reliability care package — note that write_mode and the data-stream templates below land as experimental, so flip them on deliberately: a write_mode config for synchronous writes (PR #9093), deterministic content-hash _id for idempotent span writes (PR #9094 — retries no longer duplicate spans), optional poison-pill drop so one malformed span can’t clog the pipe (PR #9109), span data-stream composable templates (PR #8991), and a configurable index.mapping.total_fields.limit for the span index template (PR #9523).
Breaking Changes — Read This Before You Upgrade
Four changes will bite if you’re not looking. At least two fail loudly by design — the rejected ES keys stop the boot, and the removed endpoints hard-fail — so clean your config before upgrading, not after.
- v1 HTTP endpoints removed. The query service dropped the v1 HTTP endpoints the UI no longer calls (PR #9260). If custom scripts or dashboards still call them, they break — plan the move to the newer API surface.
- Five ES config keys now rejected at startup. The service refuses to boot until you clean them out (PR #9076) — run a config audit before upgrading.
ai.enable_mcpreplaced by theai.mcpblock (PR #9194). AI feature users: migrate the flag before upgrading.- ClickHouse gate promoted to stable (PR #9058). If you enabled the experimental gate, review the promotion notes before upgrading.
Fixes and UI Improvements Worth a Nod
Not the headline, but real: failed _msearch items are now surfaced instead of silently dropping traces (PR #9008) — silent data disappearance is the scariest kind, and it’s fixed. Search depth is capped at 10000 with negatives rejected (PR #9492). And the UI ships a stack of improvements: OTEL terminology on by default (PR #4359), an “all services” search option where the backend supports it (PR #4342), free-form span names for any service (PR #4346), and search sort order now persists across sessions (PR #3986).
Jaeger v2.21.0 is a graduated project shipping like a startup: query traces like a database, hand them to your AI agents, and don’t forget to migrate that config first.