Freigeben über


Application Insights für ASP.NET und ASP.NET Core-Anwendungen

Vorsicht

Wir empfehlen die OpenTelemetry-Distribution von Azure Monitor für neue Anwendungen oder Kunden, um Azure Monitor Application Insights zu betreiben. Die OpenTelemetry-Distribution von Azure Monitor bietet eine ähnliche Funktionalität und Benutzererfahrung wie das Application Insights SDK. Es ist möglich, mithilfe der Migrationsleitfäden für .NET, Node.js und Python vom Application Insights SDK zu migrieren, wir arbeiten jedoch an der Integration zusätzlicher Funktionen für die Abwärtskompatibilität.

In diesem Artikel wird erläutert, wie Sie Application Insights für ASP.NET und ASP.NET Core-Anwendungen zum Senden von Telemetrie aktivieren und konfigurieren. Application Insights kann die folgende Telemetrie aus Ihren Apps sammeln:

  • Anfragen
  • Abhängigkeiten
  • Ausnahmen
  • Leistungsindikatoren
  • Ablaufverfolgungen (Protokolle)
  • Herzschläge
  • Benutzerdefinierte Ereignisse und Metriken (erfordert manuelle Instrumentierung)
  • Seitenansichten (erfordert JavaScript SDK für Webseiten)
  • Verfügbarkeitstests (erfordert manuelles Einrichten von Verfügbarkeitstests)

Unterstützte Szenarien

Hinweis

Mit dem Application Insights SDK für ASP.NET Core können Sie Anwendungen unabhängig davon überwachen, wo und wie sie ausgeführt werden. Wenn Ihre Anwendung ausgeführt wird und über eine Netzwerkverbindung mit Azure verfügt, können Telemetriedaten erfasst werden. Die Application Insights-Überwachung wird in allen Umgebungen unterstützt, in denen auch .NET Core unterstützt wird.

Unterstützt ASP.NET ASP.NET Kern
Betriebssystem Fenster Windows, Linux oder macOS
Hostingmethode In-Prozess (IIS oder IIS Express) Im Prozess oder außerhalb des Prozesses
Bereitstellungsmethode Webbereitstellung, MSI oder manuelle Dateikopie Framework-abhängig oder komplett eigenständig
Webserver Internetinformationsdienste (IIS) Internetinformationsserver (IIS) oder Kestrel
Hostingplattform Azure App Service (Windows), Virtuelle Azure-Computer oder lokale Server Das Web-Apps-Feature von Azure App Service, Azure Virtual Machines, Docker und Azure Kubernetes Service (AKS)
.NET-Version .NET Framework 4.6.1 und höher Alle offiziell unterstützten .NET-Versionen , die sich nicht in der Vorschau befinden
IDE Visual Studio Visual Studio, Visual Studio Code oder Befehlszeile

Hinzufügen von Anwendungserkenntnissen

Voraussetzungen

Erstellen einer einfachen Web-App

Wenn Sie noch keine funktionierende Webanwendung haben, können Sie die folgenden Anleitungen verwenden, um eine Webanwendung zu erstellen.

Hinweis

Wir verwenden eine MVC-Beispielanwendung. Wenn Sie den Worker Service verwenden, verwenden Sie die Anweisungen unter Application Insights für Worker Service-Anwendungen.

  1. Öffnen Sie Visual Studio.
  2. Wählen Sie Neues Projekt erstellen aus.
  3. Wählen Sie ASP.NET Webanwendung (.NET Framework) mit C# und dann "Weiter" aus.
  4. Geben Sie einen Projektnamen ein, und wählen Sie dann "Erstellen" aus.
  5. Wählen Sie MVC und dann "Erstellen" aus.

Automatisches Hinzufügen von Application Insights (Visual Studio)

Dieser Abschnitt führt Sie durch das automatische Hinzufügen von Application Insights zu einer vorlagenbasierten Web-App.

Führen Sie in Ihrem ASP.NET-Web-App-Projekt in Visual Studio die folgenden Schritte aus:

  1. Klicken Sie auf Projekt>Application Insights-Telemetrie hinzufügen>Application Insights SDK (lokal)>Weiter>Fertig stellen>Schließen.

  2. Öffnen Sie die Datei ApplicationInsights.config.

  3. Fügen Sie vor dem schließenden </ApplicationInsights>-Tag eine Zeile hinzu, die die Verbindungszeichenfolge für Ihre Application Insights-Ressource enthält. Ihre Verbindungszeichenfolge wird im Übersichtsbereich der neu erstellten Application Insights-Ressource angezeigt.

    <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>
    
  4. Wählen Sie Projekt>NuGet-Pakete verwalten>Updates aus. Aktualisieren Sie dann jedes Microsoft.ApplicationInsights-NuGet-Paket auf das neueste stabile Release.

  5. Führen Sie Ihre Anwendung aus, indem Sie auf IIS Express klicken. Eine einfache ASP.NET-App wird geöffnet. Wenn Sie auf den Seiten der Website navigieren, werden Telemetriedaten an Application Insights gesendet.

Manuelles Hinzufügen von Application Insights (ohne Visual Studio)

Dieser Abschnitt führt Sie durch das manuelle Hinzufügen von Application Insights zu einer vorlagenbasierten Web-App.

  1. Fügen Sie die folgenden NuGet-Pakete und ihre jeweiligen Abhängigkeiten Ihrem Projekt hinzu:

  2. In einigen Fällen wird die ApplicationInsights.config-Datei automatisch für Sie erstellt. Wenn die Datei bereits vorhanden ist, können Sie mit Schritt 4 fortfahren.

    Erstellen Sie sie selbst, wenn sie fehlt. Erstellen Sie im Stammverzeichnis einer ASP.NET-Anwendung eine neue Datei namens ApplicationInsights.config.

  3. Kopieren Sie die folgende XML-Konfiguration in Ihre neu erstellte Datei:


    Erweitern, um die Konfiguration anzuzeigen
    <?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. Fügen Sie die Verbindungszeichenfolge hinzu. Dazu gibt es zwei Möglichkeiten:

    • (Empfohlen) Legen Sie die Verbindungszeichenfolge in der Konfiguration fest.

      Fügen Sie vor dem schließenden </ApplicationInsights>-Tag in ApplicationInsights.config die Verbindungszeichenfolge für Ihre Application Insights-Ressource hinzu. Ihre Verbindungszeichenfolge wird im Übersichtsbereich der neu erstellten Application Insights-Ressource angezeigt.

      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
      
    • Legen Sie die Verbindungszeichenfolge im Code fest.

      Geben Sie eine Verbindungszeichenfolge in der program.cs-Klasse an.

      var configuration = new TelemetryConfiguration
      {
          ConnectionString = "Copy the connection string from your Application Insights resource"
      };
      
  5. Erstellen Sie auf derselben Projektebene wie der der ApplicationInsights.config-Datei einen Ordner namens ErrorHandler mit einer neuen C#-Datei namens AiHandleErrorAttribute.cs. Der Inhalt der Datei sieht wie folgt aus:

    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. Öffnen Sie im Ordner App_Start die Datei FilterConfig.cs, und ändern Sie sie so, dass sie dem Beispiel entspricht:

    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. Wenn Web.config bereits aktualisiert wurde, überspringen Sie diesen Schritt. Aktualisieren Sie die Datei andernfalls wie folgt:


    Erweitern, um die Konfiguration anzuzeigen
    <?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>
    

Sie haben nun erfolgreich die serverseitige Anwendungsüberwachung konfiguriert. Wenn Sie Ihre Web-App ausführen, werden in Application Insights Telemetriedaten angezeigt.

Überprüfen, ob Application Insights Telemetrie erhält

Führen Sie Ihre Anwendung aus, und senden Sie Anforderungen an diese. Nun sollten Telemetriedaten an Application Insights übermittelt werden. Mit dem Application Insights SDK werden eingehende Webanforderungen an die Anwendung sowie die folgenden Telemetriedaten automatisch erfasst.

Konfigurieren von Telemetrie

In diesem Abschnitt

Livemetriken

Mit Livemetriken kann schnell überprüft werden, ob die Anwendungsüberwachung mit Application Insights ordnungsgemäß konfiguriert ist. Es kann einige Minuten dauern, bis Telemetriedaten im Azure-Portal angezeigt werden. Im Bereich „Livemetriken“ wird jedoch die CPU-Auslastung des laufenden Prozesses nahezu in Echtzeit angezeigt. Außerdem können andere Telemetriedaten wie z. B. Anforderungen, Abhängigkeiten und Ablaufverfolgungen angezeigt werden.

Hinweis

Livemetriken sind standardmäßig aktiviert, wenn sie deren Onboarding gemäß den empfohlenen Anweisungen für .NET-Anwendungen durchführen.

Aktivieren von Livemetriken für beliebige .NET-Anwendungen mithilfe von Code

So konfigurieren Sie Livemetriken manuell

  1. Installieren Sie das NuGet-Paket Microsoft.ApplicationInsights.PerfCounterCollector.

  2. Im Folgenden finden Sie Beispielcode für die Konsolen-App zum Einrichten von Livemetriken:

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

Ablaufverfolgungen (Protokolle)

Application Insights erfasst Protokolle von ASP.NET Core und anderen .NET-Apps über ILogger und von klassischen ASP.NET (.NET Framework) über das klassische SDK und die Adapter.

Tipp

  • Standardmäßig sendet der Application Insights-Anbieter nur Protokolle mit einem Schweregrad von Warning oder höher. Um Protokolle einzuschließen oder auf niedrigerer Ebene zu speichern Information , aktualisieren Sie die Einstellungen auf Protokollebene in appsettings.json.

  • Das Microsoft.ApplicationInsights.WorkerService NuGet-Paket, das zum Aktivieren von Application Insights für Hintergrunddienste verwendet wird, liegt außerhalb des Gültigkeitsbereichs. Weitere Informationen finden Sie unter Application Insights for Worker Service-Apps.

Hinweis

Informationen zum Überprüfen häufig gestellter Fragen (FAQ) finden Sie unter Protokollierung mit .NET FAQ.

ILogger-Richtlinien gelten nicht für ASP.NET. Um Ablaufverfolgungsprotokolle von klassischen ASP.NET-Apps an Application Insights zu senden, verwenden Sie unterstützte Adapter wie:

  • System.Diagnostics.Trace mit Application Insights TraceListener
  • log4net oder NLog mit offiziellen Application Insights-Zielen

Ausführliche Schritte und Konfigurationsbeispiele finden Sie unter Senden von Ablaufverfolgungsprotokollen an Application Insights.

Konsolenanwendung

Um die Application Insights-Protokollierung zu Konsolenanwendungen hinzuzufügen, installieren Sie zuerst die folgenden NuGet-Pakete:

Im folgenden Beispiel wird das Microsoft.Extensions.Logging.ApplicationInsights Paket verwendet und das Standardverhalten für eine Konsolenanwendung veranschaulicht. Das Microsoft.Extensions.Logging.ApplicationInsights Paket sollte in einer Konsolenanwendung verwendet werden oder wann immer Sie eine minimale Mindestimplementierung von Application Insights ohne den vollständigen Funktionssatz benötigen, z. B. Metriken, verteilte Ablaufverfolgung, Sampling und Telemetrieinitialisierer.

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

Weitere Informationen finden Sie unter Welchen Telemetrietyp "Application Insights" werden aus ILogger-Protokollen erstellt? Wo kann ich ILogger-Protokolle in Application Insights anzeigen?.

Protokollierungsbereiche

Hinweis

Die folgenden Richtlinien gelten für ILogger-Szenarien (nur ASP.NET Core und Konsole). Es gilt nicht für klassische ASP.NET.

ApplicationInsightsLoggingProvider unterstützt Protokollbereiche, die standardmäßig aktiviert sind.

Wenn der Bereich vom Typ IReadOnlyCollection<KeyValuePair<string,object>>ist, wird jedes Schlüssel-Wert-Paar in der Auflistung der Application Insights-Telemetrie als benutzerdefinierte Eigenschaften hinzugefügt. Im folgenden Beispiel werden Protokolle als TraceTelemetry eigenschaften erfasst.("MyKey", "MyValue")

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

Wenn ein anderer Typ als Bereich verwendet wird, wird er unter der Eigenschaft Scope in der Application Insights-Telemetrie gespeichert. Im folgenden Beispiel wird eine Eigenschaft aufgerufenTraceTelemetry, Scope die den Bereich enthält.

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

Suchen ihrer Protokolle

ILogger-Protokolle werden als Ablaufverfolgungs-Telemetrie (Tabelle traces in Application Insights und AppTraces in Log Analytics) angezeigt.

Beispiel

Wechseln Sie im Azure-Portal zu Application Insights, und führen Sie Folgendes aus:

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

Abhängigkeiten

Automatisch nachverfolgte Abhängigkeiten

Application Insights-SDKs für .NET und .NET Core werden mit DependencyTrackingTelemetryModule ausgeliefert, einem Telemetriemodul, das Abhängigkeiten automatisch erfasst. Das Modul DependencyTrackingTelemetryModule wird als Microsoft.ApplicationInsights.DependencyCollector NuGet-Paket ausgeliefert und automatisch bereitgestellt, wenn Sie entweder das Microsoft.ApplicationInsights.Web NuGet-Paket oder das Microsoft.ApplicationInsights.AspNetCore NuGet-Paket verwenden.

Derzeit verfolgt DependencyTrackingTelemetryModule automatisch die folgenden Abhängigkeiten:

