Condividi tramite


Monitorare applicazioni e servizi .NET con Application Insights (API classica)

Annotazioni

Consultare le linee guida per il supporto di Application Insights SDK per la nostra politica di supporto SDK per le API classiche.

Attenzione

È consigliabile utilizzare la distribuzione Azure Monitor OpenTelemetry per le nuove applicazioni o per i nuovi clienti, in modo da abilitare Azure Monitor Application Insights. La distribuzione di OpenTelemetry di Azure Monitor offre funzionalità ed esperienza simili a Application Insights SDK. È possibile eseguire la migrazione da Application Insights SDK usando le guide alla migrazione per .NET, Node.js e Python, ma stiamo ancora lavorando per aggiungere altre funzionalità per la compatibilità con le versioni precedenti.

Questo articolo illustra come abilitare e configurare Application Insights per applicazioni ASP.NET, ASP.NET Core e Worker Service (non HTTP). Application Insights può raccogliere dalle app i dati di telemetria seguenti:

  • Requests
  • Dipendenze
  • Exceptions
  • Contatori delle prestazioni
  • Tracce (registri)
  • Battiti cardiaci
  • Eventi e metriche personalizzati (richiede strumentazione manuale)
  • Visualizzazioni pagina (richiede JavaScript SDK per le pagine Web)
  • Test di disponibilità (richiede la configurazione manuale dei test di disponibilità)

Scenari supportati

Annotazioni

Application Insights SDK per ASP.NET Core e SDK per il servizio di lavoro può monitorare le applicazioni indipendentemente da dove o come vengono eseguite. Se l'applicazione è in esecuzione e ha connettività di rete ad Azure, è possibile raccogliere i dati di telemetria.

Sostenuto ASP.NET ASP.NET Core Servizio del ruolo di lavoro
Sistema operativo Windows Windows, Linux o macOS Windows, Linux o macOS
Metodo di hosting In-process (IIS o IIS Express) Interno o esterno al processo Console o servizio in background (eseguito come processo, in genere tramite l'interfaccia dotnet della riga di comando o come daemon Windows Service/Linux)
Metodo di distribuzione Web Deploy, MSI o copia manuale dei file Dipendente dal framework o indipendente Dipendente dal framework o indipendente
Server Web Internet Information Services (IIS) Internet Information Server (IIS) o Kestrel Non applicabile (nessun server Web, progettato per carichi di lavoro non HTTP, ad esempio messaggistica, attività in background e app console)
Piattaforma di hosting Servizio app di Azure (Windows), Macchine virtuali di Azure o server locali La funzionalità Web Apps di Azure App Service, Macchine Virtuali di Azure, Docker e Azure Kubernetes Service (AKS) Macchine virtuali di Azure, servizio Azure Kubernetes, contenitori o qualsiasi ambiente in cui è supportato .NET Core
Versione .NET .NET Framework 4.6.1 e versioni successive Tutte le versioni di .NET supportate ufficialmente che non sono in anteprima Tutte le versioni di .NET supportate ufficialmente che non sono in anteprima
IDE Visual Studio Visual Studio, Visual Studio Code o riga di comando Visual Studio, Visual Studio Code o riga di comando

Annotazioni

Un servizio di lavoro è un'applicazione in background a esecuzione prolungata che esegue attività all'esterno di una pipeline di richiesta/risposta HTTP. Application Insights SDK per il servizio di lavoro può essere usato nel servizio di lavoro .NET Core appena introdotto, nelle attività in background in ASP.NET Core e nelle app console come .NET Core e .NET Framework.

Worker Service SDK non esegue alcuna raccolta di dati di telemetria da sola. ma viene fornito con alcuni dei più noti agenti di raccolta automatica di Application Insights, ad esempio DependencyCollector, PerfCounterCollector e ApplicationInsightsLoggingProvider. Questo SDK espone i metodi di estensione su IServiceCollection per abilitare e configurare la raccolta di dati di telemetria.

Aggiungere Application Insights

Prerequisiti

Creare un'applicazione Web di base

Se non si dispone ancora di un'applicazione Web funzionante, è possibile usare le indicazioni seguenti per crearne una.

  1. Apri Visual Studio.
  2. Selezionare Crea un nuovo progetto.
  3. Scegliere ASP.NET'applicazione Web (.NET Framework) con C# e selezionare Avanti.
  4. Immettere un nome di progetto e quindi selezionare Crea.
  5. Scegliere MVC e quindi Crea.

Aggiungere automaticamente Application Insights (Visual Studio)

Questa sezione illustra l'aggiunta automatica di Application Insights a un'app Web basata su modello.

Annotazioni

C'è un problema noto in Visual Studio 2019: l'archiviazione della chiave di strumentazione o stringa di connessione in un segreto utente viene interrotta per le app basate su .NET Framework. La chiave deve essere codificata nel file Applicationinsights.config per aggirare questo bug.

Dall'interno del progetto di app Web ASP.NET in Visual Studio:

  1. Selezionare Progetto>Aggiungi Application Insights Telemetry>Application Insights SDK (locale)>Avanti>Fine>Chiudi.

  2. Aprire il file ApplicationInsights.config.

  3. Prima del tag di chiusura </ApplicationInsights> aggiungere una riga contenente la stringa di connessione per la risorsa di Application Insights. Trovare la stringa di connessione nel riquadro di panoramica della risorsa di Application Insights appena creata.

    <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>
    
  4. Selezionare Progetto>Gestisci pacchetti NuGet>Aggiornamenti. Aggiornare quindi ogni pacchetto NuGet Microsoft.ApplicationInsights all'ultima versione stabile.

  5. Eseguire l'applicazione selezionando IIS Express. Viene aperta un'app ASP.NET di base. Mentre si esplorano le pagine del sito, i dati di telemetria vengono inviati ad Application Insights.

Aggiungere Application Insights manualmente (senza Visual Studio)

Questa sezione illustra l'aggiunta manuale di Application Insights a un'app Web basata su modelli.

  1. Aggiungere i pacchetti NuGet seguenti e le relative dipendenze al progetto:

  2. In alcuni casi, il file ApplicationInsights.config viene creato automaticamente. Se il file è già presente, andare al passaggio 4.

    Crearlo manualmente se mancante. Nella directory radice di un'applicazione ASP.NET creare un nuovo file denominato ApplicationInsights.config.

  3. Copiare la configurazione XML seguente nel file appena creato:


    Espandere per visualizzare la configurazione
    <?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>
    
  4. Aggiungere la stringa di connessione, che può essere eseguita in due modi:

    • (Scelta consigliata) Impostare la stringa di connessione nella configurazione.

      Prima del tag di chiusura </ApplicationInsights> in ApplicationInsights.config, aggiungi la stringa di connessione per la risorsa di Application Insights. È possibile trovare la stringa di connessione nel riquadro di panoramica della risorsa di Application Insights appena creata.

      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
      
    • Imposta la stringa di connessione nel codice.

      Specificare un stringa di connessione nella classe program.cs.

      var configuration = new TelemetryConfiguration
      {
          ConnectionString = "Copy the connection string from your Application Insights resource"
      };
      
  5. Allo stesso livello del progetto del file ApplicationInsights.config, creare una cartella denominata ErrorHandler con un nuovo file C# denominato AiHandleErrorAttribute.cs. Il contenuto del file sarà simile al seguente:

    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);
            }
        }
    }
    
  6. Nella cartella App_Start aprire il file FilterConfig.cs e modificarlo in modo che corrisponda all'esempio:

    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());
            }
        }
    }
    
  7. Se Web.config è già aggiornato, ignorare questo passaggio. In caso contrario, aggiornare il file come segue:


    Espandere per visualizzare la configurazione
    <?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=\&quot;Web\&quot; /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>
    

A questo punto, è stato configurato correttamente il monitoraggio delle applicazioni lato server. Se si esegue l'app Web, i dati di telemetria iniziano a comparire in Application Insights.

Verificare che Application Insights riceva i dati di telemetria

Eseguire l'applicazione ed effettuare richieste. I dati di telemetria dovrebbero ora fluire in Application Insights. Application Insights SDK raccoglie automaticamente le richieste Web in ingresso all'applicazione, insieme ai dati di telemetria seguenti.

Configurare i dati di telemetria

Contenuto della sezione

Metriche in tempo reale

È possibile usare le metriche attive per verificare rapidamente se il monitoraggio delle applicazioni con Application Insights è configurato correttamente. La visualizzazione dei dati di telemetria nel portale di Azure può richiedere alcuni minuti, ma il riquadro delle metriche attive mostra l'utilizzo della CPU del processo in esecuzione quasi in tempo reale. Può anche visualizzare altri dati di telemetria, ad esempio richieste, dipendenze e tracce.

Annotazioni

Le metriche attive sono abilitate per impostazione predefinita quando si esegue l'onboarding seguendo le istruzioni consigliate per le applicazioni .NET.

Abilitare le metriche attive usando il codice per qualsiasi applicazione .NET

Per configurare manualmente le metriche attive:

  1. Installare il pacchetto NuGet Microsoft.ApplicationInsights.PerfCounterCollector.

  2. Il codice dell'app console di esempio seguente mostra la configurazione delle metriche attive:

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();
            }
        }
    }
}

Tracce (log)

Questa sezione illustra come inviare i log di traccia diagnostica da ASP.NET o ASP.NET applicazioni Core ad Application Insights e quindi esplorare o cercare tali log nel portale.

È possibile usare i log di traccia per identificare le tracce associate a ogni richiesta utente e correlarle con altri eventi ed eccezioni.

Application Insights acquisisce i log da ASP.NET Core e da altre app .NET tramite ILogger e dai ASP.NET classici (.NET Framework) tramite l'SDK e gli adattatori classici.

Annotazioni

  • Di default, il provider di Application Insights invia solo i log con una gravità di Warning o superiore. Per includere Information o i log di livello inferiore, aggiornare le impostazioni del livello di log in appsettings.json.

  • Il Microsoft.ApplicationInsights.WorkerService pacchetto NuGet, usato per abilitare Application Insights per i servizi in background, non rientra nell'ambito.

  • Per esaminare le domande frequenti, vedere Domande frequenti sulla registrazione con .NET.

Scegliere un approccio di registrazione per generare log di diagnostica che Application Insights può raccogliere.

Installare la registrazione nell'app

Per le app classiche ASP.NET che usano la traccia System.Diagnostics, configurare un Application Insights TraceListener nel file di configurazione.

Aggiungere un listener a web.config o app.config:

<configuration>
  <system.diagnostics>
    <trace>
      <listeners>
        <add name="myAppInsightsListener"
             type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>

Annotazioni

Il modulo log-capture è un adattatore utile per logger di terze parti. Tuttavia, se non si usa già NLog, log4Net o System.Diagnostics.Trace, è consigliabile chiamare direttamente Application Insights TrackTrace().

Configurare Application Insights per raccogliere i log

Opzione 1: Aggiungere Application Insights al progetto, se non è già stato fatto. Quando si aggiunge Application Insights in Visual Studio, è possibile includere l'agente di raccolta log.

Opzione 2: Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni per configurare Application Insights. Selezionare l'opzione Configura raccolta di tracce .

Annotazioni

Se ti manca il menu o l'opzione dell'agente di raccolta log di Application Insights, consulta l'articolo dedicato sulla risoluzione dei problemi.

Installazione manuale

Usare questo metodo se il tipo di progetto non è supportato dal programma di installazione di Application Insights (ad esempio, alcuni scenari desktop/console) o se si preferisce un controllo esplicito a livello di pacchetto.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Gestisci pacchetti NuGet.

  2. Effettua una ricerca di Application Insights.

  3. Selezionare uno dei pacchetti seguenti:

Il pacchetto NuGet installa gli assembly necessari e modifica web.config o app.config, se applicabile.

Istruzioni di installazione:

Annotazioni

Espandere una delle sezioni seguenti per istruzioni di installazione specifiche del pacchetto.


ILogger
  1. Installa il Microsoft.Extensions.Logging.ApplicationInsights.

  2. Aggiungi 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();

Dopo aver installato il pacchetto NuGet e registrato il provider con l’inserimento delle dipendenze, l’app è pronta per registrare i log. Con l'inserimento del costruttore, ILogger o l'alternativa di tipo generico ILogger<TCategoryName> è necessaria. Quando queste implementazioni vengono risolte, ApplicationInsightsLoggerProvider fornisce tali implementazioni. I messaggi o le eccezioni registrati vengono inviati ad Application Insights.

Si consideri il controller di esempio seguente:

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" };
    }
}

Per altre informazioni, vedere Registrazione in ASP.NET Core e Quale tipo di telemetria di Application Insights viene generato dai log ILogger? Dove è possibile visualizzare i log ILogger in Application Insights?.

Inserire chiamate di log di diagnostica (System.Diagnostics.Trace/ log4net/ NLog)

Se si usa System.Diagnostics.Trace, una chiamata tipica sarà:

System.Diagnostics.Trace.TraceWarning("Slow response - database01");

Se si preferisce log4net o NLog, usare:

    logger.Warn("Slow response - database01");
Usare gli eventi di EventSource

È possibile configurare gli eventi System.Diagnostics.Tracing.EventSource da inviare ad Application Insights come tracce.

  1. Installare il pacchetto NuGet Microsoft.ApplicationInsights.EventSourceListener.

  2. Modificare la TelemetryModules sezione del file diApplicationInsights.config :

        <Add Type="Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule, Microsoft.ApplicationInsights.EventSourceListener">
          <Sources>
            <Add Name="MyCompany" Level="Verbose" />
          </Sources>
        </Add>
    

Per ogni origine, è possibile impostare i parametri seguenti:

  • Name specifica il nome dell'oggetto EventSource da raccogliere.
  • Level specifica il livello di registrazione da raccogliere: Critical, Error, Informational, LogAlways, Verbose o Warning.
  • Le parole chiave (facoltative) specificano il valore intero delle combinazioni di parole chiave da usare.
Usare gli eventi DiagnosticSource

È possibile configurare gli eventi System.Diagnostics.DiagnosticSource da inviare ad Application Insights come tracce.

  1. Installare il pacchetto NuGet Microsoft.ApplicationInsights.DiagnosticSourceListener.

  2. Modificare la TelemetryModules sezione del file diApplicationInsights.config :

        <Add Type="Microsoft.ApplicationInsights.DiagnosticSourceListener.DiagnosticSourceTelemetryModule, Microsoft.ApplicationInsights.DiagnosticSourceListener">
          <Sources>
            <Add Name="MyDiagnosticSourceName" />
          </Sources>
        </Add>
    

Per ogni origine di diagnostica che vuoi tracciare, aggiungi una voce con l'attributo Name impostato sul nome della tua origine di diagnostica.

Usare gli eventi ETW

È possibile configurare eventi ETW (Event Tracing for Windows) da inviare ad Application Insights come tracce.

  1. Installare il pacchetto NuGet Microsoft.ApplicationInsights.EtwCollector.

  2. Modificare la sezione "TelemetryModules" del file ApplicationInsights.config :

Annotazioni

Gli eventi ETW possono essere raccolti solo se il processo che ospita l'SDK viene eseguito in un'identità che è membro del gruppo Performance Log Users o Administrators.

    <Add Type="Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule, Microsoft.ApplicationInsights.EtwCollector">
      <Sources>
        <Add ProviderName="MyCompanyEventSourceName" Level="Verbose" />
      </Sources>
    </Add>

Per ogni origine, è possibile impostare i parametri seguenti:

  • ProviderName è il nome del provider ETW da raccogliere.
  • ProviderGuid specifica il GUID del provider ETW da raccogliere. Può essere usato invece di ProviderName.
  • Level imposta il livello di registrazione per la raccolta. Può essere Critico, Errore, Informativo, LogAlways, Dettagliato o Avviso.
  • Le parole chiave (facoltative) impostano il valore intero delle combinazioni di parole chiave da usare.
Usare direttamente l'API di traccia

È possibile chiamare direttamente l'API di traccia di Application Insights. Gli adattatori di registrazione usano questa API. Per esempio:

TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow response - database01");

Un vantaggio di TrackTrace è che è possibile inserire dati relativamente lunghi nel messaggio. Ad esempio, è possibile codificare i dati POST in questa posizione.

È anche possibile aggiungere un livello di gravità al messaggio. Analogamente ad altri dati di telemetria, è possibile aggiungere valori di proprietà per filtrare o cercare set di tracce diversi. Per esempio:

TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow database response",
                            SeverityLevel.Warning,
                            new Dictionary<string, string> { { "database", "db.ID" } });

È ora possibile filtrare facilmente in Ricerca transazioni tutti i messaggi di un particolare livello di gravità correlato a un determinato database.

Applicazione console

Per aggiungere la registrazione di Application Insights alle applicazioni console, installare prima di tutto i pacchetti NuGet seguenti:

Nell'esempio seguente viene usato il Microsoft.Extensions.Logging.ApplicationInsights pacchetto e viene illustrato il comportamento predefinito per un'applicazione console. Il Microsoft.Extensions.Logging.ApplicationInsights pacchetto deve essere usato in un'applicazione console o ogni volta che si vuole un'implementazione minima di Application Insights senza il set di funzionalità completo, ad esempio metriche, traccia distribuita, campionamento e inizializzatori di 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));
}

Per altre informazioni, vedere Che tipo di dati di telemetria di Application Insights viene prodotto dai log ILogger? Dove è possibile visualizzare i log ILogger in Application Insights?.

Ambiti di registrazione

Annotazioni

Le indicazioni seguenti si applicano agli scenari ILogger (solo ASP.NET Core e console). Non si applica alle ASP.NET classiche.

ApplicationInsightsLoggingProvider supporta gli ambiti di log, che sono abilitati per impostazione predefinita.

Se l'ambito è di tipo IReadOnlyCollection<KeyValuePair<string,object>>, ogni coppia chiave/valore nella raccolta viene aggiunta ai dati di telemetria di Application Insights come proprietà personalizzate. Nell'esempio seguente, i log vengono acquisiti come TraceTelemetry e hanno ("MyKey", "MyValue") nelle proprietà.

using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
    _logger.LogError("An example of an Error level message");
}

Se viene utilizzato un altro tipo come ambito, verrà archiviato sotto la proprietà Scope nei dati di telemetria di Application Insights. Nell'esempio seguente, TraceTelemetry ha una proprietà chiamata Scope che contiene l'ambito.

using (_logger.BeginScope("hello scope"))
{
    _logger.LogError("An example of an Error level message");
}

Trova i tuoi log

