gpt4 book ai didi

django - Sentry 如何汇总错误?

转载 作者:行者123 更新时间:2023-12-03 11:01:55 25 4
gpt4 key购买 nike

我正在使用 Sentry(在 django 项目中),我想知道如何正确聚合错误。我将某些用户操作记录为错误,因此没有底层系统异常,并且正在使用 culprit属性来设置一个友好的错误名称。该消息是模板化的,并且包含一条公共(public)消息(“用户 '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:事件接口(interface)]

我已经计算出 interfaces请参阅描述传递给 Sentry 事件的数据的标准机制,我使用的是标准 sentry.interfaces.Messagesentry.interfaces.User接口(interface)。

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

[更新4:解决方案]

这是两个 get_hash Message 的函数和 User分别为接口(interface):
# sentry.interfaces.Message
def get_hash(self):
return [self.message]

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

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

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

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

最佳答案

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

Sentry 使用“接口(interface)”的概念来控制传入数据的结构,每个接口(interface)都带有 get_hash 的实现,用于返回传入数据的哈希值。 Sentry 带有许多标准接口(interface)('Message'、'User'、'HTTP'、'Stacktrace'、'Query'、'Exception'),以及这些都有自己的 get_hash 的实现.默认值(继承自 Interface 基类)是一个空列表,不会影响校验和。

在没有任何有效接口(interface)的情况下,事件消息本身被散列并作为校验和返回,这意味着消息需要唯一才能对事件进行分组。

关于django - Sentry 如何汇总错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com