#python #sentry
Вопрос:
Есть много ситуаций, когда я знаю, что произойдет ошибка, и хочу передать дополнительные данные Sentry. Я все еще хочу, чтобы возникло исключение (поэтому остальная часть моего кода останавливается), и мне нужна только одна ошибка в 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?
Отвергнутые решения:
- Ведение журнала Sentry: это приводит к двум ошибкам в sentry (одна для оператора журнала и одна для вызванного исключения).
capture_expection
: это приводит к двум ошибкам в sentry (одна для захваченного исключения и одна для вызванного исключения).- Добавление дополнительных сведений в сообщение об исключении: это нарушает группировку ошибок Sentry, поскольку каждая ошибка имеет уникальное имя
Ответ №1:
Функция, которую вы ищете, — это функция Sentry set_context
. Вы хотите вызвать эту функцию прямо перед тем, как возникнет ваше исключение.
Примечание: вы должны звонить только 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, указанной сразу после панировочных сухарей: