Счётчик просмотров, превративший наш каталог в 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.
Исправление — одна небольшая функция, возвращающая пустую строку, если часть отсутствует. Счётчику просмотров нужно было только имя набора; ему никогда не нужно было ломать страницу, которую он считал.
Почему ни одна из наших проверок это не заметила
- Мониторинг доступности открывал только главные страницы. Главная страница была в порядке.
- Этап релиза проверял каждый выпущенный набор: его страницу, его редирект на оформление заказа, платный путь от начала до конца. Он никогда не открывал список всех наборов.
- Аналитика не могла это показать. Код, который должен был считать посетителей каталога, был тем самым кодом, который падал. В логе сервера был ответ всё это время: 17 трассировок за эти 41 час, каждая из которых — запрос от человека или краулера, получивший ошибку вместо страницы.
Что изменилось
- Каждая страница, снаружи, каждый час. Небольшая задача читает карту сайта и открывает каждую страницу на английском, а затем по очереди одну из 42 других языков, через Cloudflare, как обычный посетитель. Два неудачных запуска подряд отправляют письмо; восстановление отправляет другое.
- Этап релиза открывает каждую страницу на английском после пересборки сайта и не завершается, если одна из них не отвечает 200.
- Индексные страницы считаются страницами. Страницы, на которых перечислены другие страницы, — это те, куда посетитель попадает первым, и именно их никто не тестировал.
Главный вывод
Побочные задачи в обработчике запросов, такие как подсчёт, логирование или отслеживание, никогда не должны приводить к сбою запроса, а проверка страниц, охватывающая только изменённые страницы, упускает те, что ссылаются на них. Watchdog в Night Watch принимает любой список страниц, каждая из которых должна содержать заданный текст, а не только главные страницы.