Licznik wyświetleń, który zamienił nasz katalog w błąd 502
Wysyłka
Strona z listą wszystkich zestawów, które sprzedajemy, odpowiadała każdemu odwiedzającemu błędem 502 Bad Gateway przez około 41 godzin po starcie. Strony poszczególnych zestawów działały, strona główna działała, płatności działały. Uszkodzone były tylko kilka linii kodu liczących wyświetlenia stron.
Błąd
Serwer naszego sklepu liczy wizyty na stronach zestawów. Aby ustalić, którego zestawu dotyczy żądanie, pobierał drugą część ścieżki:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Dla /kits/studio/ jest to studio. Dla samego katalogu, /kits/, ścieżka zawiera dwa ukośniki, więc zabezpieczenie ją przepuściło, ale po usunięciu ukośników pozostaje tylko jedna część, a [1] zgłaszało wyjątek IndexError. Obsługą zajmuje się standardowy moduł Pythona http.server: wyjątek w do_GET zamyka połączenie bez odpowiedzi, a Cloudflare wyświetlał odwiedzającemu błąd 502.
Poprawka to jedna mała funkcja, która zwraca pusty ciąg znaków, gdy brakuje tej części. Licznik wyświetleń potrzebował tylko nazwy zestawu; nigdy nie powinien był powodować awarii strony, którą liczył.
Dlaczego żadna z naszych kontroli tego nie wykryła
- Monitor dostępności sprawdzał tylko strony główne. Strona główna działała poprawnie.
- Etap wydania sprawdzał każdy wysyłany zestaw: jego stronę, przekierowanie do płatności, całą ścieżkę płatności od początku do końca. Nigdy nie otwierał listy wszystkich zestawów.
- Analityka nie mogła tego pokazać. Kod, który miał liczyć odwiedzających katalog, był tym samym kodem, który się wywalał. Log serwera zawierał odpowiedź przez cały czas: 17 tracebacks w ciągu tych 41 godzin, każdy z nich to żądanie, od osoby lub robota indeksującego, które zamiast strony otrzymało błąd.
Co się zmieniło
- Każda strona, z zewnątrz, co godzinę. Małe zadanie czyta mapę witryny i otwiera każdą stronę w języku angielskim oraz, naprzemiennie, jedną z pozostałych 42 wersji językowych, przez Cloudflare jak zwykły odwiedzający. Dwie nieudane próby z rzędu wysyłają e-mail; powrót do działania wysyła kolejny.
- Etap wydania otwiera każdą stronę w języku angielskim po przebudowie witryny i nie kończy pracy, jeśli któraś nie zwróci statusu 200.
- Strony indeksowe liczą się jako strony. Strony wyświetlające listy innych stron to te, na które odwiedzający trafiają najpierw, i to właśnie one były niestety nietestowane.
Wniosek
Praca poboczna w obsłudze żądania, taka jak zliczanie, logowanie czy śledzenie, nigdy nie powinna powodować błędu żądania, a kontrola stron obejmująca tylko te właśnie zmienione pomija te, które do nich linkują. Watchdog w Night Watch przyjmuje dowolną listę stron, z których każda musi zawierać określony tekst, a nie tylko strony główne.