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

Cosa è cambiato

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.

Aggiornato: