在很多情况下,我知道会发生错误并希望将附加数据传递给 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 执行此操作?
被拒绝的解决方案:
capture_expection
:这会导致哨兵中出现两个错误(一个用于捕获的异常,一个用于引发的异常)如果您需要发送大量数据或者您不知道数据的内容,那么您正在寻找的功能是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 错误中,在面包屑后面列出:
如果您的数据较小且可预测(例如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
。