Лічильник переглядів, який перетворив наш каталог на 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.
Виправлення — це одна невелика функція, яка повертає порожній рядок, коли частина відсутня. Лічильнику переглядів потрібна була лише назва набору; він ніколи не повинен був ламати сторінку, яку рахував.
Чому жодна з наших перевірок це не помітила
- Вартовий доступності перевіряв лише головні сторінки. З головною сторінкою все було гаразд.
- Етап випуску перевіряв кожен набір, який виходив: його сторінку, перенаправлення на оформлення замовлення, платний шлях від початку до кінця. Він ніколи не відкривав список усіх наборів.
- Аналітика не могла це показати. Код, який мав рахувати відвідувачів каталогу, був тим самим кодом, що й падав. Серверний лог містив відповідь усе це 41 годину: 17 трейсбеків, кожен із яких був запитом від людини або краулера, що отримав помилку замість сторінки.
Що змінилося
- Кожна сторінка, ззовні, щогодини. Невелике завдання читає sitemap і відкриває кожну англомовну сторінку та, по черзі, одну з інших 42 мов через Cloudflare, як звичайний відвідувач. Два невдалі запуски поспіль надсилають електронний лист; відновлення надсилає ще один.
- Етап випуску відкриває кожну англомовну сторінку після перебудови сайту і не завершується, якщо хоча б одна не відповідає кодом 200.
- Індексні сторінки рахуються як сторінки. Сторінки, що перелічують інші сторінки, — це ті, куди відвідувач потрапляє першими, і саме їх ніхто не тестував.
Головний висновок
Побічна робота в обробнику запитів, наприклад підрахунок, логування чи відстеження, ніколи не повинна зривати запит, а перевірка сторінок, що охоплює лише ті, які ви щойно змінили, пропускає ті, що посилаються на них. Вартовий у Night Watch приймає будь-який список сторінок, кожна з яких має містити заданий текст, а не лише головні сторінки.