Il contatore di visualizzazioni che ha trasformato il nostro catalogo in un 502
Spedizione
La pagina che elenca tutti i kit che vendiamo ha risposto a ogni visitatore con un 502 Bad Gateway per circa 41 ore dopo il lancio. La pagina di ogni singolo kit funzionava, la home page funzionava, il checkout funzionava. La parte rotta erano poche righe che contavano le visualizzazioni di pagina.
Il bug
Il server del nostro negozio conta le visite alle pagine dei kit. Per capire a quale kit si riferisce una richiesta, prendeva la seconda parte del percorso:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Per /kits/studio/ è studio. Per il catalogo stesso, /kits/, il percorso ha due barre, quindi la guardia lo lasciava passare, ma dopo aver rimosso le barre resta una sola parte, e [1] generava un IndexError. L'handler è lo standard http.server di Python: un'eccezione in do_GET chiude la connessione senza risposta, e Cloudflare mostrava al visitatore un 502.
La correzione è una piccola funzione che restituisce una stringa vuota quando la parte manca. Il conteggio delle visualizzazioni aveva bisogno solo del nome del kit; non doveva mai poter rompere la pagina che stava contando.
Perché nessuno dei nostri controlli lo ha visto
- Il watchdog di uptime apriva solo le home page. La home page andava bene.
- La fase di rilascio controllava ogni kit distribuito: la sua pagina, il suo redirect di checkout, il percorso a pagamento dall'inizio alla fine. Non apriva mai l'elenco di tutti i kit.
- Le analytics non potevano mostrarlo. Il codice che avrebbe contato i visitatori del catalogo era proprio quello che crashava. Il log del server aveva la risposta dall'inizio: 17 traceback in quelle 41 ore, ognuno una richiesta, da una persona o da un crawler, che riceveva un errore invece della pagina.
Cosa è cambiato
- Ogni pagina, dall'esterno, ogni ora. Un piccolo job legge la sitemap e apre ogni pagina in inglese e, a turno, una delle altre 42 lingue, attraverso Cloudflare come un visitatore. Due esecuzioni fallite di fila inviano un'email; il recupero ne invia un'altra.
- La fase di rilascio apre ogni pagina in inglese dopo aver ricostruito il sito, e rifiuta di finire se una non risponde 200.
- Le pagine indice contano come pagine. Le pagine che elencano altre pagine sono quelle che un visitatore raggiunge per prima, ed erano proprio quelle che nessuno aveva testato.
Il punto chiave
Le attività secondarie in un request handler, come conteggi, logging o tracking, non devono mai far fallire la richiesta, e un controllo delle pagine che copre solo quelle appena modificate trascura quelle che vi rimandano. Il watchdog in Night Watch accetta qualsiasi elenco di pagine, ciascuna con il testo che deve contenere, non solo le home page.