RATATOSKRATATOSK
Sign in

Jaeger

v2.21.0Observability
Sep 14, 2026

ACTION 1CHECK 4OTHER 64

A feature-rich release with breaking API and configuration changes, expanded experimental query and storage capabilities, and many correctness fixes. It also includes routine dependency updates.

Action needed (1)

  • breakingThe searchdepth constraint

    Query handling caps searchdepth at 10000 and rejects negative values.

    @jkowalljaeger#9492

Check if affected (4)

  • breakingRemoval of the v1 http endpoints

    Applies if you use v1 http endpoints.

    The query component removes the v1 http endpoints that the UI no longer calls.

    @ysh-botjaeger#9260

  • breakingThe ai.enable_mcp configuration, replaced by ai.mcp

    Applies if you configure ai.enable_mcp.

    The configuration replaces ai.enable_mcp with an optional ai.mcp config block.

    @SoumyaRaikwarjaeger#9194

  • breakingElasticsearch configuration key validation

    Applicability is not stated in the release notes.

    Startup now rejects five unsupported Elasticsearch configuration keys.

    @ysh-botjaeger#9076

  • breakingStorage backend query validation

    Applicability is not stated in the release notes.

    The query component rejects searches that the storage backend cannot serve.

    @ysh-botjaeger#9259

All 64 other recorded changesfixes 29 · additions 18 · value changes 10 · constraints 3 · renames 2 · defaults 1 · removals 1

