Починили историю пингов heartbeat-мониторов
Короткая честная заметка об исправленном баге.
Что было сломано
В карточке heartbeat-монитора блок «Приходы пингов» показывал «Не удалось загрузить историю пингов» — запрос истории стабильно завершался ошибкой 500. Сам мониторинг при этом работал корректно: пинги принимались, счётчики и статусы pending / up / down обновлялись. Не работала только выдача журнала.
Почему
Классическая ошибка на стыке двух слоёв. IP-адрес источника пинга хранится в PostgreSQL в колонке типа INET, и драйвер базы данных возвращает такое значение не строкой, а специализированным Python-объектом. Схема ответа API ждала строку, объект не проходил валидацию — и запрос падал. Поскольку IP записывается в каждый пинг без исключений, ломалась любая страница журнала у любого монитора.
Что починили
Теперь драйвер настроен возвращать сетевые типы строками во всём приложении — исправление закрывает и сам журнал, и пару соседних мест с тем же паттерном, которые ещё не успели выстрелить. Поведение закреплено регрессионными тестами на реальной базе, чтобы этот класс ошибок больше не проскочил мимо CI.
Главное: данные целы
Приём пингов не зависел от сломанного чтения — вся история сохранялась всё это время. После обновления журнал показывает накопленные пинги задним числом: сигналы start / success / fail, длительность задач, IP источника и поле message из тела пинга — то самое, которое до сих пор негде было посмотреть.
Спасибо пользователю, приславшему детальный баг-репорт с request_id и шагами воспроизведения — с таким описанием диагностика заняла минуты. Если замечаете странности — пишите через виджет обратной связи, это работает.