使用 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 执行此操作?
被拒绝的解决方案:
- 哨兵的日志记录:这会导致哨兵中出现两个错误(一个用于日志语句,一个用于引发的异常)
capture_expection
:这会导致哨兵出现两个错误(一个是捕获的异常,一个是引发的异常)
- 向异常消息添加额外的详细信息:这会破坏 Sentry 的错误分组,因为每个错误都有一个唯一的名称
大量或不可预测的数据: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()
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在很多情况下,我知道会发生错误并想向 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
如果您需要发送大量数据或者您不知道数据的内容,您正在寻找的功能是哨兵的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()
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^