Abhängigkeiten Einzelheiten
HTTP/HTTPS Lokale oder Remote-HTTP/HTTPS-Aufrufe.
WCF-Aufrufe Wird nur automatisch verfolgt, wenn HTTP-basierte Bindungen verwendet werden.
SQL Aufrufe mit SqlClient. Informationen zum Erfassen von SQL-Abfragen finden Sie im Abschnitt Erweitertes SQL-Tracking, um eine vollständige SQL-Abfrage zu erhalten.
Azure Blob Storage, Table Storage, oder Queue Storage Aufrufe mit dem Azure Storage-Client.
Azure Event Hubs-Client-SDK Verwenden Sie das neueste Paket: https://nuget.org/packages/Azure.Messaging.EventHubs.
Azure Service Bus-Client-SDK Verwenden Sie das neueste Paket: https://nuget.org/packages/Azure.Messaging.ServiceBus.
Azure Cosmos DB Wird automatisch nachverfolgt, wenn HTTP/HTTPS verwendet wird. Die Ablaufverfolgung für Vorgänge im direkten Modus mit TCP wird auch automatisch mithilfe des Vorschaupakets >= 3.33.0-preview erfasst. Weitere Details finden Sie in der Dokumentation.

Wenn die Abhängigkeit nicht automatisch erfasst wird, können Sie sie manuell mit einem Track-Abhängigkeitsaufruf nachverfolgen.

Weitere Informationen zur Funktionsweise der Abhängigkeitsnachverfolgung finden Sie unter Dependency Tracking in Application Insights.

Richten Sie die automatische Abhängigkeitsverfolgung in Konsolen-Apps ein

Um Abhängigkeiten in .NET-Konsolen-Apps automatisch nachzuverfolgen, installieren Sie das NuGet-Paket Microsoft.ApplicationInsights.DependencyCollector, und initialisieren Sie DependencyTrackingTelemetryModule wie folgt:

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

Manuelle Nachverfolgung von Abhängigkeiten

Die folgenden Beispiele für Abhängigkeiten, die nicht automatisch erfasst werden, erfordern eine manuelle Nachverfolgung:

  • Azure Cosmos DB wird nur dann automatisch nachverfolgt, wenn HTTP/HTTPS verwendet wird. Der TCP-Modus wird von Application Insights für ältere 2.22.0-Beta1SDK-Versionen nicht automatisch erfasst.
  • Redis

Abhängigkeiten, die nicht automatisch vom SDK erfasst werden, können Sie manuell nachverfolgen, indem Sie dieTrackDependency-API verwenden, die von den standardmäßigen automatischen Erfassungsmodulen verwendet wird.

Beispiel

Wenn Sie Ihren Code mit einer Assembly erstellen, die Sie nicht selbst geschrieben haben, können Sie alle Aufrufe zeitlich festlegen. In diesem Szenario könnten Sie herausfinden, welche Beiträge sie zu Ihren Reaktionszeiten leisten.

Damit diese Daten in den Abhängigkeitsdiagrammen in Application Insights angezeigt werden, senden Sie sie mit 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);
    }

Alternativ stellt TelemetryClient die Erweiterungsmethoden StartOperation and StopOperationbereit, die zum manuellen Verfolgen von Abhängigkeiten verwendet werden können, wie in Verfolgung ausgehender Abhängigkeiten gezeigt.

Deaktivieren des Standardmäßigen Abhängigkeitsnachverfolgungsmoduls

Weitere Informationen finden Sie in Telemetriemodulen.


Erweitertes SQL-Tracking, um eine vollständige SQL-Abfrage zu erhalten

Bei SQL-Aufrufen wird immer der Name des Servers und der Datenbank gesammelt und als Name des gesammelten DependencyTelemetry gespeichert. Ein weiteres Feld namens data kann den vollständigen SQL-Abfragetext enthalten.

Hinweis

Azure Functions erfordert separate Einstellungen, um die SQL-Texterfassung zu aktivieren. Weitere Informationen finden Sie unter Aktivieren der SQL-Abfragesammlung.

Für ASP.NET-Anwendungen wird der vollständige SQL-Abfragetext mit Hilfe der Bytecode-Instrumentierung erfasst, was die Verwendung des Instrumentierungsmoduls oder die Verwendung des Microsoft.Data.SqlClient-NuGet-Pakets anstelle der System.Data.SqlClient-Bibliothek erfordert. Plattformspezifische Schritte zum Aktivieren der vollständigen SQL-Abfragesammlung werden in der folgenden Tabelle beschrieben.

Plattform Erforderliche Schritte, um eine vollständige SQL-Abfrage zu erhalten
Web-Apps in Azure App Service In der Systemsteuerung Ihrer Web-App öffnen Sie das Application Insights-Bereich, und aktivieren Sie SQL-Befehle unter .NET.
IIS-Server (Azure Virtual Machines, lokal und so weiter) Verwenden Sie entweder das NuGet-Paket Microsoft.Data.SqlClient oder das Application Insights Agent-PowerShell-Modul, um die Instrumentierungs-Engine zu installieren und IIS neu zu starten.
Azure Cloud Services Fügen Sie eine Startaufgabe zum Installieren von StatusMonitor hinzu.
Ihre App sollte zur Erstellungszeit in das ApplicationInsights SDK integriert werden, indem NuGet-Pakete für ASP.NET oder ASP.NET Core-Anwendungen installiert werden.
IIS Express Verwenden Sie das NuGet-Paket Microsoft.Data.SqlClient.
WebJobs in Azure App Service Verwenden Sie das NuGet-Paket Microsoft.Data.SqlClient.

Zusätzlich zu den vorangegangenen plattformspezifischen Schritten müssen Sie sich auch ausdrücklich für die Aktivierung der SQL-Befehlssammlung anmelden, indem Sie die applicationInsights.config-Datei mit dem folgenden Code ändern:

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

In den vorstehenden Fällen besteht die ordnungsgemäße Methode zum Überprüfen, ob die Instrumentierungs-Engine korrekt installiert ist, darin, zu überprüfen, ob die SDK-Version des erfassten DependencyTelemetryrddp ist. Die Verwendung oder rdddsdrddf gibt an, dass Abhängigkeiten über DiagnosticSource oder EventSource Rückrufe erfasst werden, sodass die vollständige SQL-Abfrage nicht erfasst wird.

Ausnahmen

Ausnahmen in Webanwendungen können mit Application Insights gemeldet werden. Sie können fehlgeschlagene Anforderungen mit Ausnahmen und anderen Ereignissen sowohl auf dem Client als auch auf dem Server korrelieren, damit Sie die Ursachen schnell diagnostizieren können. In diesem Abschnitt erfahren Sie, wie Sie Ausnahmeberichte einrichten, Ausnahmen explizit melden, Fehler diagnostizieren und vieles mehr.

Einrichten der Ausnahmeberichterstattung

Sie können Application Insights einrichten, um Ausnahmen zu melden, die entweder auf dem Server oder dem Client auftreten. Abhängig von der Plattform, von der Ihre Anwendung abhängig ist, benötigen Sie die entsprechende Erweiterung oder das ENTSPRECHENDE SDK.

Wenn Ausnahmen von Ihrer serverseitigen Anwendung gemeldet werden sollen, berücksichtigen Sie die folgenden Szenarien:

Wichtig

Dieser Abschnitt konzentriert sich auf .NET Framework-Apps aus codebeispielbezogener Sicht. Einige der Methoden, die für .NET Framework funktionieren, sind im .NET Core SDK veraltet.

Diagnostizieren von Fehlern und Ausnahmen

Application Insights bietet eine kuratierte Anwendungsleistungsverwaltungserfahrung, mit der Sie Fehler in Ihren überwachten Anwendungen diagnostizieren können.

Ausführliche Anweisungen finden Sie unter Untersuchen von Fehlern, Leistung und Transaktionen mit Application Insights.

Benutzerdefinierte Ablaufverfolgungs- und Protokolldaten

Um Diagnosedaten speziell für Ihre App abzurufen, können Sie Code einfügen, um Ihre eigenen Telemetriedaten zu senden. Ihre benutzerdefinierten Telemetrie- oder Protokolldaten werden zusammen mit der Anforderung, der Seitenansicht und anderen automatisch gesammelten Daten in der Diagnosesuche angezeigt.

Mit dem Microsoft.VisualStudio.ApplicationInsights.TelemetryClientFolgenden stehen ihnen mehrere APIs zur Verfügung:

  • TelemetryClient.TrackEvent wird in der Regel für die Überwachung von Verwendungsmustern verwendet, aber die gesendeten Daten werden auch unter benutzerdefinierten Ereignissen in der Diagnosesuche angezeigt. Ereignisse werden benannt und können Zeichenfolgeneigenschaften und numerische Metriken enthalten, nach denen Sie Ihre Diagnosesuchen filtern können.
  • TelemetryClient.TrackTrace Ermöglicht das Senden längerer Daten wie POST-Informationen.
  • TelemetryClient.TrackException sendet Ausnahmedetails, z. B. Stapelablaufverfolgungen an Application Insights.

Um diese Ereignisse anzuzeigen, öffnen Sie im linken Menü die Suche. Wählen Sie das Dropdownmenü "Ereignistypen" und dann " Benutzerdefiniertes Ereignis", " Ablaufverfolgung" oder "Ausnahme" aus.

Screenshot, der den Suchbildschirm zeigt.

Hinweis

Wenn Ihre App große Mengen an Telemetrie generiert, reduziert das adaptive Samplingmodul automatisch das an das Portal gesendete Volumen, indem nur ein repräsentativer Anteil von Ereignissen gesendet wird. Ereignisse, die Teil desselben Vorgangs sind, werden als Gruppe ausgewählt oder deaktiviert, sodass Sie zwischen verwandten Ereignissen navigieren können. Weitere Informationen finden Sie unter Erstellen von Stichproben in Application Insights.

Siehe AnforderungS-POST-Daten

Anforderungsdetails enthalten nicht die Daten, die in einem POST-Anruf an Ihre App gesendet werden. So haben Sie diese Daten gemeldet:

Standardmäßig werden nicht alle Ausnahmen, die zu Fehlern in Ihrer App führen, im Portal angezeigt. Wenn Sie das JavaScript SDK in Ihren Webseiten verwenden, werden Browser-Ausnahmen angezeigt. Die meisten serverseitigen Ausnahmen werden jedoch von IIS abgefangen, daher müssen Sie code hinzufügen, um sie zu erfassen und zu melden.

Sie haben folgende Möglichkeiten:

  • Protokollieren Sie Ausnahmen explizit , indem Sie Code in Ausnahmehandler einfügen, um die Ausnahmen zu melden.
  • Erfassen Sie Ausnahmen automatisch , indem Sie Ihr ASP.NET Framework konfigurieren. Die erforderlichen Ergänzungen sind für verschiedene Frameworktypen unterschiedlich.
Explizites Melden von Ausnahmen

Die einfachste Möglichkeit zum Melden besteht darin, einen Aufruf trackException() in einen Ausnahmehandler einzufügen.

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

Die Eigenschaften und Maßparameter sind optional, eignen sich jedoch zum Filtern und Hinzufügen zusätzlicher Informationen. Wenn Sie beispielsweise über eine App verfügen, die mehrere Spiele ausführen kann, können Sie alle Ausnahmeberichte zu einem bestimmten Spiel finden. Sie können jedem Wörterbuch beliebig viele Elemente hinzufügen.

Browser-Ausnahmen

Die meisten Browser-Ausnahmen werden gemeldet.

Wenn Ihre Webseite Skriptdateien aus Inhaltsübermittlungsnetzwerken oder anderen Domänen enthält, stellen Sie sicher, dass Ihr Skripttag über das Attribut crossorigin="anonymous" verfügt und der Server CORS-Header sendet. Mit diesem Verhalten können Sie eine Stapelablaufverfolgung und Details für unbehandelte JavaScript-Ausnahmen von diesen Ressourcen abrufen.

Wiederverwenden ihres Telemetrieclients

Hinweis

Es wird empfohlen, das TelemetryClient einmal instanziieren und während der gesamten Lebensdauer einer Anwendung wiederzuverwenden.

Mit Dependency Injection (DI) in .NET, dem entsprechenden .NET SDK und der korrekten Konfiguration von Application Insights for DI können Sie den TelemetryClient als Konstruktorparameter benötigen.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

Im vorherigen Beispiel wird die TelemetryClient Klasse in die Klasse eingefügt ExampleController .

Webformulare

Bei Webformularen kann das HTTP-Modul die Ausnahmen sammeln, wenn keine Umleitungen konfiguriert CustomErrorssind. Wenn Sie jedoch aktive Umleitungen haben, fügen Sie der Funktion in Application_Error die folgenden Zeilen hinzu.

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

Im vorherigen Beispiel handelt es _telemetryClient sich um eine Klassenbereichsvariable vom Typ TelemetryClient.

MVC

Ab Application Insights Web SDK Version 2.6 (Beta 3 und höher) sammelt Application Insights unbehandelte Ausnahmen, die in den MVC 5+-Controllermethoden automatisch ausgelöst werden. Wenn Sie zuvor einen benutzerdefinierten Handler zum Nachverfolgen solcher Ausnahmen hinzugefügt haben, können Sie ihn entfernen, um die doppelte Nachverfolgung von Ausnahmen zu verhindern.

Es gibt mehrere Szenarien, in denen ein Ausnahmefilter Fehler nicht ordnungsgemäß behandeln kann, wenn Ausnahmen ausgelöst werden:

  • Von Controllerkonstruktoren
  • Von Nachrichtenhandlern
  • Während des Routings
  • Während der Serialisierung von Antwortinhalten
  • Während des Anwendungsstarts
  • In Hintergrundaufgaben