Eseguire l'app in modalità di debug o distribuirla in tempo reale.

Nel riquadro di panoramica dell'app nel portale di Application Insights selezionare Ricerca transazioni in cui è possibile:

  • Filtrare in base alle tracce di log o agli elementi con proprietà specifiche.
  • Esaminare in dettaglio un elemento specifico.
  • Trovare altri dati di log di sistema correlati alla stessa richiesta utente (con lo stesso ID operazione).
  • Salvare la configurazione di una pagina come preferito.

Annotazioni

Se l'applicazione invia grandi quantità di dati e si usa Application Insights SDK per ASP.NET versione 2.0.0-beta3 o successiva, la funzionalità di campionamento adattivo potrebbe funzionare e inviare solo una parte dei dati di telemetria. Altre informazioni sul campionamento.

Esplorare i log di Monitoraggio di Azure

I Log ILogger vengono visualizzati come dati di telemetria di traccia (tabella traces in Application Insights e AppTraces in Log Analytics).

Esempio

Nel portale di Azure passare ad Application Insights ed eseguire:

traces
| where severityLevel >= 2 // 2=Warning, 1=Information, 0=Verbose
| take 50

Tracciamento distribuito

Le architetture moderne di cloud e microservizi hanno abilitato servizi semplici e indipendenti che riducono i costi aumentando la disponibilità e la velocità effettiva. Tuttavia, ha reso i sistemi generali più difficili da ragionare e eseguire il debug. Il tracciamento distribuito risolve questo problema fornendo un profiler delle prestazioni che funziona come le pile di chiamate nelle architetture cloud e microservizi.

Monitoraggio di Azure offre due esperienze per l'utilizzo dei dati di traccia distribuiti: la visualizzazione diagnostica delle transazioni per una singola transazione/richiesta e la visualizzazione mappa dell'applicazione per mostrare l'interazione dei sistemi.

Application Insights può monitorare ogni componente separatamente e rilevare quale componente è responsabile di errori o riduzione delle prestazioni usando la correlazione di telemetria distribuita. Questo articolo illustra il modello di dati, le tecniche di propagazione del contesto, i protocolli e l'implementazione di tattiche di correlazione su linguaggi e piattaforme diversi usati da Application Insights.

Abilitare la traccia distribuita tramite Application Insights utilizzando l'autoinstrumentazione o gli SDK

Gli agenti e gli SDK di Application Insights per .NET, .NET Core, Java, Node.jse JavaScript supportano la traccia distribuita in modo nativo.

Dopo avere installato e configurato la versione corretta di Application Insights SDK, le informazioni di traccia vengono raccolte automaticamente per le librerie, le tecnologie e i framework più diffusi da agenti di raccolta delle dipendenze dell'SDK automatici. L'elenco completo delle tecnologie supportate è disponibile nella documentazione sulla raccolta automatica delle dipendenze.

Qualsiasi tecnologia può anche essere rilevata manualmente con una chiamata a TrackDependency in TelemetryClient.

Modello di dati per la correlazione dei dati di telemetria

Application Insights definisce un modello di dati per la correlazione di dati di telemetria distribuita. Per associare i dati di telemetria a un'operazione logica, ogni elemento di telemetria ha un campo di contesto denominato operation_Id. Ogni elemento di telemetria nella traccia distribuita condivide questo identificatore. Pertanto, anche se si perdono i dati di telemetria da un singolo livello, è comunque possibile associare i dati di telemetria segnalati da altri componenti.

Un'operazione logica distribuita è in genere costituita da un set di operazioni più piccole elaborate da uno dei componenti. I dati di telemetria delle richieste definiscono queste operazioni. Ogni elemento di telemetria della richiesta ha il proprio id, che lo identifica in modo globale e univoco. E tutti gli elementi di telemetria, ad esempio tracce ed eccezioni, associati alla richiesta devono impostare su operation_parentId il valore della richiesta id.

La telemetria delle dipendenze rappresenta ogni operazione in uscita, ad esempio una chiamata HTTP a un altro componente. Definisce anche il proprio id, un elemento univoco a livello globale. La telemetria delle richieste, avviata dalla chiamata di dipendenza, usa questo id come operation_parentId.

È possibile compilare una vista dell'operazione logica distribuita usando operation_Id, operation_parentIde request.id con dependency.id. Questi campi definiscono anche l'ordine di causalità delle chiamate di telemetria.

In un ambiente di microservizi, le tracce dei componenti possono passare a elementi di archiviazione diversi. Ogni componente può avere una propria stringa di connessione in Application Insights. Per ottenere dati di telemetria per l'operazione logica, Application Insights esegue query sui dati da ogni elemento di archiviazione.

Quando il numero di elementi di archiviazione è grande, è necessario un suggerimento su dove cercare successivamente. Il modello di dati di Application Insights definisce due campi per risolvere questo problema: request.source e dependency.target. Il primo campo identifica il componente che ha avviato la richiesta di dipendenza. Il secondo campo identifica il componente che ha restituito la risposta della chiamata di dipendenza.

Per informazioni sull'esecuzione di query da più istanze diverse, vedere Eseguire query sui dati tra aree di lavoro, applicazioni e risorse di Log Analytics in Monitoraggio di Azure.

Example

Esaminiamo un esempio. Un'applicazione denominata Stock Prices mostra il prezzo di mercato corrente di un titolo usando un'API esterna denominata Stock. L'applicazione Prezzi azionari ha una pagina denominata Pagina stock visualizzata dal Web browser client tramite GET /Home/Stock. L'applicazione esegue una query sull'API Stock usando la chiamata GET /api/stock/valueHTTP .

È possibile analizzare i dati di telemetria risultanti eseguendo una query:

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

Nei risultati tutti gli elementi di telemetria condividono la radice operation_Id. Quando viene effettuata una chiamata Ajax dalla pagina, viene assegnato un nuovo ID univoco (qJSXU) ai dati di telemetria delle dipendenze e l'ID di pageView viene usato come operation_ParentId. La richiesta del server usa quindi l'ID Ajax come operation_ParentId.

tipoDiElemento nome Documento d'identità operation_ParentId operation_Id
pageView Pagina delle scorte STYz STYz
dipendenza GET /Home/Stock qJSXU STYz STYz
request GET Home/Stock KqKwlrSt9PA= qJSXU STYz
dipendenza GET /api/stock/value # Ottieni il valore d'inventario tramite API bBrf2L7mm2g= KqKwlrSt9PA= STYz

Quando la chiamata GET /api/stock/value viene effettuata a un servizio esterno, è necessario conoscere l'identità del server in modo da poter impostare il dependency.target campo in modo appropriato. Quando il servizio esterno non supporta il monitoraggio, target viene impostato sul nome host del servizio. Un esempio è stock-prices-api.com. Tuttavia, se il servizio si identifica restituendo un'intestazione HTTP predefinita, target contiene l'identità del servizio che consente ad Application Insights di compilare una traccia distribuita eseguendo query sui dati di telemetria da tale servizio.

Intestazioni di correlazione utilizzando W3C TraceContext

Application Insights esegue la transizione a W3C Trace-Context, che definisce:

  • traceparent: Trasporta l'ID operativo univoco globale e l'identificatore univoco della chiamata.
  • tracestate: contiene il contesto di tracciamento specifico del sistema.

La versione più recente di Application Insights SDK supporta il protocollo Trace-Context, ma potrebbe essere necessario acconsentire esplicitamente. La retrocompatibilità con il protocollo di correlazione precedente supportato dall'SDK di Application Insights è mantenuta.

Il protocollo HTTP di correlazione, detto anche Request-Id, è deprecato. Questo protocollo definisce due intestazioni:

  • Request-Id: porta l'ID univoco globale della chiamata.
  • Correlation-Context: contiene la raccolta di coppie nome-valore delle proprietà di tracciamento distribuito.

Application Insights definisce anche l'estensione per il protocollo HTTP di correlazione. Usa le coppie nome-valore Request-Context per propagare la raccolta di proprietà usate dal chiamante o dal destinatario della chiamata. Il SDK di Application Insights utilizza questo header per impostare i campi dependency.target e request.source.

I modelli di dati W3C Trace-Context e Application Insights sono mappati nel modo seguente:

Approfondimenti sulle Applicazioni W3C TraceContext
Id di Request e Dependency parent-id
Operation_Id trace-id
Operation_ParentId parent-id dell'intervallo padre di questo intervallo. Questo campo deve essere vuoto se è un intervallo radice.

Per altre informazioni, vedere Modello di dati di telemetria di Application Insights.

Abilitare il supporto per la traccia distribuita W3C

La traccia distribuita basata su W3C TraceContext è abilitata per impostazione predefinita in tutti gli SDK recenti di .NET Framework/.NET Core, insieme alla compatibilità con le versioni precedenti con il protocollo legacy Request-Id .

Correlazione dei dati di telemetria

La correlazione viene gestita automaticamente durante l'integrazione di un'app. Non sono necessarie azioni speciali.

Il runtime .NET supporta la distribuzione con l'aiuto di Activity e DiagnosticSource

Application Insights .NET SDK usa DiagnosticSource e Activity per raccogliere e correlare i dati di telemetria.

Dipendenze

Dipendenze rilevate automaticamente

Gli SDK di Application Insights per .NET e .NET Core vengono forniti con DependencyTrackingTelemetryModule, ovvero un modulo di telemetria che raccoglie automaticamente le dipendenze. Il modulo DependencyTrackingTelemetryModule viene fornito come pacchetto NuGet Microsoft.ApplicationInsights.DependencyCollector e usato automaticamente quando si usa il Microsoft.ApplicationInsights.Web pacchetto NuGet o il Microsoft.ApplicationInsights.AspNetCore pacchetto NuGet.

Attualmente, DependencyTrackingTelemetryModule tiene traccia delle dipendenze seguenti automaticamente:

Dipendenze Dettagli
HTTP/HTTPS Chiamate HTTP/HTTPS locali o remote.
Chiamate WCF Rilevata automaticamente solo se vengono usate associazioni basate su HTTP.
SQL Chiamate effettuate con SqlClient. Vedere la sezione Rilevamento SQL avanzato per ottenere query SQL complete per l'acquisizione di query SQL.
Archiviazione BLOB di Azure, Archiviazione tabelle o Archiviazione code Chiamate effettuate con il client di Archiviazione di Azure.
SDK del client Hub eventi di Azure Usare il pacchetto più recente: https://nuget.org/packages/Azure.Messaging.EventHubs.
SDK client del bus di servizio di Azure Usare il pacchetto più recente: https://nuget.org/packages/Azure.Messaging.ServiceBus.
Azure Cosmos DB Rilevato automaticamente se viene usato HTTP/HTTPS. Anche la traccia per le operazioni in modalità diretta con TCP viene acquisita automaticamente usando il pacchetto di anteprima >= 3.33.0-preview. Per altri dettagli, vedere la documentazione.

Se la dipendenza non viene selezionata automaticamente, è possibile monitorarla manualmente con una chiamata di dipendenza di rilevamento.

Per altre informazioni sul funzionamento del rilevamento delle dipendenze, vedere Rilevamento delle dipendenze in Application Insights.

Configurare il rilevamento automatico delle dipendenze nelle app console

Per tenere traccia automaticamente delle dipendenze dalle app console .NET, installare il pacchetto NuGet Microsoft.ApplicationInsights.DependencyCollector e inizializzare DependencyTrackingTelemetryModule:

    DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule();
    depModule.Initialize(TelemetryConfiguration.Active);

Annotazioni

Per le app console .NET Core, TelemetryConfiguration.Active è obsoleto.

Rilevamento manuale delle dipendenze

Gli esempi seguenti di dipendenze, che non vengono raccolti automaticamente, richiedono il rilevamento manuale:

  • viene tenuta automaticamente traccia di Azure Cosmos DB solo se è usato HTTP/HTTPS. La modalità TCP non viene acquisita automaticamente da Application Insights per le versioni dell'SDK precedenti a 2.22.0-Beta1.
  • Redis

Per tali dipendenze non raccolte automaticamente dall'SDK, è possibile tenerne traccia manualmente usando l'API TrackDependency usata dai moduli di raccolta automatica standard.

Esempio

Se si compila il codice con un assembly che non è stato scritto manualmente, è possibile eseguire tutte le chiamate. Questo scenario consente di scoprire quale contributo apporta ai tempi di risposta.

Per visualizzare i dati nei grafici relativi alle dipendenze in Application Insights, inviarli mediante 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);
    }

In alternativa, TelemetryClient fornisce i metodi di estensione StartOperation e StopOperation, che possono essere usati per tenere traccia manualmente delle dipendenze, come illustrato in Rilevamento delle dipendenze in uscita.

Disabilitazione del modulo di rilevamento delle dipendenze standard

Per altre informazioni, vedere Moduli di telemetria.


Rilevamento SQL avanzato per ottenere la query SQL completa

Per le chiamate SQL, il nome del server e del database viene sempre raccolto e archiviato come nome dell'oggetto raccolto DependencyTelemetry. Un altro campo, denominato dati, può contenere il testo completo della query SQL.

Annotazioni

Funzioni di Azure richiede impostazioni separate per abilitare la raccolta di testo SQL. Per altre informazioni, vedere Abilitare la raccolta di query SQL.

Per applicazioni ASP.NET, il testo completo della query SQL viene raccolto con l'aiuto della strumentazione del codice byte, che richiede l'uso del motore di strumentazione o tramite il pacchetto NuGet Microsoft.Data.SqlClient anziché la libreria System.Data.SqlClient. I passaggi specifici della piattaforma per abilitare la raccolta completa di query SQL sono descritti nella tabella seguente.

Platform Passaggi necessari per ottenere la query SQL completa
App Web nel servizio app di Azure Nel pannello di controllo dell'app Web aprire il riquadro Application Insights e abilitare i comandi SQL in .NET.
Server IIS (Macchine virtuali di Azure, locale e così via) Usare il pacchetto NuGet Microsoft.Data.SqlClient oppure usare il modulo PowerShell dell'agente di Application Insights per installare il motore di strumentazione e riavviare IIS.
Servizi cloud di Azure Aggiungere un'attività di avvio per installare StatusMonitor.
Deve essere eseguito l’onborading dell’app nell’SDK di ApplicationInsights in fase di compilazione, installando pacchetti NuGet per le applicazioni ASP.NET o ASP.NET Core.
IIS Express Usare il pacchetto NuGet Microsoft.Data.SqlClient .
Processi Web nel servizio app di Azure Usare il pacchetto NuGet Microsoft.Data.SqlClient .

Oltre ai passaggi precedenti specifici della piattaforma, è anche necessario acconsentire esplicitamente all'abilitazione della raccolta di comandi SQL modificando il file ApplicationInsights.config con il codice seguente:

<TelemetryModules>
  <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
    <EnableSqlCommandTextInstrumentation>true</EnableSqlCommandTextInstrumentation>
  </Add>

Nei casi precedenti, il modo corretto per convalidare che il motore di strumentazione sia installato correttamente è convalidando che la versione SDK di raccolta DependencyTelemetry è rddp. L'uso di rdddsd o rddf indica che le dipendenze vengono raccolte tramite callback DiagnosticSource o EventSource, quindi la query SQL completa non viene acquisita.

Exceptions

Le eccezioni nelle applicazioni Web possono essere segnalate con Application Insights. È possibile correlare le richieste non riuscite con le eccezioni e altri eventi sia nel client che nel server, in modo da poter diagnosticare rapidamente le cause. Questa sezione illustra come configurare la segnalazione delle eccezioni, segnalare le eccezioni in modo esplicito, diagnosticare gli errori e altro ancora.

Configurare la creazione di report sulle eccezioni

È possibile configurare Application Insights per segnalare le eccezioni che si verificano nel server o nel client. A seconda della piattaforma da cui dipende l'applicazione, è necessario usare l'estensione o l'SDK appropriato.

Per fare in modo che le eccezioni vengano segnalate dall'applicazione lato server, considerare gli scenari seguenti:

Importante

Questa sezione è incentrata sulle app .NET Framework da una prospettiva di un esempio di codice. Alcuni metodi che funzionano per .NET Framework sono obsoleti in .NET Core SDK.

Diagnosticare errori ed eccezioni

Application Insights offre un'esperienza di gestione delle prestazioni delle applicazioni curata che consente di diagnosticare gli errori nelle applicazioni monitorate.

Per istruzioni dettagliate, vedere Analizzare errori, prestazioni e transazioni con Application Insights.

Dati di traccia e di log personalizzati

Per ottenere dati di diagnostica specifici per l'app, è possibile inserire codice per l'invio dei propri dati di telemetria. I propri dati di log o telemetria vengono visualizzati nella ricerca diagnostica insieme alla richiesta, alla visualizzazione di pagina e ad altri dati raccolti automaticamente.

Usando Microsoft.VisualStudio.ApplicationInsights.TelemetryClient, sono disponibili diverse API:

Per visualizzare questi eventi, nel menu a sinistra aprire Cerca. Selezionare il menu a discesa Tipi di evento e quindi scegliere Evento personalizzato, Traccia o Eccezione.

Screenshot che mostra la schermata Cerca.

Annotazioni

Se l'app genera grandi quantità di dati di telemetria, il modulo di campionamento adattivo riduce automaticamente il volume inviato al portale inviando solo una frazione rappresentativa di eventi. Gli eventi che fanno parte della stessa operazione vengono selezionati o deselezionati come gruppo, per rendere possibile lo spostamento tra eventi correlati. Per altre informazioni, vedere Campionamento in Application Insights.

Vedere i dati POST di una richiesta

I dettagli della richiesta non includono i dati inviati all'app in una chiamata POST. Per poter ottenere questi dati:

  • Aggiungere Application Insights SDK al codice dell'app.
  • Inserire il codice nell'applicazione per chiamare Microsoft.ApplicationInsights.TrackTrace(). Inviare i dati POST nel parametro del messaggio. Esiste un limite per le dimensioni consentite, quindi è consigliabile provare a inviare solo i dati essenziali.
  • Quando si esamina una richiesta non riuscita, trovare le tracce associate.

Per impostazione predefinita, non tutte le eccezioni che generano errori nell'app vengono visualizzate nel portale. Se si usa JavaScript SDK nelle pagine Web, vengono visualizzate eccezioni del browser. Tuttavia, la maggior parte delle eccezioni lato server vengono intercettate da IIS ed quindi è necessario aggiungere del codice per acquisirle e segnalarle.

