Backend Changes
⛔ Breaking Changes
- Metrics changes due to upgrading all OTEL collector packages (@renovate-bot in #8560)
- [metricstore] remove min step api from metricstore (@mahadzaryab1 in #8425)
✨ New Features
- Feat(query): auto-detect ui base path from browser url (adr-009) (@yurishkuro in #8568)
- Feat(storage): forward configured headers to elasticsearch/opensearch backend (@ChaitanyaD48 in #8544)
- Feat(query): add configurable header forwarding to grpc storage backend (@yurishkuro in #8539)
🐞 Bug fixes, Minor Improvements
- Fix(mcp): normalize span_kind input to lowercase in get_span_names handler (@farhann-saleem in #8466)
- Fix(clickhouse): fix array join alias broken by clickhouse v26 new analyzer (@Copilot in #8547)
- Chore(jaegermcp): remove non-standard health mcp tool (@Vi-shub in #8549)
- [jaegermcp] drop v1-style reftype from critical path logic (@yurishkuro in #8467)
- [cassandra] add missing
spanhashvalue to v2todbmodelconversion (@Manik2708 in #8410) - Fix(cassandra): preserve gocql timeouts when unset in config (@masihkhatibzadeh99 in #8380)
- [jaeger_mcp] continue inbound trace context from sep-414 request _meta (@SoumyaRaikwar in #8361)
- Validate start_time_max after start_time_min (@utafrali in #8309)
- Fix sigv4 auth failure due to missing req.getbody on es/os writes (@dd-tone in #8308)
🚧 Experimental Features
- Feat(jaeger): implement ai new mcp endpoint for frontned dynamic contextual tooling (@Nabil-Salah in #8423)
- [jaegerai] refactor route registration and request body size handling (@yurishkuro in #8468)
- [fix][clickhouse] add missing scope attributes in clickhouse's query builder (@mahadzaryab1 in #8439)
- [jaegermcp] add opentelemetry metrics middleware for mcp tool invocations (@CosmicAlgo in #8370)
- [clickhouse][spm] add e2e test for clickhouse spm (@mahadzaryab1 in #8432)
- [clickhouse] integrate clickhouse metric storage into jaeger storage extension (@mahadzaryab1 in #8426)
- Feat(gemini-agent): implement ai gemini agent tracing (@Nabil-Salah in #8398)
- [clickhouse][spm] implement
getcallratesfor clickhouse storage (@mahadzaryab1 in #8417) - [clickhouse][spm] implement
geterrorratesfor clickhouse storage (@mahadzaryab1 in #8414) - [clickhouse][spm] implement
getlatenciesfor clickhouse storage (@mahadzaryab1 in #8411) - [jaegermcp] add get_service_dependencies tool (@lopster568 in #8403)
- [clickhouse] enable direct integration tests for clickhouse storage (@mahadzaryab1 in #8389)
- Feature: add ttl support for clickhouse v2 storage (@singhvibhanshu in #7906)
- [jaegermcp] improve mcp tool descriptions (@lopster568 in #8314)
- [clickhouse] implement dependency writer for clickhouse storage (@mahadzaryab1 in #8360)
👷 CI Improvements
- Ci: skip metrics comparison and coverage regression gate on main branch (@Copilot in #8469)
- Chore(ci): fix stale empty go module cache (@Copilot in #8461)
- Perf(lint): rewrite check-line-endings in python for ~37x speedup (@yurishkuro in #8399)
- Ci: integrate check-line-endings.sh into make fmt and make lint (@yurishkuro in #8393)
- Ci: exclude dev-only modules from fossa workspace scan (@jkowall in #8390)
- Fix(ci): post coverage gate and metrics comparison check runs against pr head sha (@Copilot in #8387)
⚙️ Refactoring
- [cassandra] remove v1 api dependencies (@Manik2708 in #8428)
- [storage][cassandra] implement v2
tracewriter(@Manik2708 in #7699) - [cassandra] change signature of corespanreader to return an iterator (@Manik2708 in #8296)
- [depstore][v2] update depstore writer interface to accept context (@mahadzaryab1 in #8365)
📖 Documentation
- Docs(security): document code review and 2fa policies (@jkowall in #8524)
- Docs(jaegermcp): fix documentation inconsistencies in adr-002 and readme (@Vi-shub in #8509)
- Document openssf gold badge evidence refresh (@jkowall in #8497)
- Docs(mcp): align search_traces adr with search_depth schema (@farhann-saleem in #8472)
- [clickhouse][adr] add adr for clickhouse storage (@mahadzaryab1 in #8434)
📊 UI Changes
⛔ Breaking Changes
- Chore: drop legacy browser support (@ghosthouse7 in #3712)
✨ New Features
- Feat(ui): auto-detect url prefix from window.location at page load (@yurishkuro in #3874)
🐞 Bug fixes, Minor Improvements
- Fix monitor page chart widths on initial load (@gulshank0 in #3555)
- Fix: use compact duration format consistently across ui (@yurishkuro in #3846)
- Fix(search): restore time picker options broken by #3781 (@yurishkuro in #3845)
- Fix(search): use compact duration format in search results (@Copilot in #3844)
- Fix: add keyboard accessibility to span name and child expander in trace timeline (@swetalin-10 in #3807)
- Restore trace timeline column resizing in embedded mode (
uiembed=v0) (@Copilot in #3823) - Fix: include backend error in otlp conversion error message (@yurishkuro in #3827)
- Fix: stop click propagation in clicktocopy to prevent header collapse (@Copilot in #3818)
- Fix(trace): restore "back to search" link broken by react router v6 migration (@yurishkuro in #3785)
- Feat(trace): add service filter to prune spans by service in timeline (@yurishkuro in #3765)
- Fix: prevent timeline tick labels from overlapping when column is narrow (@aabhinavvvvvvv in #3768)
- Fix(ui): sort services alphabetically (@bender316 in #3734)
- 🔒 fix command injection in prepare-release.py (@jkowall in #3717)
- Perf: optimize tracestatistics grouping (@jkowall in #3718)
- Add environment checks to prepare-release target (@jkowall in #3512)
- Fix: prevent infinite loop on tracediff with empty trace ids (@parshipcy in #3714)
- Adjust search results for smaller screens (@lpmi-13 in #3697)
👷 CI Improvements
- Delete .github/workflows/s390x-build.yaml (@yurishkuro in #3851)
- Fix(lint): resolve eslint-plugin-jest(require-to-throw-message) warnings (@JeevaRamanathan in #3759)
- Fix(lint): disable jest/no-conditional-expect (@vibhor-5 in #3756)
- Fix(lint): disable eslint(no-shadow) warnings (@vibhor-5 in #3757)
- Chore: add knip; remove 4 unused devdependencies (@yurishkuro in #3742)
⚙️ Refactoring
- Refactor(spanview): extract relativebar component from tracespanview (@yurishkuro in #3855)
- Refactor(stats): migrate tracestatisticsheader to functional component (@WasThatRudy in #3842)
- Part of phase 1 (1f): remove config redux slice; use getconfig via useconfig (@parshipcy in #3781)
- Part of phase 1 (1e): migrate embed flags off redux (@parshipcy in #3761)
- Part of phase 1 (1d): move ddg view modifiers from redux to zustand (@parshipcy in #3750)
- Fix(lint): replace new array(n) with array.from, promote no-new-array to error (@mateenali66 in #3754)
- Fix(lint): clear unused vars/imports, promote no-unused-vars to error in ts (@mateenali66 in #3753)
- Fix(lint): fix jest expects to have matcher calls, promote valid-expect to error (@Pasta-coder in #3752)
- Fix(lint): drop useless array spread, promote no-useless-spread to error (@mateenali66 in #3749)
- Chore(lint): move oxlint config into vite.config.ts (@yurishkuro in #3748)
- Fix(lint): pass children as arg, promote no-children-prop to error (@yurishkuro in #3747)
- Chore: fix all knip unused-export warnings; enable failure mode (@yurishkuro in #3745)
- Chore: unexport 32 types not imported outside their own file (@yurishkuro in #3744)
- Chore: fix knip dead-code warnings (@yurishkuro in #3743)
- Part of phase1 (sub-2-1c): migrate collapse/expand and detail state to zustand (@parshipcy in #3721)
- Convert measurablenode to functional component (@thc1006 in #3407)
- Migrate tracespanview to functional component (@whiplashvin in #3470)
- Part of phase 1 (sub-1c): move trace timeline layout prefs to zustand (@parshipcy in #3719)
- Part of phase 1 (1b): archive notifier migrated from redux to zustand (@parshipcy in #3715)
- Part of phase 1: refactor: migrate trace diff state from redux to zustand (@parshipcy in #3702)
- Refactor: convert spangraph to functional component (@tmchow in #3705)
- Test(jaeger-ui): migrate tests from jest to vitest (@yurishkuro in #3695)
- Test: add mockdefault helper for default-export mocks (@yurishkuro in #3694)
- Test: replace arrow ctor mocks with regular functions (@yurishkuro in #3693)
- Chore(jaeger-ui): replace require() in test bodies with static imports (@yurishkuro in #3692)
- Chore(jaeger-ui): rename jsx test files from .js to .jsx (@yurishkuro in #3691)
- [adr/007] migrate packages/plexus tests from jest to vitest (@yurishkuro in #3690)
- [adr/007] consolidate jaeger-ui tsconfigs (step e) (@yurishkuro in #3689)