Počítadlo zobrazení, ktoré z nášho katalógu urobilo chybu 502
Doručenie
Stránka, ktorá zobrazuje všetky balíky, ktoré predávame, odpovedala každému návštevníkovi chybovým hlásením 502 Bad Gateway približne 41 hodín po spustení. Vlastné stránky jednotlivých balíkov fungovali, domovská stránka fungovala, pokladňa fungovala. Pokazená bola len časť s niekoľkými riadkami, ktoré počítali zobrazenia stránok.
Chyba
Server nášho obchodu počíta návštevy stránok balíkov. Aby zistil, o ktorý balík ide, bral druhú časť cesty:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Pre /kits/studio/ je to studio. Pre samotný katalóg, /kits/, má cesta dve lomítka, takže bezpečnostná poistka ju pustila ďalej, ale po odstránení lomítok zostane len jedna časť a [1] vyvolalo IndexError. Obsluha je štandardný http.server v Pythone: výnimka v do_GET uzavrie spojenie bez odpovede a Cloudflare zobrazil návštevníkovi chybu 502.
Oprava spočíva v jednej malej funkcii, ktorá vráti prázdny reťazec, ak časť chýba. Počítadlo zobrazení potrebovalo iba názov balíka; nikdy nepotrebovalo, aby dokázalo rozhodiť stránku, ktorú počítalo.
Prečo to žiadna z našich kontrol nezachytila
- Dohľad nad dostupnosťou kontroloval iba domovské stránky. Domovská stránka bola v poriadku.
- Krok vydania kontroloval každý balík, ktorý vydal: jeho stránku, presmerovanie na pokladňu a platenú cestu od začiatku do konca. Nikdy neotvoril zoznam všetkých balíkov.
- Analytika to nedokázala ukázať. Kód, ktorý mal počítať návštevníkov katalógu, bol ten, ktorý zlyhal. Odpoveď bola celú dobu v serverovom logu: 17 výpisov zásobníka počas tých 41 hodín, každý z nich bol požiadavkou od človeka alebo robota, ktorá dostala chybu namiesto stránky.
Čo sa zmenilo
- Každá stránka, zvonku, každú hodinu. Malá úloha číta sitemapu a otvára každú anglickú stránku a následne jeden z ďalších 42 jazykov cez Cloudflare ako návštevník. Dva neúspešné behy po sebe pošlú e-mail; obnova pošle ďalší.
- Krok vydania otvorí každú anglickú stránku po opätovnom zostavení webu a odmietne dokončiť proces, ak jedna neodpovie kódom 200.
- Indexové stránky sa počítajú ako stránky. Stránky, ktoré zobrazujú iné stránky, sú tie, ktoré návštevník navštívi ako prvé, a práve tie nikto netestoval.
Zhrnutie
Vedľajšie úlohy v obsluhe požiadavky, ako je počítanie, logovanie alebo sledovanie, nesmú nikdy spôsobiť zlyhanie požiadavky a kontrola stránok, ktorá pokrýva iba stránky, ktoré ste práve zmenili, prehliada tie, ktoré na ne odkazujú. Dozorca v Night Watch prijíma ľubovoľný zoznam stránok, z ktorých každá musí obsahovať určený text, nielen domovské stránky.