Um dos principais problemas quando uma aplicação para de funcionar é encontrar e descobrir porque ela não está funcionando. Existem várias metodologias ou bibliotecas que fornecem ferramentas, nesse caso externas à aplicação, para verificar a saúde da aplicação e seus serviços.

Tentando resolver esse problema, alguns engenheiros do Google criaram uma metodologia chamada Healthz, onde a própria aplicação nos informa se ela está saudável ou não.

Esse vídeo do Kelsey Hightower fala bem sobre o assunto e eu recomendo bastante, mas vou citar brevemente o conceito e porque acho que seria uma prática interessante de se adotar. Vamos lá?

O que é Healthz?

Lembro de um dia na cozinha. Alguns colegas aqui da dti discutindo se a lâmpada deveria saber se trocar ou se outra classe precisaria implementar esse método.

O conceito de Healthz é semelhante. Deveríamos conectar “probes” para testar nossas aplicações ou as aplicações deveriam nos avisar se ela está saudável? Claro, essa pergunta visa levantar a curiosidade, podemos fazer os dois.

O que é o Healthz? Simples, um endpoint que existe na aplicação, que faz testes de sanidade, conexões ao banco de dados, serviços e etc. Ele nos retorna um status 200 caso tudo esteja ok, ou alguma outra “resposta” caso não esteja ok.

Esse endpoint pode ser desenvolvido dentro da aplicação ou ser encapsulado e publicado juntamente com ela.

O conceito é simples. O desenvolvimento vai desde simples testes com um status http 200 ou 500, até um JSON mais completo listando os erros encontrados, ou até mesmo uma interface, tudo depende da sua necessidade ou disponibilidade. O ponto aqui é que o simples status http 200 já valida a ideia e a torna de imensa utilidade.

Healthz 101

Um exemplo prático seria uma aplicação dti-wc. Um app maravilhoso que nos informa se o banheiro da empresa está vazio ou não. Essa aplicação possui um banco de dados SQL, um servidor Redis e dois serviços, o Alair e o Ademar. Alair e Ademar são serviços que informam se o banheiro está vazio ou não.

Além dos endpoints normais dessa aplicação, ela possui um endpoint healthz que se conecta ao banco e realiza um SELECT (só pra ver se está tudo ok), conecta-se ao Redis e faz um get, e realiza uma chamada ao Vanderlei e o Ademar para saber se a conexão com os serviços está ok. A aplicação retorna 200 ou um JSON informando se alguma dessas conexões falhar.

Em algum ponto no futuro algo na nossa aplicação para de funcionar e precisamos de informações para tentar entender por que. Nesse cenário, o primeiro teste seria chamar o endpoint healthz. Ao fazer isso, percebemos que por algum motivo recebemos a mensagem que o serviço do Ademar não está funcionando. Logo, não precisamos “perder tempo” verificando a aplicação em si e podemos validar o que aconteceu com o Ademar.

O mesmo acontece para o Banco, Redis ou o Alair, podemos verificar de maneira rápida a saúde da aplicação, e ter uma identificação, mesmo que simples, caso algum sistema esteja indisponível.

CI/CD com o Healthz

Uma outra vantagem do Healthz é que podemos incluí-lo no processo de CI/CD e impedir a publicação da aplicação caso o endpoint não retorne corretamente. Isso evita, por exemplo, que um dos ambientes fique fora do ar por um tempo até que o desenvolvedor responsável possa perceber que a aplicação não está saudável e realizar um rollback.

Olhando um caso específico do Kubernetes temos dois health checks disponíveis, livenessProbe e readinessProbe que podem ser utilizados com o Healthz. Ao configurar o readinessProbe para testar o healthz, caso o Kubernetes não receba uma mensagem de sucesso desse endpoint ele impede a publicação, mantendo o pod anterior online, tudo de forma automática e sem que o ambiente fique indisponível.

Da mesma forma, o livenessProbe pode ser utilizado para realizar testes com uma frequência X e testar se a aplicação está saudável.

Em breve vamos falar mais sobre Kubernetes, fique ligado!