Telemetria/Insights Design Reference
Keyworks: Application Insights Azure Telemetry Pulse
Conceitos
Telemetria
Este termo tem sido usado recentemente para representar os dados recolhidos sobre a utilização de uma aplicação. Informação detalhada sobre as operações realizadas pelos utilizadores, o contexto de utilização da aplicação, erros, etc.
Application Insights
Este serviço do Windows Azure permite recolher dados de vários tipos sobre aplicações hospedadas no Azure e também fornece uma API para a configuração do serviço e recolha de eventos adicionais.
Desenho
Numa primeira fase as aplicações Elevation apenas recolherão informação a partir do servidor Web. Ou seja, sobre o Web site ASP.NET MVC. Fica para uma fase posterior a recolha de informação no cliente (browser).
Para ativar o Application Insights e o Primavera.CoreLib.Telemetry é apenas necessário realizar as seguintes operações no
host da aplicação:
(1) Instalar o package Microsoft.ApplicationInsights.Web
(2) Instalar o package Primavera.CoreLib.Telemetry
Configuração do Application Insights
Dado o desenho do Application Insights não é possível encapsular a instalação do seu package nem a configuração necessária no host.
Quando o package é instalado, serão instalados na verdade dos seguintes packages relacionados:
Microsoft.ApplicationInsightsMicrosoft.ApplicationInsights.Agent.InterceptMicrosoft.ApplicationInsights.DependencyCollectorMicrosoft.ApplicationInsights.PerfCounterCollectorMicrosoft.ApplicationInsights.WebMicrosoft.ApplicationInsights.WindowsServerMicrosoft.ApplicationInsights.WindowsServer.TelemetryChannel
A instalação desses packages criará um ficheiro ApplicationInsights.config na root do host e fará algumas alterações
ao ficheiro Web.config:
<system.web>
(...)
<httpModules>
(...)
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
(...)
<\system.web>
(...)
<system.webServer>
(...)
<modules>
(...)
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules>
(...)
<\system.webServer>
Todas estas configurações são necessárias para o serviço funcionar corretametne.
Configuração do CoreLib Telemetry
A assembly Primavera.CoreLib.Telemetry disponibiliza um conjunto de tipos que complementam ou simplificam a interação com o
Application Insights (AI).
Um dos aspectos que o AI permite é o de recolher informação sobre as exceções não tratadas no host. No entanto, a configuração
dessa funcionalidade é manual e por isso está encapsulada no componente Primavera.Core.Telemetry.HttpMvcApplicationTelemetry.
Esse comportamento está implementado da seguinte forma.
(1) No ficheiro Global.asax.cs, o evento Application_Start()sinaliza o arranque da aplicação para permitir que a telemetria se
configure.
protected void Application_Start(object sender, EventArgs e)
{
// Start telemetry
HttpMvcApplicationTelemetry.Start();
// Notify the global application events handler
GlobalApplicationEventsHandler.OnApplicationStart(this);
}
Em Primavera.Core.Telemetry.HttpMvcApplicationTelemetry:
private static void SetupGlobalFilters(TelemetryConfiguration configuration)
{
// Collect not handled exceptions?
if (configuration.Enabled && configuration.ServerTelemetryEnabled && configuration.CollectServerUnhandledExceptions)
{
GlobalFilterCollection filters = GlobalFilters.Filters;
if (filters == null)
{
// Tracing
HttpMvcApplicationTelemetry.TracingCategory.Error("GlobalFilters collection is null.");
// Throw error
throw new TelemetryException(Properties.Resources.RES_Error_GlobalFilterCollectionNull);
}
filters.Add(new TelemetryHandleErrorAttribute());
// Tracing
HttpMvcApplicationTelemetry.TracingCategory.Verbose("Added '{0}' global filter.", typeof(TelemetryHandleErrorAttribute));
}
}
(2) Note-se que ativação deste comportamento está dependente do setting CollectServerUnhandledExceptions que está inativo por defeito.
(3) Assim, sempre que uma exceção não tratada ocorrer, desde que no web.config os custom errors estejam desligados, o evento será
recolhido no AI (ver Primavera.Core.Telemetry.TelemetryHandleErrorAttribute).
/// <summary>
/// Called when an exception occurs.
/// </summary>
/// <param name="filterContext">The action-filter context.</param>
public override void OnException(ExceptionContext filterContext)
{
// Tracing
Tracing.Category(nameof(TelemetryHandleErrorAttribute))
.Information("Unhandled exception raised.");
// Initialized?
if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
{
// Only if customError is enabled
if (filterContext.HttpContext.IsCustomErrorEnabled)
{
// Set the exception source
filterContext.Exception.SetSource(nameof(TelemetryHandleErrorAttribute));
// Write (using tracing listener)
TelemetryTracingListener.WriteException(filterContext.Exception);
// Tracing
Tracing.Category(nameof(TelemetryHandleErrorAttribute))
.Information("Collected unhandled exception.");
}
else
{
// Tracing
Tracing.Category(nameof(TelemetryHandleErrorAttribute))
.Information("CustomError is enabled. Exception will not be collected.");
}
}
// Default behavior
base.OnException(filterContext);
}
Tracing
Está disponível também um tracing listener que facilita o registo de eventos de tracing para o AppInsights. O seu registo deve ser feito da seguinte forma:
<tracingConfiguration>
<elements>
<add name="default" level="Error">
<listeners>
<add type="Primavera.Core.Telemetry.TracingListeners.TelemetryTracingListener, Primavera.CoreLib.Telemetry, Version=3.0.0.0, Culture=neutral, PublicKeyToken=33086db60a481256" />
</listeners>
</add>
</elements>
</tracingConfiguration>
TelemetryWriter
O componente Primavera.Core.Telemetry.TelemetryWriter disponibiliza a API completa para registo
de eventos, erros, etc na telemetria.
Eis um exemplo da sua utilização:
public void WriteSomeTelemetry()
{
using (TelemetryWriter writer = new TelemetryWriter())
{
writer.WriteEvent("event");
writer.WriteException(new InvalidOperationException());
writer.WriteMetric("metric", 10);
writer.WriteTrace(TelemetrySeverityLevel.Warning, "trace");
}
}
Os métodos disponibilizados são os seguintes:
- WriteEvent - para registar um evento custom.
- WriteException - para registar um erro.
- WriteMetric - para registar uma métrica.
- WriteTrace - para registar um registo de trace.
Ativação do Serviço
Para o serviço recolher realmente os dados no Azure é necessário configurar os app settings do host para incluirem a instrumentation key correspondente.
Questões
- P: Não está a ser recolhida nenhuma informação no application insights. Porquê?
- R: Provavelmente porque a instrumentation key não está definida ou as configurações no
web.confige/ou noapplicationinsights.configestá incorretas.
- R: Provavelmente porque a instrumentation key não está definida ou as configurações no
- P: Não está a ser recolhida qualquer informação sobre exceções não tratadas. Porquê?
- R: Provavelmente porque os custom errors estão ativos no
web.config.
- R: Provavelmente porque os custom errors estão ativos no