Alle von der Anwendung behandelten Ausnahmen müssen weiterhin manuell nachverfolgt werden. Unbehandelte Ausnahmen, die von Controllern stammen, führen in der Regel zu einer Antwort von 500 "Interner Serverfehler". Wenn diese Antwort manuell als Ergebnis einer behandelten Ausnahme oder gar keine Ausnahme erstellt wird, wird sie in der entsprechenden Anforderungs-Telemetrie mit ResultCode 500 nachverfolgt. Das Application Insights SDK kann jedoch keine entsprechende Ausnahme nachverfolgen.

Unterstützung früherer Versionen

Wenn Sie MVC 4 (und früher) von Application Insights Web SDK 2.5 (und früher) verwenden, lesen Sie die folgenden Beispiele zum Nachverfolgen von Ausnahmen.


Erweitern, um Anweisungen für frühere Versionen anzuzeigen

Wenn die CustomErrors-Konfiguration lautet Off, stehen Ausnahmen für das ZU erfassende HTTP-Modul zur Verfügung. Wenn sie jedoch auf RemoteOnly (Standard) festgelegt ist oder Ondie Ausnahme gelöscht wird und nicht für Application Insights zur automatischen Erfassung verfügbar ist. Sie können dieses Verhalten beheben, indem Sie die System.Web.Mvc.HandleErrorAttribute-Klasse überschreiben und die überschriebene Klasse anwenden, wie für die verschiedenen MVC-Versionen hier gezeigt (siehe GitHub-Quelle):

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

Ersetzen Sie das HandleError-Attribut durch Ihr neues Attribut in Ihren Controllern:

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

Beispiel

MVC 3

Registrieren Sie AiHandleErrorAttribute sich als globaler Filter in Global.asax.cs:

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

Beispiel

MVC 4, MVC 5

Registrieren Sie AiHandleErrorAttribute sich als globaler Filter 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());
    }
}

Beispiel

Web-API

Ab Application Insights Web SDK Version 2.6 (Beta 3 und höher) sammelt Application Insights unbehandelte Ausnahmen, die in den Controllermethoden automatisch für Web-API 2+ ausgelöst werden. Wenn Sie zuvor einen benutzerdefinierten Handler zum Nachverfolgen solcher Ausnahmen hinzugefügt haben, wie in den folgenden Beispielen beschrieben, können Sie ihn entfernen, um die doppelte Nachverfolgung von Ausnahmen zu verhindern.

Es gibt mehrere Fälle, die die Ausnahmefilter nicht verarbeiten können. Beispiel:

  • Ausnahmen, die von Controllerkonstruktoren ausgelöst werden.
  • Ausnahmen, die von Nachrichtenhandlern ausgelöst werden.
  • Ausnahmen, die während des Routings ausgelöst werden.
  • Ausnahmen, die während der Serialisierung von Antwortinhalten ausgelöst werden.
  • Ausnahme beim Starten der Anwendung ausgelöst.
  • Ausnahme in Hintergrundaufgaben ausgelöst.

Alle von der Anwendung behandelten Ausnahmen müssen weiterhin manuell nachverfolgt werden. Unbehandelte Ausnahmen, die von Controllern stammen, führen in der Regel zu einer Antwort von 500 "Interner Serverfehler". Wenn eine solche Antwort manuell als Ergebnis einer behandelten Ausnahme oder gar keine Ausnahme erstellt wird, wird sie in einer entsprechenden Anforderungs-Telemetrie mit ResultCode 500 nachverfolgt. Das Application Insights SDK kann jedoch keine entsprechende Ausnahme nachverfolgen.

Unterstützung früherer Versionen

Wenn Sie Web-API 1 (und früher) von Application Insights Web SDK 2.5 (und früher) verwenden, lesen Sie die folgenden Beispiele zum Nachverfolgen von Ausnahmen.


Erweitern, um Anweisungen für frühere Versionen anzuzeigen

Web-API 1.x

Außerkraftsetzung 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);
    }
    }
}

Sie können dieses überschriebene Attribut bestimmten Controllern hinzufügen oder der globalen Filterkonfiguration in der WebApiConfig Klasse hinzufügen:

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

Beispiel

Web-API 2.x

Hinzufügen einer Implementierung von 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);
        }
    }
}

Fügen Sie diesen Codeausschnitt zu den Diensten 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());
        }
    }
}

Beispiel

Als Alternative könnten Sie:

  • Ersetzen Sie die einzige ExceptionHandler Instanz durch eine benutzerdefinierte Implementierung von IExceptionHandler. Dieser Ausnahmehandler wird nur aufgerufen, wenn das Framework weiterhin auswählen kann, welche Antwortnachricht gesendet werden soll, nicht wenn die Verbindung abgebrochen wird, z. B..
  • Verwenden Sie Ausnahmefilter, wie im vorherigen Abschnitt auf Web-API 1.x-Controllern beschrieben, die nicht in allen Fällen aufgerufen werden.

WCF

Fügen Sie eine Klasse hinzu, die erweitert Attribute und implementiert und implementiert IErrorHandler und 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)
        {
        }
      }
    }

Fügen Sie das Attribut zu den Dienstimplementierungen hinzu:

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

Beispiel

Leistungsindikatoren für Ausnahmen

Wenn Sie den Azure Monitor Application Insights Agent auf Ihrem Server installiert haben, können Sie ein Diagramm der Von .NET gemessenen Ausnahmenrate abrufen. Sowohl behandelte als auch unbehandelte .NET-Ausnahmen sind enthalten.

Öffnen Sie eine Registerkarte "Metrik-Explorer", und fügen Sie ein neues Diagramm hinzu. Wählen Sie unter Leistungsindikatorendie Ausnahmerate aus.

.NET Framework berechnet die Rate, indem die Anzahl der Ausnahmen in einem Intervall gezählt und durch die Länge des Intervalls dividiert wird.

Diese Anzahl unterscheidet sich von der Vom Application Insights-Portal TrackException berechneten Ausnahmenzählungsberichte. Die Samplingintervalle unterscheiden sich, und das SDK sendet TrackException keine Berichte für alle behandelten und nicht behandelten Ausnahmen.

Benutzerdefinierte Metriksammlung

Die Azure Monitor Application Insights .NET- und .NET Core-SDKs verfügen über zwei verschiedene Methoden zum Sammeln von benutzerdefinierten Metriken:

  • Die TrackMetric() Methode, die keine Voraggregation aufweist.
  • Die GetMetric() Methode, die eine Voraggregation aufweist.

Wir empfehlen die Verwendung der Aggregation. TrackMetric(). Dieser Artikel führt Sie durch die Verwendung der GetMetric() Methode und einige der Gründe für die Funktionsweise.


Erweitern Sie die Erweiterung, um mehr über das Voraggregieren im Vergleich zur nicht voraggregierenden API zu erfahren.

Die TrackMetric() Methode sendet unformatierte Telemetrie, die eine Metrik angibt. Es ist ineffizient, ein einzelnes Telemetrieelement für jeden Wert zu senden. Die TrackMetric() Methode ist auch ineffizient in Bezug auf die Leistung, da jeder TrackMetric(item) die vollständige SDK-Pipeline von Telemetrieinitialisierern und Prozessoren durchläuft.

Im Gegensatz dazu TrackMetric()GetMetric() behandelt die lokale Voraggregation für Sie und sendet dann nur eine aggregierte Zusammenfassungsmetrik in einem festen Intervall von einer Minute. Wenn Sie einige benutzerdefinierte Metriken auf der zweiten oder sogar Millisekundenebene genau überwachen müssen, können Sie dies tun, während nur die Speicher- und Netzwerkdatenverkehrskosten anfallen, die nur jede Minute überwacht werden. Dieses Verhalten verringert auch das Risiko einer Drosselung erheblich, da die Gesamtanzahl der Telemetrieelemente, die für eine aggregierte Metrik gesendet werden müssen, erheblich reduziert werden.

In Application Insights werden benutzerdefinierte Metriken gesammelt TrackMetric() und GetMetric() unterliegen nicht dem Sampling. Das Sampling wichtiger Metriken kann zu Szenarien führen, in denen Warnungen, die auf diesen Metriken basieren, unzuverlässig werden. Indem Sie Ihre benutzerdefinierten Metriken niemals samplingn, können Sie im Allgemeinen sicher sein, dass beim Überschreiten der Warnungsschwellenwerte eine Warnung ausgelöst wird. Da benutzerdefinierte Metriken nicht erfasst werden, gibt es einige potenzielle Bedenken.

Die Trendnachverfolgung in einer Metrik jede Sekunde oder in einem noch präziseren Intervall kann zu folgendem Ergebnis führen:

  • Höhere Datenspeicherungskosten. Es gibt kosten, die mit der Menge der Daten verbunden sind, die Sie an Azure Monitor senden. Je mehr Daten Sie senden, desto größer ist die Gesamtkosten der Überwachung.
  • Erhöhter Netzwerkdatenverkehr oder Leistungsaufwand. In einigen Szenarien könnte dieser Aufwand sowohl eine geld- als auch eine Anwendungsleistung kosten.
  • Risiko der Einnahmeeinschränkung. Azure Monitor legt Datenpunkte ("Drosselungen") ab, wenn Ihre App eine hohe Telemetrierate in einem kurzen Zeitintervall sendet.

Drosselung ist ein Problem, da sie zu verpassten Warnungen führen kann. Die Bedingung zum Auslösen einer Warnung kann lokal auftreten und dann aufgrund zu vieler Gesendeter Daten am Aufnahmeendpunkt abgelegt werden. Es wird nicht empfohlen, die Verwendung für .NET und .NET Core zu verwenden TrackMetric() , es sei denn, Sie haben Ihre eigene lokale Aggregationslogik implementiert. Wenn Sie versuchen, jede Instanz nachzuverfolgen, die ein Ereignis über einen bestimmten Zeitraum hinweg auftritt, stellen Sie möglicherweise fest, dass dies TrackEvent() besser passt. Beachten Sie, dass benutzerdefinierte Ereignisse im Gegensatz zu benutzerdefinierten Metriken samplings unterliegen. Sie können dies auch dann verwenden TrackMetric() , wenn Sie ihre eigene lokale Voraggregation schreiben. Aber wenn Sie dies tun, beachten Sie die Fallstricke.

Zusammenfassend wird empfohlen GetMetric() , dass es voraggregatiert wird, werte von allen Track() Aufrufen ansammelt und eine Zusammenfassung/Aggregat einmal pro Minute sendet. Die GetMetric() Methode kann den Kosten- und Leistungsaufwand erheblich reduzieren, indem weniger Datenpunkte gesendet und gleichzeitig alle relevanten Informationen gesammelt werden.

Erste Schritte mit GetMetric

Für unsere Beispiele verwenden wir eine einfache .NET Core 3.1-Workerdienstanwendung. Wenn Sie die mit diesen Beispielen verwendete Testumgebung replizieren möchten, führen Sie die Schritte 1 bis 6 im Artikel "Monitoring Worker Service" aus. Diese Schritte fügen Application Insights zu einer projektbasierten Arbeitsdienstvorlage hinzu. Die Konzepte gelten für jede allgemeine Anwendung, in der das SDK verwendet werden kann, einschließlich Web-Apps und Konsolen-Apps.

Metriken senden

Ersetzen Sie den Inhalt der worker.cs Datei durch den folgenden Code:

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

Wenn Sie den Beispielcode ausführen, wird die while Schleife wiederholt ausgeführt, ohne dass Telemetrie im Visual Studio-Ausgabefenster gesendet wird. Ein einzelnes Telemetrieelement wird um die 60-Sekunden-Marke gesendet, die in unserem Test wie folgt aussieht:

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

Dieses einzelne Telemetrieelement stellt ein Aggregat von 41 unterschiedlichen Metriken dar. Da wir denselben Wert immer wieder senden, haben wir eine Standardabweichung (stDev) von 0 identischen () maximalen (max) und minimalen (min) Werten. Die value Eigenschaft stellt eine Summe aller einzelnen Werte dar, die aggregiert wurden.

Hinweis

Die GetMetric Methode unterstützt das Nachverfolgen des letzten Werts (z gauge. B. ) oder das Nachverfolgen von Histogrammen oder Verteilungen nicht.

Wenn wir unsere Application Insights-Ressource in der Protokollumgebung (Analyse) untersuchen, würde das einzelne Telemetrieelement wie der folgende Screenshot aussehen.

Screenshot der Log Analytics-Abfrageansicht.

Hinweis

Während das unformatierte Telemetrieelement nicht eine explizite Summeneigenschaft/ein explizites Summenfeld enthält, erstellen wir eine für Sie. In diesem Fall stellen sowohl die eigenschaft value als auch die valueSum gleiche Sache dar.

Sie können auch auf Ihre benutzerdefinierte Metrik-Telemetrie im Abschnitt "Metriken " des Portals als protokollbasierte und benutzerdefinierte Metrik zugreifen. Der folgende Screenshot ist ein Beispiel für eine protokollbasierte Metrik.

Screenshot der Ansicht

Cachemetrikverweis für die Verwendung mit hohem Durchsatz

