Como está a saúde da sua aplicação? A importância e benefícios do Health Check para o seu sistema

João Pedro Assumpção Evaristo
Grupo OLX Tech
Published in
8 min readJul 27, 2023

Neste artigo, abordaremos sobre a importância do health check para nossos sistemas e como uma implementação cuidadosa é imprescindível.

O que é?

Assim como precisamos fazer um check-ups médicos para acompanharmos como anda a nossa saúde, nossos sistemas também precisam de um monitoramento para sabermos o estado de funcionamento deles. O diagnóstico das aplicações, que por muitas vezes não recebe a devida importância, é o papel para o qual foi proposto o serviço de health check .O health check consiste em uma maneira de verificar se um serviço é capaz de realizar sua tarefa da maneira esperada. Essa checagem pode ser abordada em diversas áreas do sistema, desde o monitoramento de vivacidade interno e externo até a corretude lógica da aplicação.

Para que serve?

Esse tipo de verificação é útil para evitar que um nó do sistema, que não esteja apto a executar o seu trabalho, permaneça ativo, evitando que erros se propaguem para outros serviços ou que dados sejam perdidos. Além disso, junto com uma rotina de testes, o health check ajuda a prevenir que uma release com bugs entre para produção.

O que deve cobrir?

Um bom health check deve cobrir todo o espectro que garanta o funcionamento correto da aplicação. Isso significa que, além de verificações internas, checagens de dependências externas também devem ser feitas, caso estas existam. Para mensurar essa saúde do todo, podemos utilizar os seguintes checkpoints:

  • Vivacidade

Testar se as dependências da aplicação estão em pé, isto é, se estão aceitando conexões em suas portas e respondendo a requisições. Este escopo não verifica detalhes de funcionamento lógico.

  • Tempo de resposta

Em complemento a Vivacidade, deve-se considerar o tempo de resposta das aplicações externas e bancos de dados. Se a sua aplicação depende de dados providos de recursos periféricos, e estes estiverem com uma latência elevada no tempo de resposta, reflete que o seu serviço também estará com alta latência, logo, com baixa saúde do ponto de vista externo.

  • Integridade lógica

Se o seu software considera apenas a sua disponibilidade de responder com um OK 200 a uma requisição, não levando em consideração a sua integridade interna, erros podem ser propagados pelo sistema, acarretando um efeito cascata. É importante que, além do aspecto de comunicação e disponibilidade, uma checagem de lógicas internas seja feita antes de responder que está tudo certo com o software.

Como mensurar a saúde?

Uma resposta simples de sucesso OK basta para mensurar a saúde da aplicação? Em paralelo a nossa saúde, não dizemos apenas se a nossa saúde está boa ou ruim, temos gradações entre esses dois extremos. Esta abordagem binária de saúde está mais ligada a um serviço de ping do que de saúde propriamente dito.

Espectro de saúde da aplicação

Boas práticas em um health check

Aqui estão algumas boas práticas, não oficiais, que podem ser utilizadas na hora de desenvolver um bom health check.

  • Leve em consideração o contexto

Saiba levar em conta o contexto da aplicação e das suas responsabilidades na hora de projetar o seu health check. Deve-se considerar quais são as expectativas do serviço em questão e quais serão os critérios para considerá-lo saudável. Aplicações respondem em tempos diferentes, algumas são mais toleráveis a perdas do que outras, etc. Também devemos olhar para o contexto das dependências. Algumas são mais críticas, já outras não impedem o funcionamento satisfatório da aplicação.

  • Verifique as dependencias

Como abordado anteriormente, é importante verificar o funcionamento das dependências externas. Se a sua aplicação está em perfeito funcionamento e as suas dependências não estão, isso pode causar um “falso negativo”, resultando em mais erros.

  • Retorne dados em formato machine-readable

Os dados retornados do seu health check serão lidos, em sua maior parte, por outros sistemas. Portanto, é importante que o tipo de dado retornado seja entendido por máquinas, como o JSON. Também é essencial que o formato retornado seja padrão para todas as aplicações do meio em que estão.

  • Segregue as respostas das verificações

É essencial separar as respostas de saúde individual e das dependências. Isso é útil na hora de analisar onde está o problema. Além disso, é importante que dentro das dependências, isso também esteja separado, pois ajuda a ponderar se a aplicação deve parar imediatamente por uma dependência estar fora, ou se esta não é crítica a ponto de forçar uma parada.

  • Respostas em formato de Status Code

Anteriormente foi abordado a importância de mensurar a saúde de maneira que cubra um espectro, ao invés de uma resposta binária. No entanto, no que diz a respeito da resposta do health check, esta deve conter um HTTP Status Code, para que se possa saber o que fazer a seguir. É importante utilizar protocolos, pois já são documentados e evitam margens para interpretações. Portanto, um serviço que é considerado saudável, deve incluir em sua resposta um “200 OK”, por exemplo.

  • Não exponha o seu endpoint

Espera-se que o endpoint do health check retorne, além do status code, dados de debug da aplicação. Expor esses dados de funcionamento, e quais serviços estão relacionados com o seu serviço, pode trazer riscos de segurança, além de não ser necessário, pois o usuário não precisa saber desses detalhes.

  • Health checks devem ser eficientes

