github jaegertracing/jaeger v2.21.0
Release v2.21.0

4 hours ago

Backend Changes

⛔ Breaking Changes

  • Feat(query)!: remove v1 http endpoints the ui no longer calls (@ysh-bot in #9260)
  • Replace ai.enable_mcp with an optional ai.mcp config block (@SoumyaRaikwar in #9194)
  • Fix(es): reject five unsupported elasticsearch config keys at startup (@ysh-bot in #9076)
  • Feat(clickhouse): promote clickhouse storage feature gate to stable (@ysh-bot in #9058)

✨ New Features

  • Feat(mcp): let search_traces omit the service name (@ysh-bot in #9262)
  • Feat(storage): let backends declare that search can omit the service name (@ysh-bot in #9256)

🐞 Bug fixes, Minor Improvements

  • Fix(memory): match unset-status spans in error=false trace search (@hharshhsaini in #9096)
  • Fix(anonymizer): register the gogo codec (@DsThakurRawat in #9540)
  • Fix(release): paginate the commits query in the release notes script (@ysh-bot in #9560)
  • Fix(release): fail the release notes script on PRs that cannot be categorized (@ysh-bot in #9561)
  • Fix(es): surface failed _msearch items instead of dropping traces silently (@hharshhsaini in #9008)
  • Feat(featuregate): normalize Jaeger gate names (@maindevhoon in #9037)
  • Fix(mcp): use inclusive bound for critical path child search (@Harizz076 in #9174)
  • Feat(es): accept --feature-gates in esmapping-generator and es-rollover init (@ysh-bot in #9546)
  • Fix(anonymizer): read the writer's zero-span capture without panicking (@DsThakurRawat in #9528)
  • Validate targetsamplespersecond is positive (@Atul-Koundal in #9379)
  • Fix(es-index-cleaner): quote index prefix in index name pattern (@DsThakurRawat in #9525)
  • Feat(es): add optional index.mapping.total_fields.limit to the span index template (@zarna1parekh in #9523)
  • Fix(mcp): respect search_depth when maxresults is unlimited (0) (@shashankvarma499 in #9517)
  • Es tracestore: set flags("none") on tag regexpquery (#9387) (@SHIVANSH-ux-ys in #9454)
  • Fix(query): cap searchdepth at 10000 and reject negatives (@jkowall in #9492)
  • Fix(security): clear open codeql and scorecard token-permission alerts (@jkowall in #9488)
  • Fix(otel-demo): upgrade opensearch to 3.7.0 (@jkowall in #9397)
  • Fix(es): clear the span writer's service cache in purge (@ysh-bot in #9416)
  • Fix(storage): remove the duplicate otelgrpc handler on the storage client (@ysh-bot in #9417)
  • Fix(telemetry): trace the jaeger_storage extension (@ysh-bot in #9414)
  • Fix(otel-demo): harden dashboards rollout diagnostics (@jkowall in #9393)
  • Fix(query): name server spans after the route when middleware copies the request (@ysh-bot in #9406)
  • Fix(es): bound service and operation query lookback (@ekagra1602 in #9400)
  • Fix(mcp): cap read_skill output at max_read_file_size (@CedricConday in #8993)
  • [query] add erraccessdenied sentinel for query interceptor access-control errors (@rishabhkumar92 in #9402)
  • Fix(storage): remove http status heuristics (@HESleagacy in #9386)
  • Feat(ai-gateway): send configurable headers on the acp agent handshake (@SoumyaRaikwar in #9395)
  • Fix(query): default search_depth in api_v3 grpc handler (@vyncint in #9100)
  • Feat(mcptools): add gen_ai.tool.call.arguments/result to the gateway's mcp tool-call span (@SoumyaRaikwar in #9304)
  • Fix(clickhouse): apply config defaults at unmarshal so explicit zeros survive (@ysh-bot in #9345)
  • Fix(otel-demo): expand opensearch volume online (@jkowall in #9315)
  • Fix(otel-demo): allow explicit opensearch recovery waiver (@jkowall in #9313)
  • Fix(ai-gateway): preserve message boundaries when reading acp over websocket (@SoumyaRaikwar in #9296)
  • Fix(otel-demo): add tested opensearch recovery gate (@jkowall in #9306)
  • Feat(jaeger): expose default component factories via jaegercli.components (@iammdzaidalam in #9073)
  • Fix(jaeger): exclude e2e-only storage_cleaner from the production binary (@ysh-bot in #9300)
  • Feat(storage): let remote storage report its search capabilities (@ysh-bot in #9269)
  • Fix(examples): add an otel collector startup probe (@jkowall in #9257)
  • Fix(memory): return copies of stored traces, not references (@ysh-bot in #9261)
  • Feat(query): reject a search the storage backend cannot serve (@ysh-bot in #9259)
  • Fix(examples): pin the otel demo chart (@jkowall in #9245)
  • Fix(es): return non-error traces for error=false search (@hharshhsaini in #9210)
  • Fix(apiv3): return notfound for missing trace (@ADITYA-CODE-SOURCE in #9151)
  • Feat(jaegerai): add gen_ai.tool.call.arguments/result to sidecar tool-call spans (@SoumyaRaikwar in #9011)
  • Feat(es): add optional poison-pill drop for synchronous writes (@ysh-bot in #9109)
  • Feat(es): warn on misaligned synchronous-write batch sizing (@ysh-bot in #9098)
  • Feat(es): add deterministic content-hash _id for idempotent span writes (@ysh-bot in #9094)
  • Fix(es): add spanid tie-breaker to trace-read search_after pagination (@hharshhsaini in #9063)
  • Feat(query): return a context from query interceptor hooks (@ysh-bot in #9082)
  • Fix(elasticsearch): use post instead of get for _msearch requests (@magic-peach in #9027)
  • Feat(es): rewire sniffing.enabled and log_level onto the esclient transport (@ysh-bot in #9077)
  • Fix(es): restore gzip compression of elasticsearch request bodies (@iammdzaidalam in #9072)
  • Refactor(storage): merge findtracesummaries into tracestore.reader (@ysh-bot in #9067)

🚧 Experimental Features

  • Feat(es): index attribute values as numbers and order predicates on them (@ysh-bot in #9321)
  • Feat(ai-gateway): serve both mcp mounts from one server and reap its sessions (@Nabil-Salah in #9216)
  • Fix(query): let membership against an attribute reach the backend untyped (@ysh-bot in #9459)
  • Feat(es): render and create span data-stream composable templates (@Me-Priyank in #8991)
  • Feat(sdk): add a prototype python sdk for structured query filters (@ysh-bot in #9302)
  • Fix(es): pin the flags on the regexp query (@DsThakurRawat in #9383)
  • Feat(es): implement the structured query filter (@ysh-bot in #9350)
  • Feat(query): show a query interceptor every predicate as a filter (@ysh-bot in #9360)
  • Feat(query): accept a structured filter on api_v3 trace search (@ysh-bot in #9359)
  • Feat(storage): carry the filter and its capabilities over remote storage (@ysh-bot in #9358)
  • Feat(query): serve a filter query in the shape the backend understands (@ysh-bot in #9357)
  • Feat(storage): let a reader declare which filters it evaluates (@ysh-bot in #9356)
  • Feat(query): convert a filter between the wire and the ast (@ysh-bot in #9355)
  • Feat(query): add a fluent builder for structured query filters (@yurishkuro in #9354)
  • Build(idl): generate go for the shared filter expression proto (@yurishkuro in #9349)
  • Fix(es): write the data stream @timestamp as an rfc 3339 string (@Me-Priyank in #9363)
  • Feat(jaegerquery): serve operator skills from ai.skills_dir under custom/ (@SoumyaRaikwar in #9169)
  • Fix(es): treat a bulk 409 as an idempotent success in the sync writer (@Me-Priyank in #9113)
  • Refactor(ai-gateway): pass mcptools.config into the turn-scoped mcp endpoint (@SoumyaRaikwar in #9162)
  • Feat(ai-gateway): announce the session-scoped mcp endpoint to the sidecar over http (@Nabil-Salah in #9009)
  • Feat(es): add write_mode config to select synchronous elasticsearch writes (@ysh-bot in #9093)
  • Feat(query): add pluggable pre/post query interceptor extension point (@ysh-bot in #9024)

👷 CI Improvements

  • Ci: remove unused test tool installation (@ysh-bot in #9553)
  • Ci: bump pnpm/action-setup to v6.1.0 for pnpm 12 support (@ysh-bot in #9562)
  • Chore(deps): update dependency prometheus-client to v0.26.0 (@renovate[bot] in #9501)
  • Test(integration): add backward-compatibility suites for cassandra and clickhouse (@iammdzaidalam in #9441)
  • Fix(ci): collect unit-test coverage as counters and keep artifacts under .cover/ (@ysh-bot in #9509)
  • Chore: upgrade go to 1.27 (@ysh-bot in #9478)
  • Ci(setup-go): retry the module download on a transient fetch failure (@ysh-bot in #9429)
  • Ci(lint): let a label waive the binary size gate (@ysh-bot in #9426)
  • Ci(lint): keep nested checkouts out of the makefile source lists (@ysh-bot in #9412)
  • Ci: stop the ci gate failing a commit on behalf of a superseded run (@ysh-bot in #9372)
  • Ci(lint): give each checkout its own golangci-lint cache (@ysh-bot in #9322)
  • Ci: wrap the pr quota script in a composite action (@ysh-bot in #9258)
  • Ci: fail the pr quota job when it cannot label or comment (@ysh-bot in #9255)
  • Fix(ci): skip the dco check on pushes to main (@ysh-bot in #9145)
  • Feat(ci): collect coverage from the jaeger binary the e2e tests spawn (@ysh-bot in #9140)
  • Feat(ci): fail loudly when codecov's upload threshold is unreachable (@ysh-bot in #9133)
  • Fix(ci): realign codecov after_n_builds with the real upload count (@ysh-bot in #9130)
  • Fix(ci): skip unused es image builds (@rootp1 in #9086)
  • Fix(ci): skip es-index-cleaner/es-rollover image build for e2e cells (@hharshhsaini in #9088)
  • Fix(es): disable disk thresholds in test stacks (@vyncint in #9085)

⚙️ Refactoring

  • Refactor(query): move filter admission from jaeger-idl into jaeger (@ysh-bot in #9461)
  • Refactor(es): move version-neutral elasticsearch code out of the v1 tree (@yurishkuro in #9409)
  • Refactor(es): embed factorybase in the elasticsearch factory (@yurishkuro in #9408)
  • Refactor(es): move the elasticsearch factorybase into the v2 package (@yurishkuro in #9407)
  • Refactor(es): remove the unused v1 elasticsearch dependency store (@ysh-bot in #9401)
  • Refactor(storage): remove unused applydefaults from es and cassandra configs (@ysh-bot in #9344)
  • Refactor(query): ask storage for the search capability instead of capturing it (@ysh-bot in #9268)
  • Refactor(es): unify bulk writes behind a single batch-write api (@ysh-bot in #9097)

📖 Documentation

  • Docs(jaeger): contributing.md: include docker and uv in prereqs (@baroquebobcat in #9522)
  • Docs(jaegerquery): add a skill-authoring guide and complete the operator guide (@SoumyaRaikwar in #9435)
  • Docs: say how the debug image's delve upgrade reaches jaeger (@ysh-bot in #9481)
  • Docs: promote the ai usage policy to a top-level ai_policy.md (@ysh-bot in #9479)
  • Docs: fix grammar in security.md (@magic-peach in #9000)
  • Docs(rfc): name the filter validator's current entry point in rfc 0005 (@ysh-bot in #9466)
  • Docs(query): correct the list-type comments on the filter admission tests (@ysh-bot in #9464)
  • Docs(rfc): let a list beside an attribute go untyped in rfc 0005 (@ysh-bot in #9458)
  • Docs(rfc): align rfc 0014 with the delivered pagination protos (@ysh-bot in #9457)
  • Docs(ai-sidecar): add a guide for running goose as the acp agent (@SoumyaRaikwar in #9418)
  • Docs: tell agents to extend an existing mechanism, and when to ask (@ysh-bot in #9384)
  • Docs: specify where the milestone checkmark goes in rfcs and adrs (@ysh-bot in #9378)
  • Docs(rfc): mark the elasticsearch milestone delivered in rfc 0005 (@ysh-bot in #9377)
  • Docs(rfc): detail the cassandra and badger pagination blockers in rfc 0014 (@ysh-bot in #9376)
  • Docs(rfc): define what a comparison compares, and how a pattern is read (@ysh-bot in #9367)
  • Docs(rfc): record the @timestamp precision rfc 0004's write path delivers (@ysh-bot in #9375)
  • Docs(adr): record the in-run summary check as the coverage gating context (@ysh-bot in #9373)
  • Docs(rfc): propose a span search that returns matching spans (@ysh-bot in #9371)
  • Docs(rfc): settle the ast's reference terms, vocabulary policy, and validation stages (@ysh-bot in #9366)
  • Docs(rfc): rename the instrumentation level to scope, and diagram the query's path (@ysh-bot in #9364)
  • Docs(rfc): reflect the design rfc 0005's implementation settled on (@ysh-bot in #9353)
  • Docs: say that an rfc under implementation is meant to be rewritten (@ysh-bot in #9352)
  • Docs(rfc): add status markers to the rfc index (@ysh-bot in #9333)
  • Docs(rfc): add an rfc for typed attribute indexing on elasticsearch (@ysh-bot in #9309)
  • Docs(rfc): add rfc 0014 for search result pagination (@ysh-bot in #9308)
  • Docs(rfc): add a json_extract operator for nested json attribute access (@ysh-bot in #9297)
  • Docs(adr): record the storage capability mechanism and close rfc 0013 (@ysh-bot in #9271)
  • Docs: replace the absolute adr-immutability rule with a proportionality test (@ysh-bot in #9142)
  • Docs(adr): extend adr-004 with binary coverage and the upload invariant (@ysh-bot in #9141)
  • Docs: add storage backend version support policy (@jkowall in #8953)
  • Docs(adr): split proposal content out of misfiled adrs into rfcs (@ysh-bot in #9117)
  • Docs(adr): split adr-003 proposal content into rfc 0009 (@ysh-bot in #9116)
  • Docs(adr): distinguish rfcs from adrs and correct misfiled records (@ysh-bot in #9114)

📊 UI Changes

✨ New Features

  • Feat(config): enable otel terminology by default (@ysh-bot in #4359)
  • Feat(search): offer an all services option when the backend supports it (@ysh-bot in #4342)

🐞 Bug fixes, Minor Improvements

  • Fix(ddg): navigate to search page on view traces (@Harizz076 in #4021)
  • Chore(model): make deduplicatetags linear instead of o(n^2) in tag count (@iammdzaidalam in #4110)
  • Feat(api/v3): expose zod schemas for otlp trace/span types (@sksingh2005 in #4438)
  • Fix(genai): read what real instrumentation emits (@ysh-bot in #4432)
  • Feat(genai): render a message as the parts it carries (@swetalin-10 in #4399)
  • Feat(genai): show images and audio on request (@u7k4rs6 in #4313)
  • Feat(genai): collapse conversation messages (@ysh-bot in #4425)
  • Fix(genai): offer large markdown on request (@ysh-bot in #4424)
  • Fix(genai): scope format choice to one message (@ysh-bot in #4423)
  • Fix(genai): expand the only section (@Rukafuu in #4419)
  • Fix(genai): keep details for unknown attributes (@conradmr94 in #4417)
  • Fix(storage): route every localstorage access through the safe wrapper (@ysh-bot in #4398)
  • Feat(search): persist sort order across sessions (@swetalin-10 in #3986)
  • Feat(genai-tab): add llm caption to the meta row and elevate agent attributes (@swetalin-10 in #4244)
  • Hide minimap when timeline is hidden (@okxint in #3764)
  • Fix(timeline): realign side panel after view switch (@ysh-bot in #4381)
  • Test(genai): add sample genai trace fixture and generator (@ysh-bot in #4372)
  • Fix(about): show the commit a ui build came from (@ysh-bot in #4364)
  • Feat(search): accept a free-form span name for any service (@ysh-bot in #4346)
  • Fix(search): hide spans column when no summary reports a span count (@ysh-bot in #4325)
  • Fix(critical-path): surface computation errors instead of silently returning empty (@swetalin-10 in #3916)
  • Fix(date): prevent incorrect partial rounding-up of durations (@thisis-manan in #4247)
  • Fix(theme): track theme changes in trace graph and flamegraph colors (@ysh-bot in #4287)
  • Fix(timeline): tokenize span tree chrome and correct the collapsed box (@ysh-bot in #4285)
  • Fix(theme): correct dark-mode span colors in canvas and graph views (@ysh-bot in #4277)
  • Feat(genai): classify tool spans and ignore bare gen_ai.tool.call.id (@u7k4rs6 in #4053)
  • Fix(genai): use the trace's own isgenaitrace for view auto-activation (@u7k4rs6 in #4271)
  • Fix(tracegraph): add aria-labels to mode toggle buttons (@shubhtrek in #4130)
  • Feat(SpanBarRow): show gen_ai.request.model as a span pill for LLM spans (@swetalin-10 in #3896)
  • Fix(search): Render search latency in smaller, muted text (@ysh-bot in #4253)
  • Fix(about): Abbreviate only full SHA in commit label, preserving prefixes (@ysh-bot in #4251)
  • Fix(search): Swap Min/Max Duration field order in search form (@rishabhkumar92 in #4249)
  • Fix(TracePage): Repair spans with no usable startTime instead of dropping them (@ysh-bot in #4245)
  • Fix(stringSupplant): Return formatted value when no encoder is provided (@gkhulbe4 in #3902)
  • Fix(SearchTracePage): Improve duration unit regex validation (@vibhor-5 in #3940)

👷 CI Improvements

  • Ci: provision pnpm with corepack, not npm (@ysh-bot in #4428)
  • Chore(deps): Retire depcheck in favor of knip (@ysh-bot in #4259)
  • Chore(ci): drop action digest pinning from renovate (@ysh-bot in #4370)
  • Chore(ci): pin action digests to full semver (@ysh-bot in #4367)
  • Feat(dev): read backend capabilities from the query service (@ysh-bot in #4349)
  • Ci: use the shared pr quota action instead of curling the script (@ysh-bot in #4344)
  • Ci: use github_token and pin github-script in pr quota workflow (@ysh-bot in #4343)

⚙️ Refactoring

  • Refactor(ui): standardize css colors using design tokens (@Harizz076 in #3886)
  • Refactor(trace): combine span decoration matching into one registry (@udita-0707 in #4254)
  • Refactor(search): key the trace map off unsorted results (@ysh-bot in #4435)

Don't miss a new jaeger release

NewReleases is sending notifications on new releases.