Metrikwerte können in einigen Fällen häufig beobachtet werden. Beispielsweise kann ein Dienst mit hohem Durchsatz, der 500 Anforderungen pro Sekunde verarbeitet, 20 Telemetriemetriken für jede Anforderung ausgeben. Das Ergebnis bedeutet, dass 10.000 Werte pro Sekunde nachverfolgt werden. In solchen Szenarien mit hohem Durchsatz müssen Benutzer das SDK möglicherweise unterstützen, indem sie einige Nachschlagevorgänge vermeiden.

Im vorherigen Beispiel wurde beispielsweise ein Nachschlagevorgang für ein Handle für die Metrik ComputersSold ausgeführt und dann ein beobachteter Wert von 42. Stattdessen kann das Handle für mehrere Nachverfolgaufrufe zwischengespeichert werden:

//...

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

Zusätzlich zum Zwischenspeichern des metrischen Handles verringert Task.Delay sich das vorangehende Beispiel auch auf 50 Millisekunden, sodass die Schleife häufiger ausgeführt wird. Das Ergebnis ist 772 TrackValue() Aufrufe.

Multidimensionale Metriken

Die Beispiele im vorherigen Abschnitt zeigen nulldimensionale Metriken. Metriken können auch multidimensional sein. Wir unterstützen derzeit bis zu 10 Dimensionen.

Hier ist ein Beispiel zum Erstellen einer eindimensionalen Metrik:

//...

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

Das Ausführen des Beispielcodes für mindestens 60 Sekunden führt zu drei unterschiedlichen Telemetrieelementen, die an Azure gesendet werden. Jedes Element stellt die Aggregation eines der drei Formfaktoren dar. Wie zuvor können Sie die Protokollansicht (Analytics) weiter untersuchen.

Screenshot der Log Analytics-Ansicht der multidimensionalen Metrik.

Im Metrik-Explorer:

Screenshot mit benutzerdefinierten Metriken.

Beachten Sie, dass Sie die Metrik nicht durch Ihre neue benutzerdefinierte Dimension aufteilen oder Ihre benutzerdefinierte Dimension mit der Metrikansicht anzeigen können.

Screenshot der Geteilten Unterstützung.

Standardmäßig sind multidimensionale Metriken im Metrik-Explorer in Application Insights-Ressourcen nicht aktiviert.

Aktivieren von mehrdimensionalen Metriken

Um multidimensionale Metriken für eine Application Insights-Ressource zu aktivieren, wählen Sie "Nutzung" und "Geschätzte Kosten>" aus, um benutzerdefinierte Metriken> zu aktivieren,aktivieren Sie warnungen für benutzerdefinierte Metriken>OK. Weitere Informationen finden Sie unter Benutzerdefinierte Metrikdimensionen und Präaggregation.

Nachdem Sie diese Änderung vorgenommen und neue mehrdimensionale Telemetrie gesendet haben, können Sie " Aufteilen anwenden" auswählen.

Hinweis

Nur neu gesendete Metriken, nachdem das Feature im Portal aktiviert wurde, haben Dimensionen gespeichert.

Screenshot, der zeigt, wie die Aufteilung angewendet wird.

Zeigen Sie Die Metrikaggregationen für jede FormFactor Dimension an.

Screenshot, der Formfaktoren zeigt.

Verwenden von MetricIdentifier, wenn mehr als drei Dimensionen vorhanden sind

Derzeit werden 10 Dimensionen unterstützt. Mehr als drei Dimensionen erfordern die Verwendung von 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");

Benutzerdefinierte Metrikkonfiguration

Wenn Sie die Metrikkonfiguration ändern möchten, müssen Sie Änderungen an der Stelle vornehmen, an der die Metrik initialisiert wird.

Spezielle Bemaßungsnamen

Metriken verwenden nicht den Telemetriekontext des TelemetryClient verwendeten Zugriffs. Die Verwendung spezieller Dimensionsnamen, die als Konstanten in der MetricDimensionNames Klasse verfügbar sind, ist die beste Problemumgehung für diese Einschränkung.

Metrikaggregate, die von der folgenden Special Operation Request Size Metrik gesendet werden, müssen Context.Operation.Name auf Special Operation. Die TrackMetric() Methode oder eine andere TrackXXX() Methode wurde OperationName ordnungsgemäß auf .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);
                //...
            }
                   
        }

Verwenden Sie in diesem Fall die in der MetricDimensionNames Klasse aufgeführten speziellen Dimensionsnamen, um die TelemetryContext Werte anzugeben.

Wenn beispielsweise das metrikbasierte Aggregat, das sich aus der nächsten Anweisung ergibt, an den Application Insights-Cloudendpunkt gesendet wird, wird das Context.Operation.Name Datenfeld auf :Special Operation

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

Der Wert dieser speziellen Dimension wird in TelemetryContext eine normale Dimension kopiert und wird nicht als normale Dimension verwendet. Wenn Sie auch eine Betriebsdimension für die normale Metrikerkundung beibehalten möchten, müssen Sie für diesen Zweck eine separate Dimension erstellen:

_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Bemaßung und Zeitreihenkapping

Um zu verhindern, dass das Telemetrie-Subsystem Ihre Ressourcen versehentlich verwendet, können Sie die maximale Anzahl von Datenreihen pro Metrik steuern. Die Standardgrenzwerte sind nicht mehr als 1.000 Datenreihen pro Metrik und nicht mehr als 100 verschiedene Werte pro Dimension.

Wichtig

Verwenden Sie niedrige Kardinalwerte für Dimensionen, um Drosselungen zu vermeiden.

Im Kontext der Begrenzung von Dimension- und Zeitreihen wird Metric.TrackValue(..) sichergestellt, dass die Grenzwerte eingehalten werden. Wenn die Grenzwerte bereits erreicht sind, Metric.TrackValue(..) wird der False Wert nicht nachverfolgt. Andernfalls wird der Wert zurückgegeben True. Dieses Verhalten ist nützlich, wenn die Daten für eine Metrik aus der Benutzereingabe stammen.

Der MetricConfiguration Konstruktor verwendet einige Optionen zum Verwalten verschiedener Datenreihen innerhalb der jeweiligen Metrik und eines Objekts einer Klasse IMetricSeriesConfiguration , die das Aggregationsverhalten für jede einzelne Datenreihe der Metrik angibt:

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 ist die maximale Anzahl von Datenzeitreihen, die eine Metrik enthalten kann. Wenn dieser Grenzwert erreicht ist, führen Aufrufe dazu TrackValue() , dass normalerweise eine neue Datenreihe zurückgegeben falsewird.
  • valuesPerDimensionLimit begrenzt die Anzahl unterschiedlicher Werte pro Dimension auf ähnliche Weise.
  • restrictToUInt32Values bestimmt, ob nur nicht negative ganzzahlige Werte nachverfolgt werden sollen.

Hier ist ein Beispiel für das Senden einer Nachricht, um zu wissen, ob Die Obergrenze überschritten wird:

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

Nachverfolgen von benutzerdefinierten Vorgängen

Application Insights-SDKs verfolgen eingehende HTTP-Anforderungen und Aufrufe abhängiger Dienste wie HTTP-Anforderungen und SQL-Abfragen automatisch. Die Nachverfolgung und Korrelation von Anforderungen und Abhängigkeiten bieten Ihnen Einblicke in die Reaktionsfähigkeit und Zuverlässigkeit der gesamten Anwendung in allen Microservices, die diese Anwendung kombinieren.

Es gibt eine Klasse von Anwendungsmustern, die nicht generisch unterstützt werden können. Eine ordnungsgemäße Überwachung solcher Muster erfordert manuelle Codeinstrumentation. In diesem Artikel werden einige Muster behandelt, die möglicherweise eine manuelle Instrumentierung erfordern, z. B. die benutzerdefinierte Warteschlangenverarbeitung und das Ausführen langer Hintergrundaufgaben.

Dieser Abschnitt enthält Anleitungen zum Nachverfolgen von benutzerdefinierten Vorgängen mit dem Application Insights SDK.

Überblick

Ein Vorgang ist eine logische Arbeit, die von einer Anwendung ausgeführt wird. Er verfügt über einen Namen, eine Startzeit, eine Dauer, ein Ergebnis und einen Kontext der Ausführung wie Benutzername, Eigenschaften und Ergebnis. Wenn der Vorgang A durch Operation B initiiert wurde, wird der Vorgang B als übergeordnetes Element für A festgelegt. Ein Vorgang kann nur ein übergeordnetes Element haben, aber er kann viele untergeordnete Vorgänge haben. Weitere Informationen zu Vorgängen und Telemetriekorrelationen finden Sie unter Application Insights Telemetriekorrelation.

Im Application Insights .NET SDK wird der Vorgang von der abstrakten Klasse "OperationTelemetry " und den nachfolgern "RequestTelemetry " und "DependencyTelemetry" beschrieben.

Nachverfolgung eingehender Vorgänge

Das Application Insights-Web-SDK sammelt automatisch HTTP-Anforderungen für ASP.NET Anwendungen, die in einer IIS-Pipeline und allen ASP.NET Core-Anwendungen ausgeführt werden. Es gibt communitygestützte Lösungen für andere Plattformen und Frameworks. Wenn die Anwendung von keiner der Standard- oder Community-unterstützten Lösungen unterstützt wird, können Sie sie manuell instrumentieren.

Ein weiteres Beispiel für die benutzerdefinierte Nachverfolgung ist der Worker, der Elemente aus der Warteschlange empfängt. Bei einigen Warteschlangen wird der Aufruf zum Hinzufügen einer Nachricht zu dieser Warteschlange als Abhängigkeit nachverfolgt. Der allgemeine Vorgang, der die Nachrichtenverarbeitung beschreibt, wird nicht automatisch erfasst.

Sehen wir uns an, wie solche Vorgänge nachverfolgt werden können.

Auf hoher Ebene besteht die Aufgabe darin, bekannte Eigenschaften zu erstellen RequestTelemetry und festzulegen. Nach Abschluss des Vorgangs verfolgen Sie die Telemetrie. Im folgenden Beispiel wird diese Aufgabe veranschaulicht.

HTTP-Anforderung in selbst gehosteter Owin-App

In diesem Beispiel wird der Ablaufverfolgungskontext gemäß dem HTTP-Protokoll für Korrelation verteilt. Sie sollten davon ausgehen, dass Sie Kopfzeilen empfangen, die dort beschrieben werden.


Erweitern zum Anzeigen von Code
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);
    }
}

Das HTTP-Protokoll für Korrelation deklariert auch den Correlation-Context Header. Es wird hier aus Gründen der Einfachheit weggelassen.

Warteschlangeninstrumentation

Der W3C-Ablaufverfolgungskontext und das HTTP-Protokoll für Korrelationsdurchlauf-Korrelationsdetails mit HTTP-Anforderungen, aber jedes Warteschlangenprotokoll muss definieren, wie die gleichen Details entlang der Warteschlangennachricht übergeben werden. Einige Warteschlangenprotokolle, z. B. AMQP, ermöglichen das Übergeben weiterer Metadaten. Andere Protokolle, z. B. Azure Storage Queue, erfordern, dass der Kontext in die Nachrichtennutzlast codiert wird.

Hinweis

Die komponentenübergreifende Ablaufverfolgung wird für Warteschlangen noch nicht unterstützt.

Wenn Ihr Produzent und Consumer Telemetrie an unterschiedliche Application Insights-Ressourcen senden, zeigen Transaktionsdiagnosen und Anwendungszuordnung Transaktionen an und ordnen End-to-End zu. Bei Warteschlangen wird diese Funktion noch nicht unterstützt.

Service Bus-Warteschlange

Informationen zur Ablaufverfolgung finden Sie unter Verteilte Ablaufverfolgung und Korrelation über Azure Service Bus Messaging.

Azure Storage-Warteschlange

Das folgende Beispiel zeigt, wie Sie die Azure Storage-Warteschlangenvorgänge nachverfolgen und Telemetrie zwischen dem Produzenten, dem Consumer und Azure Storage korrelieren.

Die Speicherwarteschlange verfügt über eine HTTP-API. Alle Aufrufe der Warteschlange werden vom Application Insights Dependency Collector für HTTP-Anforderungen nachverfolgt. Sie ist standardmäßig für ASP.NET- und ASP.NET Core-Anwendungen konfiguriert. Weitere Arten von Anwendungen finden Sie in der Dokumentation zu Konsolenanwendungen.

Sie können auch die Anwendungseinblick-Vorgangs-ID mit der Speicheranforderungs-ID korrelieren. Informationen zum Festlegen und Abrufen eines Speicheranforderungsclients und einer Serveranforderungs-ID finden Sie unter Überwachen, Diagnostizieren und Problembehandlung von Azure Storage.

Da Speicherwarteschlangen die HTTP-API unterstützen, werden alle Vorgänge mit der Warteschlange automatisch von Application Insights nachverfolgt. In vielen Fällen sollte diese Instrumentierung ausreichen. Um Ablaufverfolgungen auf der Verbraucherseite mit Produzentenablaufverfolgungen zu korrelieren, müssen Sie einen Korrelationskontext ähnlich wie im HTTP-Protokoll für Korrelation übergeben.

In diesem Beispiel wird gezeigt, wie der Enqueue Vorgang nachverfolgt wird. Sie haben folgende Möglichkeiten:

  • Korrelieren Sie Wiederholungsversuche (falls vorhanden):Sie haben alle ein gemeinsames übergeordnetes Element, das der Enqueue Vorgang ist. Andernfalls werden sie als untergeordnete Elemente der eingehenden Anforderung nachverfolgt. Wenn mehrere logische Anforderungen an die Warteschlange vorhanden sind, kann es schwierig sein, zu finden, welcher Anruf zu Wiederholungen führte.
  • Korrelieren von Speicherprotokollen (falls und bei Bedarf): Sie werden mit der Telemetrie "Application Insights" korreliert.

