Sentry 不断返回不存在的事件 ID

Sentry keeps returning nonexistent incident id's

我们有一个 django 项目。我们使用 Sentry 收集有关 HTTP 500 错误的信息。

Sentry 可以选择将事件信息添加到请求 header,因此您可以在您的应用中处理它。

所以,我们有一个 tastypie 的 mixin,看起来像这样:

class Sentry500Mixin(object):
def _handle_500(self, request, exception):

    if not isinstance(exception, TastypieError) and not settings.DEBUG:
        sentry_exception_handler(request=request)
        data = {
            'error_message': 'Sorry, this request could not be processed.',
            'incident': getattr(request, 'sentry', None)
        }
        return self.error_response(request, data, response_class=HttpApplicationError)

    else:
        return super(Sentry500Mixin, self)._handle_500(request, exception)

当发生 500 错误时,我们会得到这样的响应:

 {"error_message": "Sorry, this request could not be processed.", 
"incident": {"id": "3459b30f87ea4116a0a2855be576bbb3", "project_id": "5"}}

问题是,如果你带着这个事件id去哨兵,很有可能不会有这个id的事件。没有一件事看起来像这件事。我确信我检查的是正确的项目,如果没有创建事件,从逻辑上讲,Sentry 无法 return 给你一个 ID,但它确实做到了。

非常感谢任何帮助和想法。谢谢

正如@erik-e 在评论中解释的那样,event_id 是在客户端生成的。

UDP 协议没有保证。

您使用的是 UDP 协议吗?如果是,则 event_id 不一定映射到 Sentry 中的实际事件。 router/switch/network 设备可能丢失了您的数据包。使用 UDP 无法保证 w.r.t 交付、排序或重复数据包。

我假设 HTTP/HTTPS 哨兵协议已经结束 TCP

解决方案:

  • 仔细检查防火墙规则,
  • 尝试其他协议并确保它不是哨兵服务器的问题。

那为什么要用UDP呢?

一些普遍提出的原因:

  • 没有握手=更快,
  • 无连接 = 如果连接中断也没有问题(例如,重新启动哨兵服务器)。