sentry 数据管理之分组和指纹(翻译)

1,478 阅读3分钟

分组和指纹

所有事件都有指纹。具有相同指纹的事件被分组到一个问题中。默认情况下,Sentry将运行我们内置的分组算法之一,根据事件中可用的信息(如stacktrace、exception和message)生成指纹。要扩展或完全更改默认分组行为,可以使用以下选项的组合:

  • SDK指纹识别(SDK Fingerprinting)

  • 服务器端指纹(Server-side Fingerprinting)

  • 自定义分组增强功能(Custom Grouping Enhancements)

分组算法

每次修改默认行为时,Sentry都会将其作为新版本发布,这样不会影响现有问题的分组方式。创建Sentry项目时,将自动选择分组算法的最新和最新版本。这意味着分组行为在项目中是一致的。如果要将现有项目升级到新的分组算法版本,可以在“项目设置”中执行此操作。升级时,很可能会创建新组。

所有版本都考虑stacktrace、异常和消息。

按Stacktrace分组

当Sentry在事件数据中检测到堆栈跟踪(直接或作为异常的一部分)时,分组实际上完全基于堆栈跟踪。这个分组相当复杂,但很容易理解。

第一个也是最重要的部分是,Sentry只对应用程序中报告的堆栈跟踪帧进行分组。并不是所有的sdk都会报告这一点,但如果提供了该信息,则会将其用于分组。这意味着,如果两个堆栈跟踪只在与应用程序无关的堆栈部分不同,它们仍将被组合在一起。

根据可用的信息,以下数据可用于每个堆栈跟踪帧:

  • 模块名称

  • 标准化文件名(删除修订哈希等)

  • 规范化上下文行(基本上是受影响行的源代码的清理版本,如果提供的话)

这种分组通常工作得很好,但如果不加以处理,有两种特定的情况可能会使其失效:

  • 最小化的JavaScript源代码将以非常糟糕的方式破坏分组。因此,你应该确保哨兵可以访问你的源地图。

  • 如果通过使用decorators引入一个新的级别来修改堆栈跟踪,那么堆栈跟踪将更改,分组也将更改。为了处理这个问题,许多sdk支持隐藏不相关的堆栈跟踪帧。(例如,Python SDK将跳过所有堆栈帧,其中一个名为uu traceback_uhide_uuu的局部变量设置为True)。

按异常分组

如果没有堆栈跟踪可用,但异常信息可用,则只要事件上同时存在这两个数据,则分组将考虑异常的类型和值。由于错误消息不断变化,这种分组的可靠性大大降低。

回退分组

如果其他一切都失败了,分组就返回到消息。在这种情况下,分组算法将尝试使用不带任何参数的消息,但如果该参数不可用,则将使用完整的消息属性。