Der Enqueue Vorgang ist das untergeordnete Element eines übergeordneten Vorgangs. Ein Beispiel ist eine eingehende HTTP-Anforderung. Der HTTP-Abhängigkeitsaufruf ist das untergeordnete Element des Enqueue Vorgangs und der Enkel der eingehenden Anforderung.

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

Verwenden Sie die API direkt, Activity um die Telemetrie ihrer Anwendungsberichte zu reduzieren oder wenn Sie den Enqueue Vorgang aus anderen Gründen nicht nachverfolgen möchten:

  • Erstellen (und starten) Sie ein neues Activity , anstatt den Application Insights-Vorgang zu starten. Sie müssen ihm keine Eigenschaften zuweisen, mit Ausnahme des Vorgangsnamens.
  • Serialisieren Sie yourActivity.Id in die Nachrichtennutzlast anstelle von operation.Telemetry.Id. Sie können auch Activity.Current.Id verwenden.

Ebenso können andere Warteschlangenvorgänge instrumentiert werden. Ein Vorschauvorgang sollte auf ähnliche Weise wie eine Dequeue-Operation instrumentiert werden. Die Instrumentierung von Warteschlangenverwaltungsvorgängen ist nicht erforderlich. Application Insights verfolgt Vorgänge wie HTTP und in den meisten Fällen reicht es aus.

Stellen Sie beim Löschen von Nachrichten sicher, dass Sie die Bezeichner für den Vorgang (Korrelation) festlegen. Alternativ können Sie die Activity API verwenden. Dann müssen Sie keine Vorgangsbezeichner für die Telemetrieelemente festlegen, da das Application Insights SDK dies für Sie erledigt:

  • Erstellen Sie ein neues Activity Element, nachdem Sie ein Element aus der Warteschlange erhalten haben.
  • Wird verwendet Activity.SetParentId(message.ParentId) , um Verbraucher- und Produzentenprotokolle zu korrelieren.
  • Starten Sie das Activity.
  • Nachverfolgen von Dequeue-, Prozess- und Löschvorgängen mithilfe von Start/StopOperation Hilfsern. Führen Sie dies aus demselben asynchronen Steuerungsfluss (Ausführungskontext) aus. Auf diese Weise werden sie korrekt korreliert.
  • Beenden Sie die Activity.
  • Manuelles Verwenden Start/StopOperation oder Anrufen der Track Telemetrie.
Abhängigkeitstypen

Application Insights verwendet Abhängigkeitstyp zum Anpassen von Ui-Oberflächen. Bei Warteschlangen erkennt sie die folgenden Typen, DependencyTelemetry die die Transaktionsdiagnose verbessern:

  • Azure queue für Azure Storage-Warteschlangen
  • Azure Event Hubs für Azure Event Hubs
  • Azure Service Bus für Azure Service Bus
Batchverarbeitung

Bei einigen Warteschlangen können Sie mehrere Nachrichten mit einer Anforderung aufheben. Die Verarbeitung solcher Nachrichten ist vermutlich unabhängig und gehört zu den verschiedenen logischen Vorgängen. Es ist nicht möglich, den Dequeue Vorgang mit einer bestimmten Nachricht zu korrelieren, die verarbeitet wird.

Jede Nachricht sollte in einem eigenen asynchronen Kontrollfluss verarbeitet werden. Weitere Informationen finden Sie im Abschnitt " Nachverfolgung ausgehender Abhängigkeiten ".

Lang ausgeführte Hintergrundaufgaben

Einige Anwendungen starten lang ausgeführte Vorgänge, die möglicherweise durch Benutzeranforderungen verursacht werden. Aus der Sicht der Ablaufverfolgung/Instrumentierung unterscheidet sich dies nicht von der Anforderungs- oder Abhängigkeitsinstrumentation:

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 diesem Beispiel telemetryClient.StartOperation wird der Korrelationskontext erstellt DependencyTelemetry und gefüllt. Angenommen, Sie haben einen übergeordneten Vorgang, der von eingehenden Anforderungen erstellt wurde, die den Vorgang geplant haben. BackgroundTask Solange derselbe asynchrone Kontrollfluss wie eine eingehende Anforderung beginnt, wird er mit diesem übergeordneten Vorgang korreliert. BackgroundTask und alle geschachtelten Telemetrieelemente werden automatisch mit der Anforderung korreliert, die dies verursacht hat, auch nachdem die Anforderung beendet wurde.

Wenn die Aufgabe mit dem Hintergrundthread beginnt, dem kein Vorgang (Activity) zugeordnet ist, BackgroundTask hat er kein übergeordnetes Element. Es kann jedoch geschachtelte Vorgänge haben. Alle telemetrieelemente, die von der Aufgabe gemeldet wurden, werden mit der DependencyTelemetry erstellten BackgroundTaskin korreliert.

Nachverfolgung ausgehender Abhängigkeiten

Sie können Ihre eigene Abhängigkeitsart oder einen Vorgang nachverfolgen, der von Application Insights nicht unterstützt wird.

Die Enqueue Methode in der Servicebus-Warteschlange oder die Speicherwarteschlange kann als Beispiele für eine solche benutzerdefinierte Nachverfolgung dienen.

Der allgemeine Ansatz für die benutzerdefinierte Abhängigkeitsnachverfolgung lautet:

  • Rufen Sie die TelemetryClient.StartOperation (Erweiterungs)-Methode auf, die die eigenschaften ausfüllt, die DependencyTelemetry für die Korrelation und einige andere Eigenschaften erforderlich sind, z. B. Start, Zeitstempel und Dauer.
  • Legen Sie weitere benutzerdefinierte Eigenschaften für den DependencyTelemetryNamen und einen anderen benötigten Kontext fest.
  • Führen Sie einen Abhängigkeitsaufruf aus, und warten Sie darauf.
  • Beenden Sie den Vorgang, StopOperation wenn er abgeschlossen ist.
  • Behandeln von Ausnahmen.
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.
        }
    }
}

Durch das Löschen eines Vorgangs wird der Vorgang beendet, sodass Sie den Vorgang möglicherweise anstelle eines Aufrufs StopOperationausführen.

Warnung

In einigen Fällen kann eine unbehandelte Ausnahme verhindernfinally , dass sie aufgerufen wird, sodass Vorgänge möglicherweise nicht nachverfolgt werden.

Parallele Verarbeitung und Nachverfolgung von Vorgängen

Durch Das Aufrufen StopOperation wird nur der Vorgang beendet, der gestartet wurde. Wenn der aktuelle ausgeführte Vorgang nicht mit dem Vorgang übereinstimmt, den Sie beenden möchten, StopOperation führt nichts aus. Diese Situation kann auftreten, wenn Sie mehrere Vorgänge parallel im gleichen Ausführungskontext starten.

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;

Stellen Sie sicher, dass Sie den Vorgang immer in derselben asynchronen Methode aufrufen StartOperation und verarbeiten, um Vorgänge zu isolieren, die parallel ausgeführt werden. Wenn der Vorgang synchron (oder nicht asynchron) ist, schließen Sie den Prozess um und verfolgen sie mit 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);
}

ApplicationInsights-Vorgänge vs. System.Diagnostics.Activity

System.Diagnostics.Activity stellt den Kontext der verteilten Ablaufverfolgung dar und wird von Frameworks und Bibliotheken verwendet, um Kontext innerhalb und außerhalb des Prozesses zu erstellen und zu verteilen und Telemetrieelemente zu korrelieren. Activity arbeitet zusammen mit System.Diagnostics.DiagnosticSource dem Benachrichtigungsmechanismus zwischen dem Framework/der Bibliothek, um interessante Ereignisse wie eingehende oder ausgehende Anforderungen und Ausnahmen zu benachrichtigen.

Aktivitäten sind erstklassige Bürger in Application Insights. Automatische Abhängigkeit und Anforderungssammlung basieren stark auf sie zusammen mit DiagnosticSource Ereignissen. Wenn Sie in Ihrer Anwendung erstellt haben Activity , würde dies nicht dazu führen, dass Application Insights-Telemetrie erstellt wird. Application Insights muss Ereignisse empfangen DiagnosticSource und die Ereignisnamen und Nutzlasten kennen, die in Telemetrie übersetzt werden Activity .

Jeder Application Insights-Vorgang (Anforderung oder Abhängigkeit) umfasst Activity. Wenn StartOperation sie aufgerufen wird, wird sie darunter erstellt Activity . StartOperation ist die empfohlene Methode zum manuellen Nachverfolgen von Anforderungs- oder Abhängigkeits-Telemetriedaten und sicherstellen, dass alles korreliert ist.

Indikatoren in Application Insights

Application Insights unterstützt Leistungsindikatoren und Ereigniszähler. Dieses Handbuch bietet eine Übersicht über beide Anwendungen, einschließlich Zweck, Konfiguration und Verwendung in .NET-Anwendungen.

Überblick

  • Leistungsindikatoren sind in das Windows-Betriebssystem integriert und bieten vordefinierte Metriken wie CPU-Auslastung, Arbeitsspeicherverbrauch und Datenträgeraktivität. Diese Leistungsindikatoren eignen sich ideal für die Überwachung von Standardleistungsmetriken mit minimalem Setup. Sie unterstützen das Nachverfolgen der Ressourcenauslastung oder die Problembehandlung von Engpässen auf Systemebene in Windows-basierten Anwendungen, unterstützen jedoch keine benutzerdefinierten anwendungsspezifischen Metriken.

  • Ereigniszähler funktionieren auf mehreren Plattformen, einschließlich Windows, Linux und macOS. Sie ermöglichen Es Entwicklern, einfache, anpassbare anwendungsspezifische Metriken zu definieren und zu überwachen, die mehr Flexibilität als Leistungsindikatoren bieten. Ereignisindikatoren sind nützlich, wenn Systemmetriken unzureichend sind oder detaillierte Telemetrie in plattformübergreifenden Anwendungen benötigt wird. Sie erfordern eine explizite Implementierung und Konfiguration, was die Einrichtung intensiver macht.

Leistungsindikatoren

Windows stellt verschiedene Leistungsindikatoren bereit, z. B. zum Sammeln von Prozessor-, Arbeitsspeicher- und Datenträgernutzungsstatistiken. Sie können auch eigene Leistungsindikatoren definieren.

Ihre Anwendung unterstützt die Leistungsindikatorsammlung, wenn sie unter Internetinformationsserver (IIS) auf einem lokalen Host oder einem virtuellen Computer mit Administratorzugriff ausgeführt wird. Anwendungen, die als Azure Web Apps ausgeführt werden, können nicht direkt auf Leistungsindikatoren zugreifen, aber Application Insights sammelt eine Teilmenge der verfügbaren Leistungsindikatoren.

Tipp

Wie andere Metriken können Sie eine Warnung festlegen , um zu warnen, wenn ein Zähler außerhalb eines angegebenen Grenzwerts liegt. Um eine Warnung festzulegen, öffnen Sie den Bereich "Warnungen ", und wählen Sie "Benachrichtigung hinzufügen" aus.

Voraussetzungen

Gewähren Sie dem App-Pooldienstkonto die Berechtigung zum Überwachen von Leistungsindikatoren, indem Sie es der Gruppe "Benutzer überwachen" hinzufügen.

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

Anzeigen von Leistungsindikatoren

Der Bereich "Metriken " zeigt den Standardsatz von Leistungsindikatoren an.

Standardzähler für ASP.NET Webanwendungen:

  • % Prozess\Prozessorzeit
  • % Prozess\Prozessorzeit normalisiert
  • Arbeitsspeicher\Verfügbare Bytes
  • ASP.NET Anforderungen/Sek.
  • .NET Common Language Runtime (CLR) Ausnahmen ausgelöst/ Sek.
  • ausführungszeit für ASP.NET ApplicationsRequest
  • Prozess\Private Bytes
  • Prozess\E/A-Datenbyte/Sek.
  • ASP.NET Anwendungen\Anforderungen in der Anwendungswarteschlange
  • Prozessorzeit(_Total)\% Prozessorzeit

Hinzufügen von Leistungsindikatoren

Wenn der gewünschte Leistungsindikator nicht in der Liste der Metriken enthalten ist, können Sie ihn hinzufügen.

Option 1: Konfiguration in ApplicationInsights.config

  1. Erfahren Sie, welche Leistungsindikatoren auf Ihrem Server verfügbar sind, indem Sie diesen PowerShell-Befehl auf dem lokalen Server verwenden:

    Get-Counter -ListSet *
    

    Weitere Informationen finden Sie unter Get-Counter.

  2. Öffnen Sie ApplicationInsights.config.

    Wenn Sie Ihrer App während der Entwicklung Application Insights hinzugefügt haben:

    1. Bearbeiten Sie ApplicationInsights.config das Projekt.
    2. Stellen Sie sie auf Ihren Servern erneut bereit.
  3. Bearbeiten Sie die Leistungssammlerdirektive:

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

Sie erfassen sowohl Standardzähler als auch Indikatoren, die Sie selbst implementieren. \Objects\Processes ist ein Beispiel für einen Standardzähler, der auf allen Windows-Systemen verfügbar ist. \Sales(photo)\# Items Sold ist ein Beispiel für einen benutzerdefinierten Leistungsindikator, der in einem Webdienst implementiert werden kann.

Das Format ist \Category(instance)\Counteroder für Kategorien, die keine Instanzen haben, nur \Category\Counter.

