Подсистема централизованного сбора и нормализации ошибок многопроцессного парсера

Модуль, который автоматически перехватывает любые ошибки во всех скриптах парсера, превращает их в короткое понятное сообщение и складывает в общую таблицу базы данных.

ОПИСАНИЕ

Единый модуль без внешних зависимостей (кроме драйвера БД), решающий проблему наблюдаемости многопроцессного парсера: десятки скриптов запускаются отдельными процессами, и при сбое причина тонет в общем потоке вывода. Модуль собирает ошибки всех процессов в одну таблицу, приводит их к короткому единообразному виду и подключается одной строкой — без переписывания существующего кода.

Перехват ошибок в рантайме

Перехват построен на двух механизмах рантайма Python. Первый — подмена встроенной функции print: обёртка сохраняет исходный вывод в консоль, но дополнительно анализирует каждое сообщение и, встретив согласованный по проекту маркер ошибки, извлекает и сохраняет её. Это позволило встроить сбор в кодовую базу, где обработка исключений исторически сделана через print с маркером, не трогая сами скрипты. Второй — замена системного обработчика необработанных исключений: любое исключение, дошедшее до верха стека, перехватывается, по трассировке определяется файл-источник, тип и место сбоя, запись сохраняется, после чего управление передаётся штатному обработчику, чтобы поведение интерпретатора не менялось. Установка перехватчиков идемпотентна.

Раннер для дочерних процессов

Чтобы перехват действовал не только в головном процессе, но и во всех дочерних, модуль работает ещё и как раннер: он запускает целевой скрипт уже с установленными перехватчиками, корректно подменяя контекст запуска так, что скрипт исполняется как обычный главный модуль. Диспетчеры всех трёх подсистем парсера запускают свои дочерние скрипты именно через этот раннер, поэтому централизованный сбор покрывает весь многопроцессный конвейер.

Нормализация ошибок

Ядро модуля — нормализация «сырых» ошибок в человекочитаемую форму. Сообщения парсера имеют структуру с разделителями, и модуль разбирает их регулярными выражениями: выделяет файл-источник, тип исключения и место падения в коде (файл, строка, функция). Отдельно проработан случай Selenium и ChromeDriver: из смешанного стека убирается нативная часть драйвера и остаётся только Python-трассировка, а шумное сообщение очищается от служебных хвостов. Для распространённых исключений браузерной автоматизации заведён словарь коротких русских пояснений, поэтому в хранилище попадает понятная формулировка «где произошло: что случилось», а не англоязычный стек. Длина сообщений и стека ограничена: полный текст остаётся в консоли, в базу идёт сжатая сводка.

Хранилище и надёжность

Хранилище — отдельная таблица в той же базе, создаваемая идемпотентно; помимо сообщения и типа она хранит место сбоя, метку времени и флаг отправки уведомления (задел под последующую рассылку). Принципиальное требование — модуль не должен сам становиться источником сбоев: запись в базу полностью гасит собственные исключения, а обёртки защищены от вторичных ошибок. В итоге это прозрачная инфраструктурная прослойка, которая агрегирует ошибки всего конвейера в одном месте и приводит их к виду, пригодному и для быстрого разбора, и для оповещений.

ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ

  • Python 3 (подмена builtins.print
  • системный excepthook
  • runpy
  • traceback
  • регулярные выражения)
  • PostgreSQL
  • psycopg2
  • многопроцессная архитектура (subprocess)
  • единый текстовый протокол логирования с маркерами

РЕЗУЛЬТАТ

  • Реализован централизованный перехват ошибок без правки существующих скриптов: подмена print с сохранением вывода в консоль и переопределение системного обработчика необработанных исключений.
  • Сделан раннер, запускающий любой дочерний скрипт с уже установленными перехватчиками, — сбор покрывает весь многопроцессный конвейер, а не только головной процесс.
  • Построена нормализация ошибок регулярными выражениями: файл-источник, тип исключения и точное место падения в коде.
  • Реализована специальная обработка ошибок Selenium/ChromeDriver: отсечение нативного стека драйвера и очистка служебных хвостов сообщений.
  • Заведён словарь русских пояснений для частых исключений браузерной автоматизации — в хранилище попадает понятная формулировка вместо сырого стека.
  • Спроектирована таблица ошибок с идемпотентным созданием, местом сбоя, меткой времени и флагом под будущие уведомления.
  • Обеспечена отказоустойчивость самого модуля: запись в базу не выбрасывает исключений наружу, перехватчики защищены от вторичных ошибок.
  • Введён единый текстовый протокол диагностики, на который опирается вся кодовая база парсера.

AI АССИСТЕНТ

Задать вопрос по этой работе