ASP.NET Core 2.0: monitorando APIs REST com o Application Insights

Um dentre os muitos serviços que integram o Microsoft Azure, o Application Insights é uma solução voltada ao monitoramento de aplicações Web. Isto acontece através da coleta automatizada de dados (técnica esta conhecido como telemetria), com a disponibilização de dashboards customizáveis no próprio portal do Azure.

O Application Insights permite a análise de diferentes aspectos como número de requisições recebidas por intervalo de tempo, tempos médios de resposta e falhas. Projetos baseados em .NET, Node.js, Java, Python, Ruby, Node.js e PHP, além de Azure Functions e containers Docker estão entre as estruturas que podem ser monitoradas por meio do Application Insighs.

A coleta de dados envolve um esforço mínimo em termos de codificação. Este processo será habilitado através do uso de uma chave (Instrumentation Key) fornecida pelo Azure e normalmente especificada em um arquivo de configuração, bem como pela adição de um SDK disponibilizado pela Microsoft à aplicação que passará por monitoramento.

Eventos customizados também podem ser logados. O único requisito neste caso é que os desenvolvedores codifiquem instruções a respeito de tais ocorrências, contribuindo assim para o armazenamento informações complementares úteis para análises posteriores.

Este artigo demonstra como utilizar o Application Insights em APIs baseadas no ASP.NET Core 2.0, além de apresentar alguns dos recursos oferecidos por este serviço do Microsoft Azure.


Criando um novo recurso do Application Insights

A criação de um novo recurso do Application Insights a partir do portal do Azure é uma tarefa extremamente simples, bastando apenas acionar a opção Novo e localizar este serviço entre as opções oferecidas:

A seguir estão os campos a serem informados para a criação de tal recurso:

No caso específico do campo Tipo de Aplicativo, será utilizada a opção Aplicativo Web ASP.NET para o projeto detalhado nas próximas seções:

A chave de instrumentação poderá ser obtida ao acessar um recurso do Application Insights no portal do Azure:


Habilitando o uso do Application Insights

O projeto utilizado neste post é uma API REST para consulta a cotações de moedas estrangeiras e implementada a partir do ASP.NET Core 2.0. Foram utilizados ainda o Application Insights como solução de monitoramento, uma base do Azure SQL e o Dapper como mecanismo de acesso a dados. Os fontes estão disponíveis no GitHub:

https://github.com/renatogroffe/ASPNETCore2_APIs_AppInsights

A chave de instrumentação para uso do Application Insights deverá ser especificada no arquivo appsettings.json, por meio dos itens ApplicationInsights e InstrumentationKey:

O package Microsoft.ApplicationInsights.AspNetCore (ainda em versão beta) será então adicionado ao projeto:

Alterações também acontecerão na classe Startup. O método AddApplicationInsightsTelemetry será acionado em ConfigureServices, de forma a ativar o uso do Application Insights na API de testes:


Testes

Com a aplicação de testes em execução diversas análises serão geradas por meio do Application Insights. Tudo isto com os simples ajustes efetuados na seção anterior.

Em Visão Geral aparecerá um resumo das requisições recebidas pela aplicação nas últimas 24 horas (tal período pode ser configurado via opção Intervalo de tempo):

A funcionalidade chamada Live Metrics Stream permite o monitoramento de aplicações Web em tempo real, apresentando informações sobre requisições recebidas, falhas e o consumo de recursos nos servidores utilizados:

O Application Insights conta também com um mecanismo para tracking de dependências, um recurso extremamente útil na verificação de problemas envolvendo o acesso a bases relacionais, chamadas a APIs REST e a outros serviços do Azure (Blob Storage e Cosmos DB). Na imagem a seguir é possível observar os detalhes de uma dependência que indica a utilização de uma base do Azure SQL, incluindo o log do comando empregado na consulta a informações:

Outra função oferecida pelo Application Insights é o log de falhas ocorridas, com a exibição de detalhes úteis para a checagem e resolução de problemas:

O Mapa de Aplicativo (Application Map) exibirá as relações de dependência entre componentes da aplicação, além de informações de desempenho, falhas e alertas:

O Application Insights conta ainda com funcionalidades como:

  • Detecção inteligente, com a análise de problemas de performance ou aumento repentino na taxa de falhas e envio de e-mails automáticos informando tais ocorrências;
  • Testes de disponibilidade, que nada mais são do que requisições enviadas a partir de diferentes data centers do Azure a fim de determinar se uma aplicação Web está ou não em operação;
Testes de disponibilidade já executados
  • Regras de alerta, que utilizam critérios baseados em métricas do Application Insights e podem gerar e-mails de notificação quando estas condições não forem atendidas;
E-mail gerado por uma regra de alerta
  • Monitoramento de performance, com dashboards que podem auxiliar na busca por problemas de lentidão na aplicação;
Monitoramento de desempenho
  • Analytics, recurso que permite executar consultas customizadas com o objetivo de produzir análises avançadas (sob a forma de tabelas e/ou gráficos) de dados gerados via Application Insights.
Executando uma consulta a dados do Application Insights via Analytics

Implementando eventos customizados

O Controller a seguir (que integra o projeto de testes deste artigo) demonstra a implementação de um evento customizado no Application Insights:

  • Uma instância da classe TelemetryClient (namespace Microsoft.ApplicationInsights) será criada;
  • Um evento customizado será registrado por meio do método TrackEvent, invocado a partir do objeto do tipo TelemetryClient. Esta operação receberá como parâmetros o nome do evento, além de uma instância de Dictionary contendo informações complementares úteis para uso posterior (neste exemplo específico foi logado o conteúdo no formato JSON do objeto devolvido pela Action Get).

Na imagem a seguir é possível observar dados de eventos customizados no portal do Azure, com a visualização dos mesmos acontecendo através da funcionalidade Live Metrics Stream: