Meu Blog

Um framework para monitorar aplicações ASP.Net Core

21 Aug 2019

Na minha carreira, trabalhei em empresas que ofereciam produtos ou serviços na forma de aplicações web. Como elas precisavam estar sempre disponíveis, era muito importante ter alguma forma de monitorá-las. Isso, geralmente, era responsabilidade de uma equipe de operações. Para monitorar o estado da rede e da infraestrutura, essas equipes utilizam aplicações específicas que alertam quando ocorre problema e quando eles são resolvidos. Podemos citar o Nagios e o Zabbix como exemplo dessas ferramentas.

No caso de aplicações web, esse tipo de monitoramento não é suficiente para garantir que elas estejam funcionando. Em alguns casos, essas aplicações podem ficar fora do ar sem que tenha algum problema na infraestrutura ou na rede. Como exemplo, erros na configuração ou bugs podem fazer com que a aplicação apresente erros sem que seja detectado por essas ferramentas. A solução para resolver esse problema é configurar o Nagios ou o Zabbix para fazer uma ou mais requisições de forma a cobrir os prováveis pontos de falha.

Do ponto de vista prático, essa técnica precisa da ajuda dos desenvolvedores. Eles precisam explicar para a equipe de operações quais são os melhores cenários a serem utilizados. Entretanto, nem sempre esse procedimento é simples. Na prática o desenvolvedor implementa uma url com o objetivo específico de testar a disponibilidade da sua aplicação ao invés de definir um conjunto de chamadas a serem executadas pelo monitoramento.

Para simplificar e padronizar essa técnica, irei apresentar uma solução simples que pode ser usada em aplicações web implementadas usando o ASP.Net Core. Embora não seja o propósito desse artigo, a mesma ideia pode ser adaptada também para aplicações feitas com outras tecnologias.

Primeiro precisamos definir uma interface que será usada como o ponto de extensão da nossa solução. A interface tem um método chamado Check que não tem parâmetros e retorna um booleano. A checagem da aplicação será feita implementando essa interface para cada tipo de verificação. A ideia aqui é criar uma sequência de passos. A aplicação estará funcionando se todos os passos forem executados com sucesso.

Após criarmos a interface, vamos criar um middleware. O middleware no nosso caso será o responsável por interceptar as requisições, verificar se a requisição é uma requisição de monitoramento e, caso ela seja, ela deverá rodar a sequência de passos de verificação. Observe que o middleware recebe por injeção de dependência uma coleção de objetos do tipo IHealthCheckServices. É essa coleção que será usada para definir se a aplicação está ou não funcionando. Note que se alguma chamada for feita ao método Check e essa retornar falso, devemos considerar que a aplicação não está funcionando. Nesse caso, a requisição irá terminar com uma mensagem de erro e o status http 500.

Até agora, definimos o funcionamento principal do nosso framework. Vale explicar também como se faz para integrar esse código nas aplicações ASP.Net Core. A configuração é toda feita na classe Startup. No método Configure, iremos registrar nosso middleware. No método ConfigureServices, iremos registrar todas as classes que implementam nossa interface IHealthCheckServices. Para facilitar esse trabalho e organizar melhor o código vamos utilizar uma classe estática com alguns métodos de extensão para facilitar essa configuração.

Nesse artigo, minha proposta foi apresentar um framework simples com o objetivo de facilitar o processo de desenvolvimento e monitoramento de aplicações web. Desta forma, o código para verificar se todas as connectionstrings ou se os endereços de apis estão configurados certos podem ser compartilhados entre as diversas aplicações. Os desenvolvedores não irão precisar reescrever código para isso. Já a equipe de operações terá uma forma padrão de verificar se as aplicações ASP.Net Core estão funcionando. Elas poderão definir a url ou até mesmo como querem receber a resposta do servidor. Como sugestão, eu disponibilizei esse framework como um pacote nuget. Caso seja de seu interesse, você pode instalar usando o seguinte comando.

Install-Package FNS.HealthCheck 

O código fonte completo dessa solução também está disponível no meu repositório do github.

Me mande um twitter @souzinha se você gostou desse post.

Tweet
comments powered by Disqus