O serviço de health check, além de se preocupar em trazer os dados de diagnóstico da aplicação, deve também prezar por ser eficiente e responder no menor tempo possível. Partindo do princípio que o seu endpoint será requisitado por outras aplicações, e que estas dependem da resposta para tomar uma ação, não se pode aguardar por muito tempo uma resposta, pois isso se tornaria um gargalo para o sistema. Com isso em vista, pense nas seguintes propostas quando for desenvolver o seu health check:

  1. - Processe os diferentes diagnósticos de maneira concorrente e depois reúna os resultados.
  2. - Pense em timeouts de resposta.
  3. - Manter uma rotina de testes automatizados, centralizando os resultados em um log, pode diminuir o tempo de resposta, uma vez que os dados já estariam atualizados e prontos para serem retornados.

Realidade e impactos na OLX Brasil

Atualmente, dentro dos times de tecnologia da OLX Brasil, há um processo de melhoria da maturidade dos repositórios. Uma das frentes de aprimoramento é a implementação de serviços de health check. Observa-se que na maioria dos casos, a implementação se resume a uma rota de ping na aplicação, que é uma abordagem simplista e com menos informações em comparação ao health check, como visto anteriormente. Esse é um ponto de possível melhoria e discussão dentro dos times, uma vez que um health check mais robusto pode prevenir uma série de problemas no cotidiano.

Um dos impactos positivos que a implementação de health check poderia trazer dentro da OLX Brasil é um melhor monitoramento das dependências das aplicações internas. Por ser uma empresa grande com uma arquitetura tecnológica mais complexa, é comum que os serviços de uma equipe dependam do funcionamento adequado de outros serviços de times diferentes para executar suas tarefas. Com um monitoramento do estado de saúde das dependências, é possível planejar ações preventivas e runbooks caso algum serviço apresente problemas, evitando assim que erros se propaguem para sua aplicação e para outras em efeito cascata. Isso contribui para a estabilidade e confiabilidade do sistema como um todo.

Para se aprofundar no tema

O health check era algo novo para mim até então. Por isso, tive que fazer uma boa busca para reunir informações que me ajudassem a entender a importância e a maneira correta de se fazer um health check. Aqui, dedicarei um espaço para falar um pouco sobre as minhas referências e recomendar a leitura delas.

Iniciamos com os materiais de referência sobre o que é o health check. Para isso, me baseei na definição de Chris Richardson em Pattern: Health Check API. O texto traz uma definição do contexto do health check, as verificações que devem ser levadas em consideração e um breve exemplo de implementação em Java. Também tomei como referência o material da biblioteca da Amazon AWS, Implementing health checks, escrito por David Yanacek. David, além de abordar o que é o health check e as áreas que ele deve monitorar, apresenta uma visão sobre a importância do health check em sistemas distribuídos e seus impactos, trazendo uma experiência sobre como o health check poderia ter evitado uma cascata de erros na Amazon. Por fim, o texto Implement health check APIs for microservices — IBM Garage Practices, dos autores Ingo Averdunk e Hans Kristian Moen, também define, de maneira mais técnica, o que é o health check e traz algumas considerações sobre os requisitos do serviço. Além disso, o texto mostra uma implementação simples de um health check.

Para entender melhor o conceito de saúde do sistema e a importância de obter informações mais detalhadas além de uma resposta binária entre “up” ou “down”, busquei apoio na publicação Health Checks and Graceful Degradation in Distributed Systems, de Cindy Sridharan. A autora explora como, em certos contextos, é necessário ter mais informações sobre o estado de saúde de uma aplicação. Embora uma resposta booleana possa ser suficiente para algumas aplicações, em cenários mais complexos, como o balanceamento de carga, é necessário ter um espectro de saúde, onde são definidos limites para determinar se um serviço está saudável ou não. Essa preocupação também é discutida em outros materiais mencionados aqui.

Nos materiais de referência, também busquei exemplos que fornecessem mais informações sobre a implementação do health check e boas práticas. A começar com considerações na hora de implementar o serviço, diferenças entre health check e um ping, além de boas práticas, temos o blog A guide to API health check. Outra fonte que aborda boas práticas em health checks é o texto de Lorenzo Arribas, Meaningful web service /health checks. Nele, Lorenzo discute como muitas vezes os health checks implementados são anêmicos, ou seja, têm pouca informação e cobertura, e apresenta um exemplo real de um problema que poderia ter sido evitado com uma implementação melhor, assim como David, mencionado anteriormente. Para solucionar este problema, o autor apresenta dez boas práticas para tornar o seu health check mais robusto.

Um pouco sobre mim

Me chamo João Pedro, tenho 21 anos. Sou apaixonado por tecnologia, musculação, sair com os amigos, churrasco e videogames. Atualmente, sou estagiário no time de Autos Pro Key Account, na área de Engenharia de Software. Somos responsáveis por empoderar os clientes Key Accounts de Autos da OLX Brasil, fornecendo recursos que alavanquem seus negócios e melhorem a experiência de uso da plataforma.

Veja como o nosso time faz tecnologia e confira nossas oportunidades abertas!

--

--