È possibile:

  • Registrare le eccezioni in modo esplicito inserendo il codice nei gestori di eccezioni per segnalare le eccezioni.
  • Acquisire automaticamente le eccezioni configurando il framework di ASP.NET. Gli elementi da aggiungere variano a seconda dei diversi tipi di framework.
Segnalare le eccezioni in modo esplicito

Il modo più semplice per segnalare consiste nell'inserire una chiamata a trackException() in un gestore eccezioni.

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);
}

I parametri delle proprietà e delle misurazioni sono facoltativi, ma sono utili per filtrare e aggiungere altre informazioni. Ad esempio, per un'app in grado di eseguire diversi giochi, è possibile trovare tutti i report di eccezione correlati a un gioco specifico. È possibile aggiungere il numero desiderato di elementi a ogni dizionario.

Eccezioni del browser

Viene segnalata la maggior parte delle eccezioni del browser.

Se la pagina Web include file di script provenienti da reti per la distribuzione di contenuti o da altri domini, verificare che il tag dello script contenga l'attributo crossorigin="anonymous" e che il server invii intestazioni CORS. Questo comportamento consente di ottenere un'analisi dello stack e i dettagli per le eccezioni JavaScript non gestite da queste risorse.

Riutilizzare il client di telemetria

Annotazioni

È consigliabile creare un'istanza di TelemetryClient una volta e riutilizzarla per tutta la durata di un'applicazione.

Con l'inserimento delle dipendenze (DI) in .NET, il .NET SDK appropriato e la corretta configurazione di Application Insights per l'inserimento delle dipendenze, è possibile richiedere TelemetryClient come parametro del costruttore.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

    public ExampleController(TelemetryClient telemetryClient)
    {
        _telemetryClient = telemetryClient;
    }
}

Nell'esempio precedente, l'oggetto TelemetryClient viene inserito nella classe ExampleController.

Web Form

Per Web Forms, il modulo HTTP può raccogliere le eccezioni quando non sono configurati reindirizzamenti con CustomErrors. Tuttavia, quando sono presenti reindirizzamenti attivi, aggiungere le righe seguenti alla funzione Application_Error in Global.asax.cs.

void Application_Error(object sender, EventArgs e)
{
    if (HttpContext.Current.IsCustomErrorEnabled &&
        Server.GetLastError () != null)
    {
        _telemetryClient.TrackException(Server.GetLastError());
    }
}

Nell'esempio precedente, _telemetryClient è una variabile con ambito classe di tipo TelemetryClient.

MVC

A partire da Application Insights Web SDK versione 2.6 (beta 3 e versioni successive), Application Insights raccoglie le eccezioni non gestite generate automaticamente nei metodi dei controller MVC 5+. Se in precedenza è stato aggiunto un gestore personalizzato per tenere traccia di tali eccezioni, è possibile rimuoverlo per evitare il doppio rilevamento delle eccezioni.

Esistono diversi scenari in cui un filtro eccezioni non riesce a gestire correttamente gli errori quando vengono generate eccezioni:

  • Dai costruttori del controller
  • Dai gestori di messaggi
  • Durante il routing
  • Durante la serializzazione del contenuto della risposta
  • Durante l'avvio dell'applicazione
  • Nelle attività in background

È ancora necessario tenere traccia manualmente di tutte le eccezioni gestite dall'applicazione. Le eccezioni non gestite provenienti dai controller in genere restituiscono una risposta 500 "Errore interno del server". Se tale risposta viene costruita manualmente come risultato di un'eccezione gestita o nessuna eccezione, viene rilevata nei dati di telemetria delle richieste corrispondenti con ResultCode 500. Tuttavia, l'SDK di Application Insights non è in grado di tenere traccia di un'eccezione corrispondente.

Supporto delle versioni precedenti

Se si usa MVC 4 (e versioni precedenti) di Application Insights Web SDK 2.5 (e versioni precedenti), vedere gli esempi seguenti per tenere traccia delle eccezioni.


Espandere per visualizzare le istruzioni per le versioni precedenti

Se la configurazione di CustomErrors è Off, le eccezioni possono essere raccolte dal modulo HTTP. Se invece è impostata su RemoteOnly (impostazione predefinita) o On, l'eccezione viene cancellata e non può essere raccolta automaticamente da Application Insights. È possibile risolvere questo comportamento eseguendo l'override della classe System.Web.Mvc.HandleErrorAttribute e applicando la classe di cui è stato eseguito l'override, come illustrato per le diverse versioni MVC riportate di seguito (vedere l'origine 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

Sostituire l'attributo HandleError con il nuovo attributo nei controller:

    namespace MVC2App.Controllers
    {
        [AiHandleError]
        public class HomeController : Controller
        {
            // Omitted for brevity
        }
    }

Esempio

MVC 3

Registrare AiHandleErrorAttribute come filtro globale in Global.asax.cs:

public class MyMvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AiHandleErrorAttribute());
    }
}

Esempio

MVC 4, MVC 5

Registrare AiHandleErrorAttribute come filtro globale in FilterConfig.cs:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        // Default replaced with the override to track unhandled exceptions
        filters.Add(new AiHandleErrorAttribute());
    }
}

Esempio

API per il Web

A partire da Application Insights Web SDK versione 2.6 (beta 3 e versioni successive), Application Insights raccoglie le eccezioni non gestite generate automaticamente nei metodi dei controller per API Web 2+. Se in precedenza è stato aggiunto un gestore personalizzato per tenere traccia di tali eccezioni (come descritto nell'esempio seguente), è possibile rimuoverlo per evitare il doppio rilevamento delle eccezioni.

Esistono diversi casi in cui i filtri delle eccezioni non possono essere gestiti. Per esempio:

  • Eccezioni generate dai costruttori dei controller.
  • Eccezioni generate dai gestori di messaggi.
  • Eccezioni generate durante il routing.
  • Eccezioni generate durante la serializzazione del contenuto della risposta.
  • Eccezione generata durante l'avvio dell'applicazione.
  • Eccezione generata in attività in background.

È ancora necessario tenere traccia manualmente di tutte le eccezioni gestite dall'applicazione. Le eccezioni non gestite provenienti dai controller in genere restituiscono una risposta 500 "Errore interno del server". Se tale risposta viene costruita manualmente come risultato di un'eccezione gestita o nessuna eccezione, viene rilevata in una telemetria di richiesta corrispondente con ResultCode 500. Tuttavia, l'SDK di Application Insights non è in grado di tenere traccia di un'eccezione corrispondente.

Supporto delle versioni precedenti

Se si usa API Web 1 (e versioni precedenti) di Application Insights Web SDK 2.5 (e versioni precedenti), vedere gli esempi seguenti per tenere traccia delle eccezioni.


Espandere per visualizzare le istruzioni per le versioni precedenti

API Web 1.x

Override 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);
    }
    }
}

È possibile aggiungere questo attributo di cui è stato eseguito l'override ai controller specifici o alla configurazione del filtro globale nella 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());
        }
    }
}

Esempio

API Web 2.x

Aggiungere un'implementazione di 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);
        }
    }
}

Aggiungere questo frammento di codice ai servizi in 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());
        }
    }
}

Esempio

In alternativa, è possibile:

  • Sostituire l'unica istanza ExceptionHandler con un'implementazione personalizzata di IExceptionHandler. Questo gestore di eccezione viene chiamato solo quando il framework può ancora scegliere il messaggio di risposta da inviare, non quando la connessione viene interrotta.
  • Usare i filtri eccezioni, come descritto nella sezione precedente sui controller dell'API Web 1.x, che non vengono chiamati in tutti i casi.

WCF

Aggiungere una classe che estende Attribute e implementa 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)
        {
        }
      }
    }

Aggiungere l'attributo alle implementazioni del servizio:

namespace WcfService4
{
    [AiLogException]
    public class Service1 : IService1
    {
        // Omitted for brevity
    }
}

Esempio

Contatori delle prestazioni delle eccezioni

L'installazione dell'agente di Application Insights di Monitoraggio di Azure nel server permette di ottenere un grafico della frequenza delle eccezioni, misurata da .NET. Sono incluse le eccezioni .NET gestite e non gestite.

Aprire una scheda Esplora metriche e aggiungere un nuovo grafico. In Contatori delle prestazioni selezionare Frequenza eccezioni.

.NET framework calcola la frequenza contando il numero delle eccezioni in un intervallo e dividendolo per la lunghezza dell'intervallo.

Questo conteggio è diverso dal conteggio delle eccezioni calcolato dal portale di Application Insights, che conteggia i report TrackException. Gli intervalli di campionamento sono diversi e l'SDK non invia segnalazioni di TrackException per tutte le eccezioni gestite e non gestite.

Raccolta di metriche personalizzate

Gli SDK di Application Insights di Monitoraggio di Azure per .NET e .NET Core hanno due diversi metodi di raccolta di metriche personalizzate:

  • Il metodo TrackMetric(), che non dispone della preaggregazione.
  • Il metodo GetMetric(), che dispone della preaggregazione.

È consigliabile usare l'aggregazione, quindi TrackMetric()non è più il metodo preferito per raccogliere metriche personalizzate. Questo articolo illustra come usare il metodo GetMetric() e alcune delle motivazioni alla base del funzionamento.


Espandere per saperne di più sulle API con preaggregazione e senza preaggregazione

Il metodo TrackMetric() invia dati di telemetria non elaborati che denota una metrica. Non è efficiente inviare un singolo elemento di telemetria per ogni valore. Il metodo TrackMetric() è anche inefficiente in termini di prestazioni perché ogni TrackMetric(item) attraversa la pipeline SDK completa di inizializzatori e processori di telemetria.

Al contrario di TrackMetric(), GetMetric() gestisce la preaggregazione locale e quindi invia solo una metrica riepilogativa aggregata a un intervallo fisso di un minuto. Se è necessario monitorare attentamente alcune metriche personalizzate al secondo o anche al livello di millisecondo, è possibile farlo solo in caso di costi di archiviazione e traffico di rete solo ogni minuto. Questo comportamento riduce notevolmente anche il rischio di limitazione perché il numero totale di elementi di telemetria che devono essere inviati per una metrica aggregata viene notevolmente ridotto.

In Application Insights le metriche personalizzate raccolte tramite TrackMetric() e GetMetric() non sono soggette al campionamento. Il campionamento di metriche importanti può determinare scenari in cui gli avvisi compilati in base a tali metriche diventano inaffidabili. Non eseguendo mai il campionamento delle metriche personalizzate, in genere è possibile assicurarsi che quando le soglie di avviso vengono superate, viene generato un avviso. Poiché le metriche personalizzate non vengono campionate, esistono alcune potenziali preoccupazioni.

Il rilevamento delle tendenze in una metrica ogni secondo o a un intervallo ancora più granulare può comportare:

  • Aumento dei costi di archiviazione dei dati. È previsto un costo associato alla quantità di dati inviati a Monitoraggio di Azure. Maggiore è il costo complessivo del monitoraggio.
  • Aumento del traffico di rete o sovraccarico delle prestazioni. In alcuni scenari, questo sovraccarico potrebbe avere un costo delle prestazioni monetarie e dell'applicazione.
  • Rischio di limitazione dell'inserimento. I punti dati ("limitazioni") di Monitoraggio di Azure quando l'app invia una frequenza elevata di dati di telemetria in un breve intervallo di tempo.

La limitazione è un problema perché può causare la mancata visualizzazione di avvisi. La condizione per attivare un avviso può verificarsi in locale e quindi essere eliminata nell'endpoint di inserimento a causa di troppi dati inviati. Non è consigliabile usare TrackMetric() per .NET e .NET Core, a meno che non sia stata implementata la propria logica di aggregazione locale. Se si sta tentando di tenere traccia di ogni istanza che si verifica un evento in un determinato periodo di tempo, è possibile che TrackEvent() sia una scelta migliore. Tenere presente che, a differenza delle metriche personalizzate, gli eventi personalizzati sono soggetti al campionamento. È comunque possibile usare TrackMetric() anche senza scrivere la propria preaggregazione locale. Ma se lo fai, tieni presente le insidie.

In sintesi, è consigliabile GetMetric() perché esegue la preaggregazione, accumula valori da tutte le chiamate Track() e invia un riepilogo/aggregazione una volta ogni minuto. Il metodo GetMetric() può ridurre significativamente il costo e il sovraccarico delle prestazioni inviando un minor numero di punti dati pur raccogliendo tutte le informazioni pertinenti.

Introduzione a GetMetric

Per gli esempi si userà un'applicazione di servizio di lavoro .NET Core 3.1 di base. Se si vuole replicare l'ambiente di test usato con questi esempi, seguire i passaggi da 1 a 6 nell'applicazione del servizio di lavoro .NET Core. Questi passaggi aggiungono Application Insights a un modello di progetto del servizio di lavoro di base. I concetti si applicano a qualsiasi applicazione generale in cui è possibile usare l'SDK, incluse le app Web e le app console.

Inviare metriche

Sostituire il contenuto del file worker.cs con il codice seguente:

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);
            }
        }
    }
}

Quando si esegue il codice di esempio, viene visualizzato il ciclo while in esecuzione ripetutamente senza inviare dati di telemetria nella finestra di output di Visual Studio. Un singolo elemento di telemetria viene inviato intorno al contrassegno di 60 secondi, che nel test ha un aspetto simile al seguente:

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"}}}}

Questo singolo elemento di telemetria rappresenta un'aggregazione di 41 misurazioni di metriche distinte. Poiché stavamo inviando lo stesso valore più e più volte, abbiamo una deviazione standard (stDev) di 0 con valori massimi identici (max) e minimo (min). La proprietà value rappresenta una somma di tutti i singoli valori aggregati.

Annotazioni

Il metodo GetMetric non supporta il rilevamento dell'ultimo valore (ad esempio, gauge) o il rilevamento di istogrammi o distribuzioni.

Se si esamina la risorsa di Application Insights nell'esperienza Log (Analytics), il singolo elemento di telemetria sarà simile allo screenshot seguente.

Screenshot che mostra la visualizzazione query di Log Analytics.

Annotazioni

Anche se l'elemento di telemetria non elaborato non contiene una proprietà/campo di somma esplicito una volta inserita, ne creiamo uno automaticamente. In questo caso, sia la proprietà value chee valueSum rappresentano la stessa cosa.

È anche possibile accedere ai dati di telemetria delle metriche personalizzati nella sezione Metriche del portale sia come metrica basata su log che personalizzata. Lo screenshot seguente è un esempio di metrica basata su log.

Screenshot che mostra la visualizzazione Esplora metriche.

Informazioni di riferimento sulle metriche della cache per l'utilizzo a velocità effettiva elevata

I valori delle metriche possono essere osservati frequentemente in alcuni casi. Ad esempio, un servizio a velocità effettiva elevata che elabora 500 richieste al secondo potrebbe voler generare 20 metriche di telemetria per ogni richiesta. Il risultato indica il rilevamento di 10.000 valori al secondo. In questi scenari con velocità effettiva elevata, gli utenti potrebbero dover aiutare l'SDK evitando alcune ricerche.

Ad esempio, l'esempio precedente ha eseguito una ricerca per un handle per la metrica ComputersSold e quindi ha rilevato un valore osservato di 42. Al contrario, l'handle potrebbe essere memorizzato nella cache per più chiamate di traccia:

//...

        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);
            }
        }

Oltre a memorizzare nella cache l'handle delle metriche, l'esempio precedente si riduce Task.Delay anche a 50 millisecondi in modo che il ciclo venga eseguito più frequentemente. Il risultato è 772 chiamate TrackValue().

Metriche multidimensionali

Gli esempi nella sezione precedente mostrano le metriche zero-dimensionali. Le metriche possono anche essere multidimensionali. Attualmente sono supportate fino a 10 dimensioni.

Ecco un esempio di come creare una metrica unidimensionale:

//...

        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);
            }
        }

L'esecuzione del codice di esempio per almeno 60 secondi comporta l'invio di tre elementi di telemetria distinti ad Azure. Ogni elemento rappresenta l'aggregazione di uno dei tre fattori di forma. Come in precedenza, è possibile esaminare ulteriormente nella visualizzazione Log (Analytics).

Screenshot che mostra la visualizzazione Log Analytics della metrica multidimensionale.

In Esplora metriche:

Screenshot che mostra le metriche personalizzate.

Si noti che non è possibile suddividere la metrica in base alla nuova dimensione personalizzata o visualizzare la dimensione personalizzata con la visualizzazione delle metriche.

Screenshot che mostra il supporto della suddivisione.

Per impostazione predefinita, le metriche multidimensionali all'interno di Esplora metriche non sono attivate nelle risorse di Application Insights.

Abilitare le metriche multidimensionali

Per abilitare le metriche multidimensionali per una risorsa di Application Insights, selezionare Utilizzo e costi stimati>Metriche personalizzate> Abilita avvisi sulle dimensioni delle metriche personalizzate> OK. Per altre informazioni, vedere Dimensioni e preaggregazione delle metriche personalizzate.

Dopo aver apportato questa modifica e inviato nuovi dati di telemetria multidimensionali, è possibile selezionare Applica suddivisione.

Annotazioni

Solo le metriche appena inviate dopo l'attivazione della funzionalità nel portale hanno dimensioni archiviate.

Screenshot che mostra l'applicazione della suddivisione.

Visualizzare le aggregazioni delle metriche per ogni dimensione FormFactor.

Screenshot che mostra i fattori di forma.

Usare MetricIdentifier quando sono presenti più di tre dimensioni

Attualmente sono supportate 10 dimensioni. L'uso di più di tre dimensioni richiede l'uso di 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");

Configurazione della metrica personalizzata

Se si vuole modificare la configurazione della metrica, è necessario apportare modifiche nella posizione in cui viene inizializzata la metrica.

Nomi di dimensioni speciali

Le metriche non usano il contesto di telemetria dell'oggetto TelemetryClient usato per accedervi. L'uso di nomi di dimensioni speciali disponibili come costanti nella classe MetricDimensionNames è la soluzione migliore per questa limitazione.

Le aggregazioni di metriche inviate dalla metrica Special Operation Request Size seguente non hanno il parametro Context.Operation.Name impostato su Special Operation. Il metodo TrackMetric() o qualsiasi altro metodo TrackXXX() ha il parametro OperationName impostato correttamente su 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);
                //...
            }
                   
        }

In questa circostanza, utilizzare i nomi delle dimensioni speciali elencati nella classe MetricDimensionNames per specificare i valori TelemetryContext.

Ad esempio, quando l'aggregazione di metriche risultante dall'istruzione successiva viene inviata all'endpoint cloud di Application Insights, il relativo campo dati Context.Operation.Name viene impostato su Special Operation:

_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");

Il valore di questa dimensione speciale viene copiato in TelemetryContext e non viene usato come dimensione normale. Se si desidera mantenere anche una dimensione operativa per l'esplorazione normale delle metriche, è necessario creare una dimensione separata a tale scopo:

_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Limite di dimensioni e serie temporali

Per impedire che il sottosistema di telemetria usi accidentalmente le risorse, è possibile controllare il numero massimo di serie di dati per metrica. I limiti predefiniti non sono più di 1.000 serie di dati totali per metrica e non più di 100 valori diversi per dimensione.

Importante

Usare valori cardinali bassi per le dimensioni per evitare la limitazione.

Nel contesto del limite di dimensioni e serie temporali, viene usato Metric.TrackValue(..) per assicurarsi che vengano osservati i limiti. Se i limiti sono già raggiunti, Metric.TrackValue(..) restituisce False e il valore non verrà monitorato. In caso contrario, viene restituito True. Questo comportamento è utile se i dati per una metrica provengono dall'input dell'utente.

Il costruttore MetricConfiguration accetta alcune opzioni su come gestire serie diverse all'interno della rispettiva metrica e un oggetto di una classe che implementa IMetricSeriesConfiguration che specifica il comportamento di aggregazione per ogni singola serie della metrica:

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 è il numero massimo di serie temporali di dati che una metrica può contenere. Quando viene raggiunto questo limite, le chiamate a TrackValue() che normalmente comportano la restituzione di una nuova serie, ora restituiscono false.
  • valuesPerDimensionLimit limita il numero di valori distinti per dimensione in modo analogo.
  • restrictToUInt32Values determina se devono essere rilevati solo valori integer non negativi.

Ecco un esempio di come inviare un messaggio per sapere se vengono superati i limiti limite:

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);
}

Rilevamento delle operazioni personalizzate

Gli SDK di Application Insights verificano automaticamente le richieste HTTP in ingresso e le chiamate ai servizi dipendenti, come richieste HTTP e query SQL. La verifica e la correlazione di richieste e dipendenze offre visibilità sui tempi di risposta e sull'affidabilità dell'intera applicazione in tutti i microservizi che combinano questa applicazione.

Esiste una classe di modelli di applicazione che non può essere supportata in modo generico. Per il corretto monitoraggio di tali modelli, è necessaria la strumentazione manuale del codice. Questa sezione illustra alcuni modelli che potrebbero richiedere l'uso della strumentazione manuale, come l'elaborazione di code personalizzate e l'esecuzione di attività in background a lungo termine.

Questa sezione offre indicazioni su come tenere traccia delle operazioni personalizzate con Application Insights SDK.

Informazioni generali

Un'operazione è un lavoro logico eseguito da un'applicazione. Sono indicati nome, ora di avvio, durata, risultato e contesto dell'esecuzione, ad esempio nome utente, proprietà e risultato. Se l'operazione A è stata avviata dall'operazione B, l'operazione B è impostata come elemento padre per A. Un'operazione può avere un solo padre, ma può avere molte operazioni figlio. Per ulteriori informazioni sulle operazioni e la correlazione dei dati di telemetria, vedere Correlazione dei dati di telemetria di Application Insights.

Nell’SDK di Application Insights .NET l'operazione viene descritta dalla classe astratta OperationTelemetry e dai discendenti RequestTelemetry e DependencyTelemetry.

Verifica delle operazioni in ingresso

Application Insights Web SDK raccoglie automaticamente le richieste HTTP per le applicazioni ASP.NET eseguite nella pipeline di IIS e per tutte le applicazioni ASP.NET Core. Sono disponibili soluzioni supportate dalla community per altre piattaforme e altri framework. Se l'applicazione non è supportata dalle soluzioni standard o supportate dalla community, è possibile instrumentarla manualmente.

Un altro esempio che richiede la verifica personalizzata è offerto dal ruolo di lavoro che riceve gli elementi dalla coda. Per alcune code, la chiamata per aggiungere un messaggio a questa coda viene registrata come dipendenza. L'operazione generale che descrive l'elaborazione del messaggio non viene raccolta automaticamente.

Di seguito è illustrato come si può tenere traccia di queste operazioni.

A un livello elevato, l'attività consiste nel creare RequestTelemetry e impostare le proprietà note. Al termine dell'operazione, tenere traccia dei dati di telemetria. L'esempio seguente illustra questa attività.

Richiesta HTTP nell'app con self-hosting Owin

In questo esempio il contesto della traccia viene propagato in base al protocollo HTTP per la correlazione. Si deve prevedere di ricevere le intestazioni descritte qui.


Espandere per visualizzare il codice
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);
    }
}

Il protocollo HTTP per la correlazione dichiara inoltre l’intestazione Correlation-Context. È omesso qui per motivi di semplicità.

Strumentazione della coda

Il contesto di traccia W3C e il protocollo HTTP per la correlazione consenta di passare i dettagli di correlazione con la richiesta HTTP, ma ogni protocollo di accodamento deve definire come passare gli stessi dettagli al messaggio della coda. Alcuni protocolli di coda, ad esempio AMQP, consentono di passare più metadati. Altri protocolli, ad esempio coda di Archiviazione di Azure, richiedono che il contesto venga codificato nel payload del messaggio.

Annotazioni

La traccia tra componenti non è ancora supportata per le code.

Con HTTP, se il produttore e l'utente inviano dati di telemetria a risorse di Application Insights diverse, l'esperienza di diagnostica delle transazioni e la mappa delle applicazioni mostrano le transazioni e mappano end-to-end. Per le code, questa funzionalità non è ancora supportata.

Coda del bus di servizio

Per informazioni di tracciamento, vedere Correlazione e analisi distribuita tramite la messaggistica del bus di servizio di Azure.

Coda di archiviazione di Azure

L'esempio seguente illustra come tenere traccia delle operazioni della coda di archiviazione di Azure e correlare i dati di telemetria tra producer, consumer e Archiviazione di Azure.

La coda di archiviazione ha un'API HTTP. Tutte le chiamate alla coda vengono tracciate dall'agente di raccolta di dipendenze Application Insights per le richieste HTTP. Viene configurato per impostazione predefinita nelle applicazioni ASP.NET e ASP.NET Core. Con altri tipi di applicazioni, vedere la documentazione delle applicazioni console.

Inoltre è possibile correlare l'ID operazione di Application Insights con l'ID di richiesta di Archiviazione. Per informazioni su come impostare e ottenere un client di richiesta di Archivazione e un ID di richiesta del server, vedere Monitoraggio, diagnosi e risoluzione dei problemi dell'archiviazione di Azure.

Poiché le code di archiviazione di Azure supportano l'API HTTP, tutte le operazioni con la coda vengono automaticamente registrate da Application Insights. In molti casi, questa strumentazione dovrebbe essere sufficiente. Per correlare le tracce sul lato consumer con le tracce del producer, è necessario passare parte del contesto di correlazione in modo simile a quanto avviene nel protocollo HTTP per la correlazione.

Questo esempio illustra come tenere traccia dell'operazione Enqueue. È possibile:

  • Correlare gli eventuali tentativi, che hanno tutti un'operazione padre comune, ovvero Enqueue. In caso contrario, vengono registrati come elementi figlio della richiesta in ingresso. Se sono presenti più richieste logiche per la coda, potrebbe risultare difficile trovare la chiamata che ha restituito i tentativi.
  • Correlare i log di archiviazione (se e quando necessario) con i dati di telemetria di Application Insights.

L'operazione Enqueue è l'elemento figlio di un'operazione padre. Un esempio è una richiesta HTTP in ingresso. La chiamata di dipendenza HTTP è l'elemento figlio dell'operazione Enqueue e nipote della richiesta in ingresso.

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);
    }
}  

Per ridurre la quantità di dati di telemetria segnalati dall'applicazione o per non tenere traccia dell'operazione Enqueue per altri motivi, è possibile usare direttamente l'API Activity:

  • Creare (e avviare) un nuovo Activity anziché avviare l'operazione Application Insights. Non è necessario assegnare alcuna proprietà ad essa, ad eccezione del nome dell'operazione.
  • Serializzare yourActivity.Id nel payload dei messaggi invece di operation.Telemetry.Id. È anche possibile usare Activity.Current.Id.

Analogamente, è possibile instrumentare le altre operazioni della coda. L'operazione di visualizzazione deve essere instrumentata in modo simile a quella di rimozione dalla coda. Non è necessario instrumentare operazioni di gestione della coda. Application Insights tiene traccia di operazioni come HTTP e nella maggior parte dei casi è sufficiente.

Quando si instrumenta l'eliminazione di un messaggio, assicurarsi di impostare gli identificatori delle operazioni (correlazione). In alternativa, è possibile usare l'API Activity. Non è quindi necessario impostare gli identificatori delle operazioni negli elementi di telemetria perché Application Insights SDK esegue questa operazione automaticamente:

  • Creare un nuovo oggetto Activity dopo avere ottenuto un elemento dalla coda.
  • Usare Activity.SetParentId(message.ParentId) per correlare i log del consumer e del producer.
  • Avviare il Activity.
  • Tenere traccia delle operazioni di rimozione dalla coda, elaborazione ed eliminazione usando gli helper Start/StopOperation. dallo stesso flusso di controllo asincrono (contesto di esecuzione). In questo modo la correlazione sarà corretta.
  • Arrestare il Activity.
  • Usare Start/StopOperation o chiamare Track telemetry manualmente.
Tipi di dipendenza

Application Insights usa il tipo di dipendenza per personalizzare le esperienze dell'interfaccia utente. Per le code, riconosce i tipi seguenti diDependencyTelemetry che migliorano l'esperienza di diagnostica delle transazioni:

  • Azure queue per le code di Archiviazione di Azure
  • Azure Event Hubs per Hub eventi di Azure
  • Azure Service Bus per bus di servizio di Azure
Elaborazione in batch

Per alcune code, è possibile una rimozione dalla coda di più messaggi con una singola richiesta. L'elaborazione di tali messaggi è presumibilmente indipendente e appartiene a diverse operazioni logiche. Non è possibile correlare l'operazione Dequeue a un determinato messaggio elaborato.

Ogni elaborazione dei messaggi deve essere eseguita nel proprio flusso di controllo asincrono. Per ulteriori informazioni, vedere la sezione Verifica delle dipendenze in uscita.

Attività in background a esecuzione prolungata

Alcune applicazioni avviano operazioni a esecuzione prolungata che possono essere causate dalle richieste degli utenti. Dal punto di vista della verifica/strumentazione, non c'è differenza dalla strumentazione delle richieste o delle dipendenze:

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);
    }
}

In questo esempio telemetryClient.StartOperation crea DependencyTelemetry e specifica il contesto di correlazione. Si supponga di avere un'operazione padre creata dalle richieste in ingresso che hanno pianificato l'operazione. BackgroundTask, purché venga avviato nello stesso flusso di controllo asincrono di una richiesta in ingresso, viene correlato con tale operazione padre. BackgroundTask e tutti gli elementi di telemetria annidati vengono automaticamente correlati alla richiesta che l'ha generato anche dopo la fine della richiesta.

Quando l'attività viene avviata dal thread in background a cui non sono associate operazioni (Activity), BackgroundTask non ha elementi padre. Tuttavia, può avere operazioni annidate. Tutti gli elementi di telemetria segnalati dall'attività sono correlati a DependencyTelemetry creato in BackgroundTask.

Verifica delle dipendenze in uscita

È possibile tenere traccia della propria tipologia di dipendenza o di operazioni non supportate da Application Insights.

Il metodo Enqueue nella coda del bus di servizio o nella coda di archiviazione è un esempio di tale verifica personalizzata.

L'approccio generale per la verifica personalizzata delle dipendenze è:

  • Chiamare il metodo TelemetryClient.StartOperation (estensione) che riempie le proprietà DependencyTelemetry necessarie per la correlazione e altre proprietà, come avvio, timestamp e durata.
  • Impostare le altre proprietà personalizzate in DependencyTelemetry, ad esempio nome e altri contesti necessari.
  • Effettuare una chiamata di dipendenza e attendere.
  • Al termine, arrestare l'operazione con StopOperation.
  • Gestire le eccezioni.
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.
        }
    }
}

L'eliminazione di un'operazione causa l'arresto dell'operazione, pertanto è possibile eseguirla invece di chiamare StopOperation.

Avvertimento

In alcuni casi, un'eccezione non gestita potrebbe impedire la chiamata di finally, pertanto le operazioni potrebbero non essere rilevate.

Elaborazione e verifica di operazioni parallele

La chiamata StopOperation arresta solo l'operazione avviata. Se l'operazione corrente in esecuzione non corrisponde all'operazione che si desidera arrestare, StopOperation non esegue alcuna operazione. Questa situazione può verificarsi se si avviano più operazioni in parallelo nello stesso contesto di esecuzione.

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;

Chiamare sempre StartOperation ed elaborare l'operazione nello stesso metodo async per isolare le operazioni eseguite in parallelo. Se l'operazione è sincrona, o non asincrona, eseguire il wrapping del processo e verificare con 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);
}

Operazioni di ApplicationInsights e System.Diagnostics.Activity

System.Diagnostics.Activity rappresenta il contesto di traccia distribuita e viene usato da framework e librerie per creare e propagare il contesto all'interno e all'esterno del processo e correlare gli elementi di telemetria. Activity interagisce con System.Diagnostics.DiagnosticSource come meccanismo di notifica tra il framework o la libreria per notificare eventi interessanti, ad esempio richieste in ingresso o in uscita ed eccezioni.

Le attività sono funzionalità di primo livello in Application Insights. Le dipendenze automatiche e la raccolta di richieste si basano principalmente su di essi insieme agli eventi DiagnosticSource. Se è stata creata Activity nell'applicazione, non verrà creata l'Application Insights Telemetry. Application Insights deve ricevere DiagnosticSource eventi e conoscere i nomi degli eventi e i payload da convertire Activity in dati di telemetria.

Ogni operazione di Application Insights (richiesta o dipendenza) comporta Activity. Quando StartOperation viene chiamato, crea Activity sotto. StartOperation è il modo consigliato per tenere traccia manualmente delle telemetrie di richiesta o dipendenza e assicurarsi che tutto sia correlato.

Contatori in Application Insights

Application Insights supporta contatori di prestazioni e contatori di eventi. Questa guida fornisce una panoramica di entrambi, compreso il loro scopo, nonché la configurazione e l'utilizzo nelle applicazioni .NET.

Informazioni generali

  • I contatori di prestazioni sono integrati nel sistema operativo Windows e offrono metriche predefinite quali utilizzo della CPU, consumo di memoria e attività del disco. Questi contatori sono ideali per monitorare le metriche di prestazioni standard con una configurazione minima. Consentono di monitorare l'utilizzo delle risorse o risolvere i colli di bottiglia a livello di sistema nelle applicazioni basate su Windows, ma non supportano metriche personalizzate specifiche per le applicazioni.

  • I contatori di eventi possono essere usati su più piattaforme, tra cui Windows, Linux e macOS. Consentono agli sviluppatori di definire e monitorare metriche leggere e personalizzabili specifiche per le applicazioni, offrendo una maggiore flessibilità rispetto ai contatori di prestazioni. I contatori di eventi sono utili quando le metriche di sistema sono insufficienti o quando sono necessari dati di telemetria dettagliati in applicazioni multipiattaforma. Richiedono operazioni di implementazione e configurazione esplicite, che rendono l'installazione più impegnativa.

Contatori delle prestazioni

Windows offre una vasta gamma di contatori delle prestazioni, ad esempio quelli usati per raccogliere statistiche sull'utilizzo del processore, della memoria e del disco. È anche possibile definire contatori delle prestazioni personalizzati.

L'applicazione supporta la raccolta dei contatori di prestazioni se viene eseguita in Internet Information Server (IIS) su un host locale o su una macchina virtuale con accesso amministrativo. Le applicazioni in esecuzione come App Web di Azure non possono accedere direttamente ai contatori di prestazioni, ma Application Insights raccoglie un sottoinsieme dei contatori disponibili.

Suggerimento

Come per altre metriche, è possibile impostare un avviso per segnalare quando un contatore supera un limite specificato. Per impostare un avviso, aprire il riquadro Avvisi e selezionare Aggiungi avviso.

Prerequisiti

Concedere all'account del servizio pool di app, l'autorizzazione per monitorare i contatori delle prestazioni aggiungendolo al gruppo Utenti del Monitor prestazioni.

net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"

Visualizzare i contatori

Nel riquadro Metrica è riportato un set predefinito di contatori delle prestazioni.

Contatori predefiniti per le applicazioni Web ASP.NET:

  • % Processo\Tempo processore
  • % Processo\Tempo normalizzato processore
  • Memoria\Byte disponibili
  • Richieste ASP.NET/sec
  • Eccezioni di .NET Common Language Runtime (CLR) generate al secondo
  • Tempo di Esecuzione della Richiesta di Applicazioni ASP.NET
  • Processo\Byte privati
  • Processo\Byte dati IO/sec
  • Applicazioni ASP.NET\Richieste in coda applicazione
  • Processor(_Total)\% tempo processore

Aggiungere contatori

Se il contatore delle prestazioni desiderato non è incluso nell'elenco delle metriche, è possibile aggiungerlo.

Opzione 1: Configurazione in ApplicationInsights.config

  1. È possibile identificare i contatori disponibili nel server usando questo comando di PowerShell nel server locale:

    Get-Counter -ListSet *
    

    Per altre informazioni, vedere Get-Counter.

  2. Aprire ApplicationInsights.config.

    Se Application Insights è stato aggiunto all'app durante lo sviluppo:

    1. Modificare ApplicationInsights.config nel progetto.
    2. Ridistribuirlo nei server.
  3. Modificare la direttiva dell'agente di raccolta delle prestazioni:

    
        <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>
    

È possibile acquisire i contatori standard e quelli implementati autonomamente. \Objects\Processes è un esempio di contatore standard, disponibile in tutti i sistemi Windows. \Sales(photo)\# Items Sold è un esempio di contatore personalizzato che può essere implementato in un servizio Web.

Il formato è \Category(instance)\Counter oppure, per categorie non associate a istanze, solo \Category\Counter.

Il parametro ReportAs è obbligatorio per i nomi dei contatori che non corrispondono a [a-zA-Z()/-_ \.]+.

