Räknaren som förvandlade vår produktkatalog till ett 502-fel
Leverans
Sidan som listar alla verktygspaket vi säljer svarade varje besökare med ett 502 Bad Gateway i cirka 41 timmar efter lanseringen. Varje verktygspakets egen sida fungerade, startsidan fungerade, kassan fungerade. Det trasiga var några rader som räknade sidvisningar.
Buggen
Vår butiks server räknar besök på sidor för verktygspaket. För att ta reda på vilket verktygspaket en förfrågan gäller, tog den den andra delen av sökvägen:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
För /kits/studio/ är det studio. För själva katalogen, /kits/, har sökvägen två snedstreck, så säkerhetskontrollen släppte igenom den, men efter att snedstrecken tagits bort finns bara en del kvar, och [1] gav ett IndexError. Hanteraren är Pythons standard http.server: ett undantag i do_GET stänger anslutningen utan svar, och Cloudflare visade besökaren ett 502.
Fixen är en liten funktion som returnerar en tom sträng när delen saknas. Räknaren behövde bara verktygspakets namn; den behövde aldrig kunna krossa sidan den räknade på.
Varför inga av våra kontroller upptäckte det
- Bevakningsprocessen öppnade bara startsidor. Startsidan var okej.
- Utgivningssteget kontrollerade varje verktygspaket det levererade: dess sida, dess omdirigering till kassan, den betalda vägen från början till slut. Det öppnade aldrig listan över alla verktygspaket.
- Analysen kunde inte visa det. Koden som skulle ha räknat katalogens besökare var koden som kraschade. Serverloggen hade svaret hela tiden: 17 spårningar under de 41 timmarna, var och en en förfrågan, från en person eller en crawler, som fick ett fel istället för sidan.
Vad som ändrats
- Varje sida, utifrån, varje timme. Ett litet jobb läser sitemapen och öppnar varje engelskspråkig sida och, i tur och ordning, en av de andra 42 språken, genom Cloudflare som en besökare. Två misslyckade körningar i rad skickar ett e-postmeddelande; återhämtning skickar ett till.
- Utgivningssteget öppnar varje engelskspråkig sida efter att det byggt om webbplatsen, och vägrar slutföra om någon inte svarar med 200.
- Indexsidor räknas som sidor. Sidorna som listar andra sidor är de en besökare når först, och det var de som ingen testade.
Slutsatsen
Sidorbete i en request handler, som att räkna, logga eller spåra, får aldrig kunna få en förfrågan att misslyckas, och en sidokontroll som bara täcker de sidor du just ändrat missar de som länkar till dem. Bevakningen i Night Watch tar valfri lista med sidor, varje sida med text som den måste innehålla, inte bara startsidor.