Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Reveja as diretrizes de suporte do SDK do Application Insights para nossa política de suporte do SDK de API Clássica.
Cuidado
Recomendamos o Azure Monitor OpenTelemetry Distro para novos aplicativos ou novos clientes, para impulsionar o Application Insights do Azure Monitor. A Distribuição do OpenTelemetry do Azure Monitor oferece funcionalidade e experiência semelhantes às do SDK do Application Insights. É possível migrar do SDK do Application Insights usando os guias de migração para .NET, Node.js e Python, mas ainda estamos trabalhando para adicionar mais alguns recursos para compatibilidade com versões anteriores.
Este artigo explica como habilitar e configurar o Application Insights para aplicativos ASP.NET, ASP.NET Core e Serviço de Trabalho (não HTTP). O Application Insights pode coletar a seguinte telemetria dos seus aplicativos:
- Solicitações
- Dependências
- Exceptions
- Contadores de desempenho
- Rastreamentos (Logs)
- Pulsações
- Eventos e métricas personalizados (requer instrumentação manual)
- Exibições de página (requer SDK do JavaScript para páginas da Web)
- Testes de disponibilidade (requer a configuração manual de testes de disponibilidade)
Cenários com suporte
Observação
O SDK para ASP.NET Core e o SDK para Serviço de Trabalho do Application Insights podem monitorar os aplicativos, independentemente de onde ou como eles são executados. Se o seu aplicativo estiver em execução e tiver conectividade de rede com o Azure, será possível coletar telemetria.
| Suportado | ASP.NET | ASP.NET Core | Serviço de Trabalho |
|---|---|---|---|
| Sistema operacional | Windows | Windows, Linux ou macOS | Windows, Linux ou macOS |
| Método de hospedagem | Em processo (IIS ou IIS Express) | Em processo ou fora de processo | Console ou serviço em segundo plano (é executado como um processo, normalmente por meio da dotnet CLI ou como um daemon do Windows Service/Linux) |
| Método de implantação | Implantação da Web, MSI ou cópia de arquivo manual | Dependente da estrutura ou autocontido | Dependente da estrutura ou autocontido |
| Servidor Web | Serviços de Informações da Internet (IIS) | Internet Information Server (IIS) ou Kestrel | Não aplicável (nenhum servidor Web; projetado para cargas de trabalho não HTTP, como mensagens, tarefas em segundo plano e aplicativos de console) |
| Plataforma de hospedagem | Serviço de Aplicativo do Azure (Windows), Máquinas Virtuais do Azure ou servidores locais | O recurso Aplicativos Web do Serviço de Aplicativo do Azure, Máquinas Virtuais do Azure, Docker e Serviço de Kubernetes do Azure (AKS) | Máquinas Virtuais do Azure, AKS (Serviço de Kubernetes do Azure), contêineres ou qualquer ambiente em que o .NET Core tem suporte |
| Versão do .NET | .NET Framework 4.6.1 e posterior | Todas as versões do .NET oficialmente suportadas que não estão em visualização | Todas as versões do .NET oficialmente suportadas que não estão em visualização |
| IDE | Visual Studio | Visual Studio, Visual Studio Code ou linha de comando | Visual Studio, Visual Studio Code ou linha de comando |
Observação
Um serviço de trabalho é um aplicativo em segundo plano de execução longa que executa tarefas fora de um pipeline de solicitação/resposta HTTP. O SDK do Application Insights para Serviço de Trabalho pode ser usado no recém-introduzido Serviço de Trabalho do .NET Core, tarefas em segundo plano no ASP.NET Core e aplicativos de console como .NET Core e .NET Framework.
O SDK do Worker Service não coleta telemetria por si só. Em vez disso, ele traz outros coletores de automóveis conhecidos do Application Insights, como DependencyCollector, PerfCounterCollector e ApplicationInsightsLoggingProvider. O SDK expõe extensões de métodos em IServiceCollection para habilitar e configurar a coleta de telemetria.
Adicionar Application Insights
Pré-requisitos
- Uma assinatura do Azure. Se ainda não tiver, crie uma conta gratuita do Azure.
- Um recurso do Application Insights baseado em espaço de trabalho.
- Um aplicativo em funcionamento. Se você ainda não tiver um, consulte Criar um aplicativo Web básico.
- A última versão do Visual Studio com as seguintes cargas de trabalho:
- Desenvolvimento Web e ASP.NET
- Desenvolvimento do Azure
Criar um aplicativo Web básico
Se você ainda não tem um aplicativo Web funcional, use as diretrizes a seguir para criar um.
- Abra o Visual Studio.
- Selecione Criar um novo projeto.
- Escolha Aplicativo Web ASP.NET (.NET Framework) com C# e selecione Avançar.
- Insira um Nome do projeto e selecione Criar.
- Escolha MVC e selecione Criar.
Adicionar o Application Insights automaticamente (Visual Studio)
Esta seção orienta você a adicionar automaticamente o Application Insights a um aplicativo Web baseado em modelo.
Observação
Há um problema conhecido no Visual Studio 2019: o armazenamento da chave de instrumentação ou da cadeia de conexão em um segredo do usuário não está funcionando para aplicativos baseados no .NET Framework. A chave precisa ser codificada no arquivo Applicationinsights.config para contornar esse bug.
No projeto do aplicativo Web ASP.NET no Visual Studio:
Selecione Projeto>Adicionar Application Insights Telemetry>SDK do Application Insights (local)>Próximo>Finalizar>Fechar.
Abra o arquivo ApplicationInsights.config.
Antes de fechar a tag
</ApplicationInsights>, adicione uma linha contendo a cadeia de conexão para seu recurso do Application Insights. Encontre a cadeia de conexão no painel de visão geral do recurso recém-criado do Application Insights.<ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>Selecione Projeto>Gerenciar Pacotes do NuGet>Atualizações. Em seguida, atualize cada pacote de NuGet
Microsoft.ApplicationInsightspara a versão estável mais recente.Execute o aplicativo selecionando IIS Express. Um aplicativo ASP.NET básico será aberto. Enquanto você navega pelas páginas do site, a telemetria é enviada para o Application Insights.
Adicionar o Application Insights manualmente (sem Visual Studio)
Esta seção orienta você a adicionar manualmente o Application Insights a um aplicativo Web baseado em modelo.
Adicione os seguintes pacotes NuGet e suas dependências ao projeto:
Em alguns casos, o arquivo ApplicationInsights.config é criado automaticamente para você. Se o arquivo já estiver presente, pule para a quarta etapa.
Se ele ainda não tiver sido criado, faça isso. No diretório raiz de um aplicativo ASP.NET, crie um arquivo chamado ApplicationInsights.config.
Copie a seguinte configuração XML para o arquivo recém-criado:
Expandir para exibir a configuração
<?xml version="1.0" encoding="utf-8"?> <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings"> <TelemetryInitializers> <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer" /> <Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web"> <!-- Extended list of bots: search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client--> <Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters> </Add> <Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.AzureAppServiceRoleNameFromHostNameHeaderInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web" /> </TelemetryInitializers> <TelemetryModules> <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector"> <ExcludeComponentCorrelationHttpHeadersOnDomains> <!-- Requests to the following hostnames will not be modified by adding correlation headers. Add entries here to exclude additional hostnames. NOTE: this configuration will be lost upon NuGet upgrade. --> <Add>core.windows.net</Add> <Add>core.chinacloudapi.cn</Add> <Add>core.cloudapi.de</Add> <Add>core.usgovcloudapi.net</Add> </ExcludeComponentCorrelationHttpHeadersOnDomains> <IncludeDiagnosticSourceActivities> <Add>Microsoft.Azure.EventHubs</Add> <Add>Azure.Messaging.ServiceBus</Add> </IncludeDiagnosticSourceActivities> </Add> <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector"> <!-- Use the following syntax here to collect additional performance counters: <Counters> <Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" /> ... </Counters> PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName NOTE: performance counters configuration will be lost upon NuGet upgrade. The following placeholders are supported as InstanceName: ??APP_WIN32_PROC?? - instance name of the application process for Win32 counters. ??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters. ??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters. --> </Add> <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.AppServicesHeartbeatTelemetryModule, Microsoft.AI.WindowsServer" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureInstanceMetadataTelemetryModule, Microsoft.AI.WindowsServer"> <!-- Remove individual fields collected here by adding them to the ApplicationInsighs.HeartbeatProvider with the following syntax: <Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights"> <ExcludedHeartbeatProperties> <Add>osType</Add> <Add>___location</Add> <Add>name</Add> <Add>offer</Add> <Add>platformFaultDomain</Add> <Add>platformUpdateDomain</Add> <Add>publisher</Add> <Add>sku</Add> <Add>version</Add> <Add>vmId</Add> <Add>vmSize</Add> <Add>subscriptionId</Add> <Add>resourceGroupName</Add> <Add>placementGroupId</Add> <Add>tags</Add> <Add>vmScaleSetName</Add> </ExcludedHeartbeatProperties> </Add> NOTE: exclusions will be lost upon upgrade. --> </Add> <Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer"> <!--</Add> <Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">--> </Add> <Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web"> <Handlers> <!-- Add entries here to filter out additional handlers: NOTE: handler configuration will be lost upon NuGet upgrade. --> <Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add> <Add>System.Web.StaticFileHandler</Add> <Add>System.Web.Handlers.AssemblyResourceLoader</Add> <Add>System.Web.Optimization.BundleHandler</Add> <Add>System.Web.Script.Services.ScriptHandlerFactory</Add> <Add>System.Web.Handlers.TraceHandler</Add> <Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add> <Add>System.Web.HttpDebugHandler</Add> </Handlers> </Add> <Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" /> <Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web" /> </TelemetryModules> <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" /> <TelemetrySinks> <Add Name="default"> <TelemetryProcessors> <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector" /> <Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights" /> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> <ExcludedTypes>Event</ExcludedTypes> </Add> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> <IncludedTypes>Event</IncludedTypes> </Add> <!-- Adjust the include and exclude examples to specify the desired semicolon-delimited types. (Dependency, Event, Exception, PageView, Request, Trace) --> </TelemetryProcessors> <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel" /> </Add> </TelemetrySinks> <!-- Learn more about Application Insights configuration with ApplicationInsights.config here: http://go.microsoft.com/fwlink/?LinkID=513840 --> <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString> </ApplicationInsights>Adicione a cadeia de conexão, o que pode ser feito de duas maneiras:
(Recomendado) Defina a cadeia de conexão na configuração.
Antes da marca de fechamento
</ApplicationInsights>em ApplicationInsights.config, adicione a cadeia de conexão ao recurso do Application Insights. Você encontrará a cadeia de conexão no painel de visão geral do recurso recém-criado do Application Insights.<ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>Defina a string de conexão no código.
Forneça uma cadeia de conexão na classe program.cs.
var configuration = new TelemetryConfiguration { ConnectionString = "Copy the connection string from your Application Insights resource" };
No mesmo nível do projeto que o arquivo ApplicationInsights.config, crie uma pasta chamada ErrorHandler com um novo arquivo C# chamado AiHandleErrorAttribute.cs. O conteúdo do arquivo é semelhante ao seguinte:
using System; using System.Web.Mvc; using Microsoft.ApplicationInsights; namespace WebApplication10.ErrorHandler //namespace will vary based on your project name { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class AiHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null) { //If customError is Off, then AI HTTPModule will report the exception if (filterContext.HttpContext.IsCustomErrorEnabled) { var ai = new TelemetryClient(); ai.TrackException(filterContext.Exception); } } base.OnException(filterContext); } } }Na pasta App_Start, abra o arquivo FilterConfig.cs e altere-o para corresponder ao exemplo:
using System.Web; using System.Web.Mvc; namespace WebApplication10 //Namespace will vary based on project name { public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new ErrorHandler.AiHandleErrorAttribute()); } } }Se o Web.config já estiver atualizado, ignore esta etapa. Caso contrário, atualize o arquivo conforme mostrado a seguir:
Expandir para exibir a configuração
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit https://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.7.2" /> <httpRuntime targetFramework="4.7.2" /> <!-- Code added for Application Insights start --> <httpModules> <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" /> </httpModules> <!-- Code added for Application Insights end --> </system.web> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" /> <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0" /> </dependentAssembly> <!-- Code added for Application Insights start --> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /> </dependentAssembly> <!-- Code added for Application Insights end --> </assemblyBinding> </runtime> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" /> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /> </compilers> </system.codedom> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <!-- Code added for Application Insights start --> <modules> <remove name="TelemetryCorrelationHttpModule" /> <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler" /> <remove name="ApplicationInsightsWebTracking" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> </modules> <!-- Code added for Application Insights end --> </system.webServer> </configuration>
Até aqui, você configurou com sucesso o monitoramento de aplicativos do lado do servidor. Se você executar o aplicativo Web, a telemetria começará a aparecer no Application Insights.
Verificar se o Application Insights recebe telemetria
Execute o aplicativo e faça solicitações a ele. A telemetria agora deve fluir para o Application Insights. O SDK do Application Insights coleta automaticamente as solicitações da Web recebidas pelo aplicativo, juntamente com a telemetria a seguir.
Configurar telemetria
Nesta seção
- Métricas dinâmicas
- Rastreamentos (logs)
- Rastreamento distribuído
- Dependências
- Exceções
- Métricas personalizadas
- Operações personalizadas
Métricas em tempo real
Métricas dinâmicas podem ser usadas para verificar rapidamente se o monitoramento de aplicativo com o Application Insights está configurado corretamente. A telemetria pode levar alguns minutos para aparecer no portal do Azure, mas o painel de métricas dinâmicas mostra o uso da CPU do processo em execução quase em tempo real. Ele também pode mostrar outras telemetrias, como solicitações, dependências, rastreamentos etc.
Observação
As métricas dinâmicas são habilitadas por padrão durante a integração usando as instruções recomendadas para aplicativos .NET.
Habilitar métricas dinâmicas usando código para qualquer aplicativo .NET
Para configurar manualmente as métricas em tempo real:
Instale o pacote NuGet Microsoft.ApplicationInsights.PerfCounterCollector.
O exemplo de código de aplicativo de console a seguir mostra como configurar as métricas dinâmicas:
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse;
using System;
using System.Threading.Tasks;
namespace LiveMetricsDemo
{
class Program
{
static void Main(string[] args)
{
// Create a TelemetryConfiguration instance.
TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();
config.InstrumentationKey = "INSTRUMENTATION-KEY-HERE";
QuickPulseTelemetryProcessor quickPulseProcessor = null;
config.DefaultTelemetrySink.TelemetryProcessorChainBuilder
.Use((next) =>
{
quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
return quickPulseProcessor;
})
.Build();
var quickPulseModule = new QuickPulseTelemetryModule();
// Secure the control channel.
// This is optional, but recommended.
quickPulseModule.AuthenticationApiKey = "YOUR-API-KEY-HERE";
quickPulseModule.Initialize(config);
quickPulseModule.RegisterTelemetryProcessor(quickPulseProcessor);
// Create a TelemetryClient instance. It is important
// to use the same TelemetryConfiguration here as the one
// used to set up live metrics.
TelemetryClient client = new TelemetryClient(config);
// This sample runs indefinitely. Replace with actual application logic.
while (true)
{
// Send dependency and request telemetry.
// These will be shown in live metrics.
// CPU/Memory Performance counter is also shown
// automatically without any additional steps.
client.TrackDependency("My dependency", "target", "http://sample",
DateTimeOffset.Now, TimeSpan.FromMilliseconds(300), true);
client.TrackRequest("My Request", DateTimeOffset.Now,
TimeSpan.FromMilliseconds(230), "200", true);
Task.Delay(1000).Wait();
}
}
}
}
Rastreamentos (logs)
Esta seção explica como enviar logs de rastreamento de diagnóstico de ASP.NET ou aplicativos do ASP.NET Core para o Application Insights e, em seguida, explorar/pesquisar esses logs no portal.
Você pode usar logs de rastreamento para identificar rastreamentos associados a cada solicitação de usuário e correlacionar-os com outros eventos e relatórios de exceção.
O Application Insights captura logs de ASP.NET Core e outros aplicativos .NET por meio de ILogger e de ASP.NET clássico (.NET Framework) por meio do SDK clássico e de adaptadores.
Observação
Por padrão, o provedor do Application Insights só envia logs com gravidade
Warningou superior. Para incluir logs deInformationou nível inferior, atualize as configurações de nível de log emappsettings.json.O pacote NuGet
Microsoft.ApplicationInsights.WorkerService, usado para habilitar o Application Insights para serviços em segundo plano, está fora do escopo.Para revisar perguntas frequentes (FAQ), confira Perguntas frequentes sobre registro em log com .NET.
Escolha uma estratégia de log de eventos para produzir logs de diagnóstico que o Application Insights pode capturar.
Instalar registro no seu aplicativo
Para aplicativos de ASP.NET clássicos que usam o rastreamento System.Diagnostics, configure um Application Insights TraceListener no arquivo de configuração.
Adicionar um ouvinte a web.config ou app.config:
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add name="myAppInsightsListener"
type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Observação
O módulo de captura de log é um adaptador útil para agentes de terceiros. No entanto, se você ainda não estiver usando NLog, log4Net ou System.Diagnostics.Trace, considere chamar o Application Insights TrackTrace() diretamente.
Configurar o Application Insights para coletar logs
Opção 1: Adicione o Application Insights ao seu projeto se você ainda não fez isso. Ao adicionar o Application Insights no Visual Studio, há uma opção para incluir o coletor de logs.
Opção 2: Clique com o botão direito do mouse no projeto no Gerenciador de Soluções para configurar o Application Insights. Selecione a opção Configurar coleção de rastreamento .
Observação
Se você estiver perdendo o menu do Application Insights ou a opção coletor de logs, consulte o artigo de solução de problemas dedicado.
Instalação manual
Use esse método se o tipo de projeto não for compatível com o instalador do Application Insights (por exemplo, alguns cenários de desktop/console) ou se preferir um controle explícito no nível do pacote.
No Gerenciador de Soluções, clique com o botão direito do mouse em seu projeto e selecione Gerenciar Pacotes NuGet.
Pesquise Application Insights.
Selecione um dos seguintes pacotes:
-
ILogger: Microsoft.Extensions.Logging.ApplicationInsights
-
System.Diagnostics: Microsoft.ApplicationInsights.TraceListener
-
log4net: Microsoft.ApplicationInsights.Log4NetAppender
-
NLog: Microsoft.ApplicationInsights.NLogTarget
-
Microsoft.ApplicationInsights.EventSourceListener
-
Microsoft.ApplicationInsights.DiagnosticSourceListener
-
Microsoft.ApplicationInsights.EtwCollector
-
ILogger: Microsoft.Extensions.Logging.ApplicationInsights
O pacote NuGet instala os assemblies necessários e modifica web.config ou app.config, se aplicável.
Instruções de instalação:
Observação
Expanda qualquer uma das seções abaixo para obter instruções de instalação específicas do pacote.
ILogger
Instale os
Microsoft.Extensions.Logging.ApplicationInsights.Adicionar
ApplicationInsightsLoggerProvider:
using Microsoft.Extensions.Logging.ApplicationInsights;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Logging.AddApplicationInsights(
configureTelemetryConfiguration: (config) =>
config.ConnectionString = builder.Configuration.GetConnectionString("APPLICATIONINSIGHTS_CONNECTION_STRING"),
configureApplicationInsightsLoggerOptions: (options) => { }
);
builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("your-category", LogLevel.Trace);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Com o pacote NuGet instalado e o provedor sendo registrado com injeção de dependência, o aplicativo está pronto para o log. Com a injeção de construtor, exija uma ILogger ou a alternativa de tipo genérico ILogger<TCategoryName>, conforme necessário. Quando essas implementações forem resolvidas, o ApplicationInsightsLoggerProvider as fornecerá. As mensagens ou exceções registradas são enviadas para o Application Insights.
Considere o seguinte exemplo de controlador:
public class ValuesController : ControllerBase
{
private readonly ILogger _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
_logger.LogWarning("An example of a Warning trace..");
_logger.LogError("An example of an Error level message");
return new string[] { "value1", "value2" };
}
}
Para obter mais informações, confira Registrar em log no ASP.NET Core e Qual tipo de telemetria do Application Insights é produzido a partir de logs do ILogger? Onde posso ver os logs do ILogger no Application Insights?.
Inserir chamadas de log de diagnóstico (System.Diagnostics.Trace / log4net / NLog)
Se você usar System.Diagnostics.Trace, uma chamada típica será:
System.Diagnostics.Trace.TraceWarning("Slow response - database01");
Se preferir log4net ou NLog, use:
logger.Warn("Slow response - database01");
Usar eventos EventSource
Você pode configurar eventos System.Diagnostics.Tracing.EventSource para serem enviados ao Application Insights como rastreamentos.
Instale o pacote do NuGet
Microsoft.ApplicationInsights.EventSourceListener.Edite a
TelemetryModulesseção do arquivo ApplicationInsights.config :<Add Type="Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule, Microsoft.ApplicationInsights.EventSourceListener"> <Sources> <Add Name="MyCompany" Level="Verbose" /> </Sources> </Add>
Para cada origem, você pode definir os seguintes parâmetros:
- O nome especifica o nome do EventSource a ser coletado.
- O nível especifica o nível de registros em log a ser coletado: Crítico, Erro, Informativo, LogAlways, Detalhado ou Aviso.
- Palavras-chave (opcional) especificam o valor inteiro das combinações de palavras-chave a serem usadas.
Usar eventos do DiagnosticSource
Você pode configurar eventos System.Diagnostics.DiagnosticSource para serem enviados ao Application Insights como rastreamentos.
Instale o pacote do NuGet
Microsoft.ApplicationInsights.DiagnosticSourceListener.Edite a
TelemetryModulesseção do arquivo ApplicationInsights.config :<Add Type="Microsoft.ApplicationInsights.DiagnosticSourceListener.DiagnosticSourceTelemetryModule, Microsoft.ApplicationInsights.DiagnosticSourceListener"> <Sources> <Add Name="MyDiagnosticSourceName" /> </Sources> </Add>
Para cada fonte de diagnóstico que você deseja rastrear, adicione uma entrada com o Name atributo definido como o nome da fonte de diagnóstico.
Usar eventos ETW
Você pode configurar eventos de ETW (Rastreamento de Eventos para Windows) a serem enviados ao Application Insights como rastreamentos.
Instale o pacote do NuGet
Microsoft.ApplicationInsights.EtwCollector.Edite a seção "TelemetryModules" do arquivo ApplicationInsights.config :
Observação
Eventos ETW só poderão ser coletados se o processo que hospeda o SDK estiver em execução em uma identidade que seja membro dos administradores ou usuários de log de desempenho.
<Add Type="Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule, Microsoft.ApplicationInsights.EtwCollector">
<Sources>
<Add ProviderName="MyCompanyEventSourceName" Level="Verbose" />
</Sources>
</Add>
Para cada origem, você pode definir os seguintes parâmetros:
- ProviderName é o nome do provedor ETW a ser coletado.
-
ProviderGuid especifica o GUID do provedor ETW para coleta. Ele pode ser usado em vez de
ProviderName. - Nível define o nível de registros em log a ser coletado. Ele pode ser Crítico, Erro, Informativo, LogAlways, Detalhado ou Aviso.
- Palavras-chave (opcional) definem o valor inteiro das combinações de palavras-chave a serem usadas.
Utilizar a API de Rastreio diretamente
Você pode chamar a API de rastreamento do Application Insights diretamente. Os adaptadores de registro usam essa API. Por exemplo:
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow response - database01");
Uma vantagem de TrackTrace é que você pode colocar dados relativamente longos na mensagem. Por exemplo, você pode codificar dados POST lá.
Você também pode adicionar um nível de severidade à sua mensagem. E, como outra telemetria, você pode adicionar propriedades para ajudar a filtrar ou pesquisar diferentes conjuntos de rastros. Por exemplo:
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow database response",
SeverityLevel.Warning,
new Dictionary<string, string> { { "database", "db.ID" } });
Agora você pode filtrar facilmente na Pesquisa de Transações todas as mensagens de um nível de severidade específico relacionado a um banco de dados específico.
Aplicativo de console
Para adicionar o registro em log do Application Insights aos aplicativos de console, primeiro instale os seguintes pacotes NuGet:
O exemplo a seguir usa o pacote Microsoft.Extensions.Logging.ApplicationInsights e demonstra o comportamento padrão de um aplicativo de console. O pacote Microsoft.Extensions.Logging.ApplicationInsights deve ser usado em um aplicativo de console ou sempre que você quiser uma implementação mínima do Application Insights sem o conjunto completo de recursos, como métricas, rastreamento distribuído, amostragem e inicializadores de telemetria.
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using var channel = new InMemoryChannel();
try
{
IServiceCollection services = new ServiceCollection();
services.Configure<TelemetryConfiguration>(config => config.TelemetryChannel = channel);
services.AddLogging(builder =>
{
// Only Application Insights is registered as a logger provider
builder.AddApplicationInsights(
configureTelemetryConfiguration: (config) => config.ConnectionString = "<YourConnectionString>",
configureApplicationInsightsLoggerOptions: (options) => { }
);
});
IServiceProvider serviceProvider = services.BuildServiceProvider();
ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogInformation("Logger is working...");
}
finally
{
// Explicitly call Flush() followed by Delay, as required in console apps.
// This ensures that even if the application terminates, telemetry is sent to the back end.
channel.Flush();
await Task.Delay(TimeSpan.FromMilliseconds(1000));
}
Para obter mais informações, confira Qual tipo de telemetria do Application Insights é produzido a partir de logs do ILogger? Onde posso ver os logs do ILogger no Application Insights?.
Escopos de registro de log
Observação
As diretrizes a seguir se aplicam a cenários ILogger (somente ASP.NET Core e console). Ele não se aplica ao ASP.NET clássico.
ApplicationInsightsLoggingProvider dá suporte a escopos de log, que estão habilitados por padrão.
Se o escopo for do tipo IReadOnlyCollection<KeyValuePair<string,object>>, cada par chave-valor na coleção será adicionado à telemetria do Application Insights como propriedades personalizadas. No exemplo a seguir, os logs são capturados como TraceTelemetry e têm ("MyKey", "MyValue") nas propriedades.
using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
_logger.LogError("An example of an Error level message");
}
Se qualquer outro tipo for usado como escopo, ele será armazenado sob a propriedade Scope na telemetria do Application Insights. No exemplo a seguir, TraceTelemetry tem uma propriedade chamada Scope que contém o escopo.
using (_logger.BeginScope("hello scope"))
{
_logger.LogError("An example of an Error level message");
}
Localizar seus logs
Execute seu aplicativo no modo de depuração ou implante-o ao vivo.
Explorar na Pesquisa de Transações
No painel de visão geral do aplicativo no portal do Application Insights, selecione Pesquisa de Transações , onde você pode:
- Filtrar registros de log ou itens com propriedades específicas.
- Inspecione um item específico em detalhes.
- Encontre outros dados de log do sistema relacionados à mesma solicitação de usuário (tem a mesma ID de operação).
- Salve a configuração de uma página como favorito.
Observação
Se o aplicativo enviar grandes quantidades de dados e você estiver usando o SDK do Application Insights para ASP.NET versão 2.0.0-beta3 ou posterior, o recurso de amostragem adaptável poderá operar e enviar apenas uma parte da telemetria. Saiba mais sobre amostragem.
Explorar nos Logs do Azure Monitor
Os logs ILogger aparecem como telemetria de rastreamento (tabela traces no Application Insights e AppTraces no Log Analytics).
Exemplo
No portal do Azure, vá para Application Insights e execute:
traces
| where severityLevel >= 2 // 2=Warning, 1=Information, 0=Verbose
| take 50
Rastreamento distribuído
As arquiteturas modernas de nuvem e microsserviços habilitaram serviços simples e independentemente implantáveis que reduzem os custos, aumentando a disponibilidade e a taxa de transferência. No entanto, tornou os sistemas como um todo mais difíceis de compreender e depurar. O rastreamento distribuído resolve esse problema fornecendo um criador de perfil de desempenho que funciona como pilhas de chamadas para arquiteturas de nuvem e microsserviços.
O Azure Monitor fornece duas experiências para consumir dados de rastreamento distribuídos: a exibição de diagnóstico de transação para uma única transação/solicitação e a exibição do mapa do aplicativo para mostrar como os sistemas interagem.
O Application Insights pode monitorar cada componente separadamente e detectar qual componente é responsável por falhas ou degradação de desempenho usando a correlação de telemetria distribuída. Este artigo explica o modelo de dados, técnicas de propagação de contexto, protocolos e implementação de táticas de correlação em diferentes linguagens e plataformas usadas pelo Application Insights.
Habilitar o rastreamento distribuído por meio do Application Insights por meio de SDKs ou auto-instrumentação
Os agentes do Application Insights e os SDKs para .NET, .NET Core, Java, Node.jse JavaScript dão suporte ao rastreamento distribuído nativamente.
Com o SDK do Application Insights adequado instalado e configurado, as informações de rastreamento são coletadas automaticamente para estruturas, bibliotecas e tecnologias populares por coletores automáticos de dependência do SDK. A lista completa de tecnologias com suporte está disponível na Documentação de autocoleta de dependência.
Qualquer tecnologia também pode ser rastreada manualmente usando TrackDependency no TelemetryClient.
Modelo de dados para correlação de telemetria
O Application Insights define um modelo de dados para correlação de telemetria distribuída. Para associar a telemetria a uma operação lógica, cada item de telemetria tem um campo de contexto chamado operation_Id. Cada item de telemetria no rastreamento distribuído compartilha esse identificador. Portanto, mesmo se você perder a telemetria de uma única camada, ainda poderá associar a telemetria relatada por outros componentes.
Uma operação lógica distribuída normalmente consiste em um conjunto de operações menores que são solicitações processadas por um dos componentes.
Telemetria de solicitação define essas operações. Cada item de telemetria de solicitação tem o seu próprio id que o identifica exclusivamente e globalmente. E todos os itens de telemetria (como rastreamentos e exceções) associados à solicitação devem definir o operation_parentId ao valor da solicitação id.
A telemetria de dependência representa todas as operações de saída, como uma chamada HTTP para outro componente. Ele também define seu próprio id que é globalmente exclusivo. A telemetria de solicitação, iniciada por essa chamada de dependência, usa este id como operation_parentId.
Você pode criar uma exibição da operação lógica distribuída usando operation_Id, operation_parentIde request.id com dependency.id. Esses campos também definem a ordem causalidade das chamadas de telemetria.
Em um ambiente de microsserviços, os rastreamentos de componentes podem ir para diferentes itens de armazenamento. Cada componente pode ter sua própria cadeia de conexão no Application Insights. Para obter telemetria para a operação lógica, o Application Insights consulta dados de cada item de armazenamento.
Quando o número de itens de armazenamento é grande, você precisa de uma dica sobre onde procurar em seguida. O modelo de dados do Application Insights define dois campos para resolver esse problema: request.source e dependency.target. O primeiro campo identifica o componente que iniciou a solicitação de dependência. O segundo campo identifica qual componente retornou a resposta da chamada de dependência.
Para obter informações sobre como consultar dados de várias instâncias, consulte Consultar dados em espaços de trabalho, aplicativos e recursos do Log Analytics no Azure Monitor.
Example
Vamos examinar um exemplo. Um aplicativo chamado Preços de Ações mostra o preço de mercado atual de uma ação usando uma API externa chamada Ações. O aplicativo Preços de ações tem uma página chamada Ações que o navegador da Web do cliente abre usando GET /Home/Stock. O aplicativo consulta a API de Estoque usando a chamada HTTP GET /api/stock/value.
Você pode analisar a telemetria resultante executando uma consulta:
(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id
Nos resultados, todos os itens de telemetria compartilham a raiz operation_Id. Quando uma chamada do Ajax é feita a partir da página, uma nova ID exclusiva (qJSXU) é atribuída à telemetria de dependência e a ID do pageView é usada como operation_ParentId. Em seguida, a solicitação do servidor usa a ID do Ajax como operation_ParentId.
| tipoDeItem | nome | ID | operation_ParentId | operation_Id |
|---|---|---|---|---|
| pageView | Página de ações | STYz |
STYz |
|
| dependência | GET /Home/Stock | qJSXU |
STYz |
STYz |
| solicitação | GET Início/Estoque | KqKwlrSt9PA= |
qJSXU |
STYz |
| dependência | GET /api/stock/value | bBrf2L7mm2g= |
KqKwlrSt9PA= |
STYz |
Quando a chamada GET /api/stock/value é feita para um serviço externo, você precisa saber a identidade desse servidor para que possa definir o dependency.target campo adequadamente. Quando o serviço externo não dá suporte ao monitoramento, target é definido como o nome do host do serviço. Um exemplo é stock-prices-api.com. No entanto, se o serviço se identificar retornando um cabeçalho HTTP predefinido, target contém a identidade de serviço que permite ao Application Insights criar um rastreamento distribuído consultando a telemetria desse serviço.
Cabeçalhos de correlação usando o TraceContext W3C
O Application Insights está fazendo a transição para o Contexto de Rastreamento do W3C, que define:
-
traceparent: Carrega a ID de operação globalmente única e o identificador exclusivo da chamada. -
tracestate: contém o contexto de rastreamento específico do sistema.
A versão mais recente do SDK do Application Insights dá suporte ao protocolo Trace-Context, mas talvez seja necessário aceitar. (A compatibilidade retroativa com o protocolo de correlação anterior, suportado pelo SDK do Application Insights, é mantida.)
O protocolo HTTP de correlação, também chamado request-Id, está sendo preterido. Este protocolo define dois cabeçalhos:
-
Request-Id: Carrega a identificação global exclusiva da chamada. -
Correlation-Context: carrega a coleção de pares nome-valor das propriedades de rastreamento distribuído.
O Application Insights também define a extensão para o protocolo HTTP de correlação. Ele usa pares nome-valor de Request-Context para propagar a coleção de propriedades usadas pelo computador chamado ou chamador imediato. O SDK do Application Insights usa esse cabeçalho para definir os campos dependency.target e request.source.
Os modelos de dados do Contexto de Rastreamento do W3C e do Application Insights são mapeados da seguinte maneira:
| Application Insights | W3C TraceContext |
|---|---|
Id de Request e Dependency |
parent-id |
Operation_Id |
trace-id |
Operation_ParentId |
parent-id do intervalo pai desse intervalo. Esse campo deve estar vazio se for um intervalo raiz. |
Para obter mais informações, consulte o modelo de dados de telemetria do Application Insights.
Habilitar o suporte ao rastreamento distribuído do W3C
O rastreamento distribuído baseado em TraceContext do W3C é habilitado por padrão em todos os SDKs recentes do .NET Framework/.NET Core, juntamente com a compatibilidade retroativa com o protocolo herdado Request-Id.
Correlação de telemetria
A correlação é tratada por padrão ao integrar um aplicativo. Nenhuma ação especial é necessária.
O runtime do .NET dá suporte ao distribuído com a ajuda de Activity e DiagnosticSource
O SDK do .NET do Application Insights usa DiagnosticSource e Activity para coletar e correlacionar a telemetria.
Dependências
Dependências acompanhadas automaticamente
Os SDKs do Application Insights para .NET e .NET Core enviados com DependencyTrackingTelemetryModule, que é um módulo de telemetria que coleta dependências automaticamente. O módulo DependencyTrackingTelemetryModule é enviado como o pacote NuGet Microsoft.ApplicationInsights.DependencyCollector e trazido automaticamente quando você usa o pacote NuGet Microsoft.ApplicationInsights.Web ou o pacote NuGet Microsoft.ApplicationInsights.AspNetCore.
No momento, DependencyTrackingTelemetryModule acompanha as seguintes dependências automaticamente:
| Dependências | Detalhes |
|---|---|
| HTTP/HTTPS | Chamadas HTTP/HTTPS locais ou remotas. |
| Chamadas WCF | Somente acompanhadas automaticamente se associações baseadas em HTTP forem usadas. |
| SQL | Chamadas feitas com SqlClient. Consulte a seção Acompanhamento avançado do SQL para obter a consulta SQL completa para capturar consultas do SQL. |
| Armazenamento de Blobs do Azure, Armazenamento de Tabelas ou Armazenamento de Filas | Chamadas feitas com o cliente do Armazenamento do Microsoft Azure. |
| SDK do cliente dos Hubs de Eventos do Azure | Use o pacote mais recente: https://nuget.org/packages/Azure.Messaging.EventHubs. |
| SDK do cliente do Barramento de Serviço do Azure | Use o pacote mais recente: https://nuget.org/packages/Azure.Messaging.ServiceBus. |
| Azure Cosmos DB | Acompanhado automaticamente se HTTP/HTTPS é usado. O rastreamento de operações no modo direto com TCP é capturado automaticamente usando o pacote de versão prévia >= 3.33.0-preview. Para obter mais detalhes, acesse a documentação. |
Se a dependência não for coletada automaticamente, você poderá acompanhá-la manualmente com um comando acompanhar chamada de dependência.
Para saber mais sobre o funcionamento do acompanhamento de dependências, confira Acompanhamento de dependências no Application Insights.
Configurar o acompanhamento automático de dependência em aplicativos de console
Para acompanhar automaticamente as dependências de aplicativos de console do .NET, instale o pacote NuGet Microsoft.ApplicationInsights.DependencyCollector e inicialize DependencyTrackingTelemetryModule:
DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule();
depModule.Initialize(TelemetryConfiguration.Active);
Observação
TelemetryConfiguration.Active está obsoleto para aplicativos de console do .NET Core.
Como acompanhar dependências manualmente
Veja a seguir exemplos de dependências que não são coletadas automaticamente e exigem acompanhamento manual:
- O Azure Cosmos DB é acompanhado automaticamente somente se HTTP/HTTPS é usado. O modo TCP não é capturado automaticamente pelo Application Insights para versões do SDK anteriores a
2.22.0-Beta1. - Redis
Para essas dependências não coletadas automaticamente pelo SDK, você pode acompanhá-las manualmente usando a API TrackDependency que é usada pelos módulos de coleção automática padrão.
Exemplo
Se você criar seu código com um assembly que não programou, você pode cronometrar todas as chamadas para ele. Esse cenário permitiria que você descobrisse qual a contribuição dele para o seu tempo de resposta.
Para que esses dados sejam exibidos nos gráficos de dependência no Application Insights, envie-os usando TrackDependency:
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
// making dependency call
success = dependency.Call();
}
finally
{
timer.Stop();
telemetryClient.TrackDependency("myDependencyType", "myDependencyCall", "myDependencyData", startTime, timer.Elapsed, success);
}
Como alternativa, TelemetryClient fornece os métodos de extensão StartOperation e StopOperation, que podem ser usados para acompanhar manualmente as dependências, conforme mostrado em Rastreamento de dependências de saída.
Desabilitar o módulo de acompanhamento de dependências padrão
Para obter mais informações, consulte os módulos de telemetria.
Acompanhamento de SQL avançado para obter a consulta SQL completa
Para chamadas SQL, o nome do servidor e do banco de dados é sempre coletado e armazenado como o nome do DependencyTelemetry coletado. Outro campo, chamado dados, pode conter o texto completo da consulta SQL.
Observação
O Azure Functions requer configurações separadas para habilitar a coleta de texto do SQL. Para obter mais informações, confira Habilitar a coleta de consultas SQL.
Para aplicativos ASP.NET, o texto completo da consulta SQL é coletado com a ajuda da instrumentação de código de byte, que requer o uso do mecanismo de instrumentação ou do pacote NuGet Microsoft.Data.SqlClient em vez da biblioteca System.Data.SqlClient. As etapas específicas da plataforma para habilitar a coleta completa da consulta SQL são descritas na tabela a seguir.
| Platform | Etapas necessárias para obter a consulta SQL completa |
|---|---|
| Aplicativos Web no Serviço de Aplicativo do Azure | No painel de controle do aplicativo Web, abra o painel do Application Insights e habilite os Comandos SQL no .NET. |
| Servidor IIS (Máquinas Virtuais do Azure, local e assim por diante) | Use o pacote NuGet Microsoft.Data.SqlClient ou o módulo Monitor do PowerShell para o Application Insights Agent para instalar o mecanismo de instrumentação e reiniciar o IIS. |
| Serviços de Nuvem do Azure | Adicionar uma tarefa de inicialização para instalar o StatusMonitor. Seu aplicativo deve ser integrado ao SDK do ApplicationInsights no momento da criação, instalando pacotes NuGet para aplicativos ASP.NET ou ASP.NET Core. |
| IIS Express | Use o pacote NuGet Microsoft.Data.SqlClient. |
| WebJobs no Serviço de Aplicativo do Azure | Use o pacote NuGet Microsoft.Data.SqlClient. |
Além das etapas anteriores específicas da plataforma, você também precisa optar explicitamente por habilitar a coleção de comandos SQL modificando o arquivo ApplicationInsights.config com o seguinte código:
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<EnableSqlCommandTextInstrumentation>true</EnableSqlCommandTextInstrumentation>
</Add>
Nos casos anteriores, a maneira adequada de confirmar que o mecanismo de instrumentação está instalado corretamente é validando que a versão do SDK do DependencyTelemetry coletado é rddp. O uso de rdddsd ou rddf indica que as dependências são coletadas por meio de callbacks DiagnosticSource ou EventSource, portanto, a consulta SQL completa não é capturada.
Exceptions
Exceções em aplicativos Web podem ser relatadas com o Application Insights. Você pode correlacionar solicitações com falha com exceções e outros eventos no cliente e no servidor, para poder diagnosticar as causas rapidamente. Nesta seção, você aprenderá a configurar relatórios de exceções, relatar exceções explicitamente, diagnosticar falhas e muito mais.
Configurar os relatórios de exceção
Você pode configurar o Application Insights para relatar exceções que ocorrem no servidor ou no cliente. Dependendo da plataforma da qual seu aplicativo depende, você precisará da extensão ou do SDK apropriado.
Para ter exceções relatadas do seu aplicativo do lado do servidor, considere os seguintes cenários:
- Adicionar a extensão do Application Insights nos aplicativos Web do Azure.
- Adicione a Extensão de Monitoramento de Aplicativos para VMs do Azure e conjuntos de dimensionamento de máquinas virtuais do Azure aplicativos hospedados pelo IIS.
- Adicione o SDK do Application Insights ao código do seu aplicativo, execute o Agente do Application Insights para servidores Web IIS ou habilite o agente Java para aplicativos Web Java.
Importante
Esta seção é focada em aplicativos do .NET Framework sob a perspectiva de um exemplo de código. Alguns dos métodos que funcionam para .NET Framework estão obsoletos no SDK do .NET Core.
Diagnosticar falhas e exceções
O Application Insights vem com uma experiência de Gerenciamento de desempenho de aplicativos coletada para lhe ajudar a diagnosticar falhas nos aplicativos monitorados.
Para obter instruções detalhadas, confira Investigar falhas, desempenho e transações com o Application Insights.
Dados personalizados de rastreamento e log
Para obter dados de diagnóstico específicos do aplicativo, você pode inserir código para enviar seus próprios dados de telemetria. Sua telemetria personalizada ou os dados de log são exibidos na pesquisa de diagnóstico junto com a solicitação, exibição de página e outros dados coletados automaticamente.
Usando o Microsoft.VisualStudio.ApplicationInsights.TelemetryClient, você tem várias APIs disponíveis:
- TelemetryClient.TrackEvent normalmente é usado para monitorar padrões de uso, mas os dados que ele envia também aparecem em Eventos personalizados na pesquisa de diagnóstico. Os eventos são nomeados e podem conter propriedades de cadeia de caracteres e métricas numéricas nas quais é possível filtrar pesquisas de diagnóstico.
- TelemetryClient.TrackTrace permite que você envie dados mais longos, como informações POST.
- TelemetryClient.TrackException envia detalhes da exceção, como rastreamentos de pilha para Application Insights.
Para ver esses eventos, abra Pesquisar no menu à esquerda. Selecione o menu suspenso Tipos de evento e escolha Evento personalizado, Rastreamento ou Exceção.
Observação
Se o aplicativo gerar grandes quantidades de telemetria, o módulo de amostragem adaptável reduzirá automaticamente o volume enviado ao portal, enviando apenas uma fração representativa dos eventos. Eventos que fazem parte da mesma operação são selecionados ou desmarcados como um grupo para que você possa navegar entre eventos relacionados. Para obter mais informações, consulte Amostragem no Application Insights.
Consultar dados POST de solicitação
Os detalhes da solicitação não incluem os dados enviados ao seu aplicativo em uma chamada POST. Para que esses dados sejam relatados:
- Adicione o SDK do Application Insights ao código do seu aplicativo.
- Insira o código no seu aplicativo para chamar Microsoft.ApplicationInsights.TrackTrace(). Envie os dados de POST no parâmetro de mensagem. Há um limite para o tamanho permitido, portanto você deve tentar enviar somente os dados essenciais.
- Quando você investiga uma solicitação com falha, localize os rastreamentos associados.
Capturar exceções e dados de diagnóstico relacionados
Por padrão, nem todas as exceções que causam falhas no aplicativo aparecem no portal. Se você usar o SDK do JavaScript em suas páginas da Web, verá as exceções do navegador. No entanto, a maioria das exceções do lado do servidor é interceptada pelo IIS, portanto, você precisa adicionar algum código para capturá-las e relatá-las.
É possível:
- Registrar as exceções explicitamente inserindo código em manipuladores de exceção para relatar as exceções.
- Capturar exceções automaticamente configurando sua estrutura do ASP.NET. As inclusões necessárias são diferentes para diferentes tipos de estrutura.
Relatar exceções explicitamente
A maneira mais simples de relatar é inserir uma chamada a trackException() em um manipulador de exceção.
var telemetry = new TelemetryClient();
try
{
// ...
}
catch (Exception ex)
{
var properties = new Dictionary<string, string>
{
["Game"] = currentGame.Name
};
var measurements = new Dictionary<string, double>
{
["Users"] = currentGame.Users.Count
};
// Send the exception telemetry:
telemetry.TrackException(ex, properties, measurements);
}
Os parâmetros de medidas e propriedades são opcionais, mas são úteis para filtrar e adicionar informações extras. Por exemplo, se você tiver um aplicativo que pode executar vários jogos, será possível localizar todos os relatórios de exceção relacionados a um jogo específico. Você pode adicionar quantos itens desejar a cada dicionário.
Exceções de navegador
A maioria das exceções de navegador são relatados.
Se sua página da web inclui arquivos de script de redes de distribuição de conteúdo ou de outros domínios, certifique-se de sua marca de script com o atributo crossorigin="anonymous" e que o servidor envia cabeçalhos CORS. Esse comportamento permite obter um rastreamento de pilha e detalhes para exceções de JavaScript sem tratamento desses recursos.
Reutilizar o cliente de telemetria
Observação
Recomendamos que você instancie TelemetryClient uma vez e reutilize-o durante toda a vida útil de um aplicativo.
Com Injeção de dependência (DI) no .NET, o SDK do .NET apropriado e configurando corretamente o Application insights para DI, você pode exigir o TelemetryClient como um parâmetro de construtor.
public class ExampleController : ApiController
{
private readonly TelemetryClient _telemetryClient;
public ExampleController(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
}
No exemplo anterior, o TelemetryClient é injetado na classe ExampleController.
Formulários da Web
Para Web forms, o Módulo HTTP pode coletar exceções quando não há redirecionamentos configurados com CustomErrors. Contudo, quando você tiver redirecionamentos ativos, adicione as seguintes linhas à função Application_Error em Global.asax.cs.
void Application_Error(object sender, EventArgs e)
{
if (HttpContext.Current.IsCustomErrorEnabled &&
Server.GetLastError () != null)
{
_telemetryClient.TrackException(Server.GetLastError());
}
}
No exemplo anterior, _telemetryClient é uma variável de escopo de classe do tipo TelemetryClient.
MVC
Começar com o SDK do Application Insights Web versão 2.6 (beta 3 e posterior), exceções de coleta sem tratamento do Application Insights lançadas automaticamente nos métodos de controladores MVC 5+. Se você adicionou anteriormente um manipulador personalizado para acompanhar essas exceções, poderá removê-lo para evitar o acompanhamento duplo de exceções.
Há vários cenários em que um filtro de exceção não pode lidar corretamente com erros quando as exceções são geradas:
- De construtores do controlador
- De manipuladores de mensagens
- Durante o roteamento
- Durante a serialização do conteúdo da resposta
- Durante a inicialização do aplicativo
- Em tarefas em segundo plano
Todas as exceções tratadas pelo aplicativo ainda precisam ser controladas manualmente. Exceções sem tratamento provenientes de controladores geralmente resultam em resposta de "Erro interno do servidor" 500. Se a resposta for criada manualmente como resultado de uma exceção tratada ou nenhuma exceção, ele é rastreado em telemetria de solicitação correspondente com ResultCode 500. Porém, o SDK do Application Insights não poderá controlar a exceção correspondente.
Suporte de versões anteriores
Se você usa o MVC 4 (e versões anteriores) do Application Insights Web SDK 2.5 (e versões anteriores), consulte os exemplos a seguir para rastrear exceções.
Expandir para ver as instruções de versões anteriores
Se a configuração CustomErrors for Off, as exceções estarão disponíveis para o Módulo HTTP coletar. No entanto, se estiver definido como RemoteOnly (padrão) ou On, a exceção será apagada e não estará disponível para coleta automática do Application Insights. Você pode corrigir esse comportamento substituindo a classe System.Web.Mvc.HandleErrorAttribute e aplicando a classe substituída conforme mostrado para as diferentes versões do MVC aqui (consulte fonte do GitHub):
using System;
using System.Web.Mvc;
using Microsoft.ApplicationInsights;
namespace MVC2App.Controllers
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AiHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
{
//The attribute should track exceptions only when CustomErrors setting is On
//if CustomErrors is Off, exceptions will be caught by AI HTTP Module
if (filterContext.HttpContext.IsCustomErrorEnabled)
{ //Or reuse instance (recommended!). See note above.
var ai = new TelemetryClient();
ai.TrackException(filterContext.Exception);
}
}
base.OnException(filterContext);
}
}
}
MVC 2
Substitua o atributo HandleError pelo novo atributo em seus controladores:
namespace MVC2App.Controllers
{
[AiHandleError]
public class HomeController : Controller
{
// Omitted for brevity
}
}
MVC 3
Registrar AiHandleErrorAttribute como um filtro global em Global.asax.cs:
public class MyMvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AiHandleErrorAttribute());
}
}
MVC 4, MVC 5
Registrar AiHandleErrorAttribute como um filtro global em FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// Default replaced with the override to track unhandled exceptions
filters.Add(new AiHandleErrorAttribute());
}
}
Web API
Começar com o SDK do Application Insights Web versão 2.6 (beta 3 e posterior), exceções de coleta sem tratamento do Application Insights lançadas automaticamente nos métodos de controladores para Web API 2+. Se você adicionou anteriormente um manipulador personalizado para acompanhar essas exceções, conforme descrito nos exemplos a seguir, poderá removê-lo para evitar o acompanhamento duplo de exceções.
Os filtros de exceção não podem lidar com vários casos. Por exemplo:
- Exceções geradas por construtores de controlador.
- Exceções geradas por manipuladores de mensagens.
- Exceções geradas durante o roteamento.
- Exceções geradas durante a serialização de conteúdo da resposta.
- Exceção lançada durante a inicialização do aplicativo.
- Exceção lançada em tarefas em segundo plano.
Todas as exceções tratadas pelo aplicativo ainda precisam ser controladas manualmente. Exceções sem tratamento provenientes de controladores geralmente resultam em resposta de "Erro interno do servidor" 500. Se uma resposta for criada manualmente como resultado de uma exceção tratada ou nenhuma exceção, ele é rastreado em uma telemetria de solicitação correspondente com ResultCode 500. Porém, o SDK do Application Insights não poderá controlar a exceção correspondente.
Suporte de versões anteriores
Se você usa o Web API 1 (e versões anteriores) do Application Insights Web SDK 2.5 (e versões anteriores), consulte os exemplos a seguir para rastrear exceções.
Expandir para ver as instruções de versões anteriores
API Web 1.x
Substituir System.Web.Http.Filters.ExceptionFilterAttribute:
using System.Web.Http.Filters;
using Microsoft.ApplicationInsights;
namespace WebAPI.App_Start
{
public class AiExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext != null && actionExecutedContext.Exception != null)
{ //Or reuse instance (recommended!). See note above.
var ai = new TelemetryClient();
ai.TrackException(actionExecutedContext.Exception);
}
base.OnException(actionExecutedContext);
}
}
}
Você pode adicionar esse atributo substituído para controladores específicos ou adicioná-lo à configuração de filtros globais na classe WebApiConfig:
using System.Web.Http;
using WebApi1.x.App_Start;
namespace WebApi1.x
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
// ...
config.EnableSystemDiagnosticsTracing();
// Capture exceptions for Application Insights:
config.Filters.Add(new AiExceptionFilterAttribute());
}
}
}
API Web 2.x
Adicionar uma implementação de IExceptionLogger:
using System.Web.Http.ExceptionHandling;
using Microsoft.ApplicationInsights;
namespace ProductsAppPureWebAPI.App_Start
{
public class AiExceptionLogger : ExceptionLogger
{
public override void Log(ExceptionLoggerContext context)
{
if (context != null && context.Exception != null)
{
//or reuse instance (recommended!). see note above
var ai = new TelemetryClient();
ai.TrackException(context.Exception);
}
base.Log(context);
}
}
}
Adicione este snippet aos serviços em WebApiConfig:
using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using ProductsAppPureWebAPI.App_Start;
namespace WebApi2WithMVC
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
config.Services.Add(typeof(IExceptionLogger), new AiExceptionLogger());
}
}
}
Como alternativas, você pode:
- Substitua a única instância
ExceptionHandlerpor uma implementação personalizada deIExceptionHandler. O manipulador de exceção é chamado apenas quando a estrutura ainda é capaz de escolher a mensagem de resposta para enviar, não quando a conexão é anulada, por exemplo. - Use os filtros de exceção, como descrito na seção controladores acima da API Web 1.x, que não são chamados em todos os casos.
WCF
Adicione uma classe que estenda Attribute e implemente IErrorHandler e IServiceBehavior.
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Web;
using Microsoft.ApplicationInsights;
namespace WcfService4.ErrorHandling
{
public class AiLogExceptionAttribute : Attribute, IErrorHandler, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription,
System.ServiceModel.ServiceHostBase serviceHostBase,
System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
System.ServiceModel.ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher disp in serviceHostBase.ChannelDispatchers)
{
disp.ErrorHandlers.Add(this);
}
}
public void Validate(ServiceDescription serviceDescription,
System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
bool IErrorHandler.HandleError(Exception error)
{//or reuse instance (recommended!). see note above
var ai = new TelemetryClient();
ai.TrackException(error);
return false;
}
void IErrorHandler.ProvideFault(Exception error,
System.ServiceModel.Channels.MessageVersion version,
ref System.ServiceModel.Channels.Message fault)
{
}
}
}
Adicione o atributo para as implementações de serviço:
namespace WcfService4
{
[AiLogException]
public class Service1 : IService1
{
// Omitted for brevity
}
}
Contadores de desempenho de exceção
Se você instalou o Agente do Application Insights do Azure Monitor no servidor, poderá obter um gráfico da taxa de exceções medida pelo .NET. As exceções .NET tradas e sem tratamento estão incluídas.
Abra uma guia do metrics explorer e adicione um novo gráfico. Em Contadores de Desempenho, selecione Taxa de exceção.
O .NET Framework calcula a taxa contando o número de exceções em um intervalo e dividindo pelo comprimento do intervalo.
Isso é diferente da contagem 'Exceções' calculada pelo portal do Application Insights contando relatórios TrackException. Os intervalos de amostragem são diferentes, e o SDK não envia relatórios TrackException a todas as exceções tratadas e sem tratamento.
Coleta de métricas personalizadas
Os SDKs do Application Insights do Azure Monitor para .NET e .NET Core têm dois métodos diferentes de coleta de métricas personalizadas:
- O método
TrackMetric(), que não tem pré-agregação. - O método
GetMetric(), que tem pré-agregação.
É recomendável usar a agregação, portanto TrackMetric()não é mais o método preferencial de coletar métricas personalizadas. Este artigo explica como usar o método GetMetric() e alguns fundamentos por trás do seu funcionamento.
Expandir para saber mais sobre API com pré-agregação e sem pré-agregação
O método TrackMetric() envia telemetria bruta que indica uma métrica. Não é eficiente enviar um único item de telemetria para cada valor. O método TrackMetric() também é ineficiente em termos de desempenho, porque cada TrackMetric(item) passa pelo pipeline completo do SDK de inicializadores e processadores de telemetria.
Ao contrário de TrackMetric(), GetMetric() se encarrega da pré-agregação local para você e, a seguir, envia apenas uma métrica resumida agregada a um intervalo fixo de um minuto. Caso seja necessário monitorar de perto alguma métrica personalizada em segundos ou até mesmo milissegundos, é possível fazer isso com o custo de armazenamento e tráfego de rede do monitoramento a cada minuto. Esse comportamento também reduz bastante o risco de limitação, pois o número total de itens de telemetria que precisam ser enviados para uma métrica agregada é muito reduzido.
Em Application Insights, as métricas personalizadas coletadas por meio de TrackMetric() e GetMetric() não estão sujeitas à amostragem. A amostragem de métricas importantes pode levar a cenários em que os alertas criados em torno dessas métricas se tornam não confiáveis. Não fazendo a amostragem das métricas personalizadas, você geralmente tem a certeza de que um alerta é acionado quando os limites de alerta são violados. Como as métricas personalizadas não são amostradas, há algumas preocupações em potencial.
O acompanhamento de tendências de uma métrica a cada segundo ou em um intervalo ainda mais detalhado pode ter os seguintes resultados:
- Aumento dos custos de armazenamento de dados. Há um custo associado à quantidade de dados que você envia para o Azure Monitor. Quanto mais dados enviados, maior é o custo geral de monitoramento.
- Aumento do tráfego de rede ou sobrecarga de desempenho. Em alguns cenários, essa sobrecarga pode ter um custo monetário e de desempenho do aplicativo.
- Risco de limitação de ingestão. O Azure Monitor remove (“restringe”) os pontos de dados quando o aplicativo envia uma taxa alta de telemetria em um curto intervalo de tempo.
A limitação é preocupante, pois pode causar alertas perdidos. A condição para disparar um alerta pode ocorrer no local e ser removida no ponto de extremidade de ingestão devido ao excesso de dados enviados. Não recomendamos usar TrackMetric() para .NET e .NET Core, a menos que você tenha implementado sua própria lógica de agregação local. Se você está tentando rastrear todas as instâncias em que um evento ocorre durante um determinado período, TrackEvent() é uma opção melhor. Tenha em mente que, ao contrário das métricas personalizadas, os eventos personalizados estão sujeitos à amostragem. Você continua podendo usar TrackMetric(), mesmo sem escrever sua própria pré-agregação local. No entanto, se você fizer isso, tenha cuidado com percalços.
Em resumo, recomendamos o método GetMetric() porque faz a pré-agregação, acumula valores de todas as chamadas Track() e envia um resumo/agregação a cada minuto. O método GetMetric() pode reduzir significativamente o custo e a sobrecarga de desempenho enviando menos pontos de dados, mais ainda coletando todas as informações relevantes.
Introdução ao método GetMetric
Para nossos exemplos, vamos usar um aplicativo básico do serviço de trabalho do .NET Core 3.1. Se você quiser replicar o ambiente de teste usado com esses exemplos, siga as etapas 1 a 6 no aplicativo .NET Core Worker Service. Essas etapas adicionam o Application Insights a um modelo básico de projeto de serviço de trabalho. Os conceitos são aplicáveis a qualquer aplicativo geral em que o SDK possa ser usado, incluindo aplicativos Web e aplicativos de console.
Enviar métrica
Substitua o conteúdo do arquivo worker.cs pelo seguinte código:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.ApplicationInsights;
namespace WorkerService3
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private TelemetryClient _telemetryClient;
public Worker(ILogger<Worker> logger, TelemetryClient tc)
{
_logger = logger;
_telemetryClient = tc;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ // The following line demonstrates usages of GetMetric API.
// Here "computersSold", a custom metric name, is being tracked with a value of 42 every second.
while (!stoppingToken.IsCancellationRequested)
{
_telemetryClient.GetMetric("ComputersSold").TrackValue(42);
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
}
Ao executar o código de exemplo, aparece o loop while sendo executado várias vezes sem que a telemetria seja enviada na janela de saída do Visual Studio. Um único item de telemetria é enviado em torno da marca de 60 segundos, que em nosso teste se parece com:
Application Insights Telemetry: {"name":"Microsoft.ApplicationInsights.Dev.00000000-0000-0000-0000-000000000000.Metric", "time":"2019-12-28T00:54:19.0000000Z",
"ikey":"00000000-0000-0000-0000-000000000000",
"tags":{"ai.application.ver":"1.0.0.0",
"ai.cloud.roleInstance":"Test-Computer-Name",
"ai.internal.sdkVersion":"m-agg2c:2.12.0-21496",
"ai.internal.nodeName":"Test-Computer-Name"},
"data":{"baseType":"MetricData",
"baseData":{"ver":2,"metrics":[{"name":"ComputersSold",
"kind":"Aggregation",
"value":1722,
"count":41,
"min":42,
"max":42,
"stdDev":0}],
"properties":{"_MS.AggregationIntervalMs":"42000",
"DeveloperMode":"true"}}}}
Este item de telemetria único representa uma agregação de 41 medidas de métricas distintas. Como estamos enviando o mesmo valor várias vezes, temos um desvio padrão (stDev) de 0 com valores máximos (max) e mínimos (min) idênticos. A propriedade value representa a soma de todos os valores individuais que foram agregados.
Observação
O método GetMetric é incompatível com o acompanhamento do último valor (por exemplo, gauge), tampouco com o acompanhamento de histogramas ou distribuições.
Se examinássemos nosso recurso do Application Insights na experiência Log Analytics, o item individual de telemetria se pareceria com a captura de tela abaixo.
Observação
Como o item de telemetria bruta não continha um campo nem uma propriedade de soma explícita depois de ser ingerido, criamos um para você. Nesse caso, as propriedades value e valueSum representam a mesma coisa.
Você também pode acessar a telemetria das métricas personalizadas na seção Métricas do portal como uma métrica personalizada e baseada em log. A captura de tela abaixo é um exemplo de métrica baseada em log.
Referência de métrica de cache para uso de alta taxa de transferência
É possível observar os valores de métrica com frequência em alguns casos. Por exemplo, um serviço de alta taxa de transferência que processa 500 solicitações por segundo pode querer emitir 20 métricas de telemetria para cada solicitação. Esse resultado significa acompanhar 10 mil valores por segundo. Nesses cenários de alta taxa de transferência, talvez os usuários precisem ajudar o SDK evitando algumas pesquisas.
O exemplo acima realizou uma pesquisa de um identificador para a métrica ComputersSold e rastreou um valor observado de 42. Em vez disso, é possível armazenar em cache o identificador em várias invocações de rastreamento:
//...
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// This is where the cache is stored to handle faster lookup
Metric computersSold = _telemetryClient.GetMetric("ComputersSold");
while (!stoppingToken.IsCancellationRequested)
{
computersSold.TrackValue(42);
computersSold.TrackValue(142);
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(50, stoppingToken);
}
}
Além de armazenar em cache o identificador de métrica, o exemplo acima também reduziu Task.Delay para 50 milissegundos. Assim, o loop pôde ser executado com mais frequência. O resultado é 772 invocações TrackValue().
Métricas multidimensionais
Os exemplos na seção anterior mostram métricas de dimensionalidade zero. As métricas também podem ser multidimensionais. Atualmente, damos suporte para até 10 dimensões.
Este é um exemplo de como criar uma métrica unidimensional:
//...
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// This is an example of a metric with a single dimension.
// FormFactor is the name of the dimension.
Metric computersSold= _telemetryClient.GetMetric("ComputersSold", "FormFactor");
while (!stoppingToken.IsCancellationRequested)
{
// The number of arguments (dimension values)
// must match the number of dimensions specified while GetMetric.
// Laptop, Tablet, etc are values for the dimension "FormFactor"
computersSold.TrackValue(42, "Laptop");
computersSold.TrackValue(20, "Tablet");
computersSold.TrackValue(126, "Desktop");
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(50, stoppingToken);
}
}
Caso você execute o código de exemplo por pelo menos 60 segundos, três itens diferentes de telemetria são enviados ao Azure. Cada um representa a agregação de um dos três fatores forma. Como antes, você pode examiná-los melhor na exibição do Log Analytics.
No gerenciador de métricas:
Não é possível dividir a métrica pela nova dimensão personalizada nem exibir a dimensão personalizada com a exibição de métricas.
Por padrão, as métricas multidimensionais no gerenciador de métricas não estão ativadas nos recursos do Application Insights.
Habilitar métricas multidimensionais
Para habilitar métricas multidimensionais para um recurso do Application Insights, selecione Uso e custos estimados>Métricas personalizadas>Habilitar alertas em dimensões de métricas personalizadas>OK. Para saber mais, confira Dimensões de métricas personalizadas e pré-agregação.
Depois de fazer essa alteração e enviar uma nova telemetria multidimensional, selecione Aplicar divisão.
Observação
Somente as métricas enviadas recentemente depois que o recurso foi ativado no portal têm dimensões armazenadas.
Exiba suas agregações de métrica para cada dimensão FormFactor.
Usar MetricIdentifier quando há mais de três dimensões
No momento, há suporte para dez dimensões. Usar mais de três dimensões requer o uso de MetricIdentifier:
// Add "using Microsoft.ApplicationInsights.Metrics;" to use MetricIdentifier
// MetricIdentifier id = new MetricIdentifier("[metricNamespace]","[metricId],"[dim1]","[dim2]","[dim3]","[dim4]","[dim5]");
MetricIdentifier id = new MetricIdentifier("CustomMetricNamespace","ComputerSold", "FormFactor", "GraphicsCard", "MemorySpeed", "BatteryCapacity", "StorageCapacity");
Metric computersSold = _telemetryClient.GetMetric(id);
computersSold.TrackValue(110,"Laptop", "Nvidia", "DDR4", "39Wh", "1TB");
Configuração de métrica personalizada
Se você quer alterar a configuração de uma métrica, é necessário fazer isso no local em que a métrica é inicializada.
Nomes de dimensão especiais
As métricas não usam o contexto de telemetria do TelemetryClient usado para acessá-las. A melhor solução para isso é usar nomes de dimensões especiais disponíveis como constantes na classe MetricDimensionNames.
As agregações de métrica enviadas pela métrica Special Operation Request Size a seguir não tem Context.Operation.Name definidas como Special Operation. O método TrackMetric() ou qualquer outro método TrackXXX() tem OperationName definido corretamente como Special Operation.
//...
TelemetryClient specialClient;
private static int GetCurrentRequestSize()
{
// Do stuff
return 1100;
}
int requestSize = GetCurrentRequestSize()
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//...
specialClient.Context.Operation.Name = "Special Operation";
specialClient.GetMetric("Special Operation Request Size").TrackValue(requestSize);
//...
}
}
Nessa circunstância, use os nomes de dimensão especiais listados na classe MetricDimensionNames para especificar os valores TelemetryContext.
Por exemplo, quando a agregação de métrica resultante da próxima instrução é enviada para o ponto de extremidade de nuvem do Application Insights, seu campo de dados Context.Operation.Name é definido como Special Operation:
_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");
O valor dessa dimensão especial é copiado em TelemetryContext e não é usado como uma dimensão normal. Se você também quiser manter uma dimensão de operação para exploração de métrica normal, você precisará criar uma dimensão separada para essa finalidade:
_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Dimensão e utilização de limitação da série temporal
Para impedir que o subsistema de telemetria use acidentalmente seus recursos, você pode controlar o número máximo de série de dados por métrica. Os limites padrão não são mais do que mil séries de dados totais por métrica e não mais do que 100 valores diferentes por dimensão.
Importante
Use valores cardeais baixos nas dimensões para evitar a limitação.
No contexto de dimensão e utilização de limite da série temporal, usamos Metric.TrackValue(..) para garantir que os limites sejam cumpridos. Se os limites já estiverem atingidos, Metric.TrackValue(..) retornará False e o valor não será rastreado. Caso contrário, ele retornará True. Esse comportamento será útil se os dados de uma métrica se originarem da entrada de usuário.
O construtor MetricConfiguration obtém algumas opções sobre como gerenciar diferentes séries dentro da respectiva métrica e um objeto de uma classe que implementa IMetricSeriesConfiguration que especifica o comportamento de agregação para cada série individual da métrica:
var metConfig = new MetricConfiguration(seriesCountLimit: 100, valuesPerDimensionLimit:2,
new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));
Metric computersSold = _telemetryClient.GetMetric("ComputersSold", "Dimension1", "Dimension2", metConfig);
// Start tracking.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value1");
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value2");
// The following call gives 3rd unique value for dimension2, which is above the limit of 2.
computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3");
// The above call does not track the metric, and returns false.
-
seriesCountLimité o número máximo de série temporal de dados que uma métrica pode ter. Quando esse limite é atingido, as chamadas paraTrackValue(), que costumam ter uma nova série como resultado, retornamfalse. -
valuesPerDimensionLimitlimita o número de valores distintos por dimensão de maneira semelhante. -
restrictToUInt32Valuesdetermina se apenas valores inteiros não negativos devem ser acompanhados.
Este é um exemplo de como enviar uma mensagem para saber se os limites de tampa são excedidos:
if (! computersSold.TrackValue(100, "Dim1Value1", "Dim2Value3"))
{
// Add "using Microsoft.ApplicationInsights.DataContract;" to use SeverityLevel.Error
_telemetryClient.TrackTrace("Metric value not tracked as value of one of the dimension exceeded the cap. Revisit the dimensions to ensure they are within the limits",
SeverityLevel.Error);
}
Acompanhamento de operações personalizadas
Os SDKs do Application Insights rastreiam automaticamente chamadas e solicitações HTTP recebidas por serviços dependentes, como solicitações HTTP e consultas SQL. O acompanhamento e a correlação de solicitações e dependências fornecem visibilidade sobre a capacidade de resposta e a confiabilidade do aplicativo inteiro em todos os microsserviços que combinados nesse aplicativo.
Há uma classe de padrões de aplicativo que não tem suporte genérico. O monitoramento adequado de tais padrões requer a instrumentação de código manual. Esta seção aborda alguns padrões que podem exigir instrumentação manual, como processamento de fila personalizado e execução de tarefas em segundo plano de execução prolongada.
Esta seção fornece diretrizes sobre como acompanhar operações personalizadas com o SDK do Application Insights.
Visão geral
Uma operação é um trabalho lógico executado por um aplicativo. Ela tem nome, hora de início, duração e resultado, além de um contexto de execução como nome de usuário, propriedades e resultado. Se a operação A tiver sido iniciada pela operação B, então a operação B será definida como pai para A. Uma operação pode ter somente um pai, mas pode ter muitas operações filhas. Para saber mais sobre operações e correlação de telemetria, confira Correlação de telemetria do Application Insights.
No SDK do .NET do Application Insights, a operação é descrita pela classe abstrata OperationTelemetry e seus descendentes RequestTelemetry e DependencyTelemetry.
Acompanhamento de operações de entrada
O SDK da Web do Application Insights coleta automaticamente as solicitações HTTP para aplicativos ASP.NET executados em um pipeline do IIS e para todos os aplicativos do ASP.NET Core. Há soluções com suporte da comunidade para outras plataformas e estruturas. Se o aplicativo não for compatível com nenhuma das soluções padrão ou com suporte da comunidade, instrumente-o manualmente.
Outro exemplo que requer um acompanhamento personalizado é o trabalho que recebe os itens da fila. Para alguns filas, a chamada para adicionar uma mensagem a essa fila é acompanhada como dependência. A operação geral que descreve o processamento de mensagens não é coletada automaticamente.
Vamos ver como essas operações poderiam ser rastreadas.
Em um nível alto, a tarefa é criar RequestTelemetry e definir propriedades conhecidas. Depois que a operação for concluída, você poderá acompanhar a telemetria. O exemplo a seguir demonstra essa tarefa.
Solicitação HTTP no aplicativo autohospedado Owin
Neste exemplo, o contexto de rastreamento é propagado de acordo com o protocolo HTTP para correlação. Espere receber cabeçalhos descritos lá.
Expandir para exibir código
public class ApplicationInsightsMiddleware : OwinMiddleware
{
// You may create a new TelemetryConfiguration instance, reuse one you already have,
// or fetch the instance created by Application Insights SDK.
private readonly TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.CreateDefault();
private readonly TelemetryClient telemetryClient = new TelemetryClient(telemetryConfiguration);
public ApplicationInsightsMiddleware(OwinMiddleware next) : base(next) {}
public override async Task Invoke(IOwinContext context)
{
// Let's create and start RequestTelemetry.
var requestTelemetry = new RequestTelemetry
{
Name = $"{context.Request.Method} {context.Request.Uri.GetLeftPart(UriPartial.Path)}"
};
// If there is a Request-Id received from the upstream service, set the telemetry context accordingly.
if (context.Request.Headers.ContainsKey("Request-Id"))
{
var requestId = context.Request.Headers.Get("Request-Id");
// Get the operation ID from the Request-Id (if you follow the HTTP Protocol for Correlation).
requestTelemetry.Context.Operation.Id = GetOperationId(requestId);
requestTelemetry.Context.Operation.ParentId = requestId;
}
// StartOperation is a helper method that allows correlation of
// current operations with nested operations/telemetry
// and initializes start time and duration on telemetry items.
var operation = telemetryClient.StartOperation(requestTelemetry);
// Process the request.
try
{
await Next.Invoke(context);
}
catch (Exception e)
{
requestTelemetry.Success = false;
requestTelemetry.ResponseCode;
telemetryClient.TrackException(e);
throw;
}
finally
{
// Update status code and success as appropriate.
if (context.Response != null)
{
requestTelemetry.ResponseCode = context.Response.StatusCode.ToString();
requestTelemetry.Success = context.Response.StatusCode >= 200 && context.Response.StatusCode <= 299;
}
else
{
requestTelemetry.Success = false;
}
// Now it's time to stop the operation (and track telemetry).
telemetryClient.StopOperation(operation);
}
}
public static string GetOperationId(string id)
{
// Returns the root ID from the '|' to the first '.' if any.
int rootEnd = id.IndexOf('.');
if (rootEnd < 0)
rootEnd = id.Length;
int rootStart = id[0] == '|' ? 1 : 0;
return id.Substring(rootStart, rootEnd - rootStart);
}
}
O protocolo HTTP para correlação também declara o cabeçalho Correlation-Context. Ela é omitida aqui para fins de simplificação.
Instrumentação de fila
O Contexto de Rastreamento W3C e o Protocolo HTTP para correlação passa detalhes de correlação com solicitações HTTP, mas cada protocolo de fila precisa definir como os mesmos detalhes são passados ao longo da mensagem da fila. Alguns protocolos de fila, como AMQP, permitem a transmissão de mais metadados. Outros, como a Fila do Armazenamento do Azure, exigem que o contexto seja codificado no conteúdo da mensagem.
Observação
O rastreamento entre componentes ainda não é compatível com filas.
Com HTTP, se o produtor e o consumidor enviarem telemetria para diferentes recursos do Application Insights, a experiência de diagnóstico de transação e o Mapa do Aplicativo mostrarão transações e farão o mapeamento de ponta a ponta. Para filas, essa funcionalidade ainda não tem suporte.
Fila do Barramento de Serviço
Para saber mais sobre o rastreamento, confira Rastreamento distribuído e correlação por meio de mensagens do Barramento de Serviço do Azure.
Fila de Armazenamento do Azure
O exemplo a seguir mostra como acompanhar operações da fila de Armazenamento do Azure e correlacionar telemetria entre o produtor, o consumidor e o Armazenamento do Azure.
A fila de Armazenamento tem uma API HTTP. Todas as chamadas à fila são rastreadas pelo coletor de dependência do Application Insights para solicitações HTTP. Ele é configurado por padrão em aplicativos ASP.NET e ASP.NET Core. Com outros tipos de aplicativos, confira a Documentação de aplicativos do console.
Também convém correlacionar a ID da operação do Application Insights à ID de solicitação de Armazenamento. Para obter informações sobre como definir e obter um cliente de solicitação de Armazenamento e uma ID de solicitação do servidor, consulte Monitorar, diagnosticar e solucionar problemas do Armazenamento do Azure.
Como as filas de Armazenamento do Azure dão suporte a API HTTP, todas as operações com a fila automaticamente são acompanhadas pelo Application Insights. Em muitos casos, essa instrumentação deve ser suficiente. Para correlacionar rastreamentos do consumidor com rastreamentos do produtor, transmita algum contexto de correlação de maneira semelhante a feita em HTTP Protocol for Correlation.
Este exemplo mostra como controlar a operação Enqueue. É possível:
-
Correlacionar novas tentativas (se houver): todas têm um pai comum que é a operação
Enqueue. Caso contrário, elas são acompanhadas como filhos da solicitação de entrada. Se houver várias solicitações lógicas para a fila, pode ser difícil descobrir qual chamada resultou em novas tentativas. - Correlacione os logs do Armazenamento (se e quando necessário): são correlacionados à telemetria do Application Insights.
A operação Enqueue é filho de uma operação pai. Um exemplo é uma solicitação HTTP de entrada. A chamada de dependência HTTP é filho da operação Enqueue e neto da solicitação de entrada.
public async Task Enqueue(CloudQueue queue, string message)
{
var operation = telemetryClient.StartOperation<DependencyTelemetry>("enqueue " + queue.Name);
operation.Telemetry.Type = "Azure queue";
operation.Telemetry.Data = "Enqueue " + queue.Name;
// MessagePayload represents your custom message and also serializes correlation identifiers into payload.
// For example, if you choose to pass payload serialized to JSON, it might look like
// {'RootId' : 'some-id', 'ParentId' : '|some-id.1.2.3.', 'message' : 'your message to process'}
var jsonPayload = JsonConvert.SerializeObject(new MessagePayload
{
RootId = operation.Telemetry.Context.Operation.Id,
ParentId = operation.Telemetry.Id,
Payload = message
});
CloudQueueMessage queueMessage = new CloudQueueMessage(jsonPayload);
// Add operation.Telemetry.Id to the OperationContext to correlate Storage logs and Application Insights telemetry.
OperationContext context = new OperationContext { ClientRequestID = operation.Telemetry.Id};
try
{
await queue.AddMessageAsync(queueMessage, null, null, new QueueRequestOptions(), context);
}
catch (StorageException e)
{
operation.Telemetry.Properties.Add("AzureServiceRequestID", e.RequestInformation.ServiceRequestID);
operation.Telemetry.Success = false;
operation.Telemetry.ResultCode = e.RequestInformation.HttpStatusCode.ToString();
telemetryClient.TrackException(e);
}
finally
{
// Update status code and success as appropriate.
telemetryClient.StopOperation(operation);
}
}
Para reduzir a quantidade de telemetria que o seu aplicativo relata ou se você não quiser acompanhar a operação Enqueue por outros motivos, use a API Activity diretamente:
- Crie (e inicie) um novo
Activityem vez de iniciar a operação do Application Insights. Você não precisa atribuir nenhuma propriedade a ela, exceto o nome da operação. - Serializar
yourActivity.Idpara o conteúdo da mensagem, em vez deoperation.Telemetry.Id. Também é possível usarActivity.Current.Id.
Da mesma forma, outras operações de fila podem ser instrumentadas. Uma operação de espiar deve ser instrumentada da mesma maneira que uma operação de remoção da fila. A instrumentação de operações de gerenciamento de fila não é necessária. O Application Insights acompanha operações como HTTP e, na maioria dos casos, isso é suficiente.
Ao instrumentar a exclusão de mensagem, verifique se você definiu os identificadores da operação (correlação). Como alternativa, você pode usar a API Activity. Assim, você não precisa definir identificadores de operação nos itens de telemetria porque o SDK do Application Insights faz isso para você:
- Crie um novo
Activitydepois que tiver obtido um item da fila. - Use
Activity.SetParentId(message.ParentId)para correlacionar os logs de produtor e consumidor. - Inicie o
Activity. - Acompanhe as operações de remoção da fila, processamento e exclusão usando auxiliares
Start/StopOperation. Faça isso do mesmo fluxo de controle assíncrono (contexto de execução). Dessa forma, elas são correlacionadas corretamente. - Pare o
Activity. - Use
Start/StopOperationou chame a telemetriaTrackmanualmente.
Tipos de dependência
Application Insights usa o tipo de dependência para personalizar experiências de interface do usuário. Para filas, os seguintes tipos de DependencyTelemetry que melhoram a Experiência do diagnóstico de transação são reconhecidos:
-
Azure queuepara filas do Armazenamento do Microsoft Azure -
Azure Event Hubspara Hubs de Eventos do Azure -
Azure Service Buspara Barramento de Serviço do Azure
Processamento em lotes
Com algumas filas, você pode remover da fila várias mensagens com uma solicitação. O processamento dessas mensagens é supostamente independente e pertence a diferentes operações lógicas. Não é possível correlacionar a Dequeue operação a uma mensagem específica que está sendo processada.
Cada mensagem deve ser processada no seu próprio fluxo de controle assíncrono. Para obter mais informações, consulte a seção Acompanhamento de dependências de saída.
Tarefas em segundo plano de execução longa
Alguns aplicativos iniciam operações de longa execução que podem ser causadas por solicitações de usuário. Da perspectiva do rastreamento/instrumentação, isso não é diferente da instrumentação de solicitação ou de dependência:
async Task BackgroundTask()
{
var operation = telemetryClient.StartOperation<DependencyTelemetry>(taskName);
operation.Telemetry.Type = "Background";
try
{
int progress = 0;
while (progress < 100)
{
// Process the task.
telemetryClient.TrackTrace($"done {progress++}%");
}
// Update status code and success as appropriate.
}
catch (Exception e)
{
telemetryClient.TrackException(e);
// Update status code and success as appropriate.
throw;
}
finally
{
telemetryClient.StopOperation(operation);
}
}
Neste exemplo, o telemetryClient.StartOperation cria DependencyTelemetry e preenche o contexto de correlação. Digamos que você tem uma operação pai criada por solicitações de entrada que agendaram a operação. Desde que BackgroundTask inicie no mesmo fluxo de controle assíncrono que uma solicitação de entrada, ela será correlacionada com essa operação pai.
BackgroundTask e todos os itens de telemetria aninhados são automaticamente correlacionados com a solicitação a causou, mesmo após o término da solicitação.
Quando a tarefa inicia do thread em segundo plano que não tem nenhuma operação (Activity) associada a ele, BackgroundTask não tem nenhum pai. No entanto, ela pode ter operações aninhadas. Todos os itens de telemetria relatados da tarefa estão correlacionados à DependencyTelemetry criada na BackgroundTask.
Acompanhamento de dependências de saída
Você pode controlar sua própria variante de dependência ou uma operação sem suporte pelo Application Insights.
O método Enqueue na fila do Barramento de Serviço ou fila de Armazenamento pode servir como exemplos de tal acompanhamento personalizado.
A abordagem geral ao acompanhamento de dependência personalizado é:
- Chame o método
TelemetryClient.StartOperation(extensão) que preenche as propriedadesDependencyTelemetrynecessárias para correlação e algumas outras, como início, carimbo de data/hora e duração. - Definir outras propriedades personalizadas no
DependencyTelemetry: tais como nome e qualquer outro contexto necessário. - Fazer uma chamada de dependência e esperar por ela.
- Interromper a operação com
StopOperationquando concluída. - Tratar exceções.
public async Task RunMyTaskAsync()
{
using (var operation = telemetryClient.StartOperation<DependencyTelemetry>("task 1"))
{
try
{
var myTask = await StartMyTaskAsync();
// Update status code and success as appropriate.
}
catch(...)
{
// Update status code and success as appropriate.
}
}
}
Como descartar uma operação faz com que ela seja interrompida, é possível fazer isso em vez de chamar StopOperation.
Aviso
Em alguns casos, uma exceção não tratada pode impedir a chamada de finally, impedindo o rastreamento das operações.
Rastreamento e processamento de operações paralelas
A chamada de StopOperation só interrompe a operação iniciada. Se a operação de execução atual não corresponder à que você deseja interromper, StopOperation não fará nada. Essa situação pode acontecer ao iniciar diversas operações em paralelo no mesmo contexto de execução.
var firstOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 1");
var firstTask = RunMyTaskAsync();
var secondOperation = telemetryClient.StartOperation<DependencyTelemetry>("task 2");
var secondTask = RunMyTaskAsync();
await firstTask;
// FAILURE!!! This will do nothing and will not report telemetry for the first operation
// as currently secondOperation is active.
telemetryClient.StopOperation(firstOperation);
await secondTask;
Sempre chame StartOperation e processe a operação no mesmo método assíncrono para isolar as operações executadas em paralelo. Se a operação for síncrona (ou não assíncrona), envolva o processo e faça o rastreamento com Task.Run.
public void RunMyTask(string name)
{
using (var operation = telemetryClient.StartOperation<DependencyTelemetry>(name))
{
Process();
// Update status code and success as appropriate.
}
}
public async Task RunAllTasks()
{
var task1 = Task.Run(() => RunMyTask("task 1"));
var task2 = Task.Run(() => RunMyTask("task 2"));
await Task.WhenAll(task1, task2);
}
Operações do ApplicationInsights versus System.Diagnostics.Activity
System.Diagnostics.Activity representa o contexto de rastreamento distribuído e é usado por estruturas e bibliotecas para criar e propagar o contexto dentro e fora do processo e correlacionar os itens de telemetria.
O Activity trabalha com o System.Diagnostics.DiagnosticSource como o mecanismo de notificação entre a estrutura e a biblioteca para notificar sobre eventos interessantes, como solicitações e exceções recebidas ou enviadas.
As atividades no Application Insights são funcionalidades de nível superior. A dependência automática e a coleta de solicitações dependem muito delas e dos eventos DiagnosticSource. Se você criou o Activity em seu aplicativo, isso não cria a telemetria do Application Insights. O Application Insights precisa receber DiagnosticSource eventos e saber os nomes de eventos e cargas para traduzir Activity em telemetria.
Cada operação do Application Insights (solicitação ou dependência) envolve Activity. Quando StartOperation é chamado, ele cria Activity abaixo.
StartOperation é a maneira recomendada para controlar a telemetrias de solicitação ou dependência manualmente e garantir que tudo esteja correlacionado.
Contadores no Application Insights
O Application Insights dá suporte a contadores de desempenho e contadores de eventos. Este guia fornece uma visão geral de ambos, incluindo sua finalidade, configuração e uso em aplicativos .NET.
Visão geral
Os contadores de desempenho são integrados ao sistema operacional Windows e oferecem métricas predefinidas, como uso da CPU, consumo de memória e atividade de disco. Esses contadores são ideais para monitorar métricas de desempenho padrão com configuração mínima. Eles ajudam a controlar a utilização de recursos ou a solucionar problemas de gargalos no nível do sistema em aplicativos baseados no Windows, mas não oferecem suporte a métricas personalizadas específicas do aplicativo.
Os contadores de eventos funcionam em várias plataformas, incluindo Windows, Linux e macOS. Eles permitem que os desenvolvedores definam e monitorem métricas leves e personalizáveis específicas do aplicativo, proporcionando mais flexibilidade do que os contadores de desempenho. Os contadores de eventos são úteis quando as métricas do sistema são insuficientes ou quando a telemetria detalhada é necessária em aplicativos entre plataformas. Eles exigem implementação e configuração explícitas, o que torna a instalação mais trabalhosa.
Contadores de desempenho
O Windows fornece vários contadores de desempenho, como os usados para coletar estatísticas de uso do processador, da memória e do disco. Também é possível definir contadores de desempenho próprios.
Seu aplicativo dá suporte à coleta de contadores de desempenho se for executado no IIS (Internet Information Server) em um host local ou em uma máquina virtual com acesso administrativo. Os aplicativos em execução como os Aplicativos Web do Azure não podem acessar diretamente contadores de desempenho, mas o Application Insights coleta um subconjunto de contadores disponíveis.
Dica
Como outras métricas, você pode definir um alerta para avisar se um contador ultrapassar um limite especificado. Para definir um alerta, abra o painel Alertas e selecione Adicionar Alerta.
Pré-requisitos
Conceda à conta de serviço do pool de aplicativos permissão para monitorar os contadores de desempenho adicionando-a ao grupo Usuários do Monitor de Desempenho.
net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"
Visualizar contadores
O painel Métricas mostra o conjunto padrão de contadores de desempenho.
Contadores padrão para aplicativos Web ASP.NET:
- % Processo\Tempo do Processador
- % Processo\Tempo do processador normalizado
- Memória\Bytes disponíveis
- Solicitações de ASP.NET/segundo
- Exceções geradas por segundo do CLR (Common Language Runtime) do .NET
- Tempo de execução de solicitação de aplicativos ASP.NET
- Process\Private Bytes (Bytes Privados do Processo)
- Processo\Bytes de dados de E/S/segundo
- Aplicativos ASP.NET\Solicitações em Fila de Aplicativos
- Processador(_Total)\% Tempo de Processador
Adicionar contadores
Se o contador de desempenho desejado não estiver incluído na lista de métricas, você poderá adicioná-lo.
Opção 1: configuração no ApplicationInsights.config
Descubra quais contadores estão disponíveis no servidor usando este comando do PowerShell no servidor local:
Get-Counter -ListSet *Para obter mais informações, consulte
Get-Counter.Abra o
ApplicationInsights.config.Se você adicionou o Application Insights ao seu aplicativo durante o desenvolvimento:
- Edite
ApplicationInsights.configno projeto. - Reimplante-o em seus servidores.
- Edite
Edite a diretiva do coletor de desempenho:
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector"> <Counters> <Add PerformanceCounter="\Objects\Processes"/> <Add PerformanceCounter="\Sales(photo)\# Items Sold" ReportAs="Photo sales"/> </Counters> </Add>
Capture os contadores padrão e os contadores que você mesmo implementa.
\Objects\Processes é um exemplo de um contador padrão, disponível em todos os sistemas Windows.
\Sales(photo)\# Items Sold é um exemplo de um contador personalizado que pode ser implementado em um serviço Web.
O formato é \Category(instance)\Counter, ou apenas \Category\Counter para categorias que não têm instâncias.
O parâmetro ReportAs é necessário para nomes de contador que não correspondem a [a-zA-Z()/-_ \.]+.
Se você especificar uma instância, ela se tornará uma dimensão CounterInstanceName da métrica relatada.
Opção 2: configuração no código
Veja a seção a seguir.
Coletar contadores de desempenho no código para aplicativos Web ASP.NET ou aplicativos de console .NET/.NET Core
Para coletar contadores de desempenho do sistema e enviá-los ao Application Insights, você pode adaptar o seguinte snippet:
var perfCollectorModule = new PerformanceCollectorModule();
perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
@"\Process([replace-with-application-process-name])\Page Faults/sec", "PageFaultsPerfSec"));
perfCollectorModule.Initialize(TelemetryConfiguration.Active);
Ou você pode fazer a mesma coisa com métricas personalizadas que você criou:
var perfCollectorModule = new PerformanceCollectorModule();
perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
@"\Sales(photo)\# Items Sold", "Photo sales"));
perfCollectorModule.Initialize(TelemetryConfiguration.Active);
Contadores de desempenho para aplicativos em execução nos Aplicativos Web do Azure e Contêineres do Windows no Serviço de Aplicativo do Azure
Os aplicativos ASP.NET e ASP.NET Core implantados nos aplicativos Web do Azure são executados em um ambiente de área restrita especial. Os aplicativos implantados no Serviço de Aplicativo do Azure podem utilizar um contêiner de Windows ou ser hospedados em um ambiente de área restrita. Se o aplicativo for implantado em um Contêiner do Windows, todos os contadores de desempenho padrão estarão disponíveis na imagem de contêiner.
O ambiente de área restrita não permite acesso direto aos contadores de desempenho do sistema. No entanto, um subconjunto limitado de contadores é exposto como variáveis de ambiente, conforme descrito em Contadores Perf expostos como variáveis de ambiente. Só um subconjunto de contadores está disponível nesse ambiente. Para obter a lista completa, confira Contadores perf expostos como variáveis de ambiente.
O SDK do Application Insights para ASP.NET e ASP.NET Core detecta se o código é implantado em um aplicativo Web e em um contêiner não Windows. A detecção determina se eles vão coletar contadores de desempenho em um ambiente de área restrita ou usando o mecanismo de coleta padrão quando hospedados em um contêiner ou máquina virtual do Windows.
Consultas do Log Analytics para contadores de desempenho
Você pode pesquisar e exibir relatórios do contador de desempenho no Log Analytics.
O esquema performanceCounters expõe o nome category, counter e o nome instance de cada contador de desempenho. Na telemetria de cada aplicativo, você verá apenas os contadores desse aplicativo. Por exemplo, para ver quais contadores estão disponíveis:
performanceCounters | summarize count(), avg(value) by category, instance, counter
Aqui, Instance se refere à instância do contador de desempenho, não à função ou à instância do computador do servidor. O nome da instância do contador de desempenho normalmente segmenta os contadores, como tempo de processador, pelo nome do processo ou aplicativo.
Para obter um gráfico da memória disponível no período recente:
performanceCounters | where counter == "Available Bytes" | summarize avg(value), min(value) by bin(timestamp, 1h) | render timechart
Como outras telemetrias, o performanceCounters também tem uma coluna cloud_RoleInstance que indica a identidade da instância do servidor host no qual seu aplicativo está sendo executado. Por exemplo, para comparar o desempenho do seu aplicativo em diferentes computadores:
performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)
Perguntas frequentes sobre contadores de desempenho
Para examinar as perguntas frequentes, consulte Perguntas frequentes sobre contadores de desempenho.
Contadores de eventos
EventCounter é o mecanismo do .NET/.NET Core para publicar e consumir contadores ou estatísticas. Os EventCounters têm suporte em todas as plataformas de sistema operacional: Windows, Linux e macOS. Ele pode ser considerado como um equivalente multiplataforma para o PerformanceCounters que só tem suporte em sistemas Windows.
Embora os usuários possam publicar qualquer contador de eventos personalizado para atender às suas necessidades, o .NET publica um conjunto desses contadores por padrão. Esse documento apresenta as etapas necessárias para coletar e exibir contadores de eventos (definidos pelo sistema ou pelo usuário) no Azure Application Insights.
Dica
Como outras métricas, você pode definir um alerta para avisar se um contador ultrapassar um limite especificado. Para definir um alerta, abra o painel Alertas e selecione Adicionar Alerta.
Usar o Application Insights para coletar EventCounters
O Application Insights é compatível com a coleta de EventCounters com seu EventCounterCollectionModule, que faz parte do pacote NuGet recém-lançado Microsoft.ApplicationInsights.EventCounterCollector.
EventCounterCollectionModule é habilitado automaticamente ao usar AspNetCore ou WorkerService.
EventCounterCollectionModule coleta contadores com uma frequência de coleta não configurável de 60 segundos. Não há permissões especiais necessárias para coletar EventCounters. Para aplicativos ASP.NET Core, é recomendável também adicionar o pacote Microsoft.ApplicationInsights.AspNetCore.
dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore
Contadores padrão coletados
A partir da versão 2.15.0 do SDK do AspNetCore ou do SDK do WorkerService, nenhum contador é coletado por padrão. O próprio módulo está habilitado, para que os usuários possam simplesmente adicionar os contadores desejados e coletá-los.
Para ver uma lista de contadores conhecidos publicados pelo runtime do .NET, confira o documento Contadores disponíveis.
Personalizar os contadores a serem coletados
O exemplo a seguir mostra como adicionar/remover contadores. Essa personalização seria feita como parte da configuração de serviço de aplicativo depois que a coleção de telemetria do Application Insights for habilitada usando AddApplicationInsightsTelemetry() ou AddApplicationInsightsWorkerService(). Veja a seguir um exemplo de código de um aplicativo ASP.NET Core. Para outros tipos de aplicativos, consulte configurar módulos de telemetria.
using Microsoft.ApplicationInsights.Extensibility.EventCounterCollector;
using Microsoft.Extensions.DependencyInjection;
builder.Services.ConfigureTelemetryModule<EventCounterCollectionModule>(
(module, o) =>
{
// Removes all default counters, if any.
module.Counters.Clear();
// Adds a user defined counter "MyCounter" from EventSource named "MyEventSource"
module.Counters.Add(
new EventCounterCollectionRequest("MyEventSource", "MyCounter"));
// Adds the system counter "gen-0-size" from "System.Runtime"
module.Counters.Add(
new EventCounterCollectionRequest("System.Runtime", "gen-0-size"));
}
);
Desabilitar o módulo de coleta EventCounter
EventCounterCollectionModule pode ser desabilitado com ApplicationInsightsServiceOptions.
O exemplo a seguir usa o SDK do ASP.NET Core.
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;
var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);
Uma abordagem semelhante também pode ser usada para o SDK do Serviço de Trabalho, mas o namespace deve ser alterado conforme mostrado no exemplo a seguir.
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;
var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);
Consultas do Log Analytics para contadores de eventos
Você pode pesquisar e exibir relatórios do contador de eventos no Log Analytics, na tabela customMetrics.
Por exemplo, execute a consulta a seguir para ver quais contadores são coletados e estão disponíveis para consulta:
customMetrics | summarize avg(value) by name
Para obter um gráfico de um contador específico (por exemplo: ThreadPool Completed Work Item Count) no período recente, execute a consulta a seguir.
customMetrics
| where name contains "System.Runtime|ThreadPool Completed Work Item Count"
| where timestamp >= ago(1h)
| summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1m)
| render timechart
Como outras telemetrias, o customMetrics também tem uma coluna cloud_RoleInstance que indica a identidade da instância do servidor host no qual seu aplicativo está sendo executado. A consulta anterior mostra o valor do contador por instância e pode ser usada para comparar o desempenho de diferentes instâncias de servidor.
Perguntas frequentes sobre contadores de eventos
Para examinar as perguntas frequentes, consulte Perguntas frequentes sobre contadores de eventos.
Filtrar e enriquecer a telemetria
Nesta seção
- Filtrar e pré-processar telemetria
- Inicializadores de telemetria
- Processador de telemetria
- Amostragem
- Enriquecer dados por meio de HTTP
Filtrar e pré-processar telemetria
Você pode escrever código para filtrar, modificar ou enriquecer sua telemetria antes que ela seja enviada do SDK. O processamento inclui dados enviados dos módulos de telemetria padrão, como coleta de solicitações HTTP e coleção de dependências.
A filtragem pode modificar ou descartar a telemetria antes de ser enviada do SDK implementando
ITelemetryProcessor. Por exemplo, você pode reduzir o volume de telemetria excluindo solicitações de robôs. Ao contrário da amostragem, você tem controle total sobre o que é enviado ou descartado, mas pode afetar as métricas que se baseiam em logs agregados. Dependendo de como você descarta itens, você também pode perder a capacidade de navegar entre itens relacionados.Adicione ou modifique propriedades de qualquer telemetria enviada de seu aplicativo implementando um
ITelemetryInitializer. Por exemplo, você pode adicionar valores calculados ou números de versão pelos quais filtrar os dados no portal.A amostragem reduz o volume de telemetria sem afetar suas estatísticas. Ele mantém juntos os pontos de dados relacionados para que você possa navegar entre eles quando diagnosticar um problema. No portal, as contagens totais são multiplicadas para compensar a amostragem.
Observação
A API do SDK é usada para enviar eventos e métricas personalizados.
Filtragem
Essa técnica fornece controle direto sobre o que está incluído ou excluído do fluxo de telemetria. A filtragem pode ser usada para remover itens de telemetria de serem enviados para o Application Insights. Você pode usar a filtragem com amostragem ou separadamente.
Para filtrar a telemetria, você escreve um processador de telemetria e registra-o com TelemetryConfiguration. Toda a telemetria passa pelo processador. Você pode optar por removê-lo do fluxo ou passá-lo para o próximo processador na cadeia. A telemetria dos módulos padrão, como o coletor de solicitações HTTP e o coletor de dependências, e a telemetria que você mesmo rastreou está incluída. Por exemplo, é possível filtrar a telemetria sobre solicitações de robôs ou sobre chamadas de dependência bem-sucedidas.
Aviso
Filtrar a telemetria enviada do SDK usando processadores pode distorcer as estatísticas que você vê no portal e dificultar o acompanhamento de itens relacionados.
Em vez disso, considere usar amostragem.
ITelemetryProcessor e ITelemetryInitializer
Qual é a diferença entre processadores de telemetria e inicializadores de telemetria?
- Há algumas sobreposições no que você pode fazer com eles. Ambos podem ser usados para adicionar ou modificar propriedades de telemetria, embora seja recomendável que você use inicializadores para essa finalidade.
- Os inicializadores de telemetria sempre são executados antes dos processadores de telemetria.
- Os inicializadores de telemetria podem ser chamados mais de uma vez. Por convenção, normalmente não configuram propriedades que já estão configuradas.
- Os processadores de telemetria permitem substituir ou descartar completamente um item de telemetria.
- Todos os inicializadores de telemetria registrados são acionados para cada item de telemetria. Para processadores de telemetria, o SDK garante a chamada do primeiro processador de telemetria. Os processadores de telemetria anteriores é que decidem se o restante dos processadores será chamado ou não.
- Use inicializadores de telemetria para enriquecer a telemetria com mais propriedades ou substituir uma existente. Use um processador de telemetria para filtrar a telemetria.
Adicionar/modificar propriedades
Use inicializadores de telemetria para enriquecer a telemetria com informações adicionais ou para substituir as propriedades de telemetria definidas pelos módulos de telemetria padrão.
Por exemplo, o Application Insights para um pacote Web coleta telemetria sobre solicitações HTTP. Por padrão, ele sinaliza qualquer solicitação com um código >de resposta =400 como falha. Se, em vez disso, você quiser tratar 400 como um sucesso, poderá fornecer um inicializador de telemetria que define a propriedade de sucesso.
Se você fornecer um inicializador de telemetria, ele será chamado sempre que qualquer um dos métodos Track*() for chamado. Esse inicializador inclui métodos Track() chamados pelos módulos de telemetria padrão. Por convenção, esses módulos não definem nenhuma propriedade que já foi definida por um inicializador. Os inicializadores de telemetria são chamados antes de chamar processadores de telemetria, portanto, todos os enriquecimentos feitos pelos inicializadores são visíveis para os processadores.
Inicializadores de telemetria
Para enriquecer a telemetria com informações adicionais ou substituir propriedades de telemetria definidas pelos módulos de telemetria padrão, use inicializadores de telemetria.
Inicializadores de telemetria definem propriedades de contexto que são enviadas junto com cada item de telemetria. Você pode escrever seus próprios inicializadores para definir propriedades de contexto.
Os inicializadores padrão são todos definidos pelos pacotes NuGet da Web ou do WindowsServer:
| Inicializador | Description |
|---|---|
AccountIdTelemetryInitializer |
Define a propriedade AccountId |
AuthenticatedUserIdTelemetryInitializer |
Define a AuthenticatedUserId propriedade como definida pelo SDK do JavaScript. |
AzureRoleEnvironmentTelemetryInitializer |
Atualiza as propriedades RoleName e RoleInstance do contexto Device para todos os itens de telemetria com informações extraídas do ambiente de execução do Azure. |
BuildInfoConfigComponentVersionTelemetryInitializer |
Atualiza a propriedade Version do contexto Component para todos os itens de telemetria com o valor extraído do arquivo BuildInfo.config produzido pelo MS Build. |
ClientIpHeaderTelemetryInitializer |
Atualiza a Ip propriedade do Location contexto de todos os itens de telemetria com base no X-Forwarded-For cabeçalho HTTP da solicitação. |
DeviceTelemetryInitializer |
Atualiza as seguintes propriedades do Device contexto para todos os itens de telemetria:• Type é definido como PC.• Id é definido como o nome de domínio do computador em que o aplicativo Web está em execução.• OemName é definido como o valor extraído do campo Win32_ComputerSystem.Manufacturer usando WMI.• Model é definido como o valor extraído do campo Win32_ComputerSystem.Model usando WMI.• NetworkType é definido como o valor extraído da NetworkInterface propriedade.• Language é definido como o nome da CurrentCulture propriedade. |
DomainNameRoleInstanceTelemetryInitializer |
Atualiza a propriedade RoleInstance do contexto Device para todos os itens de telemetria com o nome de domínio do computador em que o aplicativo web está em execução. |
OperationNameTelemetryInitializer |
Atualiza a propriedade Name das propriedades RequestTelemetry e Name do contexto Operation de todos os itens de telemetria baseados no método HTTP, incluindo os nomes do controlador MVC do ASP.NET e a ação invocada para processar a solicitação. |
OperationIdTelemetryInitializer ou OperationCorrelationTelemetryInitializer |
Atualiza a propriedade de contexto Operation.Id de todos os itens de telemetria acompanhados durante o tratamento de uma solicitação com o RequestTelemetry.Id gerado automaticamente. |
SessionTelemetryInitializer |
Atualiza a propriedade Id do contexto Session de todos os itens de telemetria com o valor extraído do cookie ai_session gerado pelo código de instrumentação JavaScript ApplicationInsights em execução no navegador do usuário. |
SyntheticTelemetryInitializer ou SyntheticUserAgentTelemetryInitializer |
Atualiza as propriedades de contexto User, Session e Operation de todos os itens de telemetria monitorados ao lidar com uma solicitação de uma origem sintética, como um teste de disponibilidade ou bots de mecanismo de busca. Por padrão, o Metrics Explorer não exibe telemetria sintética.Os <Filters> definem as propriedades de identificação das solicitações. |
UserTelemetryInitializer |
Atualiza as propriedades Id e AcquisitionDate do contexto User para todos os itens de telemetria com valores extraídos do cookie ai_user, gerado pelo código de instrumentação JavaScript do Application Insights em execução no navegador do usuário. |
WebTestTelemetryInitializer |
Define a ID do usuário, a ID da sessão e as propriedades de origem sintética para solicitações HTTP provenientes de testes de disponibilidade. Os <Filters> definem as propriedades de identificação das solicitações. |
Observação
Para aplicativos .NET em execução no Azure Service Fabric, você pode incluir o Microsoft.ApplicationInsights.ServiceFabric pacote NuGet. Esse pacote inclui uma FabricTelemetryInitializer propriedade, que adiciona propriedades do Service Fabric a itens de telemetria. Para obter mais informações, consulte a página do GitHub sobre as propriedades adicionadas por este pacote NuGet.
Adicionar ITelemetryInitializer
Este blog descreve um projeto para diagnosticar problemas de dependência enviando automaticamente pings regulares para dependências.
Definir seu inicializador
using System; using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.DataContracts; using Microsoft.ApplicationInsights.Extensibility; namespace MvcWebRole.Telemetry { /* * Custom TelemetryInitializer that overrides the default SDK * behavior of treating response codes >= 400 as failed requests * */ public class MyTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { var requestTelemetry = telemetry as RequestTelemetry; // Is this a TrackRequest() ? if (requestTelemetry == null) return; int code; bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code); if (!parsed) return; if (code >= 400 && code < 500) { // If we set the Success property, the SDK won't change it: requestTelemetry.Success = true; // Allow us to filter these requests in the portal: requestTelemetry.Properties["Overridden400s"] = "true"; } // else leave the SDK to set the Success property } } }Carregue seu inicializador
Opção 1: configuração no código
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
Opção 2: configuração no ApplicationInsights.config
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
...
</TelemetryInitializers>
</ApplicationInsights>
Veja mais deste exemplo.
Observação
Verifique se o arquivo applicationinsights.config está no diretório de saída e contém alterações recentes.
Exemplo de ITelemetryInitializers
Adicionar uma propriedade personalizada
O inicializador de exemplo a seguir adiciona uma propriedade personalizada a cada telemetria controlada.
public void Initialize(ITelemetry item)
{
var itemProperties = item as ISupportProperties;
if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
{
itemProperties.Properties["customProp"] = "customValue";
}
}
Adicionar um nome de função de nuvem e uma instância de função de nuvem
Etapa 1: Gravar TelemetryInitializer personalizado
O inicializador de exemplo a seguir define o nome da função de nuvem para cada telemetria controlada.
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
namespace CustomInitializer.Telemetry
{
public class MyTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
//set custom role name here
telemetry.Context.Cloud.RoleName = "Custom RoleName";
telemetry.Context.Cloud.RoleInstance = "Custom RoleInstance";
}
}
}
}
Etapa 2: carregar um inicializador para TelemetryConfiguration
No arquivo ApplicationInsights.config :
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="CustomInitializer.Telemetry.MyTelemetryInitializer, CustomInitializer"/>
...
</TelemetryInitializers>
</ApplicationInsights>
Um método alternativo para ASP.NET aplicativos Web é instanciar o inicializador no código. O exemplo a seguir mostra o código no arquivo Global.aspx.cs :
using Microsoft.ApplicationInsights.Extensibility;
using CustomInitializer.Telemetry;
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
Controlar o endereço IP do cliente usado para mapeamentos de localização geográfica
O inicializador de exemplo a seguir define o IP do cliente, que é usado para mapeamento de localização geográfica, em vez do endereço IP do soquete do cliente, durante a ingestão de telemetria.
public void Initialize(ITelemetry telemetry)
{
var request = telemetry as RequestTelemetry;
if (request == null) return true;
request.Context.Location.Ip = "{client ip address}"; // Could utilize System.Web.HttpContext.Current.Request.UserHostAddress;
return true;
}
Processadores de telemetria
Os processadores de telemetria podem filtrar e modificar cada item de telemetria antes de serem enviados do SDK para o portal.
Implemente
ITelemetryProcessor.Os processadores de telemetria constrói uma cadeia de processamento. Ao instanciar um processador de telemetria, você obtém uma referência para o próximo processador da cadeia. Quando um ponto de dados de telemetria é passado para o método de processo, ele faz seu trabalho e, em seguida, chama (ou não chama) o próximo processador de telemetria na cadeia.
using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.DataContracts; public class SuccessfulDependencyFilter : ITelemetryProcessor { private ITelemetryProcessor Next { get; set; } // next will point to the next TelemetryProcessor in the chain. public SuccessfulDependencyFilter(ITelemetryProcessor next) { this.Next = next; } public void Process(ITelemetry item) { // To filter out an item, return without calling the next processor. if (!OKtoSend(item)) { return; } this.Next.Process(item); } // Example: replace with your own criteria. private bool OKtoSend (ITelemetry item) { var dependency = item as DependencyTelemetry; if (dependency == null) return true; return dependency.Success != true; } }Adicione seu processador.
Insira este trecho de código no ApplicationInsights.config:
<TelemetryProcessors> <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9"> <!-- Set public property --> <MyParamFromConfigFile>2-beta</MyParamFromConfigFile> </Add> </TelemetryProcessors>Você pode passar valores de string do arquivo .config ao definir propriedades públicas nomeadas na sua classe.
Aviso
Tome cuidado para corresponder o nome do tipo e quaisquer nomes de propriedade no arquivo .config aos nomes de classe e propriedades no código. Se o arquivo .config fizer referência a um tipo ou propriedade inexistente, o SDK poderá falhar silenciosamente ao enviar qualquer telemetria.
Como alternativa, você pode inicializar o filtro no código. Em uma classe de inicialização adequada, por exemplo, AppStart in
Global.asax.cs, insira seu processador na cadeia:Observação
O exemplo de código a seguir é obsoleto, mas é disponibilizado aqui para posteridade. Considere começar a usar o OpenTelemetry ou migrar para o OpenTelemetry.
var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; builder.Use((next) => new SuccessfulDependencyFilter(next)); // If you have more processors: builder.Use((next) => new AnotherProcessor(next)); builder.Build();Os clientes de telemetria criados após esse ponto usam seus processadores.
Processador de telemetria de amostragem adaptável (de 2.0.0-beta3)
Essa funcionalidade está habilitada por padrão. Se seu aplicativo enviar telemetria considerável, esse processador removerá parte dessa telemetria.
<TelemetryProcessors> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> </Add> </TelemetryProcessors>O parâmetro fornece o destino que o algoritmo tenta alcançar. Cada instância do SDK funciona de forma independente. Portanto, se o servidor for um cluster de vários computadores, o volume real de telemetria será multiplicado adequadamente.
Saiba mais sobre amostragem.
Processador de telemetria de amostragem com taxa fixa (de 2.0.0-beta1)
Há também um processador de telemetria de amostragem padrão (de 2.0.1):
<TelemetryProcessors> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.SamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <!-- Set a percentage close to 100/N where N is an integer. --> <!-- E.g. 50 (=100/2), 33.33 (=100/3), 25 (=100/4), 20, 1 (=100/100), 0.1 (=100/1000) --> <SamplingPercentage>10</SamplingPercentage> </Add> </TelemetryProcessors>
Filtros de exemplo
Solicitações sintéticas
Filtre os bots e os testes Web. Embora o Metrics Explorer lhe dê a opção de filtrar fontes sintéticas, essa opção reduz o tamanho do tráfego e da ingestão filtrando-as no próprio SDK.
public void Process(ITelemetry item)
{
if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
// Send everything else:
this.Next.Process(item);
}
Autenticação com falha
Filtre solicitações com uma resposta "401".
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null &&
request.ResponseCode.Equals("401", StringComparison.OrdinalIgnoreCase))
{
// To filter out an item, return without calling the next processor.
return;
}
// Send everything else
this.Next.Process(item);
}
Filtrar chamadas de dependência rápidas remotas
Se você quiser diagnosticar apenas chamadas lentas, filtre as rápidas.
Observação
Essa filtragem distorce as estatísticas que você vê no portal.
public void Process(ITelemetry item)
{
var request = item as DependencyTelemetry;
if (request != null && request.Duration.TotalMilliseconds < 100)
{
return;
}
this.Next.Process(item);
}
amostragem
Para saber como configurar a amostragem para aplicativos ASP.NET, confira Amostragem no Application Insights.
Enriquecer dados por meio de HTTP
var requestTelemetry = HttpContext.Current?.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;
if (requestTelemetry != null)
{
requestTelemetry.Properties["myProp"] = "someData";
}
Gerenciar componentes do SDK
Nesta seção
- Canais de telemetria
- Módulos de telemetria
- Desabilitar telemetria
- Provedor ApplicationId
- Coleção de instantâneos
Você pode personalizar o SDK do Application Insights para ASP.NET, ASP.NET Core e Serviço de Trabalho para alterar a configuração padrão.
O SDK do .NET do Application Insights consiste em muitos pacotes NuGet. O pacote principal fornece a API para enviar telemetria para o Application Insights. Mais pacotes fornecem módulos de telemetria e inicializadores para acompanhar automaticamente a telemetria do seu aplicativo e seu contexto. Ajustando o arquivo de configuração, você pode habilitar ou desabilitar módulos de telemetria e inicializadores. Você também pode definir parâmetros para alguns deles.
O arquivo de configuração é nomeado ApplicationInsights.config ou ApplicationInsights.xml. O nome depende do tipo do aplicativo. Ele é adicionado automaticamente ao seu projeto quando você instala a maioria das versões do SDK.
Por padrão, quando você usa a experiência automatizada dos projetos de modelo do Visual Studio que dão suporte a Adicionar>Application Insights Telemetry, o arquivo ApplicationInsights.config é criado na pasta raiz do projeto. Depois de compilar, ele é copiado para a pasta bin. Ele também é adicionado a um aplicativo Web pelo Application Insights Agent em um servidor IIS.
Importante
O arquivo de configuração será ignorado se a extensão para sites do Azure ou a extensão para VMs do Azure e conjuntos de dimensionamento de máquinas virtuais do Azure for usada.
Não há um arquivo equivalente para controlar o SDK em uma página da Web.
Canais de telemetria
Os canais de telemetria são parte integrante dos SDKs do Application Insights. Eles gerenciam o armazenamento em buffer e a transmissão de telemetria para o serviço do Application Insights. As versões .NET e .NET Core dos SDKs têm dois canais de telemetria integrados: InMemoryChannel e ServerTelemetryChannel. Esta seção descreve cada canal e mostra como personalizar o comportamento do canal.
Observação
Para examinar as perguntas frequentes, consulte Perguntas frequentes sobre canais de telemetria
O que são canais de telemetria?
Os canais de telemetria são responsáveis por armazenar itens de telemetria em buffer e enviá-los ao serviço Application Insights, onde são armazenados para consulta e análise. Um canal de telemetria é qualquer classe que implemente a interface Microsoft.ApplicationInsights.ITelemetryChannel.
O método Send(ITelemetry item) de um canal de telemetria é chamado depois que todos os inicializadores e processadores de telemetria são chamados. Portanto, todos os itens descartados por um processador de telemetria não chegam ao canal. O método Send() geralmente não envia os itens para o back-end de forma instantânea. Normalmente, ele os armazena em buffers na memória e os envia em lotes, para obter uma transmissão eficiente.
Evite chamar Flush() a menos que seja essencial enviar a telemetria armazenada em buffer imediatamente. Use-o apenas em cenários como desligamento do aplicativo, tratamento de exceções ou ao usar processos de curta duração, como trabalhos em segundo plano ou ferramentas de linha de comando. Em aplicativos Web ou serviços de execução longa, o SDK lida com o envio de telemetria automaticamente. Chamar Flush() desnecessariamente pode causar problemas de desempenho.
Live Metrics Stream também tem um canal personalizado que possibilita a transmissão ao vivo de telemetria. Este canal é independente do canal regular de telemetria e este documento não se aplica a ele.
Canais de telemetria integrados
Os SDKs do Application Insights .NET e .NET Core são fornecidos com dois canais integrados:
InMemoryChannel: um canal leve que armazena itens em buffer na memória até que eles sejam enviados. Os itens são armazenados em buffer na memória e liberados uma vez a cada 30 segundos ou sempre que 500 itens são armazenados em buffer. Este canal oferece garantias mínimas de confiabilidade porque não tenta enviar novamente a telemetria após uma falha. Esse canal também não mantém itens em disco. Portanto, todos os itens não enviados são perdidos permanentemente após o desligamento do aplicativo, sejam eles normais ou não. Este canal implementa um método
Flush()que pode ser usado para forçar a liberação de qualquer item de telemetria na memória de forma síncrona. Este canal é adequado para aplicações de curta duração, onde uma descarga síncrona é ideal.Este canal faz parte do pacote Microsoft.ApplicationInsights NuGet maior e é o canal padrão que o SDK usa quando nada mais está configurado.
ServerTelemetryChannel: um canal mais avançado que tem políticas de repetição e a capacidade de armazenar dados em um disco local. Este canal tenta enviar novamente a telemetria se ocorrerem erros transitórios. Este canal também usa armazenamento em disco local para manter itens no disco durante interrupções de rede ou altos volumes de telemetria. Por causa desses mecanismos de repetição e armazenamento em disco local, esse canal é considerado mais confiável. Isso é recomendado em todos os cenários de produção. Este canal é o padrão para aplicativos ASP.NET e ASP.NET Core configurados de acordo com a documentação oficial. Este canal é otimizado para cenários de servidor com processos de longa duração. O método
Flush()que é implementado por esse canal não é síncrono.Este canal é enviado como o pacote Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet e é adquirido automaticamente quando você usa o pacote Microsoft.ApplicationInsights.Web ou Microsoft.ApplicationInsights.AspNetCore NuGet.
Configure um canal de telemetria
Você configura um canal de telemetria definindo-o para a configuração de telemetria ativa. Nos aplicativos ASP.NET, a configuração envolve definir a instância do canal de telemetria como TelemetryConfiguration.Active ou modificando o ApplicationInsights.config. Nos aplicativos ASP.NET Core, a configuração envolve adicionar o canal ao contêiner de injeção de dependência.
As seções a seguir mostram exemplos de como definir a configuração StorageFolder do canal em vários tipos de aplicativos.
StorageFolder é apenas uma das configurações configuráveis. Para obter a lista completa de definições de configuração, confira a seção Configurações configuráveis nos canais mais tarde neste artigo.
Opção 1: configuração no código
O código a seguir configura uma instância ServerTelemetryChannel com StorageFolder definido como um local personalizado. Adicione este código no início do aplicativo, normalmente no método Application_Start() em Global.aspx.cs.
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
protected void Application_Start()
{
var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
}
Opção 2: configuração no ApplicationInsights.config
A seção a seguir de ApplicationInsights.config mostra o canal ServerTelemetryChannel configurado com StorageFolder definido para um local personalizado:
<TelemetrySinks>
<Add Name="default">
<TelemetryProcessors>
<!-- Telemetry processors omitted for brevity -->
</TelemetryProcessors>
<TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
<StorageFolder>d:\temp\applicationinsights</StorageFolder>
</TelemetryChannel>
</Add>
</TelemetrySinks>
Configuração no código para aplicativos de console
Para aplicativos de console, o código é o mesmo para .NET e .NET Core:
var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
Detalhes operacionais de ServerTelemetryChannel
ServerTelemetryChannel armazena os itens que chegam em um buffer na memória. Os itens são serializados, compactados e armazenados em uma instância Transmission uma vez a cada 30 segundos ou quando 500 itens são armazenados em buffer. Uma única instância Transmission contém até 500 itens e representa um lote de telemetria enviado por meio de uma única chamada HTTPS para o serviço do Application Insights.
Por padrão, no máximo 10 instâncias Transmission podem ser enviadas em paralelo. Se a telemetria estiver chegando a taxas mais rápidas ou se a rede ou o back-end do Application Insights for lento, as instâncias Transmission serão armazenadas na memória. A capacidade padrão desse buffer Transmission na memória é 5 MB. Quando a capacidade na memória é excedida, as instâncias Transmission são armazenadas em disco local até um limite de 50 MB.
As instâncias Transmission são armazenadas no disco local também quando há problemas de rede. Apenas os itens armazenados em um disco local sobrevivem a uma falha do aplicativo. Eles são enviados sempre que o aplicativo é iniciado novamente. Se os problemas de rede persistirem, ServerTelemetryChannel usará uma lógica de retirada exponencial que varia de 10 segundos a 1 hora antes de tentar novamente enviar telemetria.
Configurações configuráveis em canais
Para a lista completa de configurações configuráveis para cada canal, consulte:
Aqui estão as configurações mais comumente usadas para ServerTelemetryChannel:
MaxTransmissionBufferCapacity: A quantidade máxima de memória, em bytes, usada pelo canal para fazer o buffer das transmissões na memória. Quando essa capacidade é atingida, novos itens são armazenados diretamente no disco local. O valor padrão é 5 MB. Definir um valor mais alto leva a menos uso de disco, mas lembre-se de que os itens na memória serão perdidos se o aplicativo falhar.MaxTransmissionSenderCapacity: o número máximo de instânciasTransmissionque são enviadas ao Application Insights ao mesmo tempo. O valor padrão é 10. Essa configuração pode ser definida para um número maior, o que é recomendável quando é gerado um grande volume de telemetria. O volume alto normalmente ocorre durante o teste de carga ou quando a amostragem é desligada.StorageFolder: A pasta usada pelo canal para armazenar itens no disco conforme necessário. No Windows,% LOCALAPPDATA% ou% TEMP% é usado se nenhum outro caminho for especificado explicitamente. Em ambientes diferentes do Windows, por padrão, os seguintes locais são usados (em ordem): %TMPDIR%, /var/tmp/ ou /tmp/.
Qual canal devo usar?
Recomendamos ServerTelemetryChannel para a maioria dos cenários de produção que envolvem aplicativos de execução prolongada. Para obter mais informações sobre a liberação de telemetria, leia sobre o uso de Flush().
Quando usar Flush()
O método Flush() envia qualquer telemetria em buffer imediatamente. No entanto, ele só deve ser usado em cenários específicos.
Use Flush() quando:
- O aplicativo está prestes a ser desligado e você quer garantir que a telemetria seja enviada antes da saída.
- Você está em um manipulador de exceção e precisa garantir que a telemetria seja entregue.
- Você está escrevendo um processo de curta duração, como um trabalho em segundo plano ou uma ferramenta da CLI que sai rapidamente.
Evite usar Flush() em aplicativos de execução longa, como serviços Web. O SDK gerencia automaticamente o buffer e a transmissão. Chamar Flush() desnecessariamente pode causar problemas de desempenho e não garante que todos os dados sejam enviados, especialmente ao usar ServerTelemetryChannel, o que não libera de forma síncrona.
Módulos de telemetria
O Application Insights coleta automaticamente a telemetria sobre cargas de trabalho específicas sem a necessidade de acompanhamento manual do usuário.
Os módulos de coleta automática a seguir estão habilitados por padrão. Você pode desabilitá-los ou configurá-los para alterar o comportamento padrão deles.
Cada módulo de telemetria coleta um tipo específico de dados e usa a API principal para enviar os dados. Os módulos são instalados por diferentes pacotes NuGet, que também adicionam as linhas necessárias ao arquivo .config.
| Area | Description |
|---|---|
| Acompanhamento de solicitações | Coleta telemetria de solicitação (tempo de resposta, código de resultado) para solicitações da Web de entrada. Módulo: Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.Web |
| Acompanhamento de dependência | Coleta telemetria sobre dependências de saída (chamadas HTTP, chamadas SQL). Para trabalhar no IIS, instale o Agente de Application Insights. Também é possível escrever o acompanhamento de dependência personalizado usando a API TrackDependency. Dá suporte à autoinstrumentação com o Serviço de Aplicativo e o monitoramento de VMs e conjuntos de dimensionamento de máquinas virtuais. Módulo: Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.DependencyCollector |
| Contadores de desempenho | Coleta contadores de desempenho do Windows (CPU, memória, carga de rede de instalações do IIS). Especifique quais contadores (incluindo os personalizados). Para obter mais informações, consulte Coletar contadores de desempenho do sistema. Módulo: Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModuleNuGet:Microsoft.ApplicationInsights.PerfCounterCollector |
| Contadores de eventos | Coleta EventCounters do .NET. Recomendado para ASP.NET Core e multiplataforma no lugar de contadores de desempenho do Windows. Módulo: EventCounterCollectionModule (SDK ≥ 2.8.0) |
| Métricas dinâmicas (QuickPulse) | Coleta a telemetria para o painel Live Metrics. Módulo: QuickPulseTelemetryModule |
| Pulsações (Serviço de Aplicativo) | Envia pulsações e métricas personalizadas para o ambiente do Serviço de Aplicativo. Módulo: AppServicesHeartbeatTelemetryModule |
| Pulsações (VMs e conjuntos de dimensionamento de máquinas virtuais) | Envia pulsações e métricas personalizadas para o ambiente de VM do Azure. Módulo: AzureInstanceMetadataTelemetryModule |
| Telemetria de diagnóstico | Relata erros no código de instrumentação do Application Insights (por exemplo, contadores ausentes, exceções ITelemetryInitializer). A telemetria de rastreamento é exibida na Pesquisa de Diagnóstico.Módulo: Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModuleNuGet:Microsoft.ApplicationInsights Observação: se você instalar esse pacote apenas, o arquivo ApplicationInsights.config não será criado automaticamente. |
| Modo de desenvolvedor (depurador anexado) | Força o TelemetryChannel a enviar de itens imediatamente quando o depurador é anexado. Reduz a latência, mas aumenta a sobrecarga de CPU/rede.Módulo: Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModuleNuGet:Application Insights Windows Server |
| Acompanhamento de exceções (Web) | Rastreia exceções sem tratamento em aplicativos Web. Consulte Falhas e exceções Módulo: Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.Web |
| Acompanhamento de exceção (não observado/sem tratamento) | Rastreia exceções de tarefa não observadas e exceções sem tratamento para funções de trabalho, serviços Windows e aplicativos de console. Módulos: • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule• Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModuleNuGet:Microsoft.ApplicationInsights.WindowsServer |
| Acompanhamento de EventSource | Envia eventos EventSource configurados para o Application Insights como rastreamentos. Módulo: Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModuleNuGet:Microsoft.ApplicationInsights.EventSourceListener |
| Coletor ETW | Envia eventos de provedor ETW configurados para o Application Insights como rastreamentos. Módulo: Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModuleNuGet:Microsoft.ApplicationInsights.EtwCollector |
| API principal (não um módulo) |
API principal usada por outros componentes de telemetria e para telemetria personalizada. Módulo: Microsoft.ApplicationInsights packageNuGet:Microsoft.ApplicationInsights Observação: se você instalar esse pacote apenas, o arquivo ApplicationInsights.config não será criado automaticamente. |
Configurar módulos de telemetria
Use a seção TelemetryModules em ApplicationInsights.config para configurar, adicionar ou remover módulos. Os seguintes exemplos:
- Configurar
DependencyTrackingTelemetryModule(habilitar a injeção de cabeçalho W3C). - Configurar
EventCounterCollectionModule(limpar padrões e adicionar um único contador). - Desabilite a coleção de contadores de desempenho removendo
PerformanceCollectorModule.
<ApplicationInsights>
<TelemetryModules>
<!-- Dependency tracking -->
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<!-- Match Core example: enable W3C header injection -->
<EnableW3CHeadersInjection>true</EnableW3CHeadersInjection>
</Add>
<!-- EventCounterCollectionModule: add a single counter (if you use event counters) -->
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.EventCounterCollectionModule, Microsoft.AI.PerfCounterCollector">
<Counters>
<!-- Mirrors Core example: only collect 'gen-0-size' from System.Runtime -->
<Add ProviderName="System.Runtime" CounterName="gen-0-size" />
</Counters>
</Add>
<!-- PerformanceCollectorModule (classic Windows performance counters).
To DISABLE perf-counter collection, do NOT include this module.
If it already exists in your file, remove or comment it out.
Example of the line you would remove:
<Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector" />
-->
</TelemetryModules>
</ApplicationInsights>
Observação
O conjunto exato de módulos presentes em seu ApplicationInsights.config depende de quais pacotes do SDK você instalou.
Desabilitar telemetria
Há um nó no arquivo de configuração para cada módulo. Para desabilitar um módulo, exclua o nó ou comente-o.
Cadeia de conexão
Essa configuração determina o recurso application insights no qual seus dados são exibidos. Normalmente, você cria um recurso separado, com uma cadeia de conexão separada, para cada um dos seus aplicativos.
Consulte cadeias de conexão no Application Insights para obter exemplos de código.
Se você quiser definir a cadeia de conexão dinamicamente, por exemplo, para enviar resultados do aplicativo para recursos diferentes, poderá omitir a cadeia de conexão do arquivo de configuração e defini-la no código.
Para definir a cadeia de conexão para todas as instâncias de TelemetryClient, incluindo módulos de telemetria padrão, execute esta etapa em um método de inicialização, como global.aspx.cs em um serviço de ASP.NET:
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights;
protected void Application_Start()
{
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
configuration.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
var telemetryClient = new TelemetryClient(configuration);
Se você quiser enviar um conjunto específico de eventos para um recurso diferente, poderá definir a chave para um cliente de telemetria específico:
var tc = new TelemetryClient();
tc.Context.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
tc.TrackEvent("myEvent");
// ...
Para obter uma nova cadeia de conexão, crie um novo recurso no portal do Application Insights.
Provedor de ID de Aplicativo
Observação
Para ASP.NET, esse provedor está disponível a partir do SDK v2.6.0*.
A finalidade desse provedor é pesquisar uma ID do aplicativo com base em uma cadeia de conexão. O ID do aplicativo está incluído em RequestTelemetry e DependencyTelemetry e é usado para determinar a correlação no portal.
Essa funcionalidade está disponível por meio da configuração TelemetryConfiguration.ApplicationIdProvider.
Interface: IApplicationIdProvider
public interface IApplicationIdProvider
{
bool TryGetApplicationId(string instrumentationKey, out string applicationId);
}
Fornecemos duas implementações no SDK do Microsoft.ApplicationInsights : ApplicationInsightsApplicationIdProvider e DictionaryApplicationIdProvider.
ApplicationInsightsApplicationIdProvider
Esse wrapper é para nossa API de Perfil. Ele limita as solicitações e os resultados do cache. Esse provedor é incluído automaticamente ao instalar Microsoft.ApplicationInsights.DependencyCollector ou Microsoft.ApplicationInsights.Web.
A classe expõe uma propriedade opcional chamada ProfileQueryEndpoint. Por padrão, ele é definido como https://dc.services.visualstudio.com/api/profiles/{0}/appId.
Caso precise configurar um proxy, recomendamos fazer proxy do endereço base e garantir que o caminho inclua /api/profiles/{0}/appId. Em runtime, {0} é substituído pela chave de instrumentação para cada solicitação.
Configuração de exemplo por meio de ApplicationInsights.config
<ApplicationInsights>
...
<ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights">
<ProfileQueryEndpoint>https://dc.services.visualstudio.com/api/profiles/{0}/appId</ProfileQueryEndpoint>
</ApplicationIdProvider>
...
</ApplicationInsights>
Configuração de exemplo por meio de código
TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();
DictionaryApplicationIdProvider
Esse provedor estático depende dos pares de chave de instrumentação/ID do aplicativo configurados.
Essa classe tem a propriedade Defined, que é um Dictionary<string,string> dos pares de chave de instrumentação/ID do aplicativo.
Essa classe tem a propriedade Nextopcional, que pode ser usada para configurar outro provedor a ser usado quando uma cadeia de conexão é solicitada que não existe em sua configuração.
Configuração de exemplo por meio de ApplicationInsights.config
<ApplicationInsights>
...
<ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.DictionaryApplicationIdProvider, Microsoft.ApplicationInsights">
<Defined>
<Type key="InstrumentationKey_1" value="ApplicationId_1"/>
<Type key="InstrumentationKey_2" value="ApplicationId_2"/>
</Defined>
<Next Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
</ApplicationIdProvider>
...
</ApplicationInsights>
Configuração de exemplo por meio de código
TelemetryConfiguration.Active.ApplicationIdProvider = new DictionaryApplicationIdProvider{
Defined = new Dictionary<string, string>
{
{"InstrumentationKey_1", "ApplicationId_1"},
{"InstrumentationKey_2", "ApplicationId_2"}
}
};
Configurar a coleção de instantâneos
Para saber como configurar a coleção de instantâneos para aplicativos ASP.NET e ASP.NET Core, consulte Habilitar o Depurador de Instantâneos para aplicativos .NET no Azure Service Fabric, Serviços de Nuvem e Máquinas Virtuais.
Adicionar monitoramento do lado do cliente
As seções anteriores forneceram orientações sobre métodos para configurar o monitoramento do lado do servidor de forma automática e manual. Para adicionar o monitoramento do lado do cliente, use o SDK do JavaScript cliente. Você pode monitorar as transações do lado do cliente de qualquer página da Web adicionando um Script do Carregador de SDK do JavaScript (Web) antes da marca de fechamento </head> do HTML da página.
Embora seja possível adicionar manualmente o Script do Carregador do SDK do JavaScript (Web) ao cabeçalho de cada página HTML, recomendamos que você adicione o Script do Carregador do SDK do JavaScript (Web) a uma página principal. Essa ação injeta o script carregador do SDK de JavaScript (Web) em todas as páginas de um site.
Para o aplicativo MVC do ASP.NET baseado em modelo deste artigo, o arquivo que você precisa editar é o _Layout.cshtml. Encontre-o em Exibições>Compartilhado. Para adicionar o monitoramento do lado do cliente, abra _Layout.cshtml e siga as instruções de configuração baseadas no Script do Carregador do SDK do JavaScript (Web) no artigo sobre configuração do SDK do JavaScript do lado do cliente.
API principal para eventos e métricas personalizados
Insira algumas linhas de código em seu aplicativo para descobrir o que os usuários estão fazendo com ele ou para ajudar a diagnosticar problemas. Você pode enviar telemetria de aplicativos de dispositivo e desktop, clientes Web e servidores Web. Use a API de telemetria principal do Application Insights para enviar eventos e métricas personalizados e suas próprias versões da telemetria padrão. Essa API é a mesma API que os coletores de dados padrão do Application Insights usam.
Resumo da API
A API principal é uniforme em todas as plataformas, além de algumas variações como GetMetric (somente .NET).
| Método | Usado para |
|---|---|
TrackPageView |
Páginas, telas, painéis ou formulários. |
TrackEvent |
Ações do usuário e outros eventos. Usado para acompanhar o comportamento do usuário ou monitorar o desempenho. |
GetMetric |
Métricas zero e multidimensionais, agregação configurada centralmente, somente C#. |
TrackMetric |
Medidas de desempenho, como comprimentos de fila não relacionados a eventos específicos. |
TrackException |
Registro de exceções para diagnóstico. Rastrear onde elas ocorrem em relação a outros eventos e examinar os rastreamentos de pilha. |
TrackRequest |
Registrando em log a frequência e a duração das solicitações de servidor para análise de desempenho. |
TrackTrace |
Mensagens de log de diagnóstico de recurso. Você também pode capturar logs de terceiros. |
TrackDependency |
Registrar em log a duração e a frequência das chamadas para componentes externos dos quais seu aplicativo depende. |
Você pode anexar propriedades e métricas à maioria dessas chamadas de telemetria.
Pré-requisitos
Se você ainda não possui uma referência ao SDK do Application Insights:
Adicione o SDK do Application Insights ao seu projeto.
No código do dispositivo ou servidor Web, inclua:
Obter uma instância do TelemetryClient
Obter uma instância de TelemetryClient:
Observação
Se você usar o Azure Functions v2+ ou o Azure WebJobs v3+, consulte Monitorar o Azure Functions.
Observação
Para aplicativos ASP.NET Core e aplicativos Não HTTP/Worker for .NET/.NET Core, obtenha uma instância do TelemetryClient do contêiner de injeção de dependência conforme explicado em sua respectiva documentação.
private TelemetryClient telemetry = new TelemetryClient();
Se você vir uma mensagem informando que esse método está obsoleto, consulte microsoft/ApplicationInsights-dotnet#1152 para obter mais informações.
As solicitações HTTP de entrada são capturadas automaticamente. Talvez você queira criar mais instâncias de TelemetryClient para outros módulos do seu aplicativo. Por exemplo, você pode ter uma TelemetryClient instância em sua classe middleware para relatar eventos de lógica de negócios. Você pode definir propriedades como UserId e DeviceId identificar o computador. Essas informações são anexadas a todos os eventos que a instância envia.
TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";
Observação
TelemetryClient é thread-safe.
TrackEvent
No Application Insights, um evento personalizado é um ponto de dados que você pode exibir no Metrics Explorer como uma contagem agregada e na Pesquisa de Diagnóstico como ocorrências individuais. (Não está relacionado ao MVC ou a outros "eventos") da estrutura.
Insira chamadas de TrackEvent em seu código para fazer a contagem de vários eventos. Por exemplo, talvez você queira acompanhar a frequência com que os usuários escolhem um recurso específico. Ou talvez você queira saber com que frequência eles atingem determinadas metas ou cometem tipos específicos de erros.
Por exemplo, em um aplicativo de jogo, envie um evento sempre que um usuário ganhar o jogo:
Eventos personalizados no Log Analytics
A telemetria está disponível na tabela customEvents, na guia Logs do Application Insights ou na experiência de uso. Os eventos podem vir de trackEvent(..) ou do plug-in de Coleta Automática do Click Analytics.
Se a amostragem estiver em operação, a itemCount propriedade mostrará um valor maior que 1. Por exemplo, itemCount==10 significa que, de 10 chamadas para trackEvent(), o processo de amostragem transmitiu apenas uma delas. Para obter uma contagem correta de eventos personalizados, use código como customEvents | summarize sum(itemCount).
Observação
itemCount tem um valor mínimo de um; o registro em si representa uma entrada.
GetMetric
Para saber como usar efetivamente a GetMetric() chamada para capturar métricas pré-configuradas localmente para aplicativos .NET e .NET Core, consulte a coleção de métricas personalizadas no .NET e no .NET Core.
TrackMetric
Observação
Microsoft.ApplicationInsights.TelemetryClient.TrackMetric não é o método preferencial para enviar métricas. As métricas devem ser sempre pré-agregadas ao longo de um período de tempo antes de serem enviadas. Use uma das sobrecargas de GetMetric(..) para obter um objeto de métrica a fim de acessar as funcionalidades de pré-agregação do SDK.
Se você estiver implementando sua própria lógica de pré-agregação, poderá usar o TrackMetric() método para enviar as agregações resultantes. Se o aplicativo exigir o envio de um item de telemetria separado em todas as ocasiões sem agregação ao longo do tempo, você provavelmente terá um caso de uso para telemetria de eventos. Consulte TelemetryClient.TrackEvent(Microsoft.ApplicationInsights.DataContracts.EventTelemetry).
O Application Insights pode mapear métricas que não estão anexadas a eventos específicos. Por exemplo, você pode monitorar um comprimento de fila em intervalos regulares. Com as métricas, as medidas individuais são de menor interesse do que as variações e tendências e, portanto, os gráficos estatísticos são úteis.
Para enviar métricas para o Application Insights, você pode usar a TrackMetric(..) API. Há duas maneiras de enviar uma métrica:
Valor único. Sempre que você executa uma medida em seu aplicativo, envia o valor correspondente para o Application Insights.
Por exemplo, suponha que você tenha uma métrica que descreva o número de itens em um contêiner. Durante um período de tempo específico, primeiro você coloca três itens no contêiner e, em seguida, remove dois itens. Assim, você ligaria
TrackMetricduas vezes. Primeiro, você passaria o valor3e, em seguida, passaria o valor-2. O Application Insights armazena os dois valores para você.Agregação. Quando você trabalha com métricas, cada medida raramente é de interesse. Em vez disso, um resumo do que aconteceu durante um determinado período de tempo é importante. Chamamos essa síntese de agregação.
No exemplo anterior, a soma da métrica de agregação para esse período de tempo é
1e a contagem dos valores de métrica é2. Ao usar a abordagem de agregação, você invocaTrackMetricapenas uma vez por período de tempo e envia os valores agregados. Recomendamos essa abordagem porque ela pode reduzir significativamente a sobrecarga de custo e desempenho enviando menos pontos de dados para o Application Insights, enquanto ainda coleta todas as informações relevantes.
Exemplos de valor único
Para enviar um único valor de métrica:
var sample = new MetricTelemetry();
sample.Name = "queueLength";
sample.Sum = 42.3;
telemetryClient.TrackMetric(sample);
Métricas personalizadas no Log Analytics
A telemetria está disponível na tabela no customMetricsApplication Insights Analytics. Cada linha representa uma chamada para trackMetric(..) em seu aplicativo.
-
valueSum: a soma das medidas. Para obter o valor médio, divida porvalueCount. -
valueCount: o número de medições que foram agregadas nestatrackMetric(..)chamada.
Observação
valueCount tem um valor mínimo de um; o registro em si representa uma entrada.
Exibições de página
Em um aplicativo ou página da Web, a telemetria de exibição de página é enviada por padrão quando cada tela ou página é carregada. Mas você pode alterar o padrão para acompanhar exibições de página em momentos mais ou diferentes. Por exemplo, em um aplicativo que exibe guias ou painéis, talvez você queira rastrear uma página sempre que o usuário abrir um novo painel.
Dados de usuário e de sessão são enviados como propriedades, juntamente com exibições de páginas, assim, os gráficos de usuário e sessão são ativados quando há telemetria de exibições de páginas.
Exibições de página personalizadas
Telemetria de página no Log Analytics
No Log Analytics, duas tabelas mostram dados das operações do navegador:
-
pageViews: contém dados sobre a URL e o título da página. -
browserTimings: contém dados sobre o desempenho do cliente, como o tempo necessário para processar os dados de entrada.
Para descobrir quanto tempo o navegador leva para processar páginas diferentes:
browserTimings
| summarize avg(networkDuration), avg(processingDuration), avg(totalDuration) by name
Para descobrir a popularidade de navegadores diferentes:
pageViews
| summarize count() by client_Browser
Para associar as exibições de página a chamadas AJAX, utilize dependências:
pageViews
| join (dependencies) on operation_Id
TrackRequest
O SDK do servidor usa TrackRequest para logar requisições HTTP.
Você também pode chamá-lo por conta própria se quiser simular solicitações em um contexto em que não tenha o módulo de serviço Web em execução.
A maneira recomendada de enviar telemetria de solicitação é onde a solicitação atua como um contexto de operação.
Contexto da operação
Você pode correlacionar itens de telemetria ao associá-los ao contexto da operação. O módulo de acompanhamento de solicitações padrão faz isso para exceções e outros eventos que são enviados enquanto uma solicitação HTTP está sendo processada. Em Pesquisa e Análise, você pode encontrar facilmente todos os eventos associados à solicitação usando sua ID de operação.
Ao acompanhar a telemetria manualmente, a maneira mais fácil de garantir a correlação de telemetria é usando esse padrão:
// Establish an operation context and associated telemetry item:
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("operationName"))
{
// Telemetry sent in here uses the same operation ID.
...
telemetryClient.TrackTrace(...); // or other Track* calls
...
// Set properties of containing telemetry item--for example:
operation.Telemetry.ResponseCode = "200";
// Optional: explicitly send telemetry item:
telemetryClient.StopOperation(operation);
} // When operation is disposed, telemetry item is sent.
Para obter mais informações sobre correlação, consulte a correlação de telemetria no Application Insights.
Junto com a configuração de um contexto de operação, StartOperation cria um item de telemetria do tipo que você especificar. Ele envia o item de telemetria quando você descarta a operação ou se você chamar StopOperation explicitamente. Se você usar RequestTelemetry como o tipo de telemetria, sua duração será definida como o intervalo cronometrado entre iniciar e parar.
Itens de telemetria relatados em um escopo da operação se tornam “filhos” dessa operação. Contextos de operação podem ser aninhados.
Na Pesquisa, o contexto da operação é usado para criar a lista Itens Relacionados .
Para obter mais informações sobre o acompanhamento de operações personalizadas, consulte Rastrear operações personalizadas com o SDK do .NET do Application Insights.
Solicitações no Log Analytics
No Application Insights Analytics, as solicitações aparecem na requests tabela.
Se a amostragem estiver em operação, a itemCount propriedade mostrará um valor maior que 1. Por exemplo, itemCount==10 significa que, de 10 chamadas para trackRequest(), o processo de amostragem transmitiu apenas uma delas. Para obter uma contagem correta de solicitações e duração média segmentada por nomes de solicitação, use código como:
requests
| summarize count = sum(itemCount), avgduration = avg(duration) by name
TrackException
Enviar exceções ao Application Insights:
- Para contá-las como uma indicação da frequência de um problema.
- Para examinar ocorrências individuais.
Os relatórios incluem os rastreamentos de pilha.
Os SDKs capturam muitas exceções automaticamente, para que você nem sempre precise chamar TrackException explicitamente.
Exceções no Log Analytics
No Application Insights Analytics, as exceções aparecem na exceptions tabela.
Se a amostragem estiver em operação, a itemCount propriedade mostrará um valor maior que 1. Por exemplo, itemCount==10 significa que, de 10 chamadas para trackException(), o processo de amostragem transmitiu apenas uma delas. Para obter uma contagem correta de exceções segmentada por tipo de exceção, use código como:
exceptions
| summarize sum(itemCount) by type
A maioria das informações de pilha importante já foi extraída em variáveis separadas, mas você pode extrair e separar a estrutura details para obter mais. Como essa estrutura é dinâmica, você deve converter o resultado para o tipo esperado. Por exemplo:
exceptions
| extend method2 = tostring(details[0].parsedStack[1].method)
Para associar as solicitações relacionadas a exceções, use uma junção:
exceptions
| join (requests) on operation_Id
TrackTrace
Use TrackTrace para ajudar a diagnosticar problemas enviando uma 'trilha de navegação estrutural' ao Application Insights. Você pode enviar partes de dados de diagnóstico e inspecioná-los na Pesquisa de Diagnóstico.
No .NET, os adaptadores de log usam essa API para enviar logs de terceiros ao portal.
telemetry.TrackTrace(message, SeverityLevel.Warning, properties);
Registrar um evento de diagnóstico, como entrar ou sair de um método.
| Parâmetro | Description |
|---|---|
message |
Dados de diagnóstico. Pode ser muito mais longo do que um nome. |
properties |
Mapa de cadeia de caracteres para cadeia de caracteres. Mais dados são usados para filtrar exceções no portal. O padrão é vazio. |
severityLevel |
Valores com suporte: SeverityLevel.ts. |
Você pode pesquisar no conteúdo da mensagem, mas ao contrário dos valores de propriedade, não é possível filtrar nele.
O limite de tamanho para message é muito maior do que o limite de propriedades. Uma vantagem de TrackTrace é que você pode colocar dados relativamente longos na mensagem. Por exemplo, você pode codificar dados POST lá.
Você também pode adicionar um nível de severidade à sua mensagem. E, assim como outra telemetria, você pode adicionar valores de propriedade para ajudá-lo a filtrar ou pesquisar diferentes conjuntos de traços. Por exemplo:
var telemetry = new Microsoft.ApplicationInsights.TelemetryClient();
telemetry.TrackTrace("Slow database response",
SeverityLevel.Warning,
new Dictionary<string,string> { {"database", db.ID} });
Na Pesquisa, você pode filtrar facilmente todas as mensagens de um nível de severidade específico relacionado a um banco de dados específico.
Rastreamentos no Log Analytics
No Application Insights Analytics, as chamadas para TrackTrace aparecem na tabela traces.
Se a amostragem estiver em operação, a itemCount propriedade mostrará um valor maior que 1. Por exemplo, itemCount==10 significa que, de 10 chamadas para trackTrace(), o processo de amostragem transmitiu apenas uma delas. Para obter uma contagem correta de chamadas de rastreamento, use código como traces | summarize sum(itemCount).
TrackDependency
Use a chamada TrackDependency para acompanhar os tempos de resposta e as taxas de êxito das chamadas a um trecho de código externo. Os resultados aparecem nos gráficos de dependência no portal. O snippet de código a seguir deve ser adicionado sempre que houver uma chamada de dependência.
Observação
Para .NET e .NET Core, você também pode usar o TelemetryClient.StartOperation método (extensão) que preenche as DependencyTelemetry propriedades necessárias para correlação e algumas outras propriedades, como a hora de início e a duração, portanto, você não precisa criar um temporizador personalizado como com os exemplos a seguir. Para obter mais informações, confira a seção sobre o acompanhamento de dependência de saída em Rastrear operações personalizadas com o SDK do .NET do Application Insights.
var success = false;
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
success = dependency.Call();
}
catch(Exception ex)
{
success = false;
telemetry.TrackException(ex);
throw new Exception("Operation went wrong", ex);
}
finally
{
timer.Stop();
telemetry.TrackDependency("DependencyType", "myDependency", "myCall", startTime, timer.Elapsed, success);
}
Lembre-se de que os SDKs do servidor incluem um módulo de dependência que descobre e rastreia determinadas chamadas de dependência automaticamente, por exemplo, para bancos de dados e APIs REST. Você precisa instalar um agente no servidor para fazer o módulo funcionar.
Você usará essa chamada se quiser acompanhar as chamadas que o acompanhamento automatizado não captura.
Para desativar o módulo de controle de dependência padrão em C#, edite ApplicationInsights.config e exclua a referência para DependencyCollector.DependencyTrackingTelemetryModule.
Dependências no Log Analytics
No
Se a amostragem estiver em operação, a itemCount propriedade mostrará um valor maior que 1. Por exemplo, itemCount==10 significa que, de 10 chamadas para trackDependency(), o processo de amostragem transmitiu apenas uma delas. Para obter uma contagem correta de dependências segmentadas pelo componente de destino, use código como:
dependencies
| summarize sum(itemCount) by target
Para associar as solicitações relacionadas a dependências, use uma junção:
dependencies
| join (requests) on operation_Id
Liberando dados
Normalmente, o SDK envia dados em intervalos fixos, normalmente 30 segundos ou sempre que o buffer está cheio, que normalmente é de 500 itens. Em alguns casos, talvez você queira liberar o buffer. Um exemplo é se você está usando o SDK em um aplicativo que é desligado.
Ao usar Flush(), recomendamos este padrão:
telemetry.Flush();
// Allow some time for flushing before shutdown.
System.Threading.Thread.Sleep(5000);
Ao usar FlushAsync(), recomendamos este padrão:
await telemetryClient.FlushAsync()
// No need to sleep
É recomendável sempre liberar como parte do desligamento do aplicativo para garantir que a telemetria não seja perdida.
Observação
Revise a configuração do Autoflush: habilitar o salvamento automático em seu web.config arquivo pode levar à degradação de desempenho em aplicativos .NET instrumentados com o Application Insights. Com o salvamento automático habilitado, cada invocação de métodos System.Diagnostics.Trace.Trace* resulta em itens de telemetria individuais sendo enviados como solicitações da Web distintas separadas para o serviço de ingestão. Isso pode potencialmente causar esgotamento de rede e armazenamento em seus servidores Web. Para melhorar o desempenho, é recomendável desabilitar a autoflush e, também, utilizar o ServerTelemetryChannel, projetado para uma transmissão de dados de telemetria mais eficaz.
A função é assíncrona para o canal de telemetria do servidor.
Usuários autenticados
Por padrão, em um aplicativo web, os usuários são identificados com cookies. Um usuário poderá ser contado mais de uma vez se acessar seu aplicativo de um computador ou navegador diferente ou se excluir cookies.
Se os usuários entrarem em seu aplicativo, você poderá obter uma contagem mais precisa definindo a ID de usuário autenticada no código do navegador. Não é necessário usar o nome de entrada real do usuário. Precisa apenas ser uma identificação exclusiva para este usuário. Ele não deve incluir espaços nem nenhum dos caracteres ,;=|.
A ID do usuário também é definida em um cookie de sessão e enviada para o servidor. Se o SDK do servidor estiver instalado, a ID de usuário autenticada será enviada como parte das propriedades de contexto da telemetria do cliente e do servidor. Em seguida, você pode filtrar e pesquisar nele.
Se o aplicativo agrupar usuários em contas, você também poderá passar um identificador para a conta. As mesmas restrições de caractere se aplicam.
No Metrics Explorer, você pode criar um gráfico que conta Usuários Autenticados e Contas de Usuários.
Você também pode pesquisar pontos de dados do cliente com nomes de usuário e contas específicas.
Observação
A propriedade EnableAuthenticationTrackingJavaScript na classe ApplicationInsightsServiceOptions no SDK do .NET Core simplifica a configuração javaScript necessária para injetar o nome de usuário como a ID de Autenticação para cada rastreamento enviado pelo SDK javaScript do Application Insights.
Quando essa propriedade é definida como true, o nome de usuário do usuário no ASP.NET Core é impresso junto com a telemetria do lado do cliente. Por esse motivo, adicionar appInsights.setAuthenticatedUserContext manualmente não é mais necessário porque ele já é injetado pelo SDK para ASP.NET Core. A ID de autenticação também é enviada para o servidor onde o SDK no .NET Core identifica e o usa para qualquer telemetria do lado do servidor, conforme descrito na referência à API JavaScript.
Para aplicativos JavaScript que não funcionam da mesma maneira que ASP.NET Core MVC, como aplicativos Web SPA, você ainda precisa adicionar appInsights.setAuthenticatedUserContext manualmente.
Filtrar, pesquisar e segmentar seus dados usando propriedades
Você pode anexar propriedades e medidas a seus eventos, métricas, exibições de página, exceções e outros dados de telemetria.
As propriedades são valores de cadeia de caracteres que você pode usar para filtrar sua telemetria nos relatórios de uso. Por exemplo, se seu aplicativo fornecer vários jogos, você poderá anexar o nome do jogo a cada evento para que você possa ver quais jogos são mais populares.
Há um limite de 8.192 no comprimento da cadeia de caracteres. Se você quiser enviar grandes partes de dados, use o parâmetro de mensagem de TrackTrace.
As métricas são valores numéricos que podem ser apresentados graficamente. Por exemplo, talvez você queira ver se há um aumento gradual nas pontuações que seus jogadores alcançam. Os grafos podem ser segmentados pelas propriedades enviadas com o evento para que você possa obter grafos separados ou empilhados para jogos diferentes.
Os valores de métrica devem ser maiores ou iguais a 0 para serem exibidos corretamente.
Há alguns limites no número de propriedades, valores de propriedade e métricas que você pode usar.
// Set up some properties and metrics:
var properties = new Dictionary <string, string>
{{"game", currentGame.Name}, {"difficulty", currentGame.Difficulty}};
var metrics = new Dictionary <string, double>
{{"Score", currentGame.Score}, {"Opponents", currentGame.OpponentCount}};
// Send the event:
telemetry.TrackEvent("WinGame", properties, metrics);
Importante
Verifique se você não registra informações de identificação pessoal nas propriedades.
Maneira alternativa de definir propriedades e métricas
Se for mais conveniente, você poderá coletar os parâmetros de um evento em um objeto separado:
var event = new EventTelemetry();
event.Name = "WinGame";
event.Metrics["processingTime"] = stopwatch.Elapsed.TotalMilliseconds;
event.Properties["game"] = currentGame.Name;
event.Properties["difficulty"] = currentGame.Difficulty;
event.Metrics["Score"] = currentGame.Score;
event.Metrics["Opponents"] = currentGame.Opponents.Length;
telemetry.TrackEvent(event);
Aviso
Não reutilize a mesma instância de item de telemetria (event neste exemplo) para chamar Track*() várias vezes. Essa prática pode fazer com que a telemetria seja enviada com configuração incorreta.
Medidas e propriedades personalizadas no Log Analytics
No Log Analytics, as métricas e propriedades personalizadas aparecem nos atributos customMeasurements e customDimensions de cada registro de telemetria.
Por exemplo, se você adicionar uma propriedade chamada "game" à telemetria de requisição, essa consulta conta as ocorrências de diferentes valores de "game" e mostra a média da métrica personalizada "score".
requests
| summarize sum(itemCount), avg(todouble(customMeasurements.score)) by tostring(customDimensions.game)
Observe que:
- Quando você extrai um valor do JSON
customDimensionsoucustomMeasurements, ele tem o tipo dinâmico, portanto, você deve convertê-lo emtostringoutodouble. - Para levar em conta a possibilidade de amostragem, use
sum(itemCount)nãocount().
Eventos de tempo
Às vezes, você deseja mapear quanto tempo leva para executar uma ação. Por exemplo, talvez você queira saber quanto tempo os usuários levam para considerar as opções em um jogo. Para obter essas informações, use o parâmetro de medida.
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// ... perform the timed action ...
stopwatch.Stop();
var metrics = new Dictionary <string, double>
{{"processingTime", stopwatch.Elapsed.TotalMilliseconds}};
// Set up some properties:
var properties = new Dictionary <string, string>
{{"signalSource", currentSignalSource.Name}};
// Send the event:
telemetry.TrackEvent("SignalProcessed", properties, metrics);
Propriedades padrão para telemetria personalizada
Se você quiser definir valores de propriedade padrão para alguns dos eventos personalizados que você escreve, defina-os em uma TelemetryClient instância. Eles são anexados a todos os itens de telemetria enviados desse cliente.
using Microsoft.ApplicationInsights.DataContracts;
var gameTelemetry = new TelemetryClient();
gameTelemetry.Context.GlobalProperties["Game"] = currentGame.Name;
// Now all telemetry is automatically sent with the context property:
gameTelemetry.TrackEvent("WinGame");
Chamadas de telemetria individuais podem substituir os valores padrão em seus dicionários de propriedades.
Para adicionar propriedades a todas as telemetrias, incluindo os dados de módulos de coleta padrão, implemente ITelemetryInitializer.
Desabilitar telemetria
Para interromper e iniciar dinamicamente a coleção e a transmissão da telemetria:
using Microsoft.ApplicationInsights.Extensibility;
TelemetryConfiguration.Active.DisableTelemetry = true;
Modo de desenvolvedor
Durante a depuração, é útil ter sua telemetria emitida pelo pipeline para que você possa ver os resultados imediatamente. Você também recebe outras mensagens que ajudam a rastrear problemas com a telemetria. Desative-o na produção porque pode diminuir a velocidade do aplicativo.
Definir a chave de instrumentação para a telemetria personalizada selecionada
var telemetry = new TelemetryClient();
telemetry.InstrumentationKey = "---my key---";
// ...
Cadeia de conexão dinâmica
Para evitar misturar a telemetria de ambientes de desenvolvimento, teste e produção, você pode criar recursos separados do Application Insights e alterar suas chaves, dependendo do ambiente.
Em vez de obter a chave de instrumentação do arquivo de configuração, você pode defini-la em seu código. Defina a chave em um método de inicialização, como global.aspx.cs em um serviço ASP.NET:
protected void Application_Start()
{
Microsoft.ApplicationInsights.Extensibility.
TelemetryConfiguration.Active.InstrumentationKey =
// - for example -
WebConfigurationManager.Settings["ikey"];
...
}
TelemetryContext
TelemetryClient tem uma propriedade Context, que contém valores que são enviados junto com todos os dados de telemetria. Eles normalmente são definidos pelos módulos de telemetria padrão, mas você também pode defini-los por conta própria. Por exemplo:
telemetry.Context.Operation.Name = "MyOperationName";
Se você definir qualquer um desses valores por conta própria, considere remover a linha relevante de ApplicationInsights.config para que seus valores e os valores padrão não fiquem confusos.
- Componente: o aplicativo e sua versão.
- Dispositivo: dados sobre o dispositivo em que o aplicativo está sendo executado. Em aplicativos Web, é o servidor ou o dispositivo cliente que envia telemetria.
- InstrumentationKey: o recurso Application Insights no Azure em que a telemetria é exibida. Geralmente é obtido a partir de ApplicationInsights.config.
- Local: a localização geográfica do dispositivo.
-
Operação: em aplicativos Web, a solicitação HTTP atual. Em outros tipos de aplicativo, você pode definir esse valor para agrupar eventos.
- ID: um valor gerado que correlaciona eventos diferentes para que, ao inspecionar qualquer evento na Pesquisa de Diagnóstico, você possa encontrar itens relacionados.
- Nome: um identificador, geralmente a URL da solicitação HTTP.
- SyntheticSource: se não for nulo ou vazio, uma cadeia de caracteres que indica que a origem da solicitação foi identificada como um teste de robô ou web. Por padrão, ele é excluído dos cálculos no Metrics Explorer.
- Sessão: a sessão do usuário. A ID é definida como um valor gerado, que é alterado quando o usuário não está ativo há algum tempo.
- Usuário: Informações do usuário.
Limits
Há alguns limites quanto ao número de métricas e eventos por aplicativo, ou seja, por chave de instrumentação. Os limites dependem do plano de preços que você escolher.
| Resource | Limite padrão | Limite máximo | Anotações |
|---|---|---|---|
| Total de dados por dia | 100 GB | Fale com o suporte. | Você pode definir um limite para reduzir os dados. Caso precise de mais dados, você pode aumentar o limite no portal, até 1.000 GB. Para capacidades maiores que 1.000 GB, envie um email para AIDataCap@microsoft.com. |
| Throttling | 32.000 eventos por segundo | Fale com o suporte. | O limite é medido em um minuto. |
| Logs de retenção de dados | De 30 a 730 dias | 730 dias | Este recurso é para Logs. |
| Métricas de retenção de dados | 90 dias | 90 dias | Este recurso é para Metrics Explorer. |
| Retenção de resultados detalhados do Teste de disponibilidade em várias etapas | 90 dias | 90 dias | Esse recurso fornece resultados detalhados de cada etapa. |
| Tamanho máximo do item de telemetria | 64 KB | 64 KB | |
| Máximo de itens de telemetria por lote | 64.000 | 64.000 | |
| Tamanho dos nomes de propriedade e métrica | 150 | 150 | Veja esquemas de tipo. |
| Tamanho da cadeia de caracteres do valor da propriedade | 8,192 | 8,192 | Veja esquemas de tipo. |
| Comprimento da mensagem de rastreamento e de exceção | 32,768 | 32,768 | Veja esquemas de tipo. |
| Contagem de testes de disponibilidade por recurso do Application Insights | 100 | 100 | |
| Contagem de testes de disponibilidade por grupo de recursos | 800 | 800 | Consulte Azure Resource Manager |
| Máximo de redirecionamentos por teste de testes de disponibilidade | 10 | 10 | |
| Testes de disponibilidade frequência mínima de teste | 300 segundos | Frequências de teste personalizadas ou inferiores a cinco minutos requerem implementações TrackAvailability personalizadas. | |
| Retenção de dados do .NET Profiler e do Depurador de Instantâneos | Duas semanas | Entre em contato com o suporte. O limite máximo de retenção é de seis meses. | |
| Dados do .NET Profiler enviados por dia | Sem limite | Não há limite. | |
| Dados do Depurador de Instantâneos enviados por dia | 30 instantâneos por dia por aplicativo monitorado | Não há limite. | O número de instantâneos coletados por aplicativo pode ser modificado por meio da configuração. |
Para obter mais informações sobre preços e cotas, confira Cobrança do Application Insights.
Para evitar atingir o limite de taxa de dados, use amostragem.
Para determinar por quanto tempo os dados são mantidos, consulte Retenção de dados e privacidade.
Aplicativos de exemplo
Aplicativo de console do .NET Core: use este exemplo se você estiver usando um aplicativo de console escrito no .NET Core (2.0 ou superior) ou no .NET Framework (4.7.2 ou superior).
Tarefas em segundo plano no ASP.NET Core com HostedServices: use este exemplo se você estiver no ASP.NET Core e criando tarefas em segundo plano de acordo com as diretrizes oficiais.
Serviço de Trabalho do .NET Core: use este exemplo se você tiver um aplicativo do Serviço de Trabalho do .NET de acordo com as diretrizes oficiais.
Resolução de problemas
Confira o artigo de solução de problemas dedicado.
Testar a conectividade entre o host do aplicativo e o serviço de ingestão
Os SDKs e agentes do Application Insights enviam telemetria para serem ingeridos como chamadas REST nos nossos pontos de extremidade de ingestão. Você pode testar a conectividade do servidor Web ou do computador host do aplicativo nos pontos de extremidade do serviço de ingestão usando clientes REST brutos do PowerShell ou comandos curl. Consulte Como solucionar problemas de ausência de telemetria de aplicativos no Azure Monitor Application Insights.
SDK do código-fonte aberto
Ler e contribuir com o código.
Para obter as atualizações mais recentes e correções de bug, consulte as notas de versão.
Notas de Lançamento
Para a versão 2.12 e versões mais recente: SDKs (kits de desenvolvimento de software) do .NET, incluindo ASP.NET, ASP.NET Core e adaptadores de registro em log
Nossas Atualizações de Serviço também resumem as principais melhorias do Application Insights.
Próximas etapas
- Para examinar perguntas frequentes (perguntas frequentes), consulte:
- Valide se você está executando uma versão com suporte do SDK do Application Insights.
- Consulte o modelo de dados para modelo de dados e tipos do Application Insights.
- Adicione transações sintéticas para testar se o site está disponível em todo o mundo com monitoramento de disponibilidade.
- Confira o Guia do Usuário de System.Diagnostics.Activity para ver como correlacionar telemetria.
- Configure uma coleta de instantâneos para ver o estado do código-fonte e as variáveis no momento em que uma exceção é lançada.
Documentos de Referência
- Referência de tipos de dados para o SDK ASP.NET e o SDK do ASP.NET Core.
- Código do SDK para ASP.NET SDK e ASP.NET Core SDK.