Как перехватить легко сериализуемое исключение с помощью Sentry? - PullRequest
0 голосов
/ 22 марта 2020

Я использую Sentry для мониторинга рабочего процесса Python, который работает с некоторыми ограничениями. Например, он не может открывать файлы или подключаться к inte rnet. По этой причине я не могу использовать sentry_sdk.capture_exception напрямую.

Что я могу сделать, это поместить объект в multiprocessing.Queue, чтобы отправить его родительскому процессу, который может общаться с сервером Sentry. Поэтому я попытался сделать что-то вроде этого:

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 объекты ( локальные переменные), которые не могут быть выбраны, поэтому поместить их в очередь не удается.

Есть ли способ получить событие, когда данные уже были извлечены, и его можно легко сериализовать, например, как JSON?

Я также спрашивал об этом здесь: https://github.com/getsentry/sentry-python/issues/654

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

На основании ответа Маркуса, без изменения глобального состояния:

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())
0 голосов
/ 24 марта 2020

Для этого вы должны использовать транспорты:

import sentry_sdk

def transport(event):
    quuee.put(event)

sentry_sdk.init(transport=transport)

Тогда вы можете использовать capture_event и все остальные как обычно.

...