如何使用哨兵捕获易于序列化的异常事件?

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())