使用 Python SDK 向 Sentry 错误添加其他详细信息

问题描述 投票:0回答:1

在很多情况下,我知道会发生错误并希望将附加数据传递给 Sentry。 我仍然希望引发异常(因此我的其余代码停止),并且我只希望哨兵中出现一个错误。

例如,假设我正在进行 HTTP 调用,如果 HTTP 调用失败,我想要一个错误,其中包括发送到 Sentry 的响应文本:

import requests

resp = requests.post(url, json=payload)
if resp.ok:
    return resp.json()
try:
    text = resp.json()
except json.JSONDecodeError:
    text = resp.text
# TODO: add `text` to Sentry error
resp.raise_for_status()

如何使用 Sentry Python SDK 执行此操作?

被拒绝的解决方案:

  • Sentry 的日志记录:这会导致 Sentry 中出现两个错误(一个用于日志语句,一个用于引发的异常)
  • capture_expection
    :这会导致哨兵中出现两个错误(一个用于捕获的异常,一个用于引发的异常)
  • 向异常消息添加额外的详细信息:这会破坏 Sentry 的错误分组,因为每个错误都有唯一的名称
python sentry
1个回答
5
投票

大量或不可预测的数据:set_context

如果您需要发送大量数据或者您不知道数据的内容,那么您正在寻找的功能是Sentry的

set_context
。 您希望在引发异常之前调用此函数。 请注意,上下文对象的大小限制为 8kb。

注意:你应该只在肯定会引发异常的情况下调用

set_context
,否则你设置的额外信息可能会添加到Sentry中的其他(不相关)错误中。

例如:

import requests
import sentry_sdk

resp = requests.post(url, json=payload)
if resp.ok:
    return resp.json()
try:
    text = resp.json()
except json.JSONDecodeError:
    text = resp.text
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
sentry_sdk.set_context("Payload", {"text": text})
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
resp.raise_for_status()

这会将其作为附加数据附加到您的 Sentry 错误中,在面包屑后面列出:

Sentry Screenshot

小、可预测的数据:set_tag

如果您的数据较小且可预测(例如HTTP状态代码),您可以使用sentry的

set_tag
。 最好在
new_scope
块内执行此操作,以便为可能出错的代码区域设置标记。 请注意,标签键的长度限制为 32 个字符,标签值的大小限制为 200 个字符。

标签显示在哨兵错误视图的顶部。

例如:

import requests
from sentry_sdk import new_scope

resp = requests.post(url, json=payload)
if resp.ok:
    return resp.json()
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
with new_scope() as scope:
    sentry_sdk.set_tag("status", resp.status_code)
    resp.raise_for_status()
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

注意:在 Sentry SDK 版本 1.* 中,使用

push_scope
而不是
new_scope

© www.soinside.com 2019 - 2024. All rights reserved.