使用 Python SDK 向 Sentry 错误添加更多详细信息

Add additional details to a Sentry error using Python SDK

在很多情况下,我知道会发生错误并想向 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 执行此操作?

被拒绝的解决方案:

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

如果您需要发送大量数据或者您不知道数据的内容,您正在寻找的功能是哨兵的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 错误中,列在面包屑之后:

小的、可预测的数据:set_tag

如果您的数据很小且可预测(例如 HTTP 状态代码),您可以使用 sentry 的 set_tag. It's best to do this within a push_scope 块,以便仅针对可能出错的代码区域设置标记。请注意,标签键的长度限制为 32 个字符,标签值的大小限制为 200 个字符。

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

例如:

import requests
from sentry_sdk import push_scope

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