De paginateller die onze catalogus in een 502 veranderde
Verzending
De pagina met een overzicht van alle kits die we verkopen, antwoordde ongeveer 41 uur na de lancering elke bezoeker met een 502 Bad Gateway. De pagina van elke kit werkte, de startpagina werkte, de checkout werkte. Het defecte onderdeel was een paar regels code die paginaweergaven telden.
De bug
De server van onze winkel telt bezoeken aan kit-pagina's. Om te bepalen voor welke kit een aanvraag is, nam het het tweede deel van het pad:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Voor /kits/studio/ is dat studio. Voor de catalogus zelf, /kits/, bevat het pad twee slashes, dus de bewaker liet het door, maar na het verwijderen van de slashes is er slechts één deel over, en [1] veroorzaakte een IndexError. De handler is de standaard http.server van Python: een uitzondering in do_GET sluit de verbinding zonder antwoord, en Cloudflare toonde de bezoeker een 502.
De oplossing is één kleine functie die een lege string teruggeeft als het deel ontbreekt. De paginateller had alleen de naam van de kit nodig; hij hoefde nooit de pagina die hij telde te laten crashen.
Waarom geen van onze controles het zag
- De uptime-watch opende alleen startpagina's. De startpagina was in orde.
- De release-stap controleerde elke kit die hij uitbracht: zijn pagina, zijn checkout-redirect, het betaalde pad end-to-end. Hij opende nooit het overzicht van alle kits.
- De analytics konden het niet laten zien. De code die de bezoekers van de catalogus had moeten tellen, was de code die crashte. Het serverlog had het antwoord al die tijd: 17 tracebacks in die 41 uur, elk een aanvraag, van een persoon of een crawler, die een fout kreeg in plaats van de pagina.
Wat is er veranderd
- Elke pagina, van buitenaf, elk uur. Een kleine taak leest de sitemap en opent elke Engelse pagina en, om beurt, een van de andere 42 talen, via Cloudflare als een bezoeker. Twee mislukte runs op rij sturen een e-mail; herstel stuurt er nog een.
- De release-stap opent elke Engelse pagina nadat hij de site opnieuw heeft gebouwd, en weigert te voltooien als er een niet met 200 antwoordt.
- Indexpagina's tellen als pagina's. De pagina's die andere pagina's opsommen, zijn de eerste die een bezoeker bereikt, en dat waren de pagina's die niemand had getest.
De conclusie
Zijtaken in een request handler, zoals tellen, loggen of bijhouden, mogen nooit een request laten mislukken, en een paginacontrole die alleen de pagina's dekt die je net hebt gewijzigd, mist de pagina's die ernaar verwijzen. De bewaking in Night Watch neemt een willekeurige lijst met pagina's, elk met tekst die erin moet voorkomen, niet alleen startpagina's.