Счётчик просмотров, превративший наш каталог в 502

Доставка

Страница со списком всех наборов, которые мы продаём, отвечала каждому посетителю ошибкой 502 Bad Gateway примерно 41 час после запуска. Страницы отдельных наборов работали, главная страница работала, оформление заказа работало. Сломанной оказалась пара строк, считавших просмотры страниц.

Баг

Сервер нашего магазина считает посещения страниц наборов. Чтобы определить, к какому набору относится запрос, он брал вторую часть пути:

self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")

Для /kits/studio/ это studio. Для самого каталога, /kits/, в пути два слеша, поэтому защитный механизм пропустил запрос, но после удаления слешей остаётся только одна часть, и [1] вызывал IndexError. Обработчик — стандартный http.server из Python: исключение в do_GET закрывает соединение без ответа, и Cloudflare показывал посетителю 502.

Исправление — одна небольшая функция, возвращающая пустую строку, если часть отсутствует. Счётчику просмотров нужно было только имя набора; ему никогда не нужно было ломать страницу, которую он считал.

Почему ни одна из наших проверок это не заметила

Что изменилось

Главный вывод

Побочные задачи в обработчике запросов, такие как подсчёт, логирование или отслеживание, никогда не должны приводить к сбою запроса, а проверка страниц, охватывающая только изменённые страницы, упускает те, что ссылаются на них. Watchdog в Night Watch принимает любой список страниц, каждая из которых должна содержать заданный текст, а не только главные страницы.

Обновлено: