发布日期: 2026-05-13
版本号: v2.18.0

本次更新涵盖Jaeger后端与UI的全面升级。后端主要变更包括因升级OTEL组件库导致的指标体系破坏性调整、移除MetricStore最小步长API,以及新增查询服务自动检测浏览器URL路径、向ES/OS和gRPC存储转发请求头等功能。修复了MCP span类型大小写处理、ClickHouse数组别名兼容性、Cassandra超时配置及ES认证等多个问题。实验性功能集中在ClickHouse性能指标存储集成、MCP工具链增强(如服务依赖查询、OpenTelemetry指标中间件)和AI代理追踪实现。CI方面优化了指标对比流程、行结尾检查性能及依赖扫描。重构工作主要针对Cassandra存储的v2接口迁移和MCP文档统一。UI部分移除了旧版浏览器支持,新增自动检测URL前缀功能,修复了时间选择器、trace时间线重置、搜索结果布局等问题,并进行了大量组件函数式重构、Redux到Zustand的状态管理迁移及测试框架从Jest到Vitest的转换。

更新内容 (中文)

后端变更

⛔ 破坏性变更

  • 由于升级所有OTEL collector包而导致的指标变更(由 @renovate-bot#8560 中贡献)
  • [metricstore] 从metricstore中移除最小步长API(由 @mahadzaryab1#8425 中贡献)

✨ 新功能

  • Feat(query):从浏览器URL自动检测UI基础路径 (adr-009)(由 @yurishkuro#8568 中贡献)
  • Feat(storage):将配置的头部转发至elasticsearch/opensearch后端(由 @ChaitanyaD48#8544 中贡献)
  • Feat(query):为grpc存储后端添加可配置的头部转发(由 @yurishkuro#8539 中贡献)

🐞 缺陷修复、小幅改进

  • Fix(mcp):在get_span_names处理器中将span_kind输入规范化为小写(由 @farhann-saleem#8466 中贡献)
  • Fix(clickhouse):修复clickhouse v26新分析器破坏的array join别名(由 @Copilot#8547 中贡献)
  • Chore(jaegermcp):移除非标准的health mcp工具(由 @Vi-shub#8549 中贡献)
  • [jaegermcp] 从关键路径逻辑中移除v1风格的reftype(由 @yurishkuro#8467 中贡献)
  • [cassandra] 在v2 todbmodel 转换中添加缺失的 spanhash 值(由 @Manik2708#8410 中贡献)
  • Fix(cassandra):在配置未设置时保留gocql超时(由 @masihkhatibzadeh99#8380 中贡献)
  • [jaeger_mcp] 从sep-414请求的 _meta 中继续入站跟踪上下文(由 @SoumyaRaikwar#8361 中贡献)
  • start_time_min 之后验证 start_time_max(由 @utafrali#8309 中贡献)
  • 修复因es/os写入时缺少 req.getbody 而导致的sigv4认证失败(由 @dd-tone#8308 中贡献)

🚧 实验性功能

  • Feat(jaeger):实现用于前端动态上下文工具的新ai mcp端点(由 @Nabil-Salah#8423 中贡献)
  • [jaegerai] 重构路由注册和请求体大小处理(由 @yurishkuro#8468 中贡献)
  • [fix][clickhouse] 在clickhouse查询构建器中添加缺失的作用域属性(由 @mahadzaryab1#8439 中贡献)
  • [jaegermcp] 为mcp工具调用添加opentelemetry指标中间件(由 @CosmicAlgo#8370 中贡献)
  • [clickhouse][spm] 为clickhouse spm添加端到端测试(由 @mahadzaryab1#8432 中贡献)
  • [clickhouse] 将clickhouse指标存储集成到jaeger存储扩展中(由 @mahadzaryab1#8426 中贡献)
  • Feat(gemini-agent):实现ai gemini代理跟踪(由 @Nabil-Salah#8398 中贡献)
  • [clickhouse][spm] 为clickhouse存储实现 getcallrates(由 @mahadzaryab1#8417 中贡献)
  • [clickhouse][spm] 为clickhouse存储实现 geterrorrates(由 @mahadzaryab1#8414 中贡献)
  • [clickhouse][spm] 为clickhouse存储实现 getlatencies(由 @mahadzaryab1#8411 中贡献)
  • [jaegermcp] 添加 get_service_dependencies 工具(由 @lopster568#8403 中贡献)
  • [clickhouse] 为clickhouse存储启用直接集成测试(由 @mahadzaryab1#8389 中贡献)
  • Feature:为clickhouse v2存储添加TTL支持(由 @singhvibhanshu#7906 中贡献)
  • [jaegermcp] 改进mcp工具描述(由 @lopster568#8314 中贡献)
  • [clickhouse] 为clickhouse存储实现依赖写入器(由 @mahadzaryab1#8360 中贡献)

👷 持续集成改进

  • Ci:在主分支上跳过指标比较和覆盖率回归门禁(由 @Copilot#8469 中贡献)
  • Chore(ci):修复过时的空go模块缓存(由 @Copilot#8461 中贡献)
  • Perf(lint):用python重写check-line-endings以实现约37倍加速(由 @yurishkuro#8399 中贡献)
  • Ci:将check-line-endings.sh集成到 make fmtmake lint 中(由 @yurishkuro#8393 中贡献)
  • Ci:从fossa工作区扫描中排除仅供开发的模块(由 @jkowall#8390 中贡献)
  • Fix(ci):在pr头sha上运行发布覆盖率门禁和指标比较检查(由 @Copilot#8387 中贡献)

⚙️ 重构

  • [cassandra] 移除v1 API依赖(由 @Manik2708#8428 中贡献)
  • [storage][cassandra] 实现v2 tracewriter(由 @Manik2708#7699 中贡献)
  • [cassandra] 更改 corespanreader 的签名以返回迭代器(由 @Manik2708#8296 中贡献)
  • [depstore][v2] 更新depstore writer接口以接受context(由 @mahadzaryab1#8365 中贡献)

📖 文档

  • Docs(security):记录代码审查和双因素认证政策(由 @jkowall#8524 中贡献)
  • Docs(jaegermcp):修复adr-002和readme中的文档不一致之处(由 @Vi-shub#8509 中贡献)
  • 记录openssf金牌徽章证据刷新(由 @jkowall#8497 中贡献)
  • Docs(mcp):使search_traces adr与search_depth schema对齐(由 @farhann-saleem#8472 中贡献)
  • [clickhouse][adr] 添加clickhouse存储的adr(由 @mahadzaryab1#8434 中贡献)

📊 UI变更

⛔ 破坏性变更

✨ 新功能

  • Feat(ui):在页面加载时从 window.location 自动检测URL前缀(由 @yurishkuro#3874 中贡献)

🐞 缺陷修复、小幅改进

  • 修复监控页面图表在初始加载时的宽度(由 @gulshank0#3555 中贡献)
  • Fix:在整个UI中一致使用紧凑时长格式(由 @yurishkuro#3846 中贡献)
  • Fix(search):恢复被#3781破坏的时间选择器选项(由 @yurishkuro#3845 中贡献)
  • Fix(search):在搜索结果中使用紧凑时长格式(由 @Copilot#3844 中贡献)
  • Fix:为跟踪时间线中的span名称和子项展开器添加键盘可访问性(由 @swetalin-10#3807 中贡献)
  • 恢复嵌入模式 (uiembed=v0) 下的跟踪时间线列调整功能(由 @Copilot#3823 中贡献)
  • Fix:在otlp转换错误消息中包含后端错误(由 @yurishkuro#3827 中贡献)
  • Fix:在clicktocopy中阻止点击传播以防止头部折叠(由 @Copilot#3818 中贡献)
  • Fix(trace):恢复被react router v6迁移破坏的“返回搜索”链接(由 @yurishkuro#3785 中贡献)
  • Feat(trace):在时间线中添加按服务剪裁span的服务过滤器(由 @yurishkuro#3765 中贡献)
  • Fix:防止在列宽较窄时时间线刻度标签重叠(由 @aabhinavvvvvvv#3768 中贡献)
  • Fix(ui):按字母顺序排序服务(由 @bender316#3734 中贡献)
  • 🔒 修复prepare-release.py中的命令注入(由 @jkowall#3717 中贡献)
  • Perf:优化tracestatistics分组(由 @jkowall#3718 中贡献)
  • 在prepare-release目标中添加环境检查(由 @jkowall#3512 中贡献)
  • Fix:防止在tracediff使用空跟踪ID时出现无限循环(由 @parshipcy#3714 中贡献)
  • 为较小的屏幕调整搜索结果(由 @lpmi-13#3697 中贡献)

👷 持续集成改进

  • 删除 .github/workflows/s390x-build.yaml(由 @yurishkuro#3851 中贡献)
  • Fix(lint):解决eslint-plugin-jest(require-to-throw-message)警告(由 @JeevaRamanathan#3759 中贡献)
  • Fix(lint):禁用jest/no-conditional-expect(由 @vibhor-5#3756 中贡献)
  • Fix(lint):禁用eslint(no-shadow)警告(由 @vibhor-5#3757 中贡献)
  • Chore:添加knip;移除4个未使用的devDependencies(由 @yurishkuro#3742 中贡献)

⚙️ 重构

  • Refactor(spanview):从tracespanview中提取relativebar组件(由 @yurishkuro#3855 中贡献)
  • Refactor(stats):将tracestatisticsheader迁移到函数式组件(由 @WasThatRudy#3842 中贡献)
  • 阶段1(1f)的一部分:移除config redux slice;通过useconfig使用getconfig(由 @parshipcy#3781 中贡献)
  • 阶段1(1e)的一部分:将embed标志从redux迁出(由 @parshipcy#3761 中贡献)
  • 阶段1(1d)的一部分:将ddg视图修饰符从redux移至zustand(由 @parshipcy#3750 中贡献)
  • Fix(lint):用array.from替换new array(n),将no-new-array提升为错误(由 @mateenali66#3754 中贡献)
  • Fix(lint):清除未使用的变量/导入,在ts中将no-unused-vars提升为错误(由 @mateenali66#3753 中贡献)
  • Fix(lint):修复jest期望以包含匹配器调用,将valid-expect提升为错误(由 @Pasta-coder#3752 中贡献)
  • Fix(lint):丢弃无用的数组展开,将no-useless-spread提升为错误(由 @mateenali66#3749 中贡献)
  • Chore(lint):将oxlint配置移入vite.config.ts(由 @yurishkuro#3748 中贡献)
  • Fix(lint):将children作为参数传递,将no-children-prop提升为错误(由 @yurishkuro#3747 中贡献)
  • Chore:修复所有knip未使用导出警告;启用失败模式(由 @yurishkuro#3745 中贡献)
  • Chore:取消导出32个在各自文件外未导入的类型(由 @yurishkuro#3744 中贡献)
  • Chore:修复knip死代码警告(由 @yurishkuro#3743 中贡献)
  • 阶段1(子步骤2-1c)的一部分:将折叠/展开和详细状态迁移到zustand(由 @parshipcy#3721 中贡献)
  • 将measurablenode转换为函数式组件(由 @thc1006#3407 中贡献)
  • 将tracespanview迁移到函数式组件(由 @whiplashvin#3470 中贡献)
  • 阶段1(子步骤1c)的一部分:将跟踪时间线布局偏好移至zustand(由 @parshipcy#3719 中贡献)
  • 阶段1(1b)的一部分:归档通知器从redux迁移到zustand(由 @parshipcy#3715 中贡献)
  • 阶段1的一部分:重构:将跟踪diff状态从redux迁移到zustand(由 @parshipcy#3702 中贡献)
  • Refactor:将spangraph转换为函数式组件(由 @tmchow#3705 中贡献)
  • Test(jaeger-ui):将测试从jest迁移到vitest(由 @yurishkuro#3695 中贡献)
  • Test:为默认导出的模拟添加mockdefault辅助函数(由 @yurishkuro#3694 中贡献)
  • Test:将箭头构造函数模拟替换为常规函数(由 @yurishkuro#3693 中贡献)
  • Chore(jaeger-ui):将测试体中的require()替换为静态导入(由 @yurishkuro#3692 中贡献)
  • Chore(jaeger-ui):将jsx测试文件从.js重命名为.jsx(由 @yurishkuro#3691 中贡献)
  • [adr/007] 将packages/plexus测试从jest迁移到vitest(由 @yurishkuro#3690 中贡献)
  • [adr/007] 合并jaeger-ui tsconfigs(步骤e)(由 @yurishkuro#3689 中贡献)

更新内容 (原始)

Backend Changes

⛔ Breaking Changes

✨ 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 spanhash value to v2 todbmodel conversion (@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 getcallrates for clickhouse storage (@mahadzaryab1 in #8417)
  • [clickhouse][spm] implement geterrorrates for clickhouse storage (@mahadzaryab1 in #8414)
  • [clickhouse][spm] implement getlatencies for 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

📖 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

✨ 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

⚙️ 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)

下载链接