Apresentando a aula e objetivos
Aula 1
Nesta primeira aula, vamos tratar de observabilidade, priorização, correlação de incidentes e do conceito de alert storm (tempestade de alertas), que ocorre quando um único alerta começa a disparar várias vezes.
Explorando cenários e conceito de alert storm
Vamos discutir cenários em que isso costuma acontecer. Por exemplo, quando a causa é uma API da nossa aplicação que caiu. Se essa API está indisponível e nossa aplicação não consegue se conectar nem executar determinadas tarefas, outras alertas começam a ocorrer: surgem problemas de latência, aparecem erros 500. No entanto, não é apenas um problema de latência ou apenas de erro 500 devido a algo pontual, e sim porque existe uma causa subjacente, a causa raiz, que pode ser uma falha em uma API, uma lentidão nessa API ou uma queda total. Às vezes utilizamos um serviço de terceiros e, ao consultar a página de status, vemos que ele está fora do ar. Há inúmeras situações que levam a múltiplos alertas de lentidão, erro 400 e erro 500 quando, no fim das contas, o problema é uma questão menor que, como um dominó, provoca outros problemas.
O conceito de alert storm (tempestade de alertas) descreve exatamente quando um único ponto de falha dispara dezenas ou centenas de alertas secundários. Esses alertas não estão diretamente relacionados como causa raiz, mas acabam explodindo porque a causa raiz os afeta.
Diferenciando ruído e sinal
Também precisamos diferenciar ruído e sinal, ou seja, distinguir entre alertas que requerem atenção e alertas informativos. Em nosso trabalho, lidamos com falsos positivos e falsos negativos. Às vezes, há um alerta que dispara o tempo todo por latência, por erro 400 ou informando que a aplicação caiu, mas, ao acessarmos o site ou o health check (verificação de integridade) da aplicação, ela está online. Por que o alerta dispara? Em muitos casos, por uma falha no ajuste do limiar (threshold) de alerta ou na configuração desse limiar. Pode acontecer, por exemplo, de verificarmos o site apenas uma vez e, justamente naquele instante, ocorrer uma lentidão ou um breve timeout (tempo limite); com isso, concluímos que o site caiu. Não repetimos a verificação para confirmar se realmente caiu ou se foi apenas uma intermitência momentânea, caracterizando um falso positivo.
Há também o cenário oposto: tudo parece tranquilo, mas descobrimos que a aplicação caiu e demoramos para perceber. Pior ainda, quem nos avisa é a equipe de suporte ou a pessoa cliente. Isso nos coloca em má posição, pois quem deveria monitorar e ser alertado primeiro somos nós, a área de DevOps, e não receber a notícia de terceiros, especialmente considerando que dispomos de diversas ferramentas para reduzir o nosso MTTR, o Mean Time to React (tempo médio para reagir). Quanto menor for esse tempo, melhor, pois significa que possivelmente fomos a única equipe que conseguiu visualizar o erro com antecedência.
Mitigando fadiga e calibrando alertas
Quando há alertas em excesso, confundimos o que é alerta realmente crítico com o que é apenas informativo. Por exemplo, receber um aviso de que estamos com 80% da capacidade de disco é informativo e, ao mesmo tempo, útil, porque ajuda a evitar um problema em produção: a aplicação pode parar, o deploy (implantação) pode falhar por falta de espaço em disco, a memória pode estar no limite, a CPU pode ficar saturada e assim por diante. O ideal é manter alertas preditivos que evitem incidentes, mas sem exagero. Existe aquela máxima: alertas demais equivalem a alerta nenhum, porque passamos a ignorá-los e, quando percebemos, deixamos passar o alerta realmente importante — e então vêm o post-mortem (análise pós-incidente), a sala de guerra e o restante da história.
Também precisamos considerar a fadiga operacional, isto é, o impacto psicológico e técnico causado por uma equipe sobrecarregada de alertas. Já comentamos sobre esse cenário. Imaginemos estar de on-call (plantão) e receber alertas o tempo todo. Recentemente passamos por uma situação assim: percebemos que, na realidade, não eram alertas verdadeiros, eram falsos negativos; parecia que o serviço estava fora do ar, mas não estava. Fomos ao time responsável por essas alertas e por esses recursos — a equipe de bancos de dados — e dissemos que era necessário corrigir, porque estávamos acordando a madrugada inteira. Acordar repetidas vezes e, às nove da manhã, precisar registrar o ponto e iniciar o trabalho é inviável; o cansaço compromete a produtividade.
Alertas não são algo imutável; calibramos constantemente. Às vezes, uma API da aplicação muda, ou muda a região em que trabalhamos, o que altera a latência. Se passamos a atuar, por exemplo, na região da China, a latência é maior. Não podemos configurar um timeout (tempo limite) de 5 ou 10 segundos para verificar a aplicação, pois pode ser curto demais. As alertas precisam ser ajustadas de acordo com as mudanças na infraestrutura. Se o site está mais performático, um timeout grande demais pode mascarar falhas reais na aplicação. Portanto, é essencial calibrar periodicamente e refatorar as alertas. Quando tudo está em infraestrutura como código — em Terraform, em Pulumi —, melhor ainda: fica muito mais fácil refatorar via código, com rastreabilidade do que foi alterado e possibilidade de debug (depuração). As IAs, hoje, ajudam muito nesse processo, tornando-o mais simples do que fazê-lo manualmente e com menor probabilidade de erro.
Simulando alerta em cascata e analisando causa raiz
O que faremos hoje, de forma objetiva: vamos simular uma alerta em cascata. Vamos acessar o vídeo da Aula 1, Volume de Sinais, 1.1, e executar um comando correspondente — é apenas um código simples de simulação. O que veremos é uma simulação de uma alert storm (tempestade de alertas) em uma arquitetura de microsserviços. A causa raiz é um problema de timeout (tempo limite) no banco de dados e, a partir dele, surgem outros problemas: outras alertas disparam por conta desse timeout. Passamos a observar problemas de cache (cache), falhas de autenticação nesse banco e erros 500. Isso é comum: algo começa a falhar e erros 500 se multiplicam. Não aparece apenas o connection timeout (tempo limite de conexão); surgem diversos 500 — em alguns casos, server timeout (tempo limite no servidor) —, por exemplo, vindos de um índice.
Nesse cenário, o catálogo de produtos do site fica indisponível. Por quê? Porque a base de dados está fora do ar; como o e-commerce (comércio eletrônico) vai acessar as informações? O API Gateway começa a lançar erros, a etapa de compra do e-commerce apresenta falhas no serviço de carrinho, a parte de pagamentos também falha. Tudo isso decorre da causa raiz: o banco de dados caiu. O frontend (camada de apresentação) retorna 503 porque o backend (camada de serviço) tem problemas, os quais existem porque o banco de dados está indisponível.
Observamos 9 alertas no total, mais 1 que é a causa raiz, responsável por gerar outras 8 alertas. Ou seja, quase 90% é ruído; apenas 1 é a alerta real, a causa raiz. Qual é a causa identificável? Se resolvermos o banco de dados — colocando o serviço em linha novamente (RDS, MongoDB etc.) —, os demais alertas se resolverão: carrinho, API Gateway, serviço de usuárias(os), autenticação, erros 500 relacionados a produto e à interação entre usuárias(os) e produto. Muitas vezes será assim: existe ruído, e o mais importante é reconhecer que isso acontecerá. É válido ter alertas relacionadas à alerta raiz, mas precisamos entender que a causa raiz é a que resolve todas as demais.
Antecipando correlação de incidentes e encerrando a aula
Sem correlação automatizada, a equipe recebe todas essas alertas simultaneamente e não consegue identificar qual é a causa raiz. Quando tivermos, na próxima aula, a correlação de sinais, poderemos perceber o que é ruído e o que é causa raiz. É isso que veremos na próxima aula, que trata de correlação de incidentes.
Nos vemos lá. Agradecemos! [♪]