jaeger v2.21.0 版本更新介绍
发布日期: 2026-09-14
版本号: v2.21.0
本次 Jaeger 更新内容总结如下:后端方面包含四项破坏性变更,分别是移除 UI 已不再调用的 v1 HTTP 接口、用可选的 ai.mcp 配置块替代 ai.enable_mcp、启动时拒绝五个不受支持的 Elasticsearch 配置项、以及将 ClickHouse 存储特性开关提升为稳定状态;新功能包括允许 search_traces 省略服务名,并让存储后端声明搜索可否省略服务名;大量缺陷修复与改进涵盖 Elasticsearch 写入与查询(同步写模式、内容哈希 _id 幂等写入、search_after 分页 spanid 排序、_msearch 改用 POST 并暴露失败项、gzip 压缩恢复、服务与操作查询回溯范围限制、error=false 搜索返回非错误链路等)、内存存储(error=false 搜索匹配无状态 span、返回链路副本而非引用)、MCP 相关(关键路径子搜索边界、search_depth 限制、read_skill 输出上限)、查询服务(search_depth 上限 10000 并拒绝负值、api_v3 默认 search_depth、服务器 span 命名、访问拒绝哨兵错误)、匿名器(gogo codec 注册、零 span 捕获读取)、发布脚本(提交分页、无法分类的 PR 处理)、ClickHouse 配置默认值、遥测与存储客户端重复 handler 清理、以及 OpenTelemetry 示例与安全告警修复等;实验性特性主要围绕结构化查询过滤器展开,包括过滤器 proto 生成、流式构建器、线格式与 AST 转换、api_v3 接受结构化过滤器、按后端能力下发查询、读取器声明支持的过滤器、Elasticsearch 实现结构化过滤器与按数值索引属性,另有可插拔的查询拦截器扩展点、Elasticsearch write_mode 配置与同步写幂等处理、Python SDK 原型、数据流组合模板、AI 网关会话级 MCP 端点与多 MCP 挂载、以及从 ai.skills_dir 加载操作员技能;CI 方面升级到 Go 1.27、pnpm 6.1.0、改进覆盖率收集与 Codecov 配置、为 Cassandra 和 ClickHouse 增加向后兼容集成测试、优化 lint 缓存与镜像构建跳过逻辑;重构包含将过滤器准入逻辑从 jaeger-idl 移入 jaeger、Elasticsearch 版本无关代码与 factorybase 迁移到 v2 包、移除未使用的 v1 依赖存储与 applydefaults、统一批量写入 API、查询时动态询问存储能力;文档方面大量更新了 RFC 与 ADR(搜索分页 RFC 0014、Elasticsearch 类型化属性索引 RFC、嵌套 JSON 提取操作符、span 搜索 RFC、存储能力机制 ADR 等),并新增技能编写指南、AI 使用策略、存储后端版本支持政策与贡献前置条件说明。UI 方面新功能有默认启用 OpenTelemetry 术语、后端支持时提供全服务选项、搜索排序跨会话持久化、任意服务的自由格式 span 名称、GenAI 相关的模型标签显示与工具 span 分类;大量修复集中在 GenAI 视图(消息渲染为多部分、图片音频展示、消息折叠、markdown 大内容按需展开、未知属性详情保留、真实埋点数据读取)、暗色主题下画布与图形视图的 span 配色、时间线侧栏重对齐、时长取整与单位校验、无可用 startTime 的 span 修复、持久化 localstorage 访问统一封装、关键路径计算错误显式提示等;重构包括 CSS 颜色标准化为设计令牌、span 装饰匹配合并为单一注册表、按未排序结果构建链路映射;CI 改用 corepack 配置 pnpm、以 knip 替代 depcheck、统一 PR 配额 action 并固定其版本。
更新内容 (中文)
后端变更
⛔ 破坏性变更
- Feat(query)!: 移除 UI 已不再调用的 v1 http 端点(@ysh-bot 于 #9260)
- 用可选的 ai.mcp 配置块替换 ai.enable_mcp(@SoumyaRaikwar 于 #9194)
- Fix(es): 启动时拒绝五个不受支持的 elasticsearch 配置键(@ysh-bot 于 #9076)
- Feat(clickhouse): 将 clickhouse 存储功能门提升为稳定状态(@ysh-bot 于 #9058)
✨ 新功能
- Feat(mcp): 允许 search_traces 省略服务名(@ysh-bot 于 #9262)
- Feat(storage): 允许后端声明搜索时可省略服务名(@ysh-bot 于 #9256)
🐞 缺陷修复、微小改进
- Fix(memory): 在 error=false 的 trace 搜索中匹配未设置状态的 span(@hharshhsaini 于 #9096)
- Fix(anonymizer): 注册 gogo codec(@DsThakurRawat 于 #9540)
- Fix(release): 在发布说明脚本中对 commits 查询进行分页(@ysh-bot 于 #9560)
- Fix(release): 当 PR 无法归类时使发布说明脚本失败(@ysh-bot 于 #9561)
- Fix(es): 展示失败的 _msearch 条目,而不是静默丢弃 trace(@hharshhsaini 于 #9008)
- Feat(featuregate): 规范化 Jaeger 门名称(@maindevhoon 于 #9037)
- Fix(mcp): 关键路径子项搜索使用闭区间(@Harizz076 于 #9174)
- Feat(es): 在 esmapping-generator 和 es-rollover init 中接受 –feature-gates(@ysh-bot 于 #9546)
- Fix(anonymizer): 读取写入方的零 span 捕获而不 panic(@DsThakurRawat 于 #9528)
- 校验 targetsamplespersecond 为正数(@Atul-Koundal 于 #9379)
- Fix(es-index-cleaner): 在索引名模式中对索引前缀加引号(@DsThakurRawat 于 #9525)
- Feat(es): 向 span 索引模板添加可选的 index.mapping.total_fields.limit(@zarna1parekh 于 #9523)
- Fix(mcp): 当 maxresults 无限(0)时遵守 search_depth(@shashankvarma499 于 #9517)
- ES tracestore:在 tag regexpquery 上设置 flags(“none”)(#9387)(@SHIVANSH-ux-ys 于 #9454)
- Fix(query): 将 searchdepth 上限设为 10000 并拒绝负数(@jkowall 于 #9492)
- Fix(security): 清除 open codeql 和 scorecard 的 token 权限告警(@jkowall 于 #9488)
- Fix(otel-demo): 将 opensearch 升级到 3.7.0(@jkowall 于 #9397)
- Fix(es): 在 purge 中清空 span 写入方的服务缓存(@ysh-bot 于 #9416)
- Fix(storage): 移除 storage 客户端上重复的 otelgrpc handler(@ysh-bot 于 #9417)
- Fix(telemetry): 为 jaeger_storage 扩展添加 trace(@ysh-bot 于 #9414)
- Fix(otel-demo): 强化仪表板 rollout 诊断(@jkowall 于 #9393)
- Fix(query): 当中间件复制请求时按路由命名 server span(@ysh-bot 于 #9406)
- Fix(es): 限定服务和操作查询的回溯范围(@ekagra1602 于 #9400)
- Fix(mcp): 将 read_skill 输出截断至 max_read_file_size(@CedricConday 于 #8993)
- [query] 为 query 拦截器的访问控制错误添加 erraccessdenied 哨兵值(@rishabhkumar92 于 #9402)
- Fix(storage): 移除 http 状态码启发式判断(@HESleagacy 于 #9386)
- Feat(ai-gateway): 在 acp agent 握手时发送可配置的 header(@SoumyaRaikwar 于 #9395)
- Fix(query): api_v3 grpc handler 中的默认 search_depth(@vyncint 于 #9100)
- Feat(mcptools): 向网关的 mcp 工具调用 span 添加 gen_ai.tool.call.arguments/result(@SoumyaRaikwar 于 #9304)
- Fix(clickhouse): 在 unmarshal 时应用配置默认值,使显式零值得以保留(@ysh-bot 于 #9345)
- Fix(otel-demo): 在线扩容 opensearch 卷(@jkowall 于 #9315)
- Fix(otel-demo): 允许显式的 opensearch 恢复豁免(@jkowall 于 #9313)
- Fix(ai-gateway): 通过 websocket 读取 acp 时保留消息边界(@SoumyaRaikwar 于 #9296)
- Fix(otel-demo): 添加经过测试的 opensearch 恢复门控(@jkowall 于 #9306)
- Feat(jaeger): 通过 jaegercli.components 暴露默认组件工厂(@iammdzaidalam 于 #9073)
- Fix(jaeger): 将仅用于 e2e 的 storage_cleaner 排除出生产二进制文件(@ysh-bot 于 #9300)
- Feat(storage): 让远程存储上报其搜索能力(@ysh-bot 于 #9269)
- Fix(examples): 添加 otel collector 启动探针(@jkowall 于 #9257)
- Fix(memory): 返回已存储 trace 的副本,而非引用(@ysh-bot 于 #9261)
- Feat(query): 拒绝存储后端无法执行的搜索(@ysh-bot 于 #9259)
- Fix(examples): 固定 otel demo chart 版本(@jkowall 于 #9245)
- Fix(es): 为 error=false 搜索返回非错误 trace(@hharshhsaini 于 #9210)
- Fix(apiv3): trace 缺失时返回 notfound(@ADITYA-CODE-SOURCE 于 #9151)
- Feat(jaegerai): 向 sidecar 工具调用 span 添加 gen_ai.tool.call.arguments/result(@SoumyaRaikwar 于 #9011)
- Feat(es): 为同步写入添加可选的 poison-pill 丢弃(@ysh-bot 于 #9109)
- Feat(es): 对未对齐的同步写入批次大小发出警告(@ysh-bot 于 #9098)
- Feat(es): 添加确定性内容哈希 _id 以实现幂等 span 写入(@ysh-bot 于 #9094)
- Fix(es): 为 trace 读取的 search_after 分页添加 spanid 决胜条件(@hharshhsaini 于 #9063)
- Feat(query): 让 query 拦截器钩子返回一个 context(@ysh-bot 于 #9082)
- Fix(elasticsearch): _msearch 请求使用 post 而非 get(@magic-peach 于 #9027)
- Feat(es): 将 sniffing.enabled 和 log_level 重新接入 esclient 传输层(@ysh-bot 于 #9077)
- Fix(es): 恢复 elasticsearch 请求体的 gzip 压缩(@iammdzaidalam 于 #9072)
- Refactor(storage): 将 findtracesummaries 合并进 tracestore.reader(@ysh-bot 于 #9067)
🚧 实验性功能
- Feat(es): 将属性值按数字索引并基于其排序谓词(@ysh-bot 于 #9321)
- Feat(ai-gateway): 在一个服务器上同时提供两个 mcp 挂载点并回收其会话(@Nabil-Salah 于 #9216)
- Fix(query): 让针对属性的成员判断以无类型形式到达后端(@ysh-bot 于 #9459)
- Feat(es): 渲染并创建 span 数据流可组合模板(@Me-Priyank 于 #8991)
- Feat(sdk): 添加用于结构化查询过滤器的原型 Python SDK(@ysh-bot 于 #9302)
- Fix(es): 固定正则查询上的 flags(@DsThakurRawat 于 #9383)
- Feat(es): 实现结构化查询过滤器(@ysh-bot 于 #9350)
- Feat(query): 向 query 拦截器展示每个谓词为过滤器(@ysh-bot 于 #9360)
- Feat(query): 在 api_v3 trace 搜索上接受结构化过滤器(@ysh-bot 于 #9359)
- Feat(storage): 通过远程存储传递过滤器及其能力(@ysh-bot 于 #9358)
- Feat(query): 以后端能理解的形式执行过滤器查询(@ysh-bot 于 #9357)
- Feat(storage): 让读取方声明它支持求值哪些过滤器(@ysh-bot 于 #9356)
- Feat(query): 在传输格式与 AST 之间转换过滤器(@ysh-bot 于 #9355)
- Feat(query): 添加结构化查询过滤器的流式构建器(@yurishkuro 于 #9354)
- Build(idl): 为共享的过滤表达式 proto 生成 Go 代码(@yurishkuro 于 #9349)
- Fix(es): 将数据流 @timestamp 写为 RFC 3339 字符串(@Me-Priyank 于 #9363)
- Feat(jaegerquery): 从 ai.skills_dir 的 custom/ 目录提供操作员技能(@SoumyaRaikwar 于 #9169)
- Fix(es): 在同步写入器中将 bulk 409 视为幂等成功(@Me-Priyank 于 #9113)
- Refactor(ai-gateway): 将 mcptools.config 传入轮次作用域的 mcp 端点(@SoumyaRaikwar 于 #9162)
- Feat(ai-gateway): 通过 http 向 sidecar 公告会话作用域的 mcp 端点(@Nabil-Salah 于 #9009)
- Feat(es): 添加 write_mode 配置以选择同步 elasticsearch 写入(@ysh-bot 于 #9093)
- Feat(query): 添加可插拔的查询前/后拦截器扩展点(@ysh-bot 于 #9024)
👷 CI 改进
- Ci: 移除未使用的测试工具安装(@ysh-bot 于 #9553)
- Ci: 将 pnpm/action-setup 升级到 v6.1.0 以支持 pnpm 12(@ysh-bot 于 #9562)
- Chore(deps): 将依赖 prometheus-client 更新到 v0.26.0(@renovate[bot] 于 #9501)
- Test(integration): 为 cassandra 和 clickhouse 添加向后兼容性测试套件(@iammdzaidalam 于 #9441)
- Fix(ci): 以计数器方式收集单元测试覆盖率,并将产物保存在 .cover/ 下(@ysh-bot 于 #9509)
- Chore: 升级 Go 到 1.27(@ysh-bot 于 #9478)
- Ci(setup-go): 瞬时拉取失败时重试模块下载(@ysh-bot 于 #9429)
- Ci(lint): 允许通过标签豁免二进制体积门禁(@ysh-bot 于 #9426)
- Ci(lint): 将嵌套 checkout 排除出 makefile 的源文件列表(@ysh-bot 于 #9412)
- Ci: 阻止 CI 门禁代表已被取代的运行判定 commit 失败(@ysh-bot 于 #9372)
- Ci(lint): 为每个 checkout 分配独立的 golangci-lint 缓存(@ysh-bot 于 #9322)
- Ci: 将 PR 配额脚本封装为 composite action(@ysh-bot 于 #9258)
- Ci: 当 PR 配额任务无法加标签或评论时明确失败(@ysh-bot 于 #9255)
- Fix(ci): 在推送到 main 时跳过 dco 检查(@ysh-bot 于 #9145)
- Feat(ci): 收集 e2e 测试所启动的 jaeger 二进制的覆盖率(@ysh-bot 于 #9140)
- Feat(ci): 当 codecov 上传阈值不可达时明确报错(@ysh-bot 于 #9133)
- Fix(ci): 将 codecov 的 after_n_builds 与实际上传数量重新对齐(@ysh-bot 于 #9130)
- Fix(ci): 跳过未使用的 es 镜像构建(@rootp1 于 #9086)
- Fix(ci): 为 e2e 单元跳过 es-index-cleaner/es-rollover 镜像构建(@hharshhsaini 于 #9088)
- Fix(es): 在测试环境中禁用磁盘阈值(@vyncint 于 #9085)
⚙️ 重构
- Refactor(query): 将过滤器准入逻辑从 jaeger-idl 移入 jaeger(@ysh-bot 于 #9461)
- Refactor(es): 将与版本无关的 elasticsearch 代码移出 v1 目录树(@yurishkuro 于 #9409)
- Refactor(es): 在 elasticsearch 工厂中嵌入 factorybase(@yurishkuro 于 #9408)
- Refactor(es): 将 elasticsearch 的 factorybase 移入 v2 包(@yurishkuro 于 #9407)
- Refactor(es): 移除未使用的 v1 elasticsearch 依赖存储(@ysh-bot 于 #9401)
- Refactor(storage): 移除 es 和 cassandra 配置中未使用的 applydefaults(@ysh-bot 于 #9344)
- Refactor(query): 向存储查询搜索能力,而非提前捕获它(@ysh-bot 于 #9268)
- Refactor(es): 将批量写入统一到单一的批量写入 API 之下(@ysh-bot 于 #9097)
📖 文档
- Docs(jaeger): contributing.md:在前置条件中加入 docker 和 uv(@baroquebobcat 于 #9522)
- Docs(jaegerquery): 添加技能编写指南并完善操作员指南(@SoumyaRaikwar 于 #9435)
- Docs: 说明调试镜像的 delve 升级如何到达 Jaeger(@ysh-bot 于 #9481)
- Docs: 将 AI 使用政策提升为顶层 ai_policy.md(@ysh-bot 于 #9479)
- Docs: 修正 security.md 中的语法(@magic-peach 于 #9000)
- Docs(rfc): 在 RFC 0005 中指明过滤器校验器当前的入口点(@ysh-bot 于 #9466)
- Docs(query): 更正过滤器准入测试中关于列表类型的注释(@ysh-bot 于 #9464)
- Docs(rfc): 在 RFC 0005 中允许属性旁的列表保持无类型(@ysh-bot 于 #9458)
- Docs(rfc): 使 RFC 0014 与已交付的分页 proto 保持一致(@ysh-bot 于 #9457)
- Docs(ai-sidecar): 添加以 goose 作为 acp agent 运行的指南(@SoumyaRaikwar 于 #9418)
- Docs: 要求 agent 扩展现有机制,并说明何时应提问(@ysh-bot 于 #9384)
- Docs: 明确 RFC 和 ADR 中里程碑勾选标记的位置(@ysh-bot 于 #9378)
- Docs(rfc): 在 RFC 0005 中标记 elasticsearch 里程碑已交付(@ysh-bot 于 #9377)
- Docs(rfc): 在 RFC 0014 中详述 cassandra 与 badger 的分页阻碍(@ysh-bot 于 #9376)
- Docs(rfc): 定义比较的内容,以及模式的读法(@ysh-bot 于 #9367)
- Docs(rfc): 记录 RFC 0004 写入路径所交付的 @timestamp 精度(@ysh-bot 于 #9375)
- Docs(adr): 将运行中摘要检查记录为覆盖率门控上下文(@ysh-bot 于 #9373)
- Docs(rfc): 提出返回匹配 span 的 span 搜索(@ysh-bot 于 #9371)
- Docs(rfc): 确定 AST 的引用术语、词汇策略和校验阶段(@ysh-bot 于 #9366)
- Docs(rfc): 将 instrumentation 层级重命名为 scope,并绘制查询路径图(@ysh-bot 于 #9364)
- Docs(rfc): 反映 RFC 0005 实现最终确定的设计(@ysh-bot 于 #9353)
- Docs: 说明实施中的 RFC 本就应被重写(@ysh-bot 于 #9352)
- Docs(rfc): 向 RFC 索引添加状态标记(@ysh-bot 于 #9333)
- Docs(rfc): 添加关于 elasticsearch 类型化属性索引的 RFC(@ysh-bot 于 #9309)
- Docs(rfc): 添加关于搜索结果分页的 RFC 0014(@ysh-bot 于 #9308)
- Docs(rfc): 添加用于嵌套 JSON 属性访问的 json_extract 操作符(@ysh-bot 于 #9297)
- Docs(adr): 记录存储能力机制并关闭 RFC 0013(@ysh-bot 于 #9271)
- Docs: 用相称性测试取代 ADR 绝对不可变规则(@ysh-bot 于 #9142)
- Docs(adr): 为 adr-004 补充二进制覆盖率与上传不变量(@ysh-bot 于 #9141)
- Docs: 添加存储后端版本支持策略(@jkowall 于 #8953)
- Docs(adr): 将归档错误的 ADR 中的提案内容拆分到 RFC(@ysh-bot 于 #9117)
- Docs(adr): 将 adr-003 的提案内容拆分到 RFC 0009(@ysh-bot 于 #9116)
- Docs(adr): 区分 RFC 与 ADR 并更正归档错误的记录(@ysh-bot 于 #9114)
📊 UI 变更
✨ 新功能
🐞 缺陷修复、微小改进
- Fix(ddg): 查看 trace 时跳转到搜索页(@Harizz076 于 #4021)
- Chore(model): 使 deduplicatetags 随标签数线性而非 O(n²)(@iammdzaidalam 于 #4110)
- Feat(api/v3): 暴露 OTLP trace/span 类型的 zod schema(@sksingh2005 于 #4438)
- Fix(genai): 读取真实 instrumentation 发出的内容(@ysh-bot 于 #4432)
- Feat(genai): 将消息渲染为其携带的各个部分(@swetalin-10 于 #4399)
- Feat(genai): 按需展示图片和音频(@u7k4rs6 于 #4313)
- Feat(genai): 折叠会话消息(@ysh-bot 于 #4425)
- Fix(genai): 按需提供大段 markdown(@ysh-bot 于 #4424)
- Fix(genai): 将格式选择限定在单条消息内(@ysh-bot 于 #4423)
- Fix(genai): 只展开唯一的小节(@Rukafuu 于 #4419)
- Fix(genai): 为未知属性保留详情(@conradmr94 于 #4417)
- Fix(storage): 让所有 localStorage 访问都经过安全封装(@ysh-bot 于 #4398)
- Feat(search): 跨会话保持排序方式(@swetalin-10 于 #3986)
- Feat(genai-tab): 在 meta 行添加 LLM 说明并提升 agent 属性(@swetalin-10 于 #4244)
- 隐藏时间轴时同时隐藏小地图(@okxint 于 #3764)
- Fix(timeline): 视图切换后重新对齐侧面板(@ysh-bot 于 #4381)
- Test(genai): 添加示例 genai trace fixture 及生成器(@ysh-bot 于 #4372)
- Fix(about): 显示 UI 构建对应的 commit(@ysh-bot 于 #4364)
- Feat(search): 任意服务均可填写自由格式的 span 名称(@ysh-bot 于 #4346)
- Fix(search): 没有摘要报告 span 数量时隐藏 spans 列(@ysh-bot 于 #4325)
- Fix(critical-path): 展示计算错误,而非静默返回空结果(@swetalin-10 于 #3916)
- Fix(date): 防止时长被错误地部分向上取整(@thisis-manan 于 #4247)
- Fix(theme): trace 图和火焰图颜色跟随主题变化(@ysh-bot 于 #4287)
- Fix(timeline): 将 span 树装饰拆分为 token 并修正折叠框(@ysh-bot 于 #4285)
- Fix(theme): 修正画布和图视图中的暗色模式 span 颜色(@ysh-bot 于 #4277)
- Feat(genai): 对工具 span 分类并忽略孤立的 gen_ai.tool.call.id(@u7k4rs6 于 #4053)
- Fix(genai): 使用 trace 自身的 isgenaitrace 自动激活视图(@u7k4rs6 于 #4271)
- Fix(tracegraph): 为模式切换按钮添加 aria-label(@shubhtrek 于 #4130)
- Feat(SpanBarRow): 将 gen_ai.request.model 作为 span 药丸展示 LLM span(@swetalin-10 于 #3896)
- Fix(search): 以更小的灰色文字渲染搜索耗时(@ysh-bot 于 #4253)
- Fix(about): 仅缩写提交标签中的完整 SHA,保留前缀(@ysh-bot 于 #4251)
- Fix(search): 交换搜索表单中最短/最长耗时字段顺序(@rishabhkumar92 于 #4249)
- Fix(TracePage): 修复无可用 startTime 的 span,而非丢弃它们(@ysh-bot 于 #4245)
- Fix(stringSupplant): 未提供编码器时返回格式化后的值(@gkhulbe4 于 #3902)
- Fix(SearchTracePage): 改进耗时单位的正则校验(@vibhor-5 于 #3940)
👷 CI 改进
- Ci: 用 corepack 而非 npm 配置 pnpm(@ysh-bot 于 #4428)
- Chore(deps): 弃用 depcheck,改用 knip(@ysh-bot 于 #4259)
- Chore(ci): 从 renovate 中移除 action digest 固定(@ysh-bot 于 #4370)
- Chore(ci): 将 action digest 固定到完整语义化版本(@ysh-bot 于 #4367)
- Feat(dev): 从 query 服务读取后端能力(@ysh-bot 于 #4349)
- Ci: 使用共享的 PR 配额 action,而非 curl 拉取脚本(@ysh-bot 于 #4344)
- Ci: 在 PR 配额 workflow 中使用 github_token 并固定 github-script(@ysh-bot 于 #4343)
⚙️ 重构
- Refactor(ui): 使用设计令牌标准化 CSS 颜色(@Harizz076 于 #3886)
- Refactor(trace): 将 span 装饰匹配合并为单一注册表(@udita-0707 于 #4254)
- Refactor(search): 以未排序结果作为 trace map 的键(@ysh-bot 于 #4435)
更新内容 (原始)
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)
下载链接
- jaeger-2.21.0-darwin-amd64.sha256sum.txt
- jaeger-2.21.0-darwin-amd64.tar.gz
- jaeger-2.21.0-darwin-amd64.tar.gz.asc
- jaeger-2.21.0-darwin-arm64.sha256sum.txt
- jaeger-2.21.0-darwin-arm64.tar.gz
- jaeger-2.21.0-darwin-arm64.tar.gz.asc
- jaeger-2.21.0-linux-amd64.sha256sum.txt
- jaeger-2.21.0-linux-amd64.tar.gz
- jaeger-2.21.0-linux-amd64.tar.gz.asc
- jaeger-2.21.0-linux-arm64.sha256sum.txt
- jaeger-2.21.0-linux-arm64.tar.gz
- jaeger-2.21.0-linux-arm64.tar.gz.asc
- jaeger-2.21.0-linux-ppc64le.sha256sum.txt
- jaeger-2.21.0-linux-ppc64le.tar.gz
- jaeger-2.21.0-linux-ppc64le.tar.gz.asc
- jaeger-2.21.0-linux-s390x.sha256sum.txt
- jaeger-2.21.0-linux-s390x.tar.gz
- jaeger-2.21.0-linux-s390x.tar.gz.asc
- jaeger-2.21.0-windows-amd64.sha256sum.txt
- jaeger-2.21.0-windows-amd64.tar.gz
- jaeger-2.21.0-windows-amd64.tar.gz.asc
- jaeger-2.21.0-windows-amd64.zip
- jaeger-2.21.0-windows-amd64.zip.asc
- jaeger-2.21.0.sha256sum.txt
- jaeger-SBOM.spdx.json
- jaeger-tools-2.21.0-darwin-amd64.sha256sum.txt
- jaeger-tools-2.21.0-darwin-amd64.tar.gz
- jaeger-tools-2.21.0-darwin-amd64.tar.gz.asc
- jaeger-tools-2.21.0-darwin-arm64.sha256sum.txt
- jaeger-tools-2.21.0-darwin-arm64.tar.gz
- jaeger-tools-2.21.0-darwin-arm64.tar.gz.asc
- jaeger-tools-2.21.0-linux-amd64.sha256sum.txt
- jaeger-tools-2.21.0-linux-amd64.tar.gz
- jaeger-tools-2.21.0-linux-amd64.tar.gz.asc
- jaeger-tools-2.21.0-linux-arm64.sha256sum.txt
- jaeger-tools-2.21.0-linux-arm64.tar.gz
- jaeger-tools-2.21.0-linux-arm64.tar.gz.asc
- jaeger-tools-2.21.0-linux-ppc64le.sha256sum.txt
- jaeger-tools-2.21.0-linux-ppc64le.tar.gz
- jaeger-tools-2.21.0-linux-ppc64le.tar.gz.asc
- jaeger-tools-2.21.0-linux-s390x.sha256sum.txt
- jaeger-tools-2.21.0-linux-s390x.tar.gz
- jaeger-tools-2.21.0-linux-s390x.tar.gz.asc
- jaeger-tools-2.21.0-windows-amd64.sha256sum.txt
- jaeger-tools-2.21.0-windows-amd64.tar.gz
- jaeger-tools-2.21.0-windows-amd64.tar.gz.asc
- jaeger-tools-2.21.0-windows-amd64.zip
- jaeger-tools-2.21.0-windows-amd64.zip.asc