Sentry如何汇总错误?

Hug*_*own 24 django sentry

我正在使用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'),)
    ...
Run Code Online (Sandbox Code Playgroud)

这是有道理的 - 项目,记录器和罪魁祸首我现在正在设置 - 问题是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()
Run Code Online (Sandbox Code Playgroud)

下一站 - 活动interfaces来自哪里?

[更新3:事件接口]

我已经知道接口是指用于描述传递到哨兵事件的数据的标准机制,并且我正在使用标准sentry.interfaces.Messagesentry.interfaces.User接口.

根据异常实例,这两个数据都将包含不同的数据 - 因此校验和永远不会匹配.有什么方法可以从校验和计算中排除这些吗?(或者至少是User接口值,因为它必须是不同的 - Message我可以标准化的接口值.)

[更新4:解决方案]

以下是和接口的两个get_hash函数:MessageUser

# sentry.interfaces.Message
def get_hash(self):
    return [self.message]

# sentry.interfaces.User
def get_hash(self):
    return []
Run Code Online (Sandbox Code Playgroud)

看看这两个,只有Message.get_hash接口会返回一个由get_checksum_for_event方法获取的值,因此这将是返回的值(散列等).这样做的结果是在消息上评估校验和单独 - 这在理论上意味着我可以标准化消息并保持用户定义的独特性.

我在这里已经回答了我自己的问题,但希望我的调查能够用于遇到同样问题的其他人.(顺便说一下,我还提交了针对Sentry文档的拉取请求,作为其中的一部分;-))

(注意任何使用/扩展Sentry和自定义接口的人 - 如果你想避免使用你的接口来分组异常,请返回一个空列表.)

Hug*_*own 17

请参阅问题本身的最终更新.事件聚合在"项目","记录器","罪魁祸首"和"校验和"属性的组合上.前三个相对容易控制 - 第四个,'校验和'是作为事件一部分发送的数据类型的函数.

Sentry使用'interfaces'的概念来控制传入的数据结构,每个接口都带有一个实现get_hash,用于返回传入数据的哈希值.Sentry带有许多标准接口('消息','用户','HTTP','Stacktrace','查询','例外'),这些都有自己的实现get_hash.默认值(继承自Interface基类)是一个空列表,不会影响校验和.

在没有任何有效接口的情况下,事件消息本身被散列并作为校验和返回,这意味着消息对于要分组的事件必须是唯一的.

  • @ HugoRodger-Brown @akaihola我相信`sentry.interfaces.Message`接口具有属性`message`和`params`,并且消息是预格式化的.有关详细信息,请参阅[此处](http://sentry.readthedocs.org/en/latest/developer/interfaces/index.html#sentry.interfaces.Message) (2认同)