Visittelleren som gjorde produktkatalogen vår om til en 502
Levering
Siden som viser alle kitene vi selger, svarte hver besøkende med en 502 Bad Gateway i omtrent 41 timer etter lansering. Hver kites egen side fungerte, forsiden fungerte, kassen fungerte. Det som var ødelagt, var noen få linjer som telte sidevisninger.
Feilen
Serveren i butikken vår teller besøk på kitesider. For å finne ut hvilken kit en forespørsel gjelder, tok den den andre delen av stien:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
For /kits/studio/ er det studio. For selve katalogen, /kits/, har stien to skråstreker, så sikringen slapp den gjennom, men etter å ha fjernet skråstrekene er det bare én del igjen, og [1] utløste en IndexError. Håndtereren er Pythons standard http.server: en unntak i do_GET lukker tilkoblingen uten svar, og Cloudflare viste besøkende en 502.
Fiksen er én liten funksjon som returnerer en tom streng når delen mangler. Visittellingen trengte bare navnet på kitet; den trengte aldri å kunne ødelegge siden den telte på.
Hvorfor ingen av sjekkene våre oppdaget det
- Oppetidsovervåkeren åpnet bare forsider. Forsiden var i orden.
- Utgivelsessteget sjekket hvert kit det sendte ut: siden, omdirigeringen til kassen og den betalte løpet fra start til slutt. Den åpnet aldri listen over alle kitene.
- Analysene kunne ikke vise det. Koden som skulle ha telt katalogens besøkende, var koden som krasjet. Serverloggen hadde svaret hele tiden: 17 tracebacks i løpet av de 41 timene, hver av dem en forespørsel, fra en person eller en crawler, som fikk en feil i stedet for siden.
Hva endret seg
- Hver side, utenfra, hver time. En liten jobb leser sitemapet og åpner hver engelskspråklige side og, etter tur, én av de andre 42 språkene, gjennom Cloudflare som en besøkende. To feilede kjøringer på rad sender en e-post; gjenoppretting sender en ny.
- Utgivelsessteget åpner hver engelskspråklige side etter at det har bygget nettstedet på nytt, og nekter å fullføre hvis én ikke svarer med 200.
- Indekssider teller som sider. Sidene som viser andre sider, er de en besøkende møter først, og det var disse ingen testet.
Konklusjonen
Biarbeid i en forespørselshåndterer, som telling, logging eller sporing, må aldri kunne feile forespørselen, og en sidesjekk som bare dekker sidene du nettopp endret, går glipp av de som lenker til dem. Overvåkeren i Night Watch tar imot en hvilken som helst liste over sider, hver med tekst den må inneholde, ikke bare startsider.