Se si specifica un'istanza, questa diventa una dimensione CounterInstanceName della metrica indicata.

Opzione 2: Configurazione nel codice

Vedere la sezione seguente.

Raccogliere i contatori delle prestazioni nel codice per applicazioni Web ASP.NET o applicazioni Console .NET/.NET Core

Per raccogliere i contatori delle prestazioni di sistema e inviarli ad Application Insights, è possibile adattare il frammento di codice seguente:

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Process([replace-with-application-process-name])\Page Faults/sec", "PageFaultsPerfSec"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

In alternativa, è possibile eseguire la stessa operazione con le metriche personalizzate create:

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Sales(photo)\# Items Sold", "Photo sales"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

Contatori delle prestazioni per le applicazioni in esecuzione in App Web di Azure e in contenitori Windows in Servizio app di Azure

Le applicazioni ASP.NET e ASP.NET Core distribuite in App Web di Azure vengono eseguite in un ambiente sandbox speciale. Le applicazioni distribuite nel servizio app di Azure possono usare un Contenitore Windows o essere ospitate in un ambiente sandbox. Se l'applicazione viene distribuita in un contenitore Windows, tutti i contatori delle prestazioni standard sono disponibili nell'immagine del contenitore.

L'ambiente sandbox non consente l'accesso diretto ai contatori delle prestazioni di sistema. Tuttavia, un subset limitato di contatori viene esposto come variabile di ambiente, come descritto in Contatori delle prestazioni esposte come variabili di ambiente. In questo ambiente è disponibile solo un subset di contatori. Per l'elenco completo, vedere Contatori delle prestazioni esposti come variabili di ambiente.

Application Insights SDK per ASP.NET e ASP.NET Core rileva se il codice è distribuito in un'app Web o in un contenitore non Windows. Il rilevamento determina se raccoglie i contatori delle prestazioni in un ambiente sandbox o se utilizza il meccanismo di raccolta standard quando è ospitato in un contenitore Windows o in una macchina virtuale.

Query di Log Analytics per i contatori di prestazioni

È possibile cercare e visualizzare i report dei contatori delle prestazioni in Log Analytics.

Lo schema performanceCounters espone category, il nome counter e il nome instance per ogni contatore delle prestazioni. Nei dati di telemetria per ogni applicazione vengono visualizzati solo i contatori per l'applicazione specifica. Ad esempio, per visualizzare quali contatori sono disponibili:

performanceCounters | summarize count(), avg(value) by category, instance, counter

Qui Instance fa riferimento all'istanza del contatore delle prestazioni e non all'istanza del ruolo o del server. Solitamente, il nome dell'istanza del contatore delle prestazioni segmenta i contatori, ad esempio il tempo del processore, in base al nome del processo o dell'applicazione.

Per ottenere un grafico della memoria disponibile nel periodo recente:

performanceCounters | where counter == "Available Bytes" | summarize avg(value), min(value) by bin(timestamp, 1h) | render timechart

Come altri dati di telemetria, performanceCounters contiene anche una colonna cloud_RoleInstance che indica l'identità dell'istanza del server host in cui viene eseguita l'app. Ad esempio, per confrontare le prestazioni dell'applicazione su computer diversi:

performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)

Domande frequenti sui contatori di prestazioni

Per consultare le domande frequenti, vedere Domande frequenti sui contatori di prestazioni.

Contatori di eventi

EventCounter è un meccanismo di .NET/.NET Core per pubblicare e utilizzare contatori o statistiche. Il supporto per EventCounter è disponibile in tutte le piattaforme del sistema operativo, ovvero Windows, Linux e macOS. Può essere considerato come un equivalente multipiattaforma per PerformanceCounters supportato solo nei sistemi Windows.

Anche se gli utenti possono pubblicare qualsiasi contatore di evento personalizzato per soddisfare le proprie esigenze, .NET pubblica un set di questi contatori per impostazione predefinita. Il documento illustra in modo dettagliato i passaggi necessari per raccogliere e visualizzare contatori degli eventi (definiti dal sistema o definiti dall'utente, in Azure Application Insights).

Suggerimento

Come per altre metriche, è possibile impostare un avviso per segnalare quando un contatore supera un limite specificato. Per impostare un avviso, aprire il riquadro Avvisi e selezionare Aggiungi avviso.

Uso di Application Insights per raccogliere EventCounters

Application Insights supporta la raccolta di EventCounters con EventCounterCollectionModule, che fa parte del pacchetto NuGet Microsoft.ApplicationInsights.EventCounterCollector rilasciato di recente. EventCounterCollectionModule viene abilitato automaticamente quando si usa AspNetCore o WorkerService. EventCounterCollectionModule raccoglie i contatori con una frequenza di raccolta non configurabile pari a 60 secondi. Non sono richieste autorizzazioni speciali per raccogliere EventCounters. Per le applicazioni ASP.NET Core è necessario aggiungere anche il pacchetto Microsoft.ApplicationInsights.AspNetCore.

dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore

Contatori predefiniti raccolti

A partire dalla versione 2.15.0 di AspNetCore SDK o WorkerService SDK, i contatori non vengono raccolti per impostazione predefinita. Il modulo stesso è abilitato, in questo modo gli utenti possono aggiungere i contatori desiderati per raccoglierli.

Per ottenere un elenco di contatori noti pubblicati da Runtime .NET, vedere il documento Contatori disponibili.

Personalizzazione dei contatori da raccogliere

L'esempio seguente illustra come aggiungere/rimuovere contatori. Questa personalizzazione viene eseguita come parte della configurazione del servizio dell'applicazione dopo l'abilitazione della telemetria di Application Insights con AddApplicationInsightsTelemetry() o AddApplicationInsightsWorkerService(). Di seguito è disponibile un esempio di codice da un'applicazione ASP.NET Core. Per altri tipi di applicazioni, vedere Configurare i moduli di 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"));
        }
    );

Disabilitazione del modulo di raccolta EventCounter

EventCounterCollectionModule può essere disabilitato utilizzando ApplicationInsightsServiceOptions.

Nell'esempio seguente viene utilizzato ASP.NET Core SDK.

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;

var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);

Un approccio simile può essere usato anche per Worker Service SDK, ma lo spazio dei nomi deve essere modificato come illustrato nell'esempio seguente.

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;

var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);

Query di Log Analytics per i contatori di eventi

È possibile cercare e visualizzare report dei contatori di eventi in Log Analytics, nella scheda customMetrics.

Eseguire ad esempio la query seguente per visualizzare i contatori raccolti e disponibili per le query:

customMetrics | summarize avg(value) by name

Per ottenere un grafico di un contatore specifico, ad esempio ThreadPool Completed Work Item Count, nel periodo recente, eseguire la query seguente.

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

Come altri dati di telemetria, customMetrics contiene anche una colonna cloud_RoleInstance che indica l'identità dell'istanza del server host in cui viene eseguita l'app. La query precedente mostra il valore del contatore per ogni istanza e può essere usata per confrontare le prestazioni di diverse istanze del server.

Domande frequenti sui contatore di eventi

Per consultare le domande frequenti, vedere Domande frequenti sui contatori di eventi.

Filtrare e arricchire i dati di telemetria

Contenuto della sezione

Filtrare e pre-elaborare i dati di telemetria

È possibile scrivere codice per filtrare, modificare o arricchire i dati di telemetria prima dell'invio dall'SDK. L'elaborazione include i dati inviati dai moduli di telemetria standard, ad esempio la raccolta di richieste HTTP e la raccolta delle dipendenze.

  • Il filtro può modificare o rimuovere i dati di telemetria prima che vengano inviati dall'SDK implementando ITelemetryProcessor. Ad esempio, è possibile ridurre il volume di dati di telemetria escludendo le richieste dai robot. A differenza del campionamento, si ha il controllo completo su ciò che viene inviato o rimosso, ma influisce su qualsiasi metrica basata su log aggregati. A seconda della modalità di eliminazione degli elementi, è anche possibile perdere la possibilità di spostarsi tra gli elementi correlati.

  • Aggiungere o modificare proprietà a tutti i dati di telemetria inviati dall'app implementando un oggetto ITelemetryInitializer. Ad esempio, è possibile aggiungere valori calcolati o numeri di versione in base ai quali filtrare i dati nel portale.

  • Il campionamento riduce il volume di dati di telemetria senza influire sulle statistiche. Mantiene insieme i punti dati correlati in modo che sia possibile spostarsi tra di essi durante la diagnosi di un problema. Nel portale i conteggi totali vengono moltiplicati per compensare il campionamento.

Annotazioni

L'API SDK viene usata per inviare metriche ed eventi personalizzati.

Filtraggio

Questa tecnica consente di controllare direttamente gli elementi inclusi o esclusi dal flusso di telemetria. Il filtro può essere usato per eliminare gli elementi di telemetria dall'invio ad Application Insights. È possibile usare il filtro con il campionamento o separatamente.

Per filtrare i dati di telemetria, scrivere un processore di telemetria e registrarlo con TelemetryConfiguration. Tutti i dati di telemetria passano attraverso il processore. È possibile scegliere di rilasciarlo dal flusso o assegnarlo al processore successivo nella catena. I dati di telemetria dai moduli standard, come il collettore di richieste HTTP e il collettore di dipendenze, e la telemetria che hai tracciato personalmente sono inclusi. Ad esempio, è possibile filtrare i dati di telemetria relativi alle richieste dei robot o alle chiamate di dipendenza riuscite.

Avvertimento

Filtrare i dati di telemetria inviati dall'SDK usando processori può asimmetriare le statistiche visualizzate nel portale e rendere difficile seguire gli elementi correlati.

Prendere invece in considerazione l'uso del campionamento.

ITelemetryProcessor e ITelemetryInitializer

Qual è la differenza tra processori di telemetria e inizializzatori di telemetria?

  • Ci sono alcune sovrapposizioni in ciò che è possibile fare con loro. Entrambi possono essere usati per aggiungere o modificare le proprietà dei dati di telemetria, anche se è consigliabile usare gli inizializzatori a tale scopo.
  • Gli inizializzatori di telemetria vengono sempre eseguiti prima dei processori di telemetria.
  • Gli inizializzatori di telemetria possono essere chiamati più volte. Per convenzione, non impostano alcuna proprietà già impostata.
  • I processori di telemetria consentono di sostituire o rimuovere completamente un elemento di telemetria.
  • Tutti gli inizializzatori di telemetria registrati vengono chiamati per ogni elemento di telemetria. Per i processori di telemetria, SDK garantisce la chiamata al primo processore di telemetria. Se il resto dei processori viene chiamato o meno viene deciso dai processori di telemetria precedenti.
  • Usare gli inizializzatori di telemetria per arricchire i dati di telemetria con più proprietà o eseguire l'override di uno esistente. Usare un processore di telemetria per filtrare i dati di telemetria.

Aggiungere/modificare le proprietà

Usare gli inizializzatori di telemetria per arricchire i dati di telemetria con informazioni aggiuntive o per eseguire l'override delle proprietà di telemetria impostate dai moduli di telemetria standard.

Ad esempio, Application Insights per un pacchetto Web raccoglie i dati di telemetria sulle richieste HTTP. Per impostazione predefinita, contrassegna qualsiasi richiesta con un codice >di risposta =400 come non riuscita. Se invece si vuole considerare 400 come un risultato positivo, è possibile fornire un inizializzatore di telemetria che imposti la proprietà Success.

Se si specifica un inizializzatore di telemetria, viene chiamato ogni volta che viene chiamato uno dei metodi Track*(). Questo inizializzatore include Track() metodi chiamati dai moduli di telemetria standard. Per convenzione, questi moduli non impostano alcuna proprietà già impostata da un inizializzatore. Gli inizializzatori di telemetria vengono chiamati prima di chiamare i processori di telemetria, quindi tutti gli arricchimenti eseguiti dagli inizializzatori sono visibili ai processori.

Inizializzatori di telemetria

Per arricchire i dati di telemetria con informazioni aggiuntive o per eseguire l'override delle proprietà di telemetria impostate dai moduli di telemetria standard, usare gli inizializzatori di telemetria.

Gli inizializzatori di telemetria impostano proprietà di contesto che vengono inviate insieme ad ogni elemento di telemetria. È possibile scrivere inizializzatori personalizzati per impostare le proprietà del contesto.

Gli inizializzatori standard sono tutti impostati dal Web o dai pacchetti NuGet WindowsServer:

Inizializzatore Description
AccountIdTelemetryInitializer Imposta la proprietà AccountId.
AuthenticatedUserIdTelemetryInitializer Imposta la proprietà AuthenticatedUserId come impostata da JavaScript SDK.
AzureRoleEnvironmentTelemetryInitializer Aggiorna le proprietà RoleName e RoleInstance del contesto Device per tutti gli elementi di telemetria con le informazioni estratte dall'ambiente di runtime di Azure.
BuildInfoConfigComponentVersionTelemetryInitializer Aggiorna la proprietà Version del contesto Component per tutti gli elementi di telemetria con il valore estratto dal file BuildInfo.config prodotto dalla compilazione MS.
ClientIpHeaderTelemetryInitializer Aggiorna la proprietà Ip del contesto Location di tutti gli elementi di telemetria in base all'intestazione HTTP X-Forwarded-For della richiesta.
DeviceTelemetryInitializer Aggiorna le proprietà seguenti del contesto Device per tutti gli elementi di telemetria:

Type viene impostato su PC.
Id viene impostato sul nome di dominio del computer in cui è in esecuzione l'applicazione Web.
OemName viene impostato sul valore estratto dal campo Win32_ComputerSystem.Manufacturer tramite WMI.
Model viene impostato sul valore estratto dal campo Win32_ComputerSystem.Model tramite WMI.
NetworkType viene impostato sul valore estratto dalla proprietà NetworkInterface.
Language viene impostato sul nome della proprietà CurrentCulture.
DomainNameRoleInstanceTelemetryInitializer Aggiorna la proprietà RoleInstance del contesto Device per tutti gli elementi di telemetria con il nome di dominio del computer in cui è in esecuzione l'applicazione Web.
OperationNameTelemetryInitializer Aggiorna la proprietà Name di RequestTelemetry e la proprietà Name del contesto Operation di tutti gli elementi di telemetria in base al metodo HTTP, e i nomi del controller MVC ASP.NET e l'azione richiamata per elaborare la richiesta.
OperationIdTelemetryInitializer o OperationCorrelationTelemetryInitializer Aggiorna la proprietà di contesto Operation.Id di tutti gli elementi di telemetria rilevati durante la gestione di una richiesta con il RequestTelemetry.Id generato automaticamente.
SessionTelemetryInitializer Aggiorna la proprietà Id del contesto Session per tutti gli elementi di telemetria con il valore estratto dal cookie ai_session generato dal codice di strumentazione JavaScript di ApplicationInsights in esecuzione nel browser dell'utente.
SyntheticTelemetryInitializer o SyntheticUserAgentTelemetryInitializer Aggiorna le proprietà di contesto User, Session e Operation di tutti gli elementi di telemetria rilevati durante la gestione di una richiesta da un'origine sintetica, ad esempio un test di disponibilità o un robot del motore di ricerca. Per impostazione predefinita, esplora metriche non mostra la telemetria sintetica.

<Filters> imposta le proprietà di identificazione delle richieste.
UserTelemetryInitializer Aggiorna le proprietà Id e AcquisitionDate del contesto User per tutti gli elementi di telemetria con i valori estratti dal cookie ai_user generato dal codice di strumentazione JavaScript di Application Insights in esecuzione nel browser dell'utente.
WebTestTelemetryInitializer Imposta l'ID utente, l'ID di sessione e le proprietà di origine sintetica per le richieste HTTP che provengono da test di disponibilità.

<Filters> imposta le proprietà di identificazione delle richieste.

Annotazioni

Per le applicazioni .NET in esecuzione in Service Fabric di Azure, è possibile includere il pacchetto NuGet Microsoft.ApplicationInsights.ServiceFabric. Questo pacchetto include una proprietà FabricTelemetryInitializer, che aggiunge le proprietà di Service Fabric per gli elementi di telemetria. Per ulteriori informazioni, vedere la pagina GitHub sulle proprietà aggiunte dal pacchetto NuGet.

Aggiungere ITelemetryInitializer

Questo blog descrive un progetto per diagnosticare i problemi di dipendenza inviando automaticamente ping regolari alle dipendenze.

  1. Definire l'inizializzatore

    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
            }
        }
    }
    
  2. Caricare l'inizializzatore

Opzione 1: Configurazione nel codice

protected void Application_Start()
{
    // ...
    TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}

Opzione 2: Configurazione in ApplicationInsights.config

<ApplicationInsights>
    <TelemetryInitializers>
    <!-- Fully qualified type name, assembly name: -->
    <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
    ...
    </TelemetryInitializers>
</ApplicationInsights>

Per altre informazioni , vedere questo esempio.

Annotazioni

Assicurarsi che il fileapplicationinsights.config si trova nella directory di output e contenga eventuali modifiche recenti.

Esempio di Inizializzatori di Telemetria

Aggiungere una proprietà personalizzata

L'inizializzatore di esempio seguente aggiunge una proprietà personalizzata a ogni telemetria rilevata.

public void Initialize(ITelemetry item)
{
    var itemProperties = item as ISupportProperties;
    if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
    {
        itemProperties.Properties["customProp"] = "customValue";
    }
}
Aggiungere un nome del ruolo cloud e un'istanza del ruolo cloud

Passaggio 1: Scrivere un TelemetryInitializer personalizzato

L'inizializzatore di esempio seguente imposta il nome del ruolo cloud su ogni telemetria rilevata.

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";
            }
        }
    }
}

Passaggio 2: Caricare un inizializzatore in TelemetryConfiguration

Nel file ApplicationInsights.config :

    <ApplicationInsights>
      <TelemetryInitializers>
        <!-- Fully qualified type name, assembly name: -->
        <Add Type="CustomInitializer.Telemetry.MyTelemetryInitializer, CustomInitializer"/>
        ...
      </TelemetryInitializers>
    </ApplicationInsights>

Un metodo alternativo per ASP.NET app Web consiste nel creare un'istanza dell'inizializzatore nel codice. L'esempio seguente mostra il codice nel file Global.aspx.cs :

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;

    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
    }
Controllare l'indirizzo IP client usato per i mapping di georilevazione

L'inizializzatore di esempio seguente imposta l'IP client, usato per la mappatura della geolocalizzazione al posto dell'indirizzo IP del socket client, durante l'acquisizione di 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;
}