Der ReportAs Parameter ist für Zählernamen erforderlich, die nicht übereinstimmen [a-zA-Z()/-_ \.]+.

Wenn Sie eine Instanz angeben, wird sie zu einer Dimension CounterInstanceName der gemeldeten Metrik.

Option 2: Konfiguration im Code

Weitere Informationen finden Sie im folgenden Abschnitt.

Erfassen von Leistungsindikatoren im Code für ASP.NET Webanwendungen oder .NET/.NET Core-Konsolenanwendungen

Um Systemleistungsindikatoren zu sammeln und an Application Insights zu senden, können Sie den folgenden Codeausschnitt anpassen:

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

Oder Sie können dasselbe mit benutzerdefinierten Metriken tun, die Sie erstellt haben:

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

Leistungsindikatoren für Anwendungen, die in Azure Web Apps und Windows-Containern in Azure App Service ausgeführt werden

Sowohl ASP.NET als auch ASP.NET Core-Anwendungen, die in Azure Web Apps bereitgestellt werden, werden in einer speziellen Sandkastenumgebung ausgeführt. Anwendungen, die in Azure App Service bereitgestellt werden, können einen Windows-Container verwenden oder in einer Sandkastenumgebung gehostet werden. Wenn die Anwendung in einem Windows-Container bereitgestellt wird, sind alle Standardleistungsindikatoren im Containerimage verfügbar.

Die Sandkastenumgebung lässt keinen direkten Zugriff auf Systemleistungsindikatoren zu. Eine begrenzte Teilmenge von Leistungsindikatoren wird jedoch als Umgebungsvariablen verfügbar gemacht, wie in Perf-Leistungsindikatoren beschrieben, die als Umgebungsvariablen verfügbar gemacht werden. In dieser Umgebung ist nur eine Teilmenge von Leistungsindikatoren verfügbar. Die vollständige Liste finden Sie unter "Perf Counters", die als Umgebungsvariablen verfügbar gemacht werden.

Das Application Insights SDK für ASP.NET und ASP.NET Core erkennt, ob Code in einer Web-App oder einem Nicht-Windows-Container bereitgestellt wird. Die Erkennung bestimmt, ob leistungsindikatoren in einer Sandkastenumgebung erfasst oder der Standardsammlungsmechanismus verwendet wird, wenn sie auf einem Windows-Container oder virtuellen Computer gehostet wird.

Protokollanalyseabfragen für Leistungsindikatoren

Sie können Leistungsindikatorberichte in Log Analytics durchsuchen und anzeigen.

Das PerformanceCounters-Schema macht den Namen category und counter den instanceNamen der einzelnen Leistungsindikatoren verfügbar. In der Telemetrie für jede Anwendung werden nur die Leistungsindikatoren für diese Anwendung angezeigt. Um beispielsweise zu sehen, welche Leistungsindikatoren verfügbar sind:

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

Instance Hier bezieht sich auf die Instanz des Leistungsindikators, nicht auf die Rolle oder die Servercomputerinstanz. Der Name der Instanz des Leistungsindikators segmentiert in der Regel Segmente, z. B. Prozessorzeit, anhand des Namens des Prozesses oder der Anwendung.

So rufen Sie ein Diagramm des verfügbaren Speichers über den letzten Zeitraum ab:

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

Wie bei anderen Telemetriedaten verfügt performanceCounters auch über eine Spalte cloud_RoleInstance , die die Identität der Hostserverinstanz angibt, auf der Ihre App ausgeführt wird. Um beispielsweise die Leistung Ihrer App auf den verschiedenen Computern zu vergleichen:

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

Häufig gestellte Fragen zu Leistungsindikatoren

Informationen zum Überprüfen häufig gestellter Fragen (FAQ) finden Sie unter Häufig gestellte Fragen zu Leistungsindikatoren.

Ereignisindikatoren

EventCounter ist .NET/.NET Core-Mechanismus zum Veröffentlichen und Nutzen von Leistungsindikatoren oder Statistiken. EventCounters werden auf allen Betriebssystemplattformen unterstützt – Windows, Linux und macOS. Es kann als plattformübergreifendes Äquivalent für performanceCounters betrachtet werden, das nur in Windows-Systemen unterstützt wird.

Während Benutzer alle benutzerdefinierten Ereigniszähler veröffentlichen können, um ihre Anforderungen zu erfüllen, veröffentlicht .NET standardmäßig eine Reihe dieser Leistungsindikatoren. In diesem Dokument werden die Schritte zum Sammeln und Anzeigen von Ereigniszählern (systemdefiniert oder benutzerdefiniert) in Azure Application Insights erläutert.

Tipp

Wie andere Metriken können Sie eine Warnung festlegen , um zu warnen, wenn ein Zähler außerhalb eines angegebenen Grenzwerts liegt. Um eine Warnung festzulegen, öffnen Sie den Bereich "Warnungen ", und wählen Sie "Benachrichtigung hinzufügen" aus.

Verwenden von Application Insights zum Sammeln von EventCounters

Application Insights unterstützt das Sammeln EventCounters mit seinem EventCounterCollectionModulePaket , das Teil des neu veröffentlichten NuGet-Pakets "Microsoft.ApplicationInsights.EventCounterCollector" ist. EventCounterCollectionModule wird bei Verwendung von AspNetCore oder WorkerService automatisch aktiviert. EventCounterCollectionModule erfasst Indikatoren mit einer nicht konfigurierten Sammlungshäufigkeit von 60 Sekunden. Es sind keine speziellen Berechtigungen zum Sammeln von EventCounters erforderlich. Für ASP.NET Core-Anwendungen möchten Sie auch das Microsoft.ApplicationInsights.AspNetCore-Paket hinzufügen.

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

Gesammelte Standardindikatoren

Ab der Version 2.15.0 von AspNetCore SDK oder WorkerService SDK werden standardmäßig keine Indikatoren erfasst. Das Modul selbst ist aktiviert, sodass Benutzer die gewünschten Zähler hinzufügen können, um sie zu sammeln.

Eine Liste bekannter Leistungsindikatoren, die von .NET Runtime veröffentlicht werden, finden Sie im Dokument "Verfügbare Leistungsindikatoren ".

Anpassen der zu erfassenden Leistungsindikatoren

Das folgende Beispiel zeigt, wie Zähler hinzugefügt/entfernt werden. Diese Anpassung erfolgt im Rahmen der Anwendungsdienstkonfiguration, nachdem die Telemetriesammlung von Application Insights entweder AddApplicationInsightsTelemetry() oder AddApplicationInsightsWorkerService(). Nachfolgend sehen Sie einen Beispielcode aus einer ASP.NET Core-Anwendung. Weitere Arten von Anwendungen finden Sie in diesem Dokument.

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

Deaktivieren des EventCounter-Auflistungsmoduls

EventCounterCollectionModule kann mithilfe von ApplicationInsightsServiceOptions.

Im folgenden Beispiel wird das ASP.NET Core SDK verwendet.

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

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

Ein ähnlicher Ansatz kann auch für das WorkerService SDK verwendet werden, aber der Namespace muss geändert werden, wie im folgenden Beispiel gezeigt.

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

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

Protokollanalyseabfragen für Ereignisindikatoren

Sie können Ereigniszählerberichte in Log Analytics in der customMetrics-Tabelle durchsuchen und anzeigen.

Führen Sie z. B. die folgende Abfrage aus, um zu sehen, welche Indikatoren gesammelt werden und für die Abfrage verfügbar sind:

customMetrics | summarize avg(value) by name

Führen Sie die folgende Abfrage aus, um ein Diagramm eines bestimmten Indikators (z. B.: ThreadPool Completed Work Item Count) über den letzten Zeitraum abzurufen.

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

Wie bei anderen Telemetriedaten verfügt customMetrics auch über eine Spalte cloud_RoleInstance , die die Identität der Hostserverinstanz angibt, auf der Ihre App ausgeführt wird. Die vorherige Abfrage zeigt den Leistungsindikatorwert pro Instanz an und kann verwendet werden, um die Leistung verschiedener Serverinstanzen zu vergleichen.

Häufig gestellte Fragen zu Ereignisindikatoren

Informationen zum Überprüfen häufig gestellter Fragen (FAQ) finden Sie unter Häufig gestellte Fragen zu Ereignisindikatoren.

Konfigurieren des Application Insights SDK

In diesem Abschnitt

Sie können das Application Insights SDK für ASP.NET und ASP.NET Core anpassen, um die Standardkonfiguration zu ändern.

Das Application Insights .NET SDK besteht aus vielen NuGet-Paketen. Das Kernpaket stellt die API zum Senden von Telemetrie an die Application Insights bereit. Weitere Pakete bieten Telemetriemodule und Initialisierer zum automatischen Nachverfolgen von Telemetriedaten aus Ihrer Anwendung und ihrem Kontext. Durch Anpassen der Konfigurationsdatei können Sie Telemetriemodule und Initialisierer aktivieren oder deaktivieren. Sie können auch Parameter für einige festlegen.

Die Konfigurationsdatei ist benannt ApplicationInsights.config oder ApplicationInsights.xml. Der Name hängt vom Typ Ihrer Anwendung ab. Es wird ihrem Projekt automatisch hinzugefügt, wenn Sie die meisten Versionen des SDK installieren.

Wenn Sie die automatisierte Benutzeroberfläche aus den Visual Studio-Vorlagenprojekten verwenden, die Die Telemetrie zum Hinzufügen> vonAnwendungseinblicken unterstützen, wird die ApplicationInsights.config Datei im Projektstammordner erstellt. Nach der Kompilierung wird sie in den Ordner "bin" kopiert. Sie wird auch einer Web-App von Application Insights Agent auf einem IIS-Server hinzugefügt.

Wichtig

Die Konfigurationsdatei wird ignoriert, wenn die Erweiterung für Azure-Websites oder die Erweiterung für Azure-VMs und VM-Skalierungsgruppen verwendet wird.

Es gibt keine entsprechende Datei zum Steuern des SDK auf einer Webseite.

Telemetriekanäle

Telemetriekanäle sind ein integraler Bestandteil der Application Insights SDKs. Sie verwalten Pufferung und Übertragung von Telemetrie an den Application Insights-Dienst. Die .NET- und .NET Core-Versionen der SDKs verfügen über zwei integrierte Telemetriekanäle: InMemoryChannel und ServerTelemetryChannel. In diesem Artikel werden die einzelnen Kanäle beschrieben und das Anpassen des Kanalverhaltens veranschaulicht.

Hinweis

Informationen zum Überprüfen häufig gestellter Fragen (FAQ) finden Sie in den häufig gestellten Fragen zu Telemetriekanälen

Was sind Telemetriekanäle?

Telemetriekanäle sind für das Puffern von Telemetrieelementen und das Senden an den Application Insights-Dienst verantwortlich, in dem sie für Abfragen und Analysen gespeichert sind. Ein Telemetriekanal ist eine beliebige Klasse, die die Microsoft.ApplicationInsights.ITelemetryChannel Schnittstelle implementiert.

Die Send(ITelemetry item) Methode eines Telemetriekanals wird aufgerufen, nachdem alle Telemetrieinitialisierer und Telemetrieprozessoren aufgerufen wurden. Daher erreichen alle elemente, die von einem Telemetrieprozessor gelöscht wurden, nicht den Kanal. Die Send() Methode sendet die Elemente nicht sofort an das Back-End. In der Regel werden sie im Arbeitsspeicher gepuffert und in Batches zur effizienten Übertragung gesendet.

Vermeiden Sie anrufe Flush() , es sei denn, es ist wichtig, die gepufferte Telemetrie sofort zu senden. Verwenden Sie sie nur in Szenarien wie Herunterfahren der Anwendung, Ausnahmebehandlung oder bei Verwendung von kurzlebigen Prozessen wie Hintergrundaufträgen oder Befehlszeilentools. In Webanwendungen oder lang ausgeführten Diensten verarbeitet das SDK das sendende Telemetrie automatisch. Das Unnötige Aufrufen Flush() kann zu Leistungsproblemen führen.

Live Metrics Stream verfügt auch über einen benutzerdefinierten Kanal, der das Livestreaming der Telemetrie ermöglicht. Dieser Kanal ist unabhängig vom regulären Telemetriekanal, und dieses Dokument gilt nicht für diesen Kanal.

Integrierte Telemetriekanäle

