O contador de visualizações que transformou nosso catálogo em um 502
Envio
A página que lista todos os kits que vendemos respondeu a cada visitante com um 502 Bad Gateway por cerca de 41 horas após o lançamento. A página de cada kit funcionava, a página inicial funcionava, o checkout funcionava. A parte quebrada eram algumas linhas que contavam as visualizações de página.
O bug
O servidor da nossa loja conta as visitas às páginas dos kits. Para descobrir a qual kit uma solicitação se destina, ele pegava a segunda parte do caminho:
self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")
Para /kits/studio/, isso é studio. Para o próprio catálogo, /kits/, o caminho tem duas barras, então o guarda deixou passar, mas depois de remover as barras há apenas uma parte, e [1] gerou um IndexError. O handler é o http.server padrão do Python: uma exceção em do_GET fecha a conexão sem resposta, e o Cloudflare mostrava ao visitante um 502.
A correção é uma pequena função que retorna uma string vazia quando a parte está ausente. A contagem de visualizações só precisava do nome do kit; nunca precisou ser capaz de quebrar a página que estava contando.
Por que nenhuma de nossas verificações detectou isso
- A monitoria de uptime abria apenas as páginas iniciais. A página inicial estava bem.
- A etapa de release verificava cada kit que enviava: sua página, seu redirecionamento de checkout, o caminho pago de ponta a ponta. Ela nunca abria a lista de todos os kits.
- A análise não podia mostrar isso. O código que contaria os visitantes do catálogo era o código que travava. O log do servidor tinha a resposta o tempo todo: 17 tracebacks nessas 41 horas, cada um uma solicitação, de uma pessoa ou de um crawler, que recebeu um erro em vez da página.
O que mudou
- Todas as páginas, de fora, a cada hora. Um pequeno job lê o sitemap e abre todas as páginas em inglês e, por sua vez, uma dos outros 42 idiomas, através do Cloudflare como um visitante. Duas execuções falhas seguidas enviam um e-mail; a recuperação envia outro.
- A etapa de release abre todas as páginas em inglês depois de reconstruir o site, e se recusa a terminar se uma delas não responder 200.
- Páginas de índice contam como páginas. As páginas que listam outras páginas são as primeiras que um visitante acessa, e eram justamente as que ninguém testou.
A conclusão
Trabalhos paralelos em um manipulador de solicitações, como contagem, registro de logs ou rastreamento, nunca devem fazer a solicitação falhar, e uma verificação de páginas que abrange apenas as páginas recém-alteradas deixa de fora as que fazem link para elas. O watch em Night Watch aceita qualquer lista de páginas, cada uma com o texto que deve conter, não apenas páginas iniciais.