Processori di telemetria

I processori di telemetria possono filtrare e modificare ciascun elemento di telemetria prima di inviarlo dal SDK al portale.

  1. Implementare ITelemetryProcessor.

    I processori di telemetria costruiscono una catena di elaborazione. Quando si crea un'istanza di un processore di telemetria, viene fornito un riferimento al processore successivo nella catena. Quando un punto dati di telemetria viene passato al metodo di processo, esegue il lavoro e quindi chiama (o non chiama) il processore di telemetria successivo nella catena.

    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;
        }
    }
    
  2. Aggiungere il processore.

    Inserire questo frammento di codice in ApplicationInsights.config:

    <TelemetryProcessors>
      <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9">
        <!-- Set public property -->
        <MyParamFromConfigFile>2-beta</MyParamFromConfigFile>
      </Add>
    </TelemetryProcessors>
    

    È possibile passare valori stringa dal file .config fornendo proprietà denominate pubbliche nella classe.

    Avvertimento

    Prestare attenzione a associare il nome del tipo e i nomi delle proprietà nel file .config ai nomi di classe e proprietà nel codice. Se il file .config fa riferimento a un tipo o a una proprietà inesistente, l'SDK potrebbe non inviare dati di telemetria.

    In alternativa, è possibile inizializzare il filtro nel codice. In una classe di inizializzazione appropriata, ad esempio AppStart in Global.asax.cs, inserire il processore nella catena:

    Annotazioni

    L'esempio di codice seguente è obsoleto, ma viene reso disponibile qui per la posterità. È consigliabile iniziare a usare OpenTelemetry o eseguire la migrazione a 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();
    

    I client di telemetria creati dopo questo punto usano i processori.

    Processore di telemetria di campionamento adattivo (da 2.0.0-beta3)

    Questa funzionalità è abilitata per impostazione predefinita. Se l'app invia numerosi dati di telemetria, questo processore ne rimuove alcuni.

    
        <TelemetryProcessors>
          <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
            <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
          </Add>
        </TelemetryProcessors>
    
    

    Il parametro fornisce la destinazione che l'algoritmo tenta di ottenere. Ogni istanza dell'SDK funziona in modo indipendente. Pertanto, se il server è un cluster di più computer, il volume effettivo dei dati di telemetria viene moltiplicato di conseguenza.

    Altre informazioni sul campionamento.

    Processore di telemetria di campionamento adattivo (da 2.0.0-beta1)

    È disponibile anche un processore di telemetria di campionamento standard (dalla versione 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>
    

Filtri di esempio

Richieste sintetiche

Filtrare i robot e i test Web. Anche se Esplora metriche offre la possibilità di filtrare le origini sintetiche, questa opzione riduce il traffico e le dimensioni di inserimento filtrandoli nell'SDK stesso.

public void Process(ITelemetry item)
{
    if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
    
    // Send everything else:
    this.Next.Process(item);
}
Autenticazione non riuscita

Filtrare ed escludere le richieste che ricevono una risposta "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);
}
Filtrare le chiamate di dipendenza remote rapide

Se si desidera diagnosticare solo le chiamate lente, filtrarne le veloci.

Annotazioni

Questo filtro sfasa le statistiche visualizzate nel portale.

public void Process(ITelemetry item)
{
    var request = item as DependencyTelemetry;

    if (request != null && request.Duration.TotalMilliseconds < 100)
    {
        return;
    }
    this.Next.Process(item);
}

campionamento

Per informazioni su come configurare il campionamento per le applicazioni ASP.NET, vedere Campionamento in Application Insights.

Arricchire i dati tramite HTTP

var requestTelemetry = HttpContext.Current?.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;

if (requestTelemetry != null)
{
    requestTelemetry.Properties["myProp"] = "someData";
}

Gestire i componenti DELL'SDK

Contenuto della sezione

È possibile personalizzare Application Insights SDK per ASP.NET, ASP.NET Core e Il servizio di lavoro per modificare la configurazione predefinita.

Application Insights .NET SDK è costituito da numerosi pacchetti NuGet. Il pacchetto di base fornisce l'API per l'invio di dati di telemetria ad Application Insights. Altri pacchetti forniscono moduli e inizializzatori di telemetria per il rilevamento automatico dei dati di telemetria dall'applicazione e dal rispettivo contesto. Modificando il file di configurazione, è possibile abilitare o disabilitare moduli di telemetria e inizializzatori. È anche possibile impostare parametri per alcuni di essi.

Il file di configurazione è denominato ApplicationInsights.config o ApplicationInsights.xml. Il nome dipende dal tipo di applicazione. Viene aggiunto automaticamente al progetto quando si installano alcune versioni dell'SDK.

Per impostazione predefinita, quando si usa l'esperienza automatizzata dai progetti modello di Visual Studio che supportano Aggiungi>Application Insights Telemetry, il file ApplicationInsights.config viene creato nella cartella radice del progetto. Dopo la compilazione, viene copiato nella cartella bin. Viene anche aggiunto a un'app Web da Application Insights Agent in un server IIS.

Importante

Il file di configurazione viene ignorato se viene usata l'estensione per i siti Web di Azure o l'estensione per le macchine virtuali di Azure e i set di scalabilità di macchine virtuali di Azure .

Non esiste un file equivalente per controllare l'SDK in una pagina Web.

Canali di telemetria

I canali di telemetria costituiscono parte integrante degli SDK di Application Insights. Essi gestiscono il buffering e la trasmissione dei dati di telemetria al servizio Application Insights. Le versioni .NET e .NET Core degli SDK hanno due canali di telemetria predefiniti: InMemoryChannel e ServerTelemetryChannel. Questa sezione descrive ogni canale e illustra come personalizzare il comportamento del canale.

Annotazioni

Per consultare le domande frequenti, vedere Domande frequenti sui canali di telemetria

Che cosa sono i canali di telemetria?

I canali di telemetria sono responsabili del buffering degli elementi di telemetria e del loro invio al servizio Application Insights, dove vengono archiviati per l'esecuzione di query e l'analisi. Un canale di telemetria è una qualsiasi classe che implementa l'interfaccia Microsoft.ApplicationInsights.ITelemetryChannel.

Il metodo Send(ITelemetry item) di un canale di telemetria viene chiamato dopo aver chiamato tutti gli inizializzatori e i processori di telemetria. Pertanto, tutti gli elementi eliminati da un processore di telemetria non raggiungono il canale. Solitamente, il metodo Send() non invia istantaneamente gli elementi al back-end. In genere, li memorizza nel buffer nella memoria e li invia in batch per una trasmissione efficiente.

Evitare di chiamare Flush() a meno che non sia fondamentale inviare immediatamente i dati di telemetria memorizzati nel buffer. Usarlo solo in scenari come l'arresto dell'applicazione, la gestione delle eccezioni o quando si usano processi di breve durata come i processi in background o gli strumenti da riga di comando. Nelle applicazioni Web o nei servizi a esecuzione prolungata, l'SDK gestisce automaticamente l'invio dei dati di telemetria. Chiamare Flush() inutilmente può causare problemi di prestazioni.

Live Metrics Stream include anche un canale personalizzato che supporta lo streaming live dei dati di telemetria. Questo canale è indipendente dal canale di telemetria normale, quindi questo documento non è pertinente.

Canali di telemetria predefiniti

Gli SDK .NET e .NET Core di Application Insights vengono forniti con due canali predefiniti:

  • InMemoryChannel: un canale leggero che inserisce gli elementi nel buffer di memoria finché non vengono inviati. Gli elementi vengono memorizzati nel buffer di memoria e scaricati una volta ogni 30 secondi, oppure ogni volta che vengono inseriti 500 elementi nel buffer. Questo canale offre garanzie di affidabilità minime perché non riprova a inviare i dati di telemetria in seguito a un errore. Inoltre, questo canale non conserva gli elementi su disco. Pertanto, gli eventuali elementi non inviati vengono persi in modo permanente all'arresto dell'applicazione, che si un arresto normale o meno. Questo canale implementa un metodo Flush() che può essere usato per forzare lo scaricamento sincrono di tutti gli elementi di telemetria in memoria. Questo canale è ideale per le applicazioni a esecuzione breve per le quali è ideale lo scaricamento sincrono.

    Il canale fa parte del pacchetto NuGet Microsoft.ApplicationInsights più esteso ed è il canale predefinito usato dall'SDK in assenza di altre opzioni di configurazione.

  • ServerTelemetryChannel: Un canale più avanzato con criteri di ripetizione dei tentativi e la possibilità di archiviare i dati in un disco locale. Questo canale ritenta l'invio dei dati di telemetria in caso di errori temporanei. Inoltre, questo canale si avvale dell'archiviazione su disco locale per mantenere gli elementi su disco durante interruzioni di rete o in presenza di volumi di telemetria elevati. A causa di questi meccanismi di ripetizione dei tentativi e dell'archiviazione su disco locale, questo è il canale ritenuto più affidabile. È consigliabile per tutti gli scenari di produzione. Questo è il canale predefinito per le applicazioni ASP.NET e ASP.NET Core configurate in base alla documentazione ufficiale. Il canale è ottimizzato per scenari server con processi a esecuzione prolungata. Il metodo Flush() implementato da questo canale non è sincrono.

    Questo canale viene fornito come pacchetto NuGet Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel e viene acquisito automaticamente quando si usa il pacchetto NuGet Microsoft.ApplicationInsights.Web o Microsoft.ApplicationInsights.AspNetCore.

Configurare un canale di telemetria

Un canale di telemetria si configura impostandolo sulla configurazione di telemetria attiva. Per le applicazioni ASP.NET, la configurazione comporta l'impostazione dell'istanza del canale di telemetria su TelemetryConfiguration.Active oppure la modifica di ApplicationInsights.config. Per le applicazioni ASP.NET Core, la configurazione comporta l'aggiunta del canale al contenitore di inserimento delle dipendenze.

Nelle sezioni seguenti sono riportati esempi di configurazione dell'impostazione StorageFolder per il canale in diversi tipi di applicazioni. StorageFolder è solo una delle impostazioni configurabili. Per l'elenco completo delle impostazioni di configurazione, vedere la sezione Impostazioni configurabili nei canali, più avanti in questo articolo.

Opzione 1: Configurazione nel codice

Il codice seguente configura un'istanza ServerTelemetryChannel con StorageFolder impostato su un percorso personalizzato. Aggiungere questo codice all'inizio dell'applicazione, in genere nel metodo Application_Start() in 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;
}

Opzione 2: Configurazione in ApplicationInsights.config

Nella sezione seguente di ApplicationInsights.config viene mostrato il canale ServerTelemetryChannel configurato con StorageFolder impostato su un percorso personalizzato:

    <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>

Configurazione nel codice per applicazioni console

Per le app console, il codice è il medesimo per .NET e .NET Core:

var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;

Dettagli sul funzionamento di ServerTelemetryChannel

ServerTelemetryChannel archivia gli elementi in arrivo in un buffer di memoria. Gli elementi vengono serializzati, compressi e archiviati in un'istanza Transmission una volta ogni 30 secondi, oppure quando nel buffer sono stati inseriti 500 elementi. Una singola istanza Transmission può contenere fino a 500 elementi e rappresenta un batch di dati di telemetria inviati tramite una singola chiamata HTTPS al servizio Application Insights.

Per impostazione predefinita, è possibile inviare in parallelo un massimo di 10 istanze Transmission. Se i dati di telemetria arrivano a velocità più elevate o se la rete o il back-end di Application Insights sono lenti, le istanze Transmission vengono archiviate in memoria. La capacità predefinita di questo buffer di memoria Transmission è di 5 MB. Quando si supera la capacità di memoria, le istanze Transmission vengono archiviate sul disco locale fino a un limite di 50 MB.

Le istanze Transmission vengono archiviate sul disco locale anche in caso di problemi di rete. Solo gli elementi archiviati su un disco locale non subiscono conseguenze dopo un arresto anomalo dell'applicazione. Essi vengono inviati ogni volta che si riavvia l'applicazione. Se i problemi di rete persistono, ServerTelemetryChannel usa una logica di backoff esponenziale in un periodo compreso tra 10 secondi e 1 ora prima di ritentare l'invio dei dati di telemetria.

Impostazioni configurabili nei canali

Per l'elenco completo delle impostazioni configurabili per ogni canale, vedere:

Di seguito sono riportate le impostazioni più comunemente usate per ServerTelemetryChannel:

  • MaxTransmissionBufferCapacity: quantità massima di memoria, in byte, utilizzata dal canale per inserire le trasmissioni nel buffer di memoria. Quando viene raggiunta questa capacità, i nuovi elementi vengono archiviati direttamente sul disco locale. Il valore predefinito è 5 MB. L'impostazione di un valore superiore comporta un minore utilizzo del disco, tuttavia si deve ricordare che gli elementi in memoria vanno persi in caso di arresto anomalo dell'applicazione.

  • MaxTransmissionSenderCapacity: il numero massimo di istanze Transmission che vengono inviate contemporaneamente ad Application Insights. Il valore predefinito è 10. Questa impostazione può essere configurata con un numero maggiore, consigliabile quando viene generato un enorme volume di dati di telemetria. Generalmente, un volume elevato si verifica durante i test di carico o quando il campionamento è disattivato.

  • StorageFolder: la cartella usata dal canale per archiviare gli elementi su disco in base alle esigenze. In Windows si usa %LOCALAPPDATA% o %TEMP% se non viene specificato esplicitamente un altro percorso. Negli ambienti diversi da Windows, per impostazione predefinita vengono usati i percorsi seguenti (in ordine): %TMPDIR%, /var/tmp/ o /tmp/.

Quale canale è consigliabile usare?

È preferibile ServerTelemetryChannel per la maggior parte degli scenari di produzione che coinvolgano applicazioni a esecuzione prolungata. Per altre informazioni sullo scaricamento dei dati di telemetria, leggere la documentazione sull'uso di Flush().

Quando usare Flush()

Il metodo Flush() invia immediatamente tutti i dati di telemetria memorizzati nel buffer. Tuttavia, deve essere usato solo in scenari specifici.

Usare Flush() quando:

  • L'applicazione sta per arrestarsi e si vuole assicurarsi che i dati di telemetria vengano inviati prima della chiusura.
  • Si è in un gestore eccezioni e si ha bisogno di garantire che i dati di telemetria vengano recapitati.
  • Si sta scrivendo un processo di breve durata, ad esempio un processo in background o uno strumento dell'interfaccia della riga di comando che si chiude rapidamente.

Evitare di usare Flush() in applicazioni a esecuzione prolungata come i servizi Web. L'SDK gestisce automaticamente il buffering e la trasmissione. Chiamare Flush() inutilmente può causare problemi di prestazioni e non garantisce che tutti i dati vengano inviati, specialmente quando si usa ServerTelemetryChannel, che non scarica in modo sincrono.

Moduli di telemetria

Application Insights raccoglie automaticamente i dati di telemetria relativi a carichi di lavoro specifici senza richiedere il rilevamento manuale da parte dell'utente.

Per impostazione predefinita, sono abilitati i seguenti moduli di raccolta automatica. È possibile disabilitarli o configurarli per modificarne il comportamento predefinito.

Ogni modulo di telemetria raccoglie un tipo specifico di dati e utilizza l’API principale per inviare i dati. I moduli sono installati da diversi pacchetti NuGet che aggiungono anche le linee necessarie al file .config.

Area Description
Rilevamento delle richieste Raccoglie i dati di telemetria delle richieste (tempo di risposta, codice di risultato) per le richieste Web in ingresso.

Modulo:Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Rilevamento delle dipendenze Raccoglie i dati di telemetria sulle dipendenze in uscita (chiamate HTTP, chiamate SQL). Per operare in IIS, installare Application Insights Agent. È anche possibile scrivere il rilevamento personalizzato delle dipendenze usando l’API TrackDependency. Supporta la strumentazione automatica con App Service e il monitoraggio di VM e set di scalabilità di macchine virtuali.

Modulo:Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.DependencyCollector
Contatori delle prestazioni Raccoglie i contatori di prestazioni Windows (CPU, memoria, carico di rete dalle installazioni IIS). Specificare i contatori (inclusi quelli personalizzati). Per altre informazioni, vedere Raccoglie i contatori delle prestazioni di sistema.

Modulo:Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule
NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
Contatori di eventi Raccoglie .NET EventCounters. Consigliato per ASP.NET Core e multipiattaforma in sostituzione dei contatori di prestazioni Windows.

Modulo:EventCounterCollectionModule (SDK ≥ 2.8.0)
Metriche live (QuickPulse) Raccoglie i dati di telemetria per il riquadro Metriche live.

Modulo:QuickPulseTelemetryModule
Heartbeat (servizio app) Invia heartbeat e metriche personalizzate per l'ambiente del servizio app.

Modulo:AppServicesHeartbeatTelemetryModule
Heartbeat (macchine virtuali e set di scalabilità di macchine virtuali) Invia heartbeat e metriche personalizzate per l'ambiente della macchina virtuale di Azure.

Modulo:AzureInstanceMetadataTelemetryModule
Dati di telemetria di diagnostica Segnala errori nel codice di strumentazione di Application Insights, (ad esempio, contatori mancanti, eccezioni ITelemetryInitializer). I dati di telemetria di traccia vengono visualizzati in Ricerca diagnostica.

Modulo:Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule
NuGet:Microsoft.ApplicationInsights

Nota: se si installa questo pacchetto, il file ApplicationInsights.config non viene creato automaticamente.
Modalità sviluppatore (debugger collegato) Forza TelemetryChannel a inviare immediatamente gli elementi quando il debugger è collegato. Riduce la latenza ma aumenta il sovraccarico di CPU/rete.

Modulo:Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule
NuGet:Application Insights Windows Server
Rilevamento delle eccezioni (Web) Rileva le eccezioni non gestite nell'app Web. Vedere Errori ed eccezioni.

Modulo:Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Rilevamento delle eccezioni (non osservate/non gestite) Tiene traccia delle eccezioni di attività non osservate e delle eccezioni non gestite per i ruoli di lavoro, i servizi Windows e le app console.

Modules:
 • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule
 • Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule
NuGet:Microsoft.ApplicationInsights.WindowsServer
Rilevamento EventSource Invia eventi EventSource configurati ad Application Insights come tracce.

Modulo:Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule
NuGet:Microsoft.ApplicationInsights.EventSourceListener
Agente di raccolta ETW Invia eventi del provider ETW configurati ad Application Insights come tracce.

