我正在使用 Sentry(在 django 项目中),我想知道如何正确聚合错误。我将某些用户操作记录为错误,因此没有底层系统异常,并且正在使用该culprit
属性设置一个友好的错误名称。该消息是模板化的,并且包含一条公共消息(“用户 'x' 无法执行操作,因为 'y'”),但绝不完全相同(不同的用户,不同的条件)。
Sentry 显然在后台使用了一组属性来确定是否将错误聚合为相同的异常,但是尽管查看了代码,但我无法弄清楚如何。
任何人都可以缩短我必须深入研究代码并告诉我需要设置哪些属性才能按照我的意愿管理聚合的捷径吗?
[更新 1:事件分组]
此行出现在 sentry.models.Group 中:
class Group(MessageBase):
"""
Aggregated message which summarizes a set of Events.
"""
...
class Meta:
unique_together = (('project', 'logger', 'culprit', 'checksum'),)
...
这是有道理的——我目前正在设置的项目、记录器和罪魁祸首——问题是checksum
。我将进一步调查,但是“校验和”表明二进制等价,这永远不会起作用 - 必须可以对具有不同属性的相同异常的实例进行分组?
[更新 2:事件校验和]
事件校验和来自sentry.manager.get_checksum_from_event
方法:
def get_checksum_from_event(event):
for interface in event.interfaces.itervalues():
result = interface.get_hash()
if result:
hash = hashlib.md5()
for r in result:
hash.update(to_string(r))
return hash.hexdigest()
return hashlib.md5(to_string(event.message)).hexdigest()
下一站——活动interfaces
从何而来?
[更新 3:事件接口]
我已经弄清楚接口是指描述传递给哨兵事件的数据的标准机制,并且我正在使用标准sentry.interfaces.Message
和sentry.interfaces.User
接口。
根据异常实例,这两者都将包含不同的数据——因此校验和永远不会匹配。有什么方法可以将这些从校验和计算中排除?(或者至少是User
接口值,因为它必须不同——Message
我可以标准化的接口值。)
[更新4:解决方案]
下面分别介绍和接口的两个get_hash
函数:Message
User
# sentry.interfaces.Message
def get_hash(self):
return [self.message]
# sentry.interfaces.User
def get_hash(self):
return []
看看这两个,只有Message.get_hash
接口会返回一个由get_checksum_for_event
方法获取的值,因此这是将返回的值(散列等)。这样做的最终效果是校验和在消息上进行评估单独 - 这在理论上意味着我可以标准化消息并保持用户定义的唯一性。
我已经在这里回答了我自己的问题,但希望我的调查对遇到同样问题的其他人有用。(顺便说一句,我还提交了针对 Sentry 文档的拉取请求作为其中的一部分 ;-))
(注意任何使用/扩展 Sentry 和自定义接口的人 - 如果你想避免你的接口被用于对异常进行分组,请返回一个空列表。)