认识
一、认识
在 Sentry
内部, 每个错误都会有按照指定聚合算法生成对应的错误指纹fingerprint
。策略如下:
-
error.name + error.message
策略: 在实践过程中, 仅靠name
和message
并不能做到有效聚合错误。两个错误name
和message
相同,但是可能来源于不同的代码段。这样可能导致我们修复了其中一个错误后,误以为相关的所有错误都被修复了,从而遗漏错误。 -
error.name + error.message + stacktrack
策略: 在实际聚合算法中,我们将反解后的堆栈纳入了计算,将堆栈拆分为一系列的frame
, 更细致的提取堆栈特征,在每一个frame
内重点关注其调用函数名、调用文件名以及当前执行的代码行,如果这些信息都相同,可以认为是同一个错误。
二、error.name + error.message
三、error.name + error.message + stacktrack
在实际聚合算法中,我们将反解后的堆栈纳入了计算,将堆栈拆分为一系列的 frame
, 更细致的提取堆栈特征,在每一个 frame
内重点关注其调用函数名、调用文件名以及当前执行的代码行,如果这些信息都相同,可以认为是同一个错误。
为了方便识别,我们会利用上述信息,通过 hash
计算最后生成一个 issueId
作为我们识别相同错误的标识。生成 hash
的过程比较复杂,除了常规提取计算外,会针对递归调用、匿名路径、匿名函数等进行跳过,也会避开某些计算开销过大的 case
。
在 Sentry
内部, 每个错误都会有按照指定聚合算法生成对应的 fingerprint
,Sentry
根据 fingerprint
生成对应的 Group Hash Code
,并以此来对错误事件进行归类。即相同的 Group Hash Code
被归为同一个 issue
。具体如下:
将解析后的错误堆栈 stacktrace
进一步拆分为一系列的 Frame
, 每一个 Frame
内我们重点关注其调用函数名,调用文件名以及当前执行的代码行。Sentry
将每一个拆分出的部分都称为一个 GroupingComponent
,当堆栈反解完毕后,我们首先自上而下的递归检测,并自下而上的生成一个个嵌套的 GroupingComponent
。最后,在顶层调用 GroupingComponent.getHash()
方法, 得到一个最终的哈希值,这就是我们最终求得的 fingerprint
。
基于错误堆栈的聚合策略,能够更细致的提取堆栈特征,规避了不同文件下触发相同 message
的问题。因此获得的聚合效果也更优秀。这个策略目前在内部的工作效果良好,基本上能够做到精确的区分各类异常而不会造成混淆和错误聚合。