Modulo:Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule
NuGet:Microsoft.ApplicationInsights.EtwCollector
API Core (non un modulo) API Core usata da altri componenti di telemetria e per dati di telemetria personalizzati.

Modulo:Microsoft.ApplicationInsights package
NuGet:Microsoft.ApplicationInsights
Nota: se si installa questo pacchetto, il file ApplicationInsights.config non viene creato automaticamente.

Configurare i moduli di telemetria

Usare la sezione TelemetryModules in ApplicationInsights.config per configurare, aggiungere o rimuovere moduli. Gli esempi seguenti:

  • Configurare DependencyTrackingTelemetryModule (abilitare l'inserimento dell'intestazione W3C).
  • Configurare EventCounterCollectionModule (cancellare le impostazioni predefinite e aggiungere un singolo contatore).
  • Disabilitare la raccolta di contatori delle prestazioni rimuovendo 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>

Annotazioni

Il set esatto di moduli presenti in ApplicationInsights.config dipende dai pacchetti SDK installati.

Disabilitare telemetria

Nel file di configurazione è presente un nodo per ogni modulo. Per disabilitare un modulo, eliminare il nodo o impostarlo come commento.

Stringa di connessione

Queste impostazioni determinano la risorsa di Application Insights in cui vengono visualizzati i dati. In genere, viene creata una risorsa separata, con una stringa di connessione separata, per ognuna delle applicazioni.

Per esempi di codice, vedere Stringhe di connessione in Application Insights.

Se si vuole impostare la stringa di connessione in modo dinamico, ad esempio per inviare i risultati dall'applicazione a diverse risorse, è possibile omettere la stringa di connessione dal file di configurazione e impostarla nel codice.

Per impostare la stringa di connessione per tutte le istanze di TelemetryClient, inclusi i moduli di telemetria standard, eseguire questo passaggio in un metodo di inizializzazione, ad esempio global.aspx.cs in un servizio 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 si vuole inviare un set specifico di eventi a una risorsa diversa, è possibile impostare la chiave per un oggetto client di telemetria specifico:


    var tc = new TelemetryClient();
    tc.Context.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
    tc.TrackEvent("myEvent");
    // ...

Per ottenere una nuova stringa di connessione, creare una nuova risorsa nel portale di Application Insights.

Fornitore di ApplicationId

Annotazioni

Per ASP.NET, questo provider è disponibile a partire da SDK v2.6.0*.

Lo scopo di questo provider è quello di cercare un ID applicazione in base a una stringa di connessione. L'ID applicazione è incluso in RequestTelemetry e DependencyTelemetry viene usato per determinare la correlazione nel portale.

Questa funzionalità è disponibile impostando TelemetryConfiguration.ApplicationIdProvider.

Interfaccia: IApplicationIdProvider

public interface IApplicationIdProvider
{
    bool TryGetApplicationId(string instrumentationKey, out string applicationId);
}

Vengono fornite due implementazioni nell'SDK Microsoft.ApplicationInsights: ApplicationInsightsApplicationIdProvider e DictionaryApplicationIdProvider.

ApplicationInsightsApplicationIdProvider

Questo wrapper è per l'API del profilo. Limita le richieste e i risultati della cache. Questo provider viene incluso automaticamente quando si installa Microsoft.ApplicationInsights.DependencyCollector o Microsoft.ApplicationInsights.Web.

La classe espone una proprietà facoltativa denominata ProfileQueryEndpoint. Per impostazione predefinita, è impostata su https://dc.services.visualstudio.com/api/profiles/{0}/appId.

Se è necessario configurare un proxy, si consiglia di usare il proxy per l'indirizzo di base e assicurarsi che il percorso includa /api/profiles/{0}/appId. In fase di runtime, {0} viene sostituito con la chiave di strumentazione per ogni richiesta.

Configurazione di esempio tramite 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>

Configurazione di esempio tramite codice

TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();

DictionaryApplicationIdProvider

Questo provider statico si basa sulle coppie chiave/ID applicazione di strumentazione configurate.

Questa classe ha la proprietà Defined, ovvero un Dictionary<string,string> delle coppie chiave/ID applicazione di strumentazione.

Questa classe ha la proprietà Next facoltativa che può essere usata per configurare un altro provider da usare quando viene richiesta una stringa di connessione che non esiste nella configurazione.

Configurazione di esempio tramite 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>

Configurazione di esempio tramite codice

TelemetryConfiguration.Active.ApplicationIdProvider = new DictionaryApplicationIdProvider{
 Defined = new Dictionary<string, string>
    {
        {"InstrumentationKey_1", "ApplicationId_1"},
        {"InstrumentationKey_2", "ApplicationId_2"}
    }
};

Configurare la raccolta di snapshot

Per informazioni su come configurare la raccolta di snapshot per applicazioni ASP.NET e ASP.NET Core, vedere Abilitare Snapshot Debugger per app .NET in Azure Service Fabric, Servizio cloud e macchine virtuali.

Aggiungere il monitoraggio sul lato client

Le sezioni precedenti forniscono indicazioni sui metodi per configurare automaticamente e manualmente il monitoraggio lato server. Per aggiungere il monitoraggio lato client, usare l'SDK JavaScript lato client. È possibile monitorare le transazioni lato client di qualsiasi pagina Web aggiungendo uno script del caricatore SDK JavaScript (Web) prima del tag di chiusura </head> del codice HTML della pagina.

Sebbene sia possibile aggiungere manualmente lo script di caricamento di JavaScript (Web) SDK all'intestazione di ogni pagina HTML, è consigliabile aggiungerlo a una pagina primaria. Questa azione inserisce lo script di caricamento di JavaScript (Web) SDK in tutte le pagine di un sito.

Per l'app MVC ASP.NET basata su modello di questo articolo, il file da modificare è _Layout.cshtml. È possibile trovarlo in Visualizzazioni>Condivise. Per aggiungere il monitoraggio sul lato client, aprire _Layout.cshtml e seguire le istruzioni per l'installazione basata su script di caricamento di JavaScript (Web) SDK riportate nell'articolo sulla configurazione di JavaScript SDK sul lato client.

API di base per eventi personalizzati e metriche

Inserire alcune righe di codice nell'applicazione per scoprire le operazioni eseguite dagli utenti o per diagnosticare i problemi. È possibile inviare dati di telemetria da app desktop e dispositivi, client Web e server Web. Usare l'API di telemetria di base di Application Insights per inviare metriche e eventi personalizzati e versioni personalizzate dei dati di telemetria standard. Questa API è la stessa API usata dagli agenti di raccolta dati standard di Application Insights.

Riepilogo API

L'API principale è uniforme in tutte le piattaforme, a parte alcune varianti come GetMetric (solo.NET).

Metodo Usato per
TrackPageView Pagine, schermate, riquadri o moduli.
TrackEvent Azioni utente e altri eventi. Usato per tenere traccia del comportamento dell'utente o per monitorare le prestazioni.
GetMetric Metriche zero e multidimensionali, aggregazione configurata centralmente, solo C#.
TrackMetric Misurazioni delle prestazioni, ad esempio lunghezze della coda, non correlate a eventi specifici.
TrackException Registrazione delle eccezioni per la diagnostica. Tenere traccia del punto in cui si verificano in relazione ad altri eventi ed esaminare le analisi dello stack.
TrackRequest Registrazione della frequenza e della durata delle richieste del server per l'analisi delle prestazioni.
TrackTrace Messaggi del log di diagnostica delle risorse. È anche possibile acquisire log di terze parti.
TrackDependency Registrazione della durata e della frequenza delle chiamate a componenti esterni da cui dipende l'app.

È possibile associare proprietà e metriche alla maggior parte di queste chiamate di telemetria.

Prerequisiti

Se non si ha ancora un riferimento in Application Insights SDK:

  1. Aggiungere Application Insights SDK al progetto.

  2. Nel codice del dispositivo o del server Web includere:

    using Microsoft.ApplicationInsights;
    

Ottenere un'istanza di TelemetryClient

Ottenere un'istanza di TelemetryClient:

Annotazioni

Se si usa Funzioni di Azure v2+ o Processi Web di Azure v3+, vedere Monitorare Funzioni di Azure.

Annotazioni

Per le app ASP.NET Core e non HTTP/ruolo di lavoro per .NET/.NET Core, ottenere un'istanza di TelemetryClient dal contenitore di inserimento delle dipendenze, come illustrato nella rispettiva documentazione.

private TelemetryClient telemetry = new TelemetryClient();

Se viene visualizzato un messaggio che indica che questo metodo è obsoleto, vedere microsoft/ApplicationInsights-dotnet#1152 per altre informazioni.

Le richieste HTTP in ingresso vengono acquisite automaticamente. Potrebbe essere necessario creare più istanze di TelemetryClient per altri moduli dell'app. Ad esempio, potrebbe essere presente un'istanza TelemetryClient della classe middleware per segnalare gli eventi della logica di business. È possibile impostare proprietà come UserId e DeviceId per identificare il computer. Queste informazioni vengono associate a tutti gli eventi inviati dall'istanza.

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

Annotazioni

TelemetryClient è sicuro per i thread.

TrackEvent

In Application Insights un evento personalizzato è un punto dati che è possibile visualizzare in Esplora metriche come conteggio aggregato e in Ricerca diagnostica come singole occorrenze. Non è correlato a MVC o ad altri "eventi".

Inserire chiamate TrackEvent nel codice per contare i vari eventi. Ad esempio, è possibile tenere traccia della frequenza con cui gli utenti scelgono una determinata funzionalità. Oppure potresti voler sapere con quale frequenza raggiungono determinati obiettivi o commettono tipi specifici di errori.

Ad esempio, in un'app di gioco inviare un evento ogni volta che un utente vince il gioco:

telemetry.TrackEvent("WinGame");

Eventi personalizzati in Log Analytics

I dati di telemetria sono disponibili nella customEvents tabella nella scheda Log di Application Insights o nell'esperienza di utilizzo. Gli eventi potrebbero provenire da trackEvent(..) o dal plug-in Click Analytics Autocollection.

Se il campionamento è attivo, la proprietà itemCount mostra un valore maggiore di 1. Ad esempio, itemCount==10 significa che di 10 chiamate a trackEvent(), il processo di campionamento ha trasmesso solo uno di essi. Per ottenere un conteggio corretto degli eventi personalizzati, usare codice come customEvents | summarize sum(itemCount).

Annotazioni

itemCount ha un valore minimo di uno; il record stesso rappresenta un entry.

GetMetric

Per informazioni su come usare in modo efficace la GetMetric() chiamata per acquisire metriche preaggregate in locale per le applicazioni .NET e .NET Core, vedere Raccolta di metriche personalizzate in .NET e .NET Core.

TrackMetric

Annotazioni

Microsoft.ApplicationInsights.TelemetryClient.TrackMetric non è il metodo preferito per l'invio di metriche. Le metriche devono essere sempre preaggregate in un periodo di tempo prima di essere inviate. Usare uno degli overload GetMetric(..) per ottenere un oggetto metrica per l'accesso alle funzionalità di pre-aggregazione dell'SDK.

Se si implementa una logica di preaggregazione personalizzata, è possibile usare il TrackMetric() metodo per inviare le aggregazioni risultanti. Se l'applicazione richiede l'invio di un elemento di telemetria separato in ogni occasione senza aggregazione nel tempo, è probabile che si verifichi un caso d'uso per i dati di telemetria degli eventi. Vedi TelemetryClient.TrackEvent(Microsoft.ApplicationInsights.DataContracts.EventTelemetry).

Application Insights può creare un grafico delle metriche non associate a eventi specifici. Ad esempio, è possibile monitorare la lunghezza della coda a intervalli regolari. Con le metriche, le singole misurazioni sono di minore interesse rispetto alle variazioni e alle tendenze e quindi i grafici statistici sono utili.

Per inviare metriche ad Application Insights, è possibile usare l'API TrackMetric(..) . Esistono due modi per inviare una metrica:

  • Valore singolo. Ogni volta che si esegue una misurazione nell'applicazione, si invia il valore corrispondente ad Application Insights.

    Si supponga, ad esempio, di avere una metrica che descrive il numero di elementi in un contenitore. Durante un determinato periodo di tempo, inserire prima tre elementi nel contenitore e quindi rimuovere due elementi. Pertanto, chiameresti TrackMetric due volte. Prima di tutto, passare il valore 3 e quindi passare il valore -2. Application Insights archivia entrambi i valori.

  • Aggregazione. Quando si lavora con le metriche, ogni singola misura è raramente di interesse. È invece importante un riepilogo di ciò che è accaduto durante un determinato periodo di tempo. Un riepilogo di questo tipo è denominato aggregazione.

    Nell'esempio precedente la somma delle metriche di aggregazione per il periodo di tempo è 1 e il conteggio dei valori delle metriche è 2. Quando si usa l'approccio di aggregazione, si richiama TrackMetric una sola volta per periodo di tempo e si inviano i valori di aggregazione. È consigliabile questo approccio perché può ridurre significativamente il costo e il sovraccarico delle prestazioni inviando meno punti dati ad Application Insights, pur raccogliendo tutte le informazioni pertinenti.

Esempi di valore singolo

Per inviare un singolo valore metrica:

var sample = new MetricTelemetry();
sample.Name = "queueLength";
sample.Sum = 42.3;
telemetryClient.TrackMetric(sample);

Metriche personalizzate in Log Analytics

I dati di telemetria sono disponibili nella customMetrics tabella in Application Insights Analytics. Ogni riga rappresenta una chiamata a trackMetric(..) nell'app.

  • valueSum: somma delle misurazioni. Per ottenere il valore medio, dividere per valueCount.
  • valueCount: numero di misurazioni aggregate in questa trackMetric(..) chiamata.

Annotazioni

valueCount ha un valore minimo di uno; il record stesso rappresenta un elemento.

Visualizzazioni pagina

Nell'app per dispositivi o per pagine web, la telemetria delle visualizzazioni delle pagine viene inviata automaticamente quando ogni schermata o pagina viene caricata. Tuttavia, è possibile modificare l'impostazione predefinita per tenere traccia delle visualizzazioni di pagina in momenti più o diversi. Ad esempio, in un'app che visualizza schede o riquadri, è possibile tenere traccia di una pagina ogni volta che l'utente apre un nuovo riquadro.

I dati utente e di sessione vengono inviati come proprietà insieme alle visualizzazioni di pagina, così i grafici utenti e di sessione si animano quando sono presenti dati di telemetria di visualizzazione di pagina.

Visualizzazioni pagina personalizzate

telemetry.TrackPageView("GameReviewPage");

Telemetria delle pagine in Log Analytics

In Log Analytics due tabelle mostrano i dati delle operazioni del browser:

  • pageViews: contiene i dati relativi all'URL e al titolo della pagina.
  • browserTimings: contiene dati sulle prestazioni del client, ad esempio il tempo impiegato per elaborare i dati in ingresso.

Per trovare quanto tempo il browser richiede per elaborare pagine diverse:

browserTimings
| summarize avg(networkDuration), avg(processingDuration), avg(totalDuration) by name

Per scoprire la popolarità di browser diversi:

pageViews
| summarize count() by client_Browser

Per associare le visualizzazioni di pagina alle chiamate AJAX, collegare con le dipendenze:

pageViews
| join (dependencies) on operation_Id

TrackRequest

L'SDK del server usa TrackRequest per registrare le richieste HTTP.

È anche possibile chiamarlo manualmente se si desidera simulare le richieste in un contesto in cui non è in esecuzione il modulo del servizio Web.

Il modo consigliato per inviare i dati di telemetria delle richieste è la posizione in cui la richiesta funge da contesto operativo.

Contesto dell'operazione

È possibile correlare gli elementi di telemetria insieme associandoli al contesto dell'operazione. Il modulo standard di rilevamento delle richieste esegue le eccezioni e altri eventi inviati durante l'elaborazione di una richiesta HTTP. In Ricerca e Analisi è possibile trovare facilmente tutti gli eventi associati alla richiesta usando il relativo ID operazione.

Quando si tiene traccia dei dati di telemetria manualmente, il modo più semplice per garantire la correlazione dei dati di telemetria consiste nell'usare questo modello:

// 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.

Per altre informazioni sulla correlazione, vedere Correlazione dei dati di telemetria in Application Insights.

Insieme all'impostazione di un contesto dell'operazione, StartOperation crea un elemento di telemetria del tipo specificato. Invia l'elemento di telemetria quando si elimina l'operazione o si chiama esplicitamente StopOperation. Se si usa RequestTelemetry come tipo di telemetria, la relativa durata viene impostata sull'intervallo di tempo compreso tra inizio e arresto.

Gli elementi di telemetria segnalati all'interno di un ambito operativo diventano sotto-elementi di tale operazione. È possibile annidare i contesti dell'operazione.

In Ricerca il contesto dell'operazione viene usato per creare l'elenco Elementi correlati .

Screenshot che mostra l'elenco Elementi correlati.

Per altre informazioni sul rilevamento delle operazioni personalizzate, vedere Tenere traccia delle operazioni personalizzate con Application Insights .NET SDK.

Richieste in Log Analytics

In Application Insights Analytics le richieste sono visualizzate nella requests tabella.

Se il campionamento è attivo, la proprietà itemCount mostra un valore maggiore di 1. Ad esempio, itemCount==10 significa che di 10 chiamate a trackRequest(), il processo di campionamento ha trasmesso solo uno di essi. Per ottenere un conteggio corretto delle richieste e della durata media segmentata in base ai nomi delle richieste, usare il codice, ad esempio:

requests
| summarize count = sum(itemCount), avgduration = avg(duration) by name

TrackException

Inviare eccezioni ad Application Insights:

I report includono le analisi dello stack.

try
{
    ...
}
catch (Exception ex)
{
    telemetry.TrackException(ex);
}

Gli SDK rilevano automaticamente molte eccezioni, quindi non è sempre necessario chiamare TrackException in modo esplicito.

Eccezioni in Log Analytics

In Application Insights Analytics le eccezioni vengono visualizzate nella exceptions tabella.

Se il campionamento è attivo, la proprietà itemCount mostra un valore maggiore di 1. Ad esempio, itemCount==10 significa che di 10 chiamate a trackException(), il processo di campionamento ha trasmesso solo uno di essi. Per ottenere un conteggio corretto delle eccezioni segmentate per tipo di eccezione, usare il codice, ad esempio:

exceptions
| summarize sum(itemCount) by type

