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

O que mudou

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.

Atualizado: