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

Wat is er veranderd

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.

Bijgewerkt: