我正在使用 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
。我会进一步调查,然而'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]
我已经弄清楚了interfaces是指用于描述传递到Sentry事件中的数据的标准机制,并且我正在使用标准的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 自定义接口并且想避免将您的接口用于分组异常,请返回空列表。)