ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Highlight 错误分组(Error Grouping)机制完全解析:消息、栈帧与 JSONPath 分组规则

Highlight 错误分组(Error Grouping)机制完全解析:消息、栈帧与 JSONPath 分组规则 可观测性后端【免费下载链接】highlighthighlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.项目地址https://gitcode.com/gh_mirrors/hi/highlight点击查看免费下载本篇技术指南围绕 highlight.io 开源全栈可观测平台的核心能力之一——**错误分组Grouping Errors**展开系统讲解错误实例如何被归并到同一错误组Error Group先是“错误消息 栈帧指纹”的经典匹配规则再是面向 JSON 结构化错误的 JSONPath 自定义分组表达式最后结合仓库源码揭示其底层打分与匹配流程。读完本文你将理解为什么看似不同的报错会被归为一组、如何在项目设置中通过$.type这类表达式定制分组维度以及源码层指纹Fingerprint与分组查询是如何落地的。为什么需要错误分组在生产环境中同一处缺陷往往会以成千上万条错误实例Error Object的形式反复出现——不同用户、不同浏览器、不同时间点触发同一段代码。如果逐条展示开发者会被海量重复的噪音淹没无法定位根因。highlight.io 的解法是引入**错误组Error Group**抽象每当一个错误被抛出并上报后端会尝试把它匹配到某个已有的错误组匹配成功就把这条新错误实例并入该组匹配失败则新建一个错误组。这样一来一个 Bug 对应一个错误组开发者看到的是“某个错误发生了多少次、影响了多少用户”而非一屏重复的堆栈。相关说明可参见仓库文档 grouping-errors.md其核心规则可概括为Highlight groups errors together based on their error message and stack trace. When an error is thrown, Highlight finds the closest matching error and adds the new error instance to it.错误实例如何匹配到错误组文档中给出的匹配判定条件如下任一满足即视为命中相同的错误消息error message或相同的顶部栈帧top stack frame且紧接着的 4 个栈帧中有 3 个相同顺序不限。其中“栈帧匹配”的判定为文件名、函数名、行号、列号全部相同或若开启了 Source Map则源代码及其上下文相同。如果没有与任何现有错误组匹配系统会为该错误新建一个错误组。匹配规则背后的设计考量从匹配条件可以读出两个设计意图错误消息是分组的第一权重维度。只要消息一致即使堆栈细节略有出入也会被归并适合捕获“同一句话在不同位置抛出”的场景。栈帧序列用于兜底。当错误消息因包含动态内容行号、时间戳、用户输入而无法精确相等时栈帧的“结构相似性”就派上用场——顶部帧必须一致后续 4 帧只需命中 3 帧且允许乱序。这能容忍编译器优化、内联函数、以及微小的代码位移带来的栈差异。源码中的“指纹Fingerprint”对应物在 backend/errorgroups/fingerprint.go 中GetFingerprints把每条结构化栈帧拆解为两类指纹StackFrameCodeCODE由该帧的LinesBefore、LineContent、LinesAfter拼接而成即文档所说的“源代码及上下文”只有当 Source Map 开启、能还原源码时才有值StackFrameMetadataMETA由FileName、FunctionName、LineNumber、ColumnNumber拼接而成即文档所说的“文件名、函数名、行号、列号”。可见文档中“栈帧匹配”的两条规则在实现层面分别对应 CODE 与 META 两类指纹的比对。指纹生成时的Index字段记录了它在栈中的位置——index 0是顶部帧index 4是紧随其后的候选帧这正对应“顶部栈帧 后 4 帧”的窗口范围。分组打分底层 SQL 如何实现“最接近匹配”文档描述了匹配的判定条件而仓库 backend/public-graph/graph/resolver.go 中的GetTopErrorGroupMatchL568给出了真正的实现它把候选错误组的得分做加权求和取最高分作为“最接近的匹配”。计分逻辑与文档规则一一对应命中来源得分对应文档规则错误组事件消息与当前错误事件完全相等100“相同的错误消息”当前项目的 JSONPath 表达式解析值命中已有 JSON 指纹(2 ^ 序号) * 1000“Grouping Rules”中自定义 JSONPath 分组顶部栈帧index 0的 META 或 CODE 指纹命中10“相同的顶部栈帧”index 1..4的 META 或 CODE 指纹命中1“后 4 帧中相同帧”随后通过一个最小阈值完成最终判定L677-L686minScore : 10 len(restMeta) - 1 if len(restCode) len(restMeta) { minScore 10 len(restCode) - 1 } if result.Sum minScore { return result.Id, nil // 匹配成功并入该组 } else { return nil, nil // 无匹配新建错误组 }这个阈值正好呼应“顶部帧相同 后 4 帧中 3 帧相同”的最低要求顶帧 10 分再加上至少 3 个后续帧各 1 分因此最小命中分为10 3 - 1 12minScore的-1修正项是为了规避边界歧义。换言之只有真正达到文档所述“顶帧一致 3/4 帧命中”的相似度才会被判定为同一错误组。补充说明该函数注释中提到某个特定项目因超长堆栈拖慢分组过程而临时关闭了匹配L608-L614说明分组 SQL 的性能与堆栈规模相关属于实现细节而非通用行为。面向 JSON 错误的自定义分组规则Grouping Rules文档的第二部分聚焦于JSON 形式的错误。如果错误以 JSON 结构上报默认的“消息精确相等 栈帧相似”规则可能过于严格——例如同样类型的错误只因发生在不同代码行消息文本不同、栈帧也不同就无法归并。文档给出的示例{ type: StackOverflowError, user: alice, message: Oh no! You got an error on line 41!! } { type: StackOverflowError, user: bob, message: Oh no! You got an error on line 50!! }这两条错误消息不同、抛出行也不同按默认规则不会被归入同一组。若希望把所有type相同的错误合并到同一错误组可在项目设置project settings中添加 JSONPath 表达式$.type系统就会基于该字段的值进行分组。实现层面JSONPath 的校验与提取JSONPath 表达式通过editProjectSettings变更backend/private-graph/graph/schema.resolvers.go保存前会用jsonpath.New(path)逐一校验非法表达式会直接报错拒绝提交for _, path : range errorJSONPaths { _, err : jsonpath.New(path) if err ! nil { return nil, e.Wrap(err, The JSON path pathis not valid) } }校验通过后写入项目模型Project.ErrorJsonPathsbackend/model/model.go。而在错误上报侧backend/public-graph/graph/resolver.go 的handleErrorAndGroup会尝试把错误事件反序列化为 JSON并对每条已配置的 JSONPath 求值将结果作为JsonResult类型的新指纹追加到指纹集合for _, path : range project.ErrorJsonPaths { value, err : jsonpath.Get(path, errorAsJson) if err nil { marshalled, err : json.Marshal(value) if err nil { jsonResult : model.ErrorFingerprint{ ProjectID: projectID, Type: model.Fingerprint.JsonResult, Value: path string(marshalled), } fingerprints append(fingerprints, jsonResult) } } }注意指纹的Value是path 求值结果的形式因此不同 JSONPath 表达式产生的指纹彼此隔离、不会混同。在打分 SQL 中JSON 指纹使用(2 ^ ordinality) * 1000的指数级权重L617-L635且结果会先反转再参与匹配L595-L596——多表达式场景下先配置的表达式权重更高从而保证多条 JSONPath 规则叠加时判定稳定、可预期。典型使用场景与配置建议场景一按错误类型分组对文档示例中的StackOverflowError场景配置$.type即可让所有type StackOverflowError的错误汇聚到一个错误组无论发生在第 41 行还是第 50 行。场景二按业务字段分组若错误对象携带业务上下文例如{ service: checkout, error: payment declined, userId: u-10086 }配置$.service按微服务维度分组配置$.error按错误描述分组配置$.userId按用户维度分组不推荐用于分组会因用户基数过大而碎片化。配置入口网页端在应用设置Project Settings的 Error Monitoring 相关区域填入 JSONPath 表达式列表API 侧通过 GraphQL 变更editProjectSettings的errorJSONPaths参数提交见 backend/private-graph/graph/schema.resolvers.go。配置建议表达式越少越好每条表达式都会成为分组指纹的一部分过多的分组维度会把错误组切得太碎不利于聚合分析优先选择低基数字段像type、service、error code这类取值有限、语义稳定的字段是最佳候选避免高基数字段userId、timestamp、message含行号/参数插值等字段会导致几乎每条错误都自成一组失去分组意义保存前校验非法 JSONPath 会在提交时被服务端拒绝jsonpath.New校验失败配置错误不会静默生效。与相邻能力的协同错误分组并非孤立功能它与仓库中的以下机制协同工作栈帧过滤在分组之前backend/errorgroups/filtering.go 的IsErrorTraceFiltered会根据项目设置FilterChromeExtension过滤掉来自浏览器扩展chrome-extension://、moz-extension://前缀的栈帧避免扩展噪音污染分组相关行为有 filtering_test.go 覆盖。嵌入向量分组Embeddings当工作区开启ErrorEmbeddingsGroup时后端会优先尝试基于大模型嵌入向量GTE-Large-Embedding的语义匹配backend/public-graph/graph/resolver.go相似度超过阈值才复用否则回退到本文所述的经典分组流程ErrorGroupingMethodClassic。错误事件去重缓存HandleErrorAndGroup会先按“事件 未转换堆栈”的GetDedupingKey做精确去重缓存backend/errorgroups/fingerprint.go缓存命中时直接复用既有分组结果显著降低重复上报的分组开销。小结highlight.io 的错误分组围绕“消息相等优先、栈帧结构相似兜底、JSONPath 自定义增强”三层机制展开默认匹配相同的错误消息或“顶部栈帧一致 后 4 帧中 3 帧一致”栈帧指纹META文件名/函数名/行号/列号与 CODE源码及上下文依赖 Source Map两类指纹参与打分JSONPath 分组规则在项目设置中添加$.type等表达式即可按 JSON 结构化字段自定义分组维度实现跨行号、跨消息的错误归并。底层实现中所有匹配都归一化为“指纹 加权打分”的 SQL 查询GetTopErrorGroupMatch顶帧 10 分、后续帧每帧 1 分、消息全等 100 分、JSONPath 指数级加权最终以最低相似度阈值决定“并入已有组”还是“新建错误组”。理解这套机制你就能精确控制错误聚合的粒度让错误面板真正服务于定位根因而不是淹没在重复报错里。赞分享可观测性后端【免费下载链接】highlighthighlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.项目地址https://gitcode.com/gh_mirrors/hi/highlight点击查看免费下载相关推荐如何在Windows系统中实现苹果苹方字体的跨平台部署指南如何在Windows系统中实现苹果苹方字体的跨平台部署指南 引言跨平台字体一致性的技术挑战 在当今多平台数字环境中字体显示的一致性已成为用户体验设计的关键要前端PostHog Error Tracking 分组嘈杂错误实战从指纹乱象到 Merge Grouping Rule 的完整治理方案PostHog Error Tracking 分组嘈杂错误实战从指纹乱象到 Merge Grouping Rule 的完整治理方案 本文是一份面向 Pos数据分析后端前端数据可视化大数据Symfony消息路由基于规则的消息分发机制Symfony消息路由基于规则的消息分发机制 在构建复杂的Web应用时消息队列Message Queue是解耦系统组件、提高应用可扩展性的关键技术。Sy后端Web框架上一篇深度解析Qwen Code多语言编程助手如何构建国际化开发环境下一篇EyeWitness终极指南安全专家都在用的10个高效使用技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表