La maggior parte delle informazioni importanti sullo stack è già estratta in variabili separate, ma è possibile separare la details struttura per ottenere di più. Poiché questa struttura è dinamica, è necessario eseguire il cast del risultato al tipo previsto. Per esempio:

exceptions
| extend method2 = tostring(details[0].parsedStack[1].method)

Per associare le eccezioni alle richieste correlate, utilizza un join:

exceptions
| join (requests) on operation_Id

TrackTrace

Usare TrackTrace per diagnosticare i problemi mediante l'invio di una traccia di navigazione ad Application Insights. È possibile inviare blocchi di dati di diagnostica ed esaminarli in Ricerca diagnostica.

Negli adattatori di log .NET, utilizzare questa API per inviare i log di terze parti al portale.

telemetry.TrackTrace(message, SeverityLevel.Warning, properties);

Registrare un evento di diagnostica, ad esempio l'immissione o l'uscita di un metodo.

Parametro Description
message Dati di diagnostica. Può essere molto più lungo di un nome.
properties Mapping da stringa a stringa. Altri dati vengono usati per filtrare le eccezioni nel portale. Di default è vuoto.
severityLevel Valori supportati: SeverityLevel.ts.

È possibile cercare il contenuto dei messaggi, ma a differenza dei valori delle proprietà, non è possibile filtrarlo.

Il limite di dimensioni su message è molto superiore al limite per le proprietà. Un vantaggio di TrackTrace è che è possibile inserire dati relativamente lunghi nel messaggio. Ad esempio, è possibile codificare i dati POST in questa posizione.

È anche possibile aggiungere un livello di gravità al messaggio. Analogamente ad altri dati di telemetria, è possibile aggiungere valori di proprietà per filtrare o cercare set di tracce diversi. Per esempio:

var telemetry = new Microsoft.ApplicationInsights.TelemetryClient();
telemetry.TrackTrace("Slow database response",
                SeverityLevel.Warning,
                new Dictionary<string,string> { {"database", db.ID} });

In Ricerca è quindi possibile filtrare facilmente tutti i messaggi di un particolare livello di gravità correlato a un determinato database.

Tracce in Log Analytics

In Application Insights Analytics le chiamate a TrackTrace vengono visualizzate nella traces tabella.

Se il campionamento è attivo, la proprietà itemCount mostra un valore maggiore di 1. Ad esempio, itemCount==10 significa che di 10 chiamate a trackTrace(), il processo di campionamento ha trasmesso solo uno di essi. Per ottenere un conteggio corretto delle chiamate di traccia, usare codice come traces | summarize sum(itemCount).

TrackDependency

Usare la TrackDependency chiamata per tenere traccia dei tempi di risposta e delle percentuali di esito positivo delle chiamate a un frammento di codice esterno. I risultati vengono visualizzati nei grafici delle dipendenze nel portale. Il frammento di codice seguente deve essere aggiunto ovunque venga effettuata una chiamata di dipendenza.

Annotazioni

Per .NET e .NET Core è possibile usare in alternativa il TelemetryClient.StartOperation metodo (estensione) che riempie le DependencyTelemetry proprietà necessarie per la correlazione e altre proprietà come l'ora di inizio e la durata, quindi non è necessario creare un timer personalizzato come negli esempi seguenti. Per altre informazioni, vedere la sezione relativa al rilevamento delle dipendenze in uscita in Tenere traccia delle operazioni personalizzate con Application Insights .NET SDK.

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);
}

Tenere presente che gli SDK del server includono un modulo di dipendenza che individua e tiene traccia di determinate chiamate di dipendenza automaticamente, ad esempio ai database e alle API REST. È necessario installare un agente nel server per eseguire il funzionamento del modulo.

Questa chiamata viene usata se si desidera tenere traccia delle chiamate che il rilevamento automatico non intercetta.

Per disattivare il modulo di rilevamento delle dipendenze standard in C#, modificare ApplicationInsights.config ed eliminare il riferimento a DependencyCollector.DependencyTrackingTelemetryModule.

Dipendenze in Log Analytics

In Application Insights Analytics le trackDependency chiamate sono visualizzate nella dependencies tabella.

Se il campionamento è attivo, la proprietà itemCount mostra un valore maggiore di 1. Ad esempio, itemCount==10 significa che di 10 chiamate a trackDependency(), il processo di campionamento ha trasmesso solo uno di essi. Per ottenere un conteggio corretto delle dipendenze segmentate per componente di destinazione, usare il codice, ad esempio:

dependencies
| summarize sum(itemCount) by target

Per associare le dipendenze alle richieste correlate, è possibile usare un join:

dependencies
| join (requests) on operation_Id

Cancellazione dei dati

In genere, l'SDK invia i dati a intervalli fissi, in genere 30 secondi o ogni volta che il buffer è pieno, che in genere è di 500 elementi. In alcuni casi, potrebbe essere necessario scaricare il buffer. Un esempio è se si usa l'SDK in un'applicazione che si arresta.

Quando si usa Flush(), è consigliabile usare questo modello:

telemetry.Flush();
// Allow some time for flushing before shutdown.
System.Threading.Thread.Sleep(5000);

Quando si usa FlushAsync(), è consigliabile usare questo modello:

await telemetryClient.FlushAsync()
// No need to sleep

Si consiglia di svuotare sempre durante l'arresto dell'applicazione per garantire che i dati di telemetria non vengano persi.

Annotazioni

Esaminare la configurazione di Autoflush: l'abilitazione delflush automatico nel web.config file può causare una riduzione delle prestazioni nelle applicazioni .NET instrumentate con Application Insights. Con la funzione autoflush abilitata, ogni invocazione dei metodi di System.Diagnostics.Trace.Trace* comporta l'invio di singoli elementi di telemetria, ognuno dei quali viene inviato come una richiesta web distinta al servizio di raccolta dati. Ciò può causare potenzialmente l'esaurimento della rete e dell'archiviazione nei server Web. Per migliorare le prestazioni, è consigliabile disabilitare il flusso automatico e anche usare ServerTelemetryChannel, progettato per una trasmissione dei dati di telemetria più efficace.

La funzione è asincrona per il canale di telemetria del server.

Utenti autenticati

In un'app Web, gli utenti sono identificati dai cookie per impostazione predefinita. Un utente potrebbe essere conteggiato più volte se accede all'app da un computer o un browser diverso o se elimina i cookie.

Se gli utenti accedono all'app, è possibile ottenere un conteggio più accurato impostando l'ID utente autenticato nel codice del browser. Non è necessario usare il nome di accesso effettivo dell'utente. Deve essere solo un ID univoco per l'utente. Non deve includere spazi o caratteri ,;=|.

L'ID utente viene impostato anche in un cookie di sessione e inviato al server. Se l'SDK del server è installato, l'ID utente autenticato viene inviato come parte delle proprietà di contesto dei dati di telemetria client e server. È quindi possibile filtrare e cercare su di esso.

Se l'app raggruppa gli utenti negli account, è anche possibile passare un identificatore per l'account. Si applicano le stesse restrizioni relative ai caratteri.

In Esplora metriche è possibile creare un grafico che conta utenti, autenticati e account utente.

È anche possibile cercare punti dati client con nomi utente e account specifici.

Annotazioni

La proprietà EnableAuthenticationTrackingJavaScript nella classe ApplicationInsightsServiceOptions in .NET Core SDK semplifica la configurazione JavaScript necessaria per inserire il nome utente come ID di autenticazione per ogni traccia inviata da Application Insights JavaScript SDK.

Quando questa proprietà è impostata su true, il nome utente dell'utente nel ASP.NET Core viene stampato insieme ai dati di telemetria lato client. Per questo motivo, l'aggiunta appInsights.setAuthenticatedUserContext manuale non è più necessaria perché è già inserita dall'SDK per ASP.NET Core. L'ID di autenticazione viene inviato anche al server in cui l'SDK in .NET Core identifica e lo usa per tutti i dati di telemetria lato server, come descritto nelle informazioni di riferimento sull'API JavaScript.

Per le applicazioni JavaScript che non funzionano allo stesso modo di ASP.NET Core MVC, ad esempio app Web SPA, è comunque necessario aggiungere appInsights.setAuthenticatedUserContext manualmente.

Filtrare, cercare e segmentare i dati usando le proprietà

È possibile associare proprietà e misurazioni agli eventi, alle metriche, alle visualizzazioni di pagina, alle eccezioni e ad altri dati di telemetria.

Le proprietà sono valori stringa che è possibile usare per filtrare i dati di telemetria nei report di utilizzo. Ad esempio, se la tua app fornisce diversi giochi, puoi allegare il nome del gioco a ogni evento in modo da poter vedere quali giochi sono più popolari.

Esiste un limite di 8.192 sulla lunghezza della stringa. Per inviare blocchi di dati di grandi dimensioni, usare il parametro message di TrackTrace.

Le metriche sono valori numerici che possono essere presentati graficamente. Ad esempio, potresti voler vedere se c'è un aumento graduale dei punteggi ottenuti dai giocatori. I grafici possono essere segmentati in base alle proprietà inviate con l'evento in modo da poter ottenere grafici separati o in pila per giochi diversi.

I valori delle metriche devono essere maggiori o uguali a 0 per essere visualizzati correttamente.

Esistono alcuni limiti al numero di proprietà, valori delle proprietà e metriche che è possibile usare.

// 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

Assicurarsi di non registrare informazioni personali nelle proprietà.

Modo alternativo per impostare proprietà e metriche

Se è più conveniente, è possibile raccogliere i parametri di un evento in un oggetto separato:

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);

Avvertimento

Non riutilizzare la stessa istanza dell'elemento di telemetria (event in questo esempio) per chiamare Track*() più volte. Questa procedura potrebbe causare l'invio dei dati di telemetria con una configurazione non corretta.

Misurazioni e proprietà personalizzate in Log Analytics

In Log Analytics le metriche e le proprietà personalizzate vengono visualizzate negli customMeasurements attributi e customDimensions di ogni record di telemetria.

Ad esempio, se si aggiunge una proprietà denominata "game" ai dati di telemetria della richiesta, questa query conta le occorrenze di valori diversi di "gioco" e mostra la media della metrica personalizzata "score":

requests
| summarize sum(itemCount), avg(todouble(customMeasurements.score)) by tostring(customDimensions.game)

Si noti che:

  • Quando si estrae un valore dal JSON customDimensions o customMeasurements, ha un tipo dinamico, quindi è necessario effettuare il cast su tostring o todouble.
  • Per tenere conto della possibilità di campionamento, usare sum(itemCount) non count().

Eventi di temporizzazione

A volte si vuole creare un grafico del tempo necessario per eseguire un'azione. Ad esempio, potresti voler sapere quanto tempo gli utenti impiegano per prendere in considerazione le scelte in un gioco. Per ottenere queste informazioni, usare il parametro di misurazione.

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);

Proprietà predefinite per i dati di telemetria personalizzati

Se desiderate impostare valori predefiniti delle proprietà per alcuni eventi personalizzati che scrivete, configurateli in un'istanza di TelemetryClient. Sono collegati a ogni elemento di telemetria inviato da tale client.

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");

Le singole chiamate di telemetria possono sovrascrivere i valori predefiniti nei dizionari delle proprietà.

Per aggiungere proprietà a tutti i dati di telemetria, inclusi i dati dei moduli di raccolta standard, implementare ITelemetryInitializer.

Disabilitare telemetria

Per arrestare e avviare dinamicamente la raccolta e la trasmissione dei dati di telemetria:

using  Microsoft.ApplicationInsights.Extensibility;

TelemetryConfiguration.Active.DisableTelemetry = true;

Modalità sviluppatore

Durante il debug, è utile che i dati di telemetria vengano accelerati attraverso la pipeline in modo da poter visualizzare immediatamente i risultati. Si ottengono anche altri messaggi che consentono di tracciare eventuali problemi con i dati di telemetria. Disattivarlo nell'ambiente di produzione perché potrebbe rallentare l'app.

TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true;

Impostare la chiave di strumentazione per la telemetria personalizzata selezionata

var telemetry = new TelemetryClient();
telemetry.InstrumentationKey = "---my key---";
// ...

Stringa di connessione dinamica

Per evitare di combinare i dati di telemetria dagli ambienti di sviluppo, test e produzione, è possibile creare risorse di Application Insights separate e modificarne le chiavi, a seconda dell'ambiente.

Anziché ottenere la chiave di strumentazione dal file di configurazione, è possibile impostarla nel codice. Impostare la chiave in un metodo di inizializzazione, ad esempio global.aspx.cs in un servizio ASP.NET:

protected void Application_Start()
{
    Microsoft.ApplicationInsights.Extensibility.
    TelemetryConfiguration.Active.InstrumentationKey =
        // - for example -
        WebConfigurationManager.Settings["ikey"];
    ...
}

TelemetryContext

TelemetryClient dispone di una proprietà Context, che contiene valori inviati insieme a tutti i dati di telemetria. Normalmente vengono impostati dai moduli di telemetria standard, ma è anche possibile impostarli manualmente. Per esempio:

telemetry.Context.Operation.Name = "MyOperationName";

Se si imposta uno di questi valori manualmente, è consigliabile rimuovere la riga pertinente da ApplicationInsights.config in modo che i valori e i valori standard non vengano confusi.

  • Componente: l'app e la relativa versione.
  • Dispositivo: dati sul dispositivo in cui è in esecuzione l'app. Nelle app Web si tratta del server o del dispositivo client da cui vengono inviati i dati di telemetria.
  • InstrumentationKey: risorsa di Application Insights in Azure in cui sono visualizzati i dati di telemetria. In genere viene prelevato da ApplicationInsights.config.
  • Posizione: posizione geografica del dispositivo.
  • Operazione: nelle applicazioni web, la richiesta HTTP corrente. In altri tipi di app è possibile impostare questo valore per raggruppare gli eventi.
    • ID: valore generato che correla diversi eventi in modo che quando si esamina qualsiasi evento in Ricerca diagnostica, è possibile trovare elementi correlati.
    • Nome: identificatore, in genere l'URL della richiesta HTTP.
    • SyntheticSource: se non null o vuoto, una stringa che indica che l'origine della richiesta è stata identificata come un robot o un test Web. Per impostazione predefinita, viene esclusa dai calcoli in Esplora metriche.
  • Sessione: sessione dell'utente. L'ID è impostato su un valore generato, che viene modificato quando l'utente non è stato attivo per un periodo di tempo.
  • Utente: informazioni sull'utente.

Limits

Esistono alcuni limiti sul numero di metriche e eventi per applicazione, ovvero per chiave di strumentazione. I limiti dipendono dal piano tariffario scelto.

Risorsa Limite predefinito Limite massimo Note
Totale dati al giorno 100 GB Contattare il supporto tecnico. È possibile impostare un limite per ridurre i dati. Se sono necessari più dati, è possibile aumentare il limite nel portale fino a 1.000 GB. Per capacità maggiori di 1.000 GB, inviare un messaggio di posta elettronica a AIDataCap@microsoft.com.
Throttling 32.000 eventi/secondo Contattare il supporto tecnico. Il limite viene misurato nell'arco di un minuto.
Log di conservazione dei dati Da 30 a 730 giorni 730 giorni Questa risorsa è per Log.
Metriche di conservazione dati 90 giorni 90 giorni Questa risorsa è per Esplora metriche.
Conservazione dettagliata dei risultati dei test a più passaggi di disponibilità 90 giorni 90 giorni Questa risorsa fornisce risultati dettagliati per ogni passaggio.
Dimensioni massime dei dati di telemetria 64 kB 64 kB
Numero massimo di dati di telemetria per batch 64.000 64.000
Lunghezza nomi di proprietà e metriche 150 150 Vedere schemi di tipo.
Lunghezza stringa valore di proprietà 8,192 8,192 Vedere schemi di tipo.
Lunghezza del messaggio di traccia e di eccezione 32,768 32,768 Vedere schemi di tipo.
Numero di test di disponibilità per ogni risorsa di Application Insights 100 100
Numero di test di disponibilità per gruppo di risorse 800 800 Vedere Azure Resource Manager
Numero massimo di reindirizzamenti per test di disponibilità 10 10
Frequenza minima dei test di disponibilità 300 secondi Frequenze di test personalizzate o inferiori a 5 minuti richiedono implementazioni TrackAvailability personalizzate.
Conservazione dei dati di .NET Profiler e Snapshot Debugger Due settimane Contattare il supporto tecnico. Il limite massimo di conservazione è di sei mesi.
Dati di Profiler .NET inviati al giorno Nessun limite Nessun limite.
Dati di Snapshot Debugger inviati al giorno 30 snapshot al giorno per ogni app monitorata Nessun limite. Il numero di snapshot raccolti per applicazione può essere modificato tramite la configurazione.

Per altre informazioni sui prezzi e sulle quote, vedere Fatturazione di Application Insights.

Per evitare di raggiungere il limite di velocità dei dati usare il campionamento.

Per determinare per quanto tempo vengono conservati i dati, vedere Conservazione e privacy dei dati.

Applicazioni di esempio

Applicazione console .NET Core: usare questo esempio se si usa un'applicazione console scritta in .NET Core (2.0 o versione successiva) o .NET Framework (4.7.2 o versione successiva).

Attività in background di ASP.NET Core con HostedServices: usate questo esempio se lavorate con ASP.NET Core e create attività in background seguendo le indicazioni ufficiali.

Servizio di lavoro .NET Core: usare questo esempio se si dispone di un'applicazione del servizio di lavoro .NET in conformità alle indicazioni ufficiali.

Risoluzione dei problemi

Vedere l'articolo sulla risoluzione dei problemi dedicato.

Testare la connettività tra l'host dell'applicazione e il servizio di inserimento

Gli SDK e gli agenti di Application Insights inviano dati di telemetria per l'inserimento come chiamate REST agli endpoint di inserimento. È possibile testare la connettività dal server Web o dal computer host dell'applicazione agli endpoint del servizio di inserimento usando client REST non elaborati da comandi PowerShell o curl. Vedere Risolvere i problemi di dati di telemetria delle applicazioni mancanti in Application Insights per Monitoraggio di Azure.

SDK open source

Leggere e contribuire al codice.

Per gli aggiornamenti e le correzioni di bug più recenti, vedere le note sulla versione.

Note di rilascio

Per la versione 2.12 e successive: .NET Software Development Kit (SDK) inclusi ASP.NET, ASP.NET Core e adattatori di registrazione

Gli aggiornamenti del servizio riepilogano anche i principali miglioramenti di Application Insights.

Passaggi successivi

Documentazione di riferimento