Počítadlo zobrazení, které proměnilo náš katalog v chybu 502
Doručení
Stránka, která vypisuje všechny balíčky, které prodáváme, odpovídala každému návštěvníkovi chybou 502 Bad Gateway přibližně 41 hodin po spuštění. Vlastní stránka každého balíčku fungovala, úvodní stránka fungovala, pokladna fungovala. Pokažená byla jen pár řádků, které počítaly zobrazení stránek.
Chyba
Server našeho obchodu počítá návštěvy stránek balíčků. Aby zjistil, o který balíček jde, bral druhou část cesty:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Pro /kits/studio/ je to studio. U samotného katalogu, /kits/, má cesta dvě lomítka, takže ochranný mechanismus ji pustil dál, ale po odstranění lomítek zbývá jen jedna část a [1] vyvolalo IndexError. Obsluha je standardní http.server v Pythonu: výjimka v do_GET zavře spojení bez odpovědi a Cloudflare návštěvníkovi zobrazil 502.
Oprava spočívá v jedné malé funkci, která vrátí prázdný řetězec, když část chybí. Počítadlo zobrazení potřebovalo vždy jen název balíčku; nikdy nepotřebovalo rozbít stránku, kterou právě počítalo.
Proč to žádná z našich kontrol nezachytila
- Hlídač dostupnosti otevíral jen úvodní stránky. Úvodní stránka byla v pořádku.
- Krok vydání kontroloval každý balíček, který vydal: jeho stránku, přesměrování na pokladnu a placenou cestu od začátku do konce. Nikdy neotevřel seznam všech balíčků.
- Analytika to nemohla ukázat. Kód, který měl počítat návštěvníky katalogu, byl ten, který spadl. Serverový log měl odpověď celou dobu: 17 výpisů zásobníku v těch 41 hodinách, každý z nich byl požadavek od člověka nebo robota, který dostal chybu místo stránky.
Co se změnilo
- Každá stránka, zvenčí, každou hodinu. Malá úloha čte sitemapu a otevírá každou anglickou stránku a postupně jednu z dalších 42 jazyků přes Cloudflare jako návštěvník. Dva neúspěšné běhy za sebou pošlou e-mail; obnovení pošle další.
- Krok vydání otevírá každou anglickou stránku poté, co znovu sestaví web, a nedovolí dokončení, pokud jedna neodpoví 200.
- Seznamové stránky se počítají jako stránky. Stránky, které vypisují jiné stránky, jsou ty, na které se návštěvník dostane jako první, a právě ty nikdo netestoval.
Shrnutí
Vedlejší práce v obsluze požadavku, jako je počítání, logování nebo sledování, nikdy nesmí způsobit selhání požadavku a kontrola stránek, která pokrývá jen právě změněné stránky, přehlédne ty, které na ně odkazují. Hlídač v Night Watch přijímá libovolný seznam stránek, z nichž každá musí obsahovat zadaný text, nejen hlavní stránky.