ASP.NET MVC: monitoramento com Application Insights
O objetivo deste artigo é apresentar o uso do Application Insights, um dos serviços que integra o Microsoft Azure, no monitoramento de aplicações ASP.NET MVC.
Introdução
Embora nem sempre receba a devida importância, o monitoramento é ainda assim uma atividade fundamental em aplicações Web que se encontram em produção. Quando bem conduzido este tipo de prática contribui uma detecção mais eficiente de falhas, além de prover informações úteis para decisões envolvendo questões de escalabilidade e disponibilidade.
Monitorar um sistema envolve, do ponto de vista técnico, a implementação de algum mecanismo de log. Esta tarefa costuma exigir um esforço extra por parte dos desenvolvedores, visando com isto a coleta de dados para a elaboração de diferentes análises.
Buscando simplificar todo este trabalho o Microsoft Azure conta com um serviço chamado Application Insights, o qual pode ser facilmente integrado a aplicações Web construídas sob as mais diversas tecnologias. Java, Node.js, PHP, Python, Ruby e, obviamente, .NET estão entre as plataformas suportadas por esta solução.
Disponibilizando SDKs para a coleta automatizada de dados e transmissão dos mesmos para repositórios na nuvem (processo este conhecido como telemetria), o Application Insights pode ser utilizado em projetos hospedados ou não no Azure. Isto abre espaço para que aplicações publicadas em outras soluções de cloud computing se beneficiem das funcionalidades oferecidas por este serviço ou, até mesmo, sistemas on-premise.
Este artigo tem por intenção demonstrar o uso do Application Insights em projetos baseados no ASP.NET MVC, através de um exemplo descrito em detalhes nas próximas seções.
Exemplo de utilização
Para implementar o projeto descrito neste artigo foram utilizados como recursos:
- Uma aplicação já existente chamada TesteMVCAppInsights, com a mesma fazendo uso do ASP.NET MVC 5 e da versão 4.6.1 do .NET Framework;
- O Microsoft Visual Studio Community 2015 Update 2 como IDE de desenvolvimento;
- Uma conta de acesso ao Microsoft Azure;
- O Application Insights como serviço de monitoramento.
É importante destacar que o Visual Studio também permite que se habilite o uso do Application Insights durante a criação de um novo projeto. Maiores detalhes a respeito disto podem ser encontrados em:
Criando um novo recurso do Application Insights
Para criar um novo recurso do Application Insights será necessário acessar inicialmente o portal do Microsoft Azure:
Após a autenticação acionar o item Novo, na sequência a opção Serviços de Desenvolvedor e, por fim, Application Insights:
Aparecerá neste momento uma tela (como indicado na próxima imagem) para a configuração do novo recurso:
- No campo Nome foi informado o valor ExemploMVCAppInsights;
- Em Tipo de Aplicativo certificar-se de que foi marcada a opção Aplicativo Web ASP.NET;
- Selecionar a criação de um novo grupo de recursos, definindo como nome do mesmo TesteApplicationInsights.
Acionando a opção Todos os recursos, após alguns segundos, já será possível constatar a presença do recurso ExemploMVCAppInsights:
Configurando o uso do Application Insights
Para habilitar a utilização do Application Insights em um projeto ASP.NET MVC será necessário acessar primeiramente o NuGet dentro do Visual Studio:
Adicionar então o package Microsoft.ApplicationInsights.Web à aplicação:
Além das bibliotecas que cuidarão da coleta de dados e comunicação com o Application Insights, a inclusão do pacote Microsoft.ApplicationInsights.Web fará com que também seja criado um arquivo de configurações chamado ApplicationInsights.config:
No arquivo ApplicationInsights.config deverá ser informada a Instrumentation Key para uso do recurso ExemploMVCAppInsights. Esta chave pode ser obtida a partir do portal do Azure, mais precisamente na seção Fundamentos em ExemploMVCAppInsights:
Como próximo passo alterar o arquivo ApplicationInsights.config, incluindo no mesmo o elemento InstrumentationKey com a chave gerada pelo Microsoft Azure:
<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="...">
<InstrumentationKey>95894fae-5476-4a79-93ee-8f7617017bb4</InstrumentationKey>
...
</ApplicationInsights>
Com estes ajustes o projeto TesteMVCAppInsights já se encontra devidamente configurado para a utilização do Application Insights. A execução desta aplicação por meio do Visual Studio e a navegação por algumas de suas funcionalidades resultará na coleta de informações de uso, como demonstrado na imagem a seguir:
Implementando eventos personalizados
Além de coletar automaticamente informações sobre falhas, número de requisições e tempos de resposta, o Application Insights também permite que eventos personalizados sejam registrados. Isto acontece por meio do uso da classe TelemetryClient (namespace Microsoft.ApplicationInsights), a qual conta com métodos que simplificam o log de dados complementares.
A View Index.cshtml no projeto TesteMVCAppInsights foi modificada, de forma a viabilizar o teste de eventos customizados com base no uso do tipo TelemetryClient. Este processo de coleta de dados ocorrerá quando forem acionadas as funcionalidades A e B:
...
<h2>Teste de utilização do Application Insights</h2>
<h2>Acione alguma das funcionalidades abaixo para testar
eventos personalizados:</h2>
<p><a href="/Home/EventoA"
class="btn btn-primary btn-lg">Funcionalidade A</a></p>
<p><a href="/Home/EventoB"
class="btn btn-primary btn-lg">Funcionalidade B</a></p>
Na próxima figura é possível observar a aparência esperada para a View Index.cshtml:
A classe HomeController também passará por alterações:
- As Actions EventoA e EventoB foram implementadas com o objetivo de testar o uso de eventos personalizados;
- Em ambas as Actions uma nova instância de TelemetryClient foi criada. Será por meio do método TrackEvent que acontecerá o envio de informações ao Application Insights;
- No caso específico da Action EventoA, foi utilizada a versão de TrackEvent que recebe apenas o nome do evento. Já em EventoB foi empregada uma segunda alternativa, demonstrando o uso de um Dictionary como parâmetro adicional contendo pares de informações (chave/identificação + valor).
using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.ApplicationInsights;
namespace TesteMVCAppInsights.Controllers
{
public class HomeController : Controller
{
...
public ActionResult EventoA()
{
TelemetryClient t = new TelemetryClient();
t.TrackEvent("EventoA");
return View("Index");
}
public ActionResult EventoB()
{
Dictionary<string, string> detalhes =
new Dictionary<string, string>();
detalhes["DescEvento"] = "Acionada a Funcionalidade B";
detalhes["Usuário"] = "Anônimo";
TelemetryClient t = new TelemetryClient();
t.TrackEvent("EventoB", detalhes);
return View("Index");
}
}
}
Para consultar informações sobre eventos personalizados é necessário acessar a opção Metrics Explorer (via portal do Azure):
Uma das visualizações oferecidas por esta funcionalidade permite a consulta aos diferentes eventos cadastrados:
Ao selecionar o registro correspondente ao evento B serão trazidos detalhes sobre o mesmo (já contemplando todos os dados logados a partir da aplicação MVC):
Conclusão
O Application Insights pode ser integrado sem maiores dificuldades a aplicações ASP.NET MVC já existentes, conforme demonstrado ao longo deste artigo. Há ainda a possibilidade de se vincular o seu uso a novos projetos, com isto acontecendo no momento da criação destas estruturas. Eventos personalizados/customizados também podem ser registrados, auxiliando assim na coleta de dados requeridos por métricas complementares não previstas nativamente.
Referências
Application Insights
https://www.visualstudio.com/products/application-insights-vs
Utilizando o Application Insights
https://channel9.msdn.com/Blogs/Comunidade-Tecnica-Microsoft/Como-gerenciar-e-monitorar-suas-aplicaes-com-Application-Insights