Die Application Insights .NET- und .NET Core-SDKs werden mit zwei integrierten Kanälen ausgeliefert:

  • InMemoryChannel: Ein einfacher Kanal, in dem Elemente im Arbeitsspeicher gepuffert werden, bis sie gesendet werden. Elemente werden im Arbeitsspeicher gepuffert und einmal alle 30 Sekunden geleert, oder wenn 500 Elemente gepuffert werden. Dieser Kanal bietet minimale Zuverlässigkeitsgarantien, da das Senden von Telemetrie nach einem Fehler nicht wiederholt wird. Dieser Kanal behält auch keine Elemente auf dem Datenträger bei. Daher gehen alle nicht gesendeten Elemente beim Herunterfahren der Anwendung dauerhaft verloren, unabhängig davon, ob sie ordnungsgemäß ist oder nicht. Dieser Kanal implementiert eine Flush() Methode, mit der alle im Arbeitsspeicher enthaltenen Telemetrieelemente synchron erzwungen werden können. Dieser Kanal eignet sich gut für Kurzlaufanwendungen, bei denen eine synchrone Spülung ideal ist.

    Dieser Kanal ist Teil des größeren Microsoft.ApplicationInsights NuGet-Pakets und ist der Standardkanal, den das SDK verwendet, wenn nichts anderes konfiguriert ist.

  • ServerTelemetryChannel: Ein erweiterter Kanal mit Wiederholungsrichtlinien und der Funktion zum Speichern von Daten auf einem lokalen Datenträger. Dieser Kanal ruft das Senden von Telemetrie erneut auf, wenn vorübergehende Fehler auftreten. Dieser Kanal verwendet auch lokalen Datenträgerspeicher, um Elemente während Netzwerkausfällen oder hohen Telemetrievolumes auf dem Datenträger zu speichern. Aufgrund dieser Wiederholungsmechanismen und des lokalen Datenträgerspeichers gilt dieser Kanal als zuverlässiger. Es wird für alle Produktionsszenarien empfohlen. Dieser Kanal ist die Standardeinstellung für ASP.NET und ASP.NET Core-Anwendungen, die gemäß der offiziellen Dokumentation konfiguriert sind. Dieser Kanal ist für Serverszenarien mit langen Prozessen optimiert. Die Flush() von diesem Kanal implementierte Methode ist nicht synchron.

    Dieser Kanal wird als Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet-Paket ausgeliefert und automatisch abgerufen, wenn Sie entweder das Microsoft.ApplicationInsights.Web- oder Microsoft.ApplicationInsights.AspNetCore NuGet-Paket verwenden.

Konfigurieren eines Telemetriekanals

Sie konfigurieren einen Telemetriekanal, indem Sie ihn auf die aktive Telemetriekonfiguration festlegen. Bei ASP.NET Anwendungen muss die Konfiguration die Telemetriekanalinstanz auf TelemetryConfiguration.Active oder durch Ändern ApplicationInsights.configfestlegen. Für ASP.NET Core-Anwendungen umfasst die Konfiguration das Hinzufügen des Kanals zum Container zum Einfügen von Abhängigkeiten.

In den folgenden Abschnitten finden Sie Beispiele für die Konfiguration der StorageFolder Einstellung für den Kanal in verschiedenen Anwendungstypen. StorageFolder ist nur eine der konfigurierbaren Einstellungen. Die vollständige Liste der Konfigurationseinstellungen finden Sie im Abschnitt "Konfigurierbare Einstellungen in Kanälen " weiter unten in diesem Artikel.

Option 1: Konfiguration im Code

Der folgende Code richtet eine ServerTelemetryChannel Instanz ein, die StorageFolder auf einen benutzerdefinierten Speicherort festgelegt ist. Fügen Sie diesen Code am Anfang der Anwendung hinzu, in der Regel in der Application_Start() Methode 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;
}

Option 2: Konfiguration in ApplicationInsights.config

Der folgende Abschnitt aus ApplicationInsights.config zeigt den Kanal an, der ServerTelemetryChannel für StorageFolder einen benutzerdefinierten Speicherort konfiguriert ist:

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

Konfiguration im Code für Konsolenanwendungen

Bei Konsolen-Apps ist der Code für .NET und .NET Core identisch:

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

Betriebsdetails von ServerTelemetryChannel

ServerTelemetryChannel speichert eingehende Elemente in einem Speicherpuffer. Die Elemente werden einmal alle 30 Sekunden serialisiert, komprimiert und in einer Transmission Instanz gespeichert, oder wenn 500 Elemente gepuffert werden. Eine einzelne Transmission Instanz enthält bis zu 500 Elemente und stellt einen Batch von Telemetrie dar, der über einen einzelnen HTTPS-Aufruf an den Application Insights-Dienst gesendet wird.

Standardmäßig können maximal 10 Transmission Instanzen parallel gesendet werden. Wenn Telemetrie schneller eintrifft oder das Netzwerk oder das Application Insights-Back-End langsam ist, Transmission werden Instanzen im Arbeitsspeicher gespeichert. Die Standardkapazität dieses Speicherpuffers Transmission beträgt 5 MB. Wenn die In-Memory-Kapazität überschritten wird, Transmission werden Instanzen auf einem lokalen Datenträger bis zu einem Grenzwert von 50 MB gespeichert.

Transmission Instanzen werden auch auf dem lokalen Datenträger gespeichert, wenn Netzwerkprobleme auftreten. Nur die Elemente, die auf einem lokalen Datenträger gespeichert sind, überleben einen Anwendungsabsturz. Sie werden immer dann gesendet, wenn die Anwendung erneut gestartet wird. Wenn Netzwerkprobleme weiterhin bestehen, wird eine exponentielle Backofflogik verwendet, ServerTelemetryChannel die zwischen 10 Sekunden und 1 Stunde liegt, bevor Sie die Telemetrie erneut senden.

Konfigurierbare Einstellungen in Kanälen

Eine vollständige Liste der konfigurierbaren Einstellungen für jeden Kanal finden Sie unter:

Hier sind die am häufigsten verwendeten Einstellungen für ServerTelemetryChannel:

  • MaxTransmissionBufferCapacity: Die maximale Speichermenge in Bytes, die vom Kanal zum Puffern von Übertragungen im Arbeitsspeicher verwendet wird. Wenn diese Kapazität erreicht ist, werden neue Elemente direkt auf dem lokalen Datenträger gespeichert. Der Standardwert ist 5 MB. Das Festlegen eines höheren Werts führt zu einer geringeren Datenträgerauslastung, aber denken Sie daran, dass Elemente im Arbeitsspeicher verloren gehen, wenn die Anwendung abstürzt.

  • MaxTransmissionSenderCapacity: Die maximale Anzahl von Transmission Instanzen, die gleichzeitig an Application Insights gesendet werden. Der Standardwert ist 10. Diese Einstellung kann auf eine höhere Zahl konfiguriert werden, die empfohlen wird, wenn ein großes Volumen an Telemetrie generiert wird. Ein hohes Volumen tritt in der Regel während der Auslastungstests oder beim Deaktivieren des Samplings auf.

  • StorageFolder: Der Ordner, der vom Kanal zum Speichern von Elementen auf dem Datenträger nach Bedarf verwendet wird. In Windows wird entweder %LOCALAPPDATA% oder %TEMP% verwendet, wenn kein anderer Pfad explizit angegeben wird. In anderen Umgebungen als Windows müssen Sie einen gültigen Speicherort oder eine gültige Telemetrie angeben, die nicht auf einem lokalen Datenträger gespeichert ist.

Welchen Kanal sollte ich verwenden?

Wir empfehlen ServerTelemetryChannel für die meisten Produktionsszenarien, die lange ausgeführte Anwendungen umfassen. Weitere Informationen zum Leeren der Telemetrie finden Sie unter Verwendung.Flush()

Gründe für die Verwendung von Flush()

Die Flush() Methode sendet alle gepufferten Telemetrie sofort. Es sollte jedoch nur in bestimmten Szenarien verwendet werden.

Verwenden Sie Flush() folgendes:

  • Die Anwendung wird heruntergefahren, und Sie möchten sicherstellen, dass Telemetrie vor dem Beenden gesendet wird.
  • Sie befinden sich in einem Ausnahmehandler und müssen garantieren, dass Telemetrie übermittelt wird.
  • Sie schreiben einen kurzlebigen Prozess wie einen Hintergrundauftrag oder ein CLI-Tool, das schnell beendet wird.

Vermeiden Sie die Verwendung Flush() in lang ausgeführten Anwendungen wie Webdiensten. Das SDK verwaltet die Pufferung und Übertragung automatisch. Das Unnötige Aufrufen Flush() kann zu Leistungsproblemen führen und garantiert nicht, dass alle Daten gesendet werden, insbesondere bei der Verwendung ServerTelemetryChannel, die nicht synchron geleert wird.

Telemetriemodule

Application Insights erfasst automatisch Telemetriedaten zu bestimmten Workloads, ohne dass eine manuelle Nachverfolgung durch den Benutzer erforderlich ist.

Die unten aufgeführten Module für die automatische Sammlung sind standardmäßig aktiviert. Sie können sie deaktivieren oder ihr Standardverhalten anpassen.

Jedes Telemetriemodul sammelt einen bestimmten Datentyp und verwendet die Kern-API zum Senden der Daten. Die Module werden von verschiedenen NuGet-Paketen installiert, die auch die erforderlichen Zeilen zur .config Datei hinzufügen.

Area BESCHREIBUNG
Anforderungsnachverfolgung Erfasst Die Anforderungstelemetrie (Antwortzeit, Ergebniscode) für eingehende Webanforderungen.

Modul:Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Nachverfolgung von Abhängigkeiten Erfasst Telemetriedaten zu ausgehenden Abhängigkeiten (HTTP-Aufrufe, SQL-Aufrufe). Um in IIS zu arbeiten, installieren Sie den Application Insights-Agent. Sie können auch benutzerdefinierte Abhängigkeitsnachverfolgung mithilfe der TrackDependency-API schreiben. Unterstützt die automatische Instrumentierung mit app Service - und VMSS-Überwachung.

Modul:Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.DependencyCollector
Leistungsindikatoren Erfasst Windows-Leistungsindikatoren (CPU, Arbeitsspeicher, Netzwerklast von IIS-Installationen). Geben Sie an, welche Leistungsindikatoren (einschließlich benutzerdefinierter Indikatoren) angezeigt werden. Weitere Informationen finden Sie unter "Erfasst Systemleistungsindikatoren".

Modul:Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule
NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
Ereigniszähler Erfasst .NET EventCounters. Empfohlen für ASP.NET Core und plattformübergreifend anstelle von Windows-Perf-Leistungsindikatoren.

Modul:EventCounterCollectionModule (SDK ≥ 2.8.0)
Live Metrics (QuickPulse) Erfasst Telemetrie für den Bereich "Livemetriken".

Modul:QuickPulseTelemetryModule
Takte (App-Dienst) Sendet Takte und benutzerdefinierte Metriken für die App Service-Umgebung.

Modul:AppServicesHeartbeatTelemetryModule
Takte (VM/VMSS) Sendet Takte und benutzerdefinierte Metriken für die Azure-VM-Umgebung.

Modul:AzureInstanceMetadataTelemetryModule
Diagnose-Telemetrie Meldet Fehler im Application Insights-Instrumentierungscode (z. B. fehlende Leistungsindikatoren, ITelemetryInitializer Ausnahmen). Die Ablaufverfolgungs-Telemetrie wird in der Diagnosesuche angezeigt.

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

Anmerkung: Wenn Sie dieses Paket nur installieren, wird die ApplicationInsights.config Datei nicht automatisch erstellt.
Entwicklermodus (angefügter Debugger) Erzwingt TelemetryChannel das sofortige Senden von Elementen, wenn der Debugger angefügt ist. Verringert die Latenz, erhöht jedoch den CPU-/Netzwerkaufwand.

Modul:Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule
NuGet:Application Insights Windows Server
Ausnahmeverfolgung (Web) Verfolgt unbehandelte Ausnahmen in Web-Apps. Siehe Fehler und Ausnahmen.

Modul:Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Ausnahmenachverfolgung (nicht überwacht/nicht behandelt) Verfolgt unobservierte Aufgaben ausnahmen und unbehandelte Ausnahmen für Arbeitsrollen, Windows-Dienste und Konsolen-Apps nach.

Module:
 • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule
 • Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule
NuGet:Microsoft.ApplicationInsights.WindowsServer
EventSource-Nachverfolgung Sendet konfigurierte EventSource-Ereignisse als Ablaufverfolgungen an Application Insights.

Modul:Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule
NuGet:Microsoft.ApplicationInsights.EventSourceListener
ETW-Sammler Sendet konfigurierte ETW-Anbieterereignisse als Ablaufverfolgungen an Application Insights.

Modul:Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule
NuGet:Microsoft.ApplicationInsights.EtwCollector
Kern-API (kein Modul) Kern-API , die von anderen Telemetriekomponenten und für benutzerdefinierte Telemetrie verwendet wird.

Modul:Microsoft.ApplicationInsights package
NuGet:Microsoft.ApplicationInsights
Anmerkung: Wenn Sie dieses Paket nur installieren, wird die ApplicationInsights.config Datei nicht automatisch erstellt.

Konfigurieren von Telemetriemodulen

Verwenden Sie den TelemetryModules Abschnitt in ApplicationInsights.config , um Module zu konfigurieren, hinzuzufügen oder zu entfernen. Die folgenden Beispiele:

  • Konfigurieren DependencyTrackingTelemetryModule (W3C-Headereinfügung aktivieren).
  • Konfigurieren EventCounterCollectionModule (Standardeinstellungen löschen und einen einzelnen Zähler hinzufügen).
  • Deaktivieren Sie die Sammlung perf-Counter, indem Sie sie entfernen 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>

Hinweis

Der genaue Satz von Modulen, die in Ihrem ApplicationInsights.config Modul vorhanden sind, hängt davon ab, welche SDK-Pakete Sie installiert haben.

Telemetrie deaktivieren

Es gibt einen Knoten in der Konfigurationsdatei für jedes Modul. Um ein Modul zu deaktivieren, löschen Sie den Knoten, oder kommentieren Sie es aus.

Telemetrieinitialisierer

Verwenden Sie Telemetrieinitialisierer, um Telemetrie mit zusätzlichen Informationen zu erweitern oder Telemetrieeigenschaften zu überschreiben, die von den Standard-Telemetriemodulen festgelegt wurden.

Telemetrieinitialisierer legen Kontexteigenschaften fest, die zusammen mit jedem Telemetrieelement gesendet werden.

Sie können eigene Initialisierer schreiben , um Kontexteigenschaften festzulegen.