fixes (29)

  • * Fix(memory): match unset-status spans in error=false trace search ([@hharshhsaini](https://github.com/hharshhsaini) in [#9096](https://github.com/jaegertracing/jaeger/pull/9096))
  • * Fix(anonymizer): register the gogo codec ([@DsThakurRawat](https://github.com/DsThakurRawat) in [#9540](https://github.com/jaegertracing/jaeger/pull/9540))
  • * Fix(es): surface failed _msearch items instead of dropping traces silently ([@hharshhsaini](https://github.com/hharshhsaini) in [#9008](https://github.com/jaegertracing/jaeger/pull/9008))
  • * Fix(mcp): use inclusive bound for critical path child search ([@Harizz076](https://github.com/Harizz076) in [#9174](https://github.com/jaegertracing/jaeger/pull/9174))
  • * Fix(anonymizer): read the writer's zero-span capture without panicking ([@DsThakurRawat](https://github.com/DsThakurRawat) in [#9528](https://github.com/jaegertracing/jaeger/pull/9528))
  • * Validate targetsamplespersecond is positive ([@Atul-Koundal](https://github.com/Atul-Koundal) in [#9379](https://github.com/jaegertracing/jaeger/pull/9379))
  • * Fix(es-index-cleaner): quote index prefix in index name pattern ([@DsThakurRawat](https://github.com/DsThakurRawat) in [#9525](https://github.com/jaegertracing/jaeger/pull/9525))
  • * Fix(mcp): respect search_depth when maxresults is unlimited (0) ([@shashankvarma499](https://github.com/shashankvarma499) in [#9517](https://github.com/jaegertracing/jaeger/pull/9517))
  • * Es tracestore: set flags("none") on tag regexpquery (#9387) ([@SHIVANSH-ux-ys](https://github.com/SHIVANSH-ux-ys) in [#9454](https://github.com/jaegertracing/jaeger/pull/9454))
  • * Fix(otel-demo): upgrade opensearch to 3.7.0 ([@jkowall](https://github.com/jkowall) in [#9397](https://github.com/jaegertracing/jaeger/pull/9397))
  • * Fix(es): clear the span writer's service cache in purge ([@ysh-bot](https://github.com/ysh-bot) in [#9416](https://github.com/jaegertracing/jaeger/pull/9416))
  • * Fix(telemetry): trace the jaeger_storage extension ([@ysh-bot](https://github.com/ysh-bot) in [#9414](https://github.com/jaegertracing/jaeger/pull/9414))
  • * Fix(otel-demo): harden dashboards rollout diagnostics ([@jkowall](https://github.com/jkowall) in [#9393](https://github.com/jaegertracing/jaeger/pull/9393))
  • * Fix(query): name server spans after the route when middleware copies the request ([@ysh-bot](https://github.com/ysh-bot) in [#9406](https://github.com/jaegertracing/jaeger/pull/9406))
  • * Fix(es): bound service and operation query lookback ([@ekagra1602](https://github.com/ekagra1602) in [#9400](https://github.com/jaegertracing/jaeger/pull/9400))
  • * Fix(mcp): cap read_skill output at max_read_file_size ([@CedricConday](https://github.com/CedricConday) in [#8993](https://github.com/jaegertracing/jaeger/pull/8993))
  • * Fix(clickhouse): apply config defaults at unmarshal so explicit zeros survive ([@ysh-bot](https://github.com/ysh-bot) in [#9345](https://github.com/jaegertracing/jaeger/pull/9345))
  • * Fix(otel-demo): expand opensearch volume online ([@jkowall](https://github.com/jkowall) in [#9315](https://github.com/jaegertracing/jaeger/pull/9315))
  • * Fix(ai-gateway): preserve message boundaries when reading acp over websocket ([@SoumyaRaikwar](https://github.com/SoumyaRaikwar) in [#9296](https://github.com/jaegertracing/jaeger/pull/9296))
  • * Fix(memory): return copies of stored traces, not references ([@ysh-bot](https://github.com/ysh-bot) in [#9261](https://github.com/jaegertracing/jaeger/pull/9261))
  • * Fix(es): return non-error traces for error=false search ([@hharshhsaini](https://github.com/hharshhsaini) in [#9210](https://github.com/jaegertracing/jaeger/pull/9210))
  • * Fix(apiv3): return notfound for missing trace ([@ADITYA-CODE-SOURCE](https://github.com/ADITYA-CODE-SOURCE) in [#9151](https://github.com/jaegertracing/jaeger/pull/9151))
  • * Fix(es): add spanid tie-breaker to trace-read search_after pagination ([@hharshhsaini](https://github.com/hharshhsaini) in [#9063](https://github.com/jaegertracing/jaeger/pull/9063))
  • * Fix(elasticsearch): use post instead of get for _msearch requests ([@magic-peach](https://github.com/magic-peach) in [#9027](https://github.com/jaegertracing/jaeger/pull/9027))
  • * Fix(es): restore gzip compression of elasticsearch request bodies ([@iammdzaidalam](https://github.com/iammdzaidalam) in [#9072](https://github.com/jaegertracing/jaeger/pull/9072))
  • * Fix(query): let membership against an attribute reach the backend untyped ([@ysh-bot](https://github.com/ysh-bot) in [#9459](https://github.com/jaegertracing/jaeger/pull/9459))
  • * Fix(es): pin the flags on the regexp query ([@DsThakurRawat](https://github.com/DsThakurRawat) in [#9383](https://github.com/jaegertracing/jaeger/pull/9383))
  • * Fix(es): write the data stream @timestamp as an rfc 3339 string ([@Me-Priyank](https://github.com/Me-Priyank) in [#9363](https://github.com/jaegertracing/jaeger/pull/9363))
  • * Fix(es): treat a bulk 409 as an idempotent success in the sync writer ([@Me-Priyank](https://github.com/Me-Priyank) in [#9113](https://github.com/jaegertracing/jaeger/pull/9113))

additions (18)

  • * Feat(es): accept --feature-gates in esmapping-generator and es-rollover init ([@ysh-bot](https://github.com/ysh-bot) in [#9546](https://github.com/jaegertracing/jaeger/pull/9546))
  • * Feat(es): add optional index.mapping.total_fields.limit to the span index template ([@zarna1parekh](https://github.com/zarna1parekh) in [#9523](https://github.com/jaegertracing/jaeger/pull/9523))
  • * Feat(ai-gateway): send configurable headers on the acp agent handshake ([@SoumyaRaikwar](https://github.com/SoumyaRaikwar) in [#9395](https://github.com/jaegertracing/jaeger/pull/9395))
  • * Fix(otel-demo): allow explicit opensearch recovery waiver ([@jkowall](https://github.com/jkowall) in [#9313](https://github.com/jaegertracing/jaeger/pull/9313))
  • * Fix(otel-demo): add tested opensearch recovery gate ([@jkowall](https://github.com/jkowall) in [#9306](https://github.com/jaegertracing/jaeger/pull/9306))
  • * Feat(es): add optional poison-pill drop for synchronous writes ([@ysh-bot](https://github.com/ysh-bot) in [#9109](https://github.com/jaegertracing/jaeger/pull/9109))
  • * Feat(es): warn on misaligned synchronous-write batch sizing ([@ysh-bot](https://github.com/ysh-bot) in [#9098](https://github.com/jaegertracing/jaeger/pull/9098))
  • * Feat(es): index attribute values as numbers and order predicates on them ([@ysh-bot](https://github.com/ysh-bot) in [#9321](https://github.com/jaegertracing/jaeger/pull/9321))
  • * Feat(ai-gateway): serve both mcp mounts from one server and reap its sessions ([@Nabil-Salah](https://github.com/Nabil-Salah) in [#9216](https://github.com/jaegertracing/jaeger/pull/9216))
  • * Feat(es): render and create span data-stream composable templates ([@Me-Priyank](https://github.com/Me-Priyank) in [#8991](https://github.com/jaegertracing/jaeger/pull/8991))
  • * Feat(es): implement the structured query filter ([@ysh-bot](https://github.com/ysh-bot) in [#9350](https://github.com/jaegertracing/jaeger/pull/9350))
  • * Feat(query): convert a filter between the wire and the ast ([@ysh-bot](https://github.com/ysh-bot) in [#9355](https://github.com/jaegertracing/jaeger/pull/9355))
  • * Feat(query): add a fluent builder for structured query filters ([@yurishkuro](https://github.com/yurishkuro) in [#9354](https://github.com/jaegertracing/jaeger/pull/9354))
  • * Feat(jaegerquery): serve operator skills from ai.skills_dir under custom/ ([@SoumyaRaikwar](https://github.com/SoumyaRaikwar) in [#9169](https://github.com/jaegertracing/jaeger/pull/9169))
  • * Feat(ai-gateway): announce the session-scoped mcp endpoint to the sidecar over http ([@Nabil-Salah](https://github.com/Nabil-Salah) in [#9009](https://github.com/jaegertracing/jaeger/pull/9009))
  • * Feat(es): add write_mode config to select synchronous elasticsearch writes ([@ysh-bot](https://github.com/ysh-bot) in [#9093](https://github.com/jaegertracing/jaeger/pull/9093))
  • * Feat(query): add pluggable pre/post query interceptor extension point ([@ysh-bot](https://github.com/ysh-bot) in [#9024](https://github.com/jaegertracing/jaeger/pull/9024))
  • serve a filter query in the shape the backend understands

value changes (10)

  • * Feat(clickhouse): promote clickhouse storage feature gate to stable ([@ysh-bot](https://github.com/ysh-bot) in [#9058](https://github.com/jaegertracing/jaeger/pull/9058))
  • * Feat(mcptools): add gen_ai.tool.call.arguments/result to the gateway's mcp tool-call span ([@SoumyaRaikwar](https://github.com/SoumyaRaikwar) in [#9304](https://github.com/jaegertracing/jaeger/pull/9304))
  • * Feat(storage): let remote storage report its search capabilities ([@ysh-bot](https://github.com/ysh-bot) in [#9269](https://github.com/jaegertracing/jaeger/pull/9269))
  • * Feat(jaegerai): add gen_ai.tool.call.arguments/result to sidecar tool-call spans ([@SoumyaRaikwar](https://github.com/SoumyaRaikwar) in [#9011](https://github.com/jaegertracing/jaeger/pull/9011))
  • * Feat(es): add deterministic content-hash _id for idempotent span writes ([@ysh-bot](https://github.com/ysh-bot) in [#9094](https://github.com/jaegertracing/jaeger/pull/9094))
  • * Feat(query): return a context from query interceptor hooks ([@ysh-bot](https://github.com/ysh-bot) in [#9082](https://github.com/jaegertracing/jaeger/pull/9082))
  • * Feat(query): show a query interceptor every predicate as a filter ([@ysh-bot](https://github.com/ysh-bot) in [#9360](https://github.com/jaegertracing/jaeger/pull/9360))
  • * Feat(storage): carry the filter and its capabilities over remote storage ([@ysh-bot](https://github.com/ysh-bot) in [#9358](https://github.com/jaegertracing/jaeger/pull/9358))
  • * Feat(storage): let a reader declare which filters it evaluates ([@ysh-bot](https://github.com/ysh-bot) in [#9356](https://github.com/jaegertracing/jaeger/pull/9356))
  • * Chore(deps): update dependency prometheus-client to v0.26.0 ([@renovate[bot]](https://github.com/apps/renovate) in [#9501](https://github.com/jaegertracing/jaeger/pull/9501))

constraints (3)

  • * Feat(mcp): let search_traces omit the service name ([@ysh-bot](https://github.com/ysh-bot) in [#9262](https://github.com/jaegertracing/jaeger/pull/9262))
  • * Feat(storage): let backends declare that search can omit the service name ([@ysh-bot](https://github.com/ysh-bot) in [#9256](https://github.com/jaegertracing/jaeger/pull/9256))
  • * Feat(query): accept a structured filter on api_v3 trace search ([@ysh-bot](https://github.com/ysh-bot) in [#9359](https://github.com/jaegertracing/jaeger/pull/9359))

renames (2)

  • * Feat(featuregate): normalize Jaeger gate names ([@maindevhoon](https://github.com/maindevhoon) in [#9037](https://github.com/jaegertracing/jaeger/pull/9037))
  • * Feat(es): rewire sniffing.enabled and log_level onto the esclient transport ([@ysh-bot](https://github.com/ysh-bot) in [#9077](https://github.com/jaegertracing/jaeger/pull/9077))

defaults (1)

  • * Fix(query): default search_depth in api_v3 grpc handler ([@vyncint](https://github.com/vyncint) in [#9100](https://github.com/jaegertracing/jaeger/pull/9100))

removals (1)

  • * Fix(storage): remove the duplicate otelgrpc handler on the storage client ([@ysh-bot](https://github.com/ysh-bot) in [#9417](https://github.com/jaegertracing/jaeger/pull/9417))
Add Jaeger to your stack

A weekly email arrives when a release needs action. Like the breaking changes in this release.

Add to stack