跳到主要内容

认识

2024年05月08日
柏拉文
越努力,越幸运

一、认识


Sentry 内部, 每个错误都会有按照指定聚合算法生成对应的错误指纹fingerprint。策略如下:

  1. error.name + error.message 策略: 在实践过程中, 仅靠 namemessage 并不能做到有效聚合错误。两个错误 namemessage 相同,但是可能来源于不同的代码段。这样可能导致我们修复了其中一个错误后,误以为相关的所有错误都被修复了,从而遗漏错误。

  2. error.name + error.message + stacktrack 策略: 在实际聚合算法中,我们将反解后的堆栈纳入了计算,将堆栈拆分为一系列的 frame, 更细致的提取堆栈特征,在每一个 frame 内重点关注其调用函数名、调用文件名以及当前执行的代码行,如果这些信息都相同,可以认为是同一个错误。

二、error.name + error.message


三、error.name + error.message + stacktrack


在实际聚合算法中,我们将反解后的堆栈纳入了计算,将堆栈拆分为一系列的 frame, 更细致的提取堆栈特征,在每一个 frame 内重点关注其调用函数名、调用文件名以及当前执行的代码行,如果这些信息都相同,可以认为是同一个错误。

Preview

为了方便识别,我们会利用上述信息,通过 hash 计算最后生成一个 issueId 作为我们识别相同错误的标识。生成 hash 的过程比较复杂,除了常规提取计算外,会针对递归调用、匿名路径、匿名函数等进行跳过,也会避开某些计算开销过大的 case

Sentry 内部, 每个错误都会有按照指定聚合算法生成对应的 fingerprintSentry 根据 fingerprint 生成对应的 Group Hash Code,并以此来对错误事件进行归类。即相同的 Group Hash Code 被归为同一个 issue。具体如下:

将解析后的错误堆栈 stacktrace 进一步拆分为一系列的 Frame, 每一个 Frame 内我们重点关注其调用函数名,调用文件名以及当前执行的代码行。Sentry 将每一个拆分出的部分都称为一个 GroupingComponent,当堆栈反解完毕后,我们首先自上而下的递归检测,并自下而上的生成一个个嵌套的 GroupingComponent。最后,在顶层调用 GroupingComponent.getHash() 方法, 得到一个最终的哈希值,这就是我们最终求得的 fingerprint

基于错误堆栈的聚合策略,能够更细致的提取堆栈特征,规避了不同文件下触发相同 message 的问题。因此获得的聚合效果也更优秀。这个策略目前在内部的工作效果良好,基本上能够做到精确的区分各类异常而不会造成混淆和错误聚合。

3.1 设计

3.2 Web

3.3 Node

参考资料


字节前端监控实践

哦吼!前端异常处理一站式详解🤩(大量DEMO,很干很干)

沉淀了3年的自研前端错误监控系统,打通你的脉络

解析Sentry源码(一)| 搞懂Sentry初始化

前端监控系列2 | 聊聊 JS 错误监控那些事儿