Die Standardinitialisierer werden entweder vom Web oder von WindowsServer NuGet-Paketen festgelegt:

Initialisierungsprogramm BESCHREIBUNG
AccountIdTelemetryInitializer Legt die AccountId Eigenschaft fest.
AuthenticatedUserIdTelemetryInitializer Legt die AuthenticatedUserId Eigenschaft fest, die vom JavaScript SDK festgelegt wird.
AzureRoleEnvironmentTelemetryInitializer Aktualisiert die RoleName Eigenschaften und RoleInstance Eigenschaften des Device Kontexts für alle Telemetrieelemente mit Informationen, die aus der Azure-Laufzeitumgebung extrahiert wurden.
BuildInfoConfigComponentVersionTelemetryInitializer Aktualisiert die Version Eigenschaft des Component Kontexts für alle Telemetrieelemente mit dem Wert, der aus der BuildInfo.config von MS Build erstellten Datei extrahiert wurde.
ClientIpHeaderTelemetryInitializer Aktualisiert die Ip Eigenschaft des Location Kontexts aller Telemetrieelemente basierend auf dem X-Forwarded-For HTTP-Header der Anforderung.
DeviceTelemetryInitializer Aktualisiert die folgenden Eigenschaften des Device Kontexts für alle Telemetrieelemente:

Type ist auf PC.
Id wird auf den Domänennamen des Computers festgelegt, auf dem die Webanwendung ausgeführt wird.
OemName wird mithilfe von WMI auf den aus dem Win32_ComputerSystem.Manufacturer Feld extrahierten Wert festgelegt.
Model wird mithilfe von WMI auf den aus dem Win32_ComputerSystem.Model Feld extrahierten Wert festgelegt.
NetworkType wird auf den aus der NetworkInterface Eigenschaft extrahierten Wert festgelegt.
Language wird auf den Namen der CurrentCulture Eigenschaft festgelegt.
DomainNameRoleInstanceTelemetryInitializer Aktualisiert die RoleInstance Eigenschaft des Device Kontexts für alle Telemetrieelemente mit dem Domänennamen des Computers, auf dem die Webanwendung ausgeführt wird.
OperationNameTelemetryInitializer Aktualisiert die Name Eigenschaft und RequestTelemetry die Name Eigenschaft des Operation Kontexts aller Telemetrieelemente basierend auf der HTTP-Methode sowie die Namen des ASP.NET MVC-Controllers und der aktion, die zum Verarbeiten der Anforderung aufgerufen wird.
OperationIdTelemetryInitializer oder OperationCorrelationTelemetryInitializer Aktualisiert die Operation.Id Kontexteigenschaft aller Telemetrieelemente, die beim Behandeln einer Anforderung mit dem automatisch generierten Element nachverfolgt werden RequestTelemetry.Id.
SessionTelemetryInitializer Aktualisiert die Id Eigenschaft des Session Kontexts für alle Telemetrieelemente, deren Wert aus dem ai_session cookie extrahiert wird, der ApplicationInsights vom JavaScript-Instrumentierungscode generiert wird, der im Browser des Benutzers ausgeführt wird.
SyntheticTelemetryInitializer oder SyntheticUserAgentTelemetryInitializer Aktualisiert die UserEigenschaften Sessionund Operation Kontexteigenschaften aller Telemetrieelemente, die bei der Behandlung einer Anforderung aus einer synthetischen Quelle nachverfolgt werden, z. B. einen Verfügbarkeitstest oder einen Suchmaschinen-Bot. Der Metrik-Explorer zeigt standardmäßig keine synthetische Telemetrie an.

Der <Filters> Satz, der die Eigenschaften der Anforderungen identifiziert.
UserTelemetryInitializer Aktualisiert die Id Eigenschaften und AcquisitionDate Eigenschaften des User Kontexts für alle Telemetrieelemente mit Werten, die aus dem ai_user Cookie extrahiert wurden, der vom JavaScript-Instrumentierungscode application Insights generiert wird, der im Browser des Benutzers ausgeführt wird.
WebTestTelemetryInitializer Legt die Benutzer-ID, Sitzungs-ID und synthetische Quelleigenschaften für HTTP-Anforderungen fest, die aus Verfügbarkeitstests stammen.

Der <Filters> Satz, der die Eigenschaften der Anforderungen identifiziert.

Hinweis

Für .NET-Anwendungen, die in Azure Service Fabric ausgeführt werden, können Sie das Microsoft.ApplicationInsights.ServiceFabric NuGet-Paket einschließen. Dieses Paket enthält eine FabricTelemetryInitializer Eigenschaft, die Service Fabric-Eigenschaften zu Telemetrieelementen hinzufügt. Weitere Informationen finden Sie auf der GitHub-Seite zu den Eigenschaften, die von diesem NuGet-Paket hinzugefügt wurden.

Informationen zum Verwenden von Telemetrieinitialisierern mit ASP.NET Anwendungen finden Sie unter "Filtern und Vorverarbeitung der Telemetrie" im Application Insights SDK.

Telemetrieprozessoren

Telemetrieprozessoren können jedes Telemetrieelement filtern und ändern, bevor es vom SDK an das Portal gesendet wird.

Informationen zum Verwenden von Telemetrieprozessoren mit ASP.NET Anwendungen finden Sie unter "Filtern und Vorverarbeitung der Telemetrie" im Application Insights SDK.

Sie können eigene Telemetrieprozessoren schreiben.

Telemetrieprozessor für adaptive Samplings (ab 2.0.0-Beta3)

Diese Funktionalität ist standardmäßig aktiviert. Wenn Ihre App erhebliche Telemetrie sendet, entfernt dieser Prozessor einige davon.


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

Der Parameter stellt das Ziel bereit, das der Algorithmus zu erreichen versucht. Jede Instanz des SDK funktioniert unabhängig. Wenn Ihr Server also ein Cluster mehrerer Computer ist, wird das tatsächliche Telemetrievolumen entsprechend multipliziert.

Weitere Informationen zum Sampling.

Telemetrieprozessor mit fester Abtastrate (ab 2.0.0-Beta1)

Es gibt auch einen standardmäßigen Sampling-Telemetrieprozessor (von 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>

Verbindungszeichenfolge

Diese Einstellung bestimmt die Application Insights-Ressource, in der Ihre Daten angezeigt werden. In der Regel erstellen Sie eine separate Ressource mit einer separaten Verbindungszeichenfolge für jede Ihrer Anwendungen.

Siehe Verbindungszeichenfolgen in Application Insights für Codebeispiele .

Wenn Sie die Verbindungszeichenfolge dynamisch festlegen möchten, um z. B. Ergebnisse aus Ihrer Anwendung an unterschiedliche Ressourcen zu senden, können Sie die Verbindungszeichenfolge aus der Konfigurationsdatei weglassen und stattdessen im Code festlegen.

Führen Sie diesen Schritt in einer Initialisierungsmethode aus, z. B. global.aspx.cs in einem ASP.NET-Dienst, um die Verbindungszeichenfolge für alle Instanzen festzulegen TelemetryClient, einschließlich Standard-Telemetriemodulen:

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

Wenn Sie einen bestimmten Satz von Ereignissen an eine andere Ressource senden möchten, können Sie den Schlüssel für einen bestimmten Telemetrieclient festlegen:


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

Um eine neue Verbindungszeichenfolge abzurufen, erstellen Sie eine neue Ressource im Application Insights-Portal.

ApplicationId-Anbieter

Hinweis

Für ASP.NET ist dieser Anbieter ab SDK v2.6.0* verfügbar.

Der Zweck dieses Anbieters besteht darin, eine Anwendungs-ID basierend auf einer Verbindungszeichenfolge nachzuschlagen. Die Anwendungs-ID ist enthalten RequestTelemetry und DependencyTelemetry wird verwendet, um die Korrelation im Portal zu ermitteln.

Diese Funktionalität ist durch Festlegen TelemetryConfiguration.ApplicationIdProviderverfügbar.

Schnittstelle: IApplicationIdProvider

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

Wir stellen zwei Implementierungen im Microsoft.ApplicationInsights SDK bereit: ApplicationInsightsApplicationIdProvider und DictionaryApplicationIdProvider.

ApplicationInsightsApplicationIdProvider

Dieser Wrapper ist für unsere Profil-API vorgesehen. Es drosselt Anforderungen und Cacheergebnisse. Dieser Anbieter wird automatisch eingeschlossen, wenn Sie entweder Microsoft.ApplicationInsights.DependencyCollector oder Microsoft.ApplicationInsights.Web installieren.

Die Klasse macht eine optionale Eigenschaft verfügbar, die aufgerufen wird ProfileQueryEndpoint. Standardmäßig ist sie auf https://dc.services.visualstudio.com/api/profiles/{0}/appId.

Wenn Sie einen Proxy konfigurieren müssen, empfehlen wir, die Basisadresse zu proxyen und sicherzustellen, dass der Pfad eingeschlossen ist /api/profiles/{0}/appId. Zur Laufzeit {0} wird der Instrumentierungsschlüssel für jede Anforderung durch den Instrumentierungsschlüssel ersetzt.

Beispielkonfiguration über 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>

Beispielkonfiguration über Code

TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();

DictionaryApplicationIdProvider

Dieser statische Anbieter basiert auf Ihren konfigurierten Instrumentierungsschlüssel-/Anwendungs-ID-Paaren.

Diese Klasse verfügt über die Defined Eigenschaft, bei der es sich um ein Dictionary<string,string> Instrumentierungsschlüssel-/Anwendungs-ID-Paar handelt.

Diese Klasse verfügt über die optionale Eigenschaft Next, die verwendet werden kann, um einen anderen Anbieter für die Verwendung zu konfigurieren, wenn eine Verbindungszeichenfolge angefordert wird, die in Ihrer Konfiguration nicht vorhanden ist.

Beispielkonfiguration über 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>

Beispielkonfiguration über Code

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

Konfigurieren der Momentaufnahmesammlung

Informationen zum Konfigurieren der Snapshotsammlung für ASP.NET und ASP.NET Core-Anwendungen finden Sie unter "Aktivieren des Snapshotdebuggers für .NET-Apps in Azure Service Fabric,Cloud Services und virtuellen Computern".

Probenahme

Informationen zum Konfigurieren von Samplings für ASP.NET und ASP.NET Core-Anwendungen finden Sie unter Sampling in Application Insights.

Anreichern von Daten über HTTP

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

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

Hinzufügen der clientseitigen Überwachung

In den vorherigen Abschnitten haben Sie Anleitungen zu den Methoden erhalten, mit denen die serverseitige Überwachung automatisch und manuell konfiguriert werden kann. Wenn Sie die clientseitige Überwachung hinzufügen möchten, verwenden Sie das clientseitige JavaScript SDK. Sie können clientseitige Transaktionen einer beliebigen Webseite überwachen, indem Sie ein JavaScript (Web) SDK Loader-Skript vor dem schließenden </head>-Tag im HTML-Code der Seite hinzufügen.

Obwohl es möglich ist, das JavaScript (Web) SDK Loader-Skript manuell dem Header jeder HTML-Seite hinzuzufügen, sollten Sie das JavaScript (Web) SDK Loader-Skript stattdessen einer primären Seite hinzufügen. Diese Aktion schleust das JavaScript (Web) SDK Loader-Skript in alle Seiten einer Website ein.

Für die vorlagenbasierte ASP.NET-MVC-App in diesem Artikel heißt die Datei, die Sie bearbeiten müssen, _Layout.cshtml. Sie finden sie unter Ansichten>Freigegeben. Wenn Sie die clientseitige Überwachung hinzufügen möchten, öffnen Sie die Datei _Layout.cshtml, und befolgen Sie die auf dem JavaScript (Web) SDK Loader-Skript basierende Einrichtungsanleitung aus dem Artikel zur Konfiguration des clientseitigen JavaScript SDK.

Problembehandlung

Informationen finden Sie in dem dedizierten Artikel zur Problembehandlung.

In Visual Studio 2019 gibt es ein bekanntes Problem: Das Speichern des Instrumentierungsschlüssels oder der Verbindungszeichenfolge in einem Benutzergeheimnis ist für .NET Framework-basierte Apps fehlerhaft. Der Schlüssel muss letztendlich in der Datei applicationinsights.config hartcodiert werden, um diesen Fehler zu umgehen. Dieser Artikel wurde so verfasst, dass dieses Problem komplett umgangen wird, indem keine Benutzergeheimnisse verwendet werden.

Testen der Konnektivität zwischen Ihrem Anwendungshost und dem Erfassungsdienst

Application Insights-SDKs und -Agents senden Telemetriedaten, die als REST-Aufrufe unserer Erfassungsendpunkte erfasst werden sollen. Sie können die Konnektivität Ihres Webservers oder Anwendungshostcomputers mit den Endpunkten des Erfassungsdiensts testen, indem Sie unformatierte REST-Clients über PowerShell- oder cURL-Befehle verwenden. Weitere Informationen finden Sie unter Problembehandlung bei fehlender Anwendungstelemetrie in Azure Monitor Application Insights.

Open-Source-SDK

Lesen und Hinzufügen von Code.

Informationen zu den neuesten Updates und Fehlerbehebungen finden Sie in den Versionshinweisen.

Versionshinweise

Versionen ab 2.12: .NET Software Development Kits (SDKs) einschließlich ASP.NET, ASP.NET Core und Protokollierungsadaptern

Unsere Dienstupdates fassen auch wichtige Application Insights-Verbesserungen zusammen.

Nächste Schritte