【发布时间】:2012-10-31 04:24:30
【问题描述】:
我正在使用 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:事件接口]
我发现interfaces 指的是描述传递给哨兵事件的数据的标准机制,并且我正在使用标准的sentry.interfaces.Message 和sentry.interfaces.User 接口。
根据异常实例,这两者都将包含不同的数据 - 因此校验和永远不会匹配。有什么方法可以将这些从校验和计算中排除? (或者至少是 User 接口值,因为它必须不同 - 我可以标准化的 Message 接口值。)
[更新 4:解决方案]
以下是Message 和User 接口的两个get_hash 函数:
# 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 和自定义接口的人请注意 - 如果您想避免您的接口被用于对异常进行分组,请返回一个空列表。)
【问题讨论】:
-
警告!覆盖 get_hash 可能是矫枉过正。
Sentry will intelligently group messages if you use proper string formatting.所以你的情况可能只是为了正确格式化错误docs.getsentry.com/hosted/clients/python/integrations/logging