如何使用哨兵捕获易于序列化的异常事件?
How to capture an easily serialisable exception event with Sentry?
我正在使用 Sentry 监视 Python 工作进程,该进程 运行 受某些限制。例如,它无法打开文件或连接到互联网。因此我不能直接使用 sentry_sdk.capture_exception
。
我能做的是将对象放在 multiprocessing.Queue
上,将其发送到可以与哨兵服务器对话的父进程。所以我尝试做这样的事情:
from sentry_sdk.utils import event_from_exception
try:
# failing code
except Exception:
exc_info = sys.exc_info()
sentry_event = event_from_exception(exc_info)
queue.put(sentry_event)
然后在父进程中sentry_sdk.capture_event(sentry_event)
.
然而,事实证明 sentry_event
仍然包含一些原始的 Python 对象(局部变量),这些对象无法被 pickle,因此将其放入队列失败。
有没有办法获得一个事件,其中数据已经被提取并且可以很容易地序列化,例如作为 JSON?
我也在这里问过这个问题:https://github.com/getsentry/sentry-python/issues/654
你应该为此使用传输:
import sentry_sdk
def transport(event):
quuee.put(event)
sentry_sdk.init(transport=transport)
然后你就可以正常使用capture_event
和其他的了。
基于 Markus 的回答,不修改全局状态:
import sentry_sdk
def get_exception_event():
event = None
def transport(e):
nonlocal event
event = e
client = sentry_sdk.Client(transport=transport)
hub = sentry_sdk.Hub(client)
hub.capture_exception()
assert event is not None
return event
try:
1 / 0
except Exception:
print(get_exception_event())
我正在使用 Sentry 监视 Python 工作进程,该进程 运行 受某些限制。例如,它无法打开文件或连接到互联网。因此我不能直接使用 sentry_sdk.capture_exception
。
我能做的是将对象放在 multiprocessing.Queue
上,将其发送到可以与哨兵服务器对话的父进程。所以我尝试做这样的事情:
from sentry_sdk.utils import event_from_exception
try:
# failing code
except Exception:
exc_info = sys.exc_info()
sentry_event = event_from_exception(exc_info)
queue.put(sentry_event)
然后在父进程中sentry_sdk.capture_event(sentry_event)
.
然而,事实证明 sentry_event
仍然包含一些原始的 Python 对象(局部变量),这些对象无法被 pickle,因此将其放入队列失败。
有没有办法获得一个事件,其中数据已经被提取并且可以很容易地序列化,例如作为 JSON?
我也在这里问过这个问题:https://github.com/getsentry/sentry-python/issues/654
你应该为此使用传输:
import sentry_sdk
def transport(event):
quuee.put(event)
sentry_sdk.init(transport=transport)
然后你就可以正常使用capture_event
和其他的了。
基于 Markus 的回答,不修改全局状态:
import sentry_sdk
def get_exception_event():
event = None
def transport(e):
nonlocal event
event = e
client = sentry_sdk.Client(transport=transport)
hub = sentry_sdk.Hub(client)
hub.capture_exception()
assert event is not None
return event
try:
1 / 0
except Exception:
print(get_exception_event())