Отключение sys.settrace необходимо или нет
Бэкенд REST-сервис, с которым я работаю, написан на python/django, и иногда сервер падает из-за одного запроса, не сообщая об исключении, т.е. я даже не могу знать, на какой строке он был в последний раз. В приложении нет никаких функций входа/выхода из журнала, которые можно было бы включить в конфигурации окружения, поэтому я придумал альтернативу - включить sys.settrace
на основе пользовательского заголовка запроса. Итак, я написал что-то вроде этого в одном из промежуточных модулей запроса:
def debug_tracer(frame, event, arg = None):
code = frame.f_code
func_name = code.co_name
line_no = frame.f_lineno
print(f"A {event} encountered in \
{func_name}() at line number {line_no} ")
return debug_tracer
if.requests.headers.get("HTTP_TRACEBACK"):
sys.settrace(debug_tracer)
Для развертывания одного сервера это выглядит следующим образом:
Запрос при t=1 без заголовка traceback -> Обычные журналы запросов-ответов
Запрос на t=2 с заголовком traceback -> Каждая строка выполнения попадает в журналы вместе с журналами запросов-ответов
Запрос на t=3 без заголовка traceback -> Обычные журналы запросов-ответов
Сейчас это работает нормально, т.е. каждый раз, когда я передаю заголовок с ключом traceback, логи для этого конкретного запроса содержат детали вызовов/возвратов/строк. Но я не могу понять, что без выполнения sys.settrace(None)
, т.е. активного отключения предыдущей функции debug_tracer
для sys.settrace
; она все еще работает как ожидалось и не влияет на другие последующие http запросы. Мой вопрос заключается в том, почему это не заставляет другие запросы также следовать той же самой конфигурации sys.settrace
?