El contador de visitas que convirtió nuestro catálogo en un 502
Envío
La página que lista cada kit que vendimos respondió a cada visitante con un 502 Bad Gateway durante unas 41 horas tras el lanzamiento. La página de cada kit funcionaba, la página de inicio funcionaba, el pago funcionaba. La parte rota eran unas pocas líneas que contaban las visitas de página.
El error
El servidor de nuestra tienda cuenta las visitas a las páginas de los kits. Para saber a qué kit corresponde una petición, tomaba la segunda parte de la ruta:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Para /kits/studio/ es studio. Para el catálogo en sí, /kits/, la ruta tiene dos barras, por lo que la salvaguarda lo dejó pasar, pero tras eliminar las barras solo queda una parte, y [1] lanzó un IndexError. El handler es el http.server estándar de Python: una excepción en do_GET cierra la conexión sin respuesta, y Cloudflare mostraba al visitante un 502.
La corrección es una pequeña función que devuelve una cadena vacía cuando falta la parte. El conteo de visitas solo necesitaba el nombre del kit; nunca necesitó poder romper la página que estaba contando.
Por qué ninguna de nuestras comprobaciones lo vio
- El watchdog de disponibilidad solo abría páginas de inicio. La página de inicio estaba bien.
- El paso de publicación comprobaba cada kit que enviaba: su página, su redirección de pago, el flujo de pago de principio a fin. Nunca abría la lista de todos los kits.
- La analítica no podía mostrarlo. El código que habría contado los visitantes del catálogo era el código que fallaba. El registro del servidor tenía la respuesta todo el tiempo: 17 trazas de error en esas 41 horas, cada una una petición, de una persona o un rastreador, que recibió un error en lugar de la página.
Qué cambió
- Cada página, desde fuera, cada hora. Un pequeño trabajo lee el mapa del sitio y abre cada página en inglés y, a su vez, una de los otros 42 idiomas, a través de Cloudflare como un visitante. Dos ejecuciones fallidas seguidas envían un correo; la recuperación envía otro.
- El paso de publicación abre cada página en inglés después de reconstruir el sitio, y se niega a terminar si alguna no responde 200.
- Las páginas de índice cuentan como páginas. Las páginas que listan otras páginas son las primeras a las que llega un visitante, y eran las que nadie probó.
La conclusión
El trabajo secundario en un controlador de solicitudes, como el conteo, el registro o el seguimiento, nunca debe poder hacer fallar la solicitud, y una comprobación de páginas que solo cubre las páginas que acabas de modificar pasa por alto las que enlazan a ellas. El watchdog en Night Watch acepta cualquier lista de páginas, cada una con el texto que debe contener, no solo las páginas de inicio.