Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anmärkning
Läs supportanvisningarna för Application Insights SDK för vår klassiska API SDK-supportpolicy.
Försiktighet
Vi rekommenderar Azure Monitor OpenTelemetry Distro för nya program eller kunder för att driva Azure Monitor Application Insights. Azure Monitor OpenTelemetry Distro ger en liknande funktion och upplevelse som Application Insights SDK. Det går att migrera från Application Insights SDK med hjälp av migreringsguiderna för .NET, Node.js och Python, men vi arbetar fortfarande med att lägga till ytterligare några funktioner för bakåtkompatibilitet.
Den här artikeln beskriver hur du aktiverar och konfigurerar Application Insights för ASP.NET-, ASP.NET Core- och Worker Service-program (icke-HTTP). Application Insights kan samla in följande telemetri från dina appar:
- Requests
- Beroenden
- Exceptions
- Prestandaräknare
- Spårningar (loggar)
- Hjärtslag
- Anpassade händelser och mått (kräver manuell instrumentering)
- Sidvisningar (kräver JavaScript SDK för webbsidor)
- Tillgänglighetstester (kräver manuellt konfiguration av tillgänglighetstester)
Scenarier som stöds
Anmärkning
Application Insights SDK för ASP.NET Core och SDK för Worker Service kan övervaka dina program oavsett var eller hur de körs. Om programmet körs och har nätverksanslutning till Azure kan telemetri samlas in.
| Understödd | ASP.NET | ASP.NET Core | Arbetstjänst |
|---|---|---|---|
| Operativsystem | Windows | Windows, Linux eller macOS | Windows, Linux eller macOS |
| Värdtjänstmetod | Pågående (IIS eller IIS Express) | Inuti processen eller utanför processen | Konsol- eller bakgrundstjänst (körs som en process, vanligtvis via dotnet CLI eller som en Windows Service/Linux-daemon) |
| Distributionsmetod | Webbdistribution, MSI eller manuell filkopiering | Ramverksberoende eller fristående | Ramverksberoende eller fristående |
| Webbserver | Internet Information Services (IIS) | Internet Information Server (IIS) eller Kestrel | Inte tillämpligt (ingen webbserver, utformad för icke-HTTP-arbetsbelastningar som meddelanden, bakgrundsuppgifter och konsolappar) |
| Värdplattform | Azure App Service (Windows), Virtuella Azure-datorer eller lokala servrar | Funktionen Web Apps i Azure App Service, Azure Virtual Machines, Docker och Azure Kubernetes Service (AKS) | Azure Virtual Machines, Azure Kubernetes Service (AKS), containrar eller miljöer där .NET Core stöds |
| .NET-version | .NET Framework 4.6.1 och senare | Alla .NET-versioner som stöds officiellt och som inte finns i förhandsversionen | Alla .NET-versioner som stöds officiellt och som inte finns i förhandsversionen |
| IDE | Visual Studio | Visual Studio, Visual Studio Code eller kommandorad | Visual Studio, Visual Studio Code eller kommandorad |
Anmärkning
En arbetstjänst är ett tidskrävande bakgrundsprogram som kör uppgifter utanför en HTTP-begäran/svarspipeline. Application Insights SDK för Worker Service kan användas i den nyligen introducerade .NET Core Worker Service, bakgrundsprocesser i ASP.NET Core och konsolappar som .NET Core och .NET Framework.
Worker Service SDK utför ingen telemetrisamling på egen hand. I stället finns det andra välkända automatiska Application Insights-insamlare som DependencyCollector, PerfCounterCollector och ApplicationInsightsLoggingProvider. Detta SDK exponerar tilläggsmetoder på IServiceCollection för att aktivera och konfigurera telemetrisamling.
Lägga till Application Insights
Förutsättningar
- Ett Azure-abonnemang. Om du inte redan har ett skapar du ett kostnadsfritt Azure-konto.
- En Application Insights-arbetsytebaserad resurs.
- Ett fungerande program. Om du inte redan har en kan du läsa Skapa ett grundläggande webbprogram.
- Den senaste versionen av Visual Studio med följande arbetsbelastningar:
- ASP.NET- och webbutveckling
- Azure development (Azure-utveckling)
Skapa ett grundläggande webbprogram
Om du inte har något fungerande webbprogram än kan du använda följande vägledning för att skapa ett.
- Öppna Visual Studio.
- Välj Skapa ett nytt projekt.
- Välj ASP.NET webbprogram (.NET Framework) med C# och välj Nästa.
- Ange ett projektnamn och välj sedan Skapa.
- Välj MVC och välj sedan Skapa.
Lägg till Application Insights automatiskt (Visual Studio)
Det här avsnittet vägleder dig genom att automatiskt lägga till Application Insights i en mallbaserad webbapp.
Anmärkning
Det finns ett känt problem i Visual Studio 2019: lagringen av instrumentationsnyckeln eller anslutningssträng i en användarhemlighet är bruten för .NET Framework-baserade appar. Nyckeln måste slutligen hårdkodas i Applicationinsights.config-filen för att kunna kringgå den här buggen.
Inifrån ditt ASP.NET webbappsprojekt i Visual Studio:
Välj Projekt>Lägg till Application Insights Telemetry>Application Insights SDK (lokal)>Nästa>Slutför>Stäng.
Öppna filen ApplicationInsights.config.
Innan du stänger
</ApplicationInsights>taggen lägger du till en rad som innehåller anslutningssträng för Application Insights-resursen. Hitta din anslutningssträng i översiktsfönstret för den nyligen skapade Application Insights-resursen.<ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>Välj Projekt>Hantera NuGet-paket>Uppdateringar. Uppdatera sedan varje
Microsoft.ApplicationInsightsNuGet-paket till den senaste stabila versionen.Kör programmet genom att välja IIS Express. En grundläggande ASP.NET app öppnas. När du bläddrar igenom sidorna på webbplatsen skickas telemetri till Application Insights.
Lägg till Application Insights manuellt (ingen Visual Studio)
Det här avsnittet vägleder dig genom att lägga till Application Insights manuellt i en mallbaserad webbapp.
Lägg till följande NuGet-paket och deras beroenden i projektet:
I vissa fall skapas applicationinsights.config-filen automatiskt åt dig. Om filen redan finns går du vidare till steg 4.
Skapa den själv om den saknas. I rotkatalogen för ett ASP.NET-program skapar du en ny fil med namnet ApplicationInsights.config.
Kopiera följande XML-konfiguration till den nyligen skapade filen:
Expandera för att visa konfigurationen
<?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>Lägg till anslutningssträng, vilket kan göras på två sätt:
(Rekommenderas) Ange anslutningssträng i konfigurationen.
Innan den avslutande
</ApplicationInsights>taggen i ApplicationInsights.config lägger du till anslutningssträng för Application Insights-resursen. Du hittar din anslutningssträng i översiktsfönstret för den nyligen skapade Application Insights-resursen.<ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>Ange anslutningssträng i kod.
Ange en anslutningssträng i klassen program.cs.
var configuration = new TelemetryConfiguration { ConnectionString = "Copy the connection string from your Application Insights resource" };
På samma nivå i projektet som applicationInsights.config-filen skapar du en mapp med namnet ErrorHandler med en ny C#-fil med namnet AiHandleErrorAttribute.cs. Innehållet i filen ser ut så här:
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); } } }I mappen App_Start öppnar du filen FilterConfig.cs och ändrar den så att den matchar exemplet:
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()); } } }Om Web.config redan har uppdaterats hoppar du över det här steget. Annars uppdaterar du filen på följande sätt:
Expandera för att visa konfigurationen
<?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit https://go.microsoft.com/fwlink/?LinkId=301880 --> <configuration> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.7.2" /> <httpRuntime targetFramework="4.7.2" /> <!-- Code added for Application Insights start --> <httpModules> <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" /> </httpModules> <!-- Code added for Application Insights end --> </system.web> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" /> <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0" /> </dependentAssembly> <!-- Code added for Application Insights start --> <dependentAssembly> <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /> </dependentAssembly> <!-- Code added for Application Insights end --> </assemblyBinding> </runtime> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" /> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /> </compilers> </system.codedom> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <!-- Code added for Application Insights start --> <modules> <remove name="TelemetryCorrelationHttpModule" /> <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler" /> <remove name="ApplicationInsightsWebTracking" /> <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" /> </modules> <!-- Code added for Application Insights end --> </system.webServer> </configuration>
Nu har du konfigurerat programövervakning på serversidan. Om du kör webbappen ser du att telemetri börjar visas i Application Insights.
Kontrollera att Application Insights tar emot telemetri
Kör ditt program och skicka begäranden till det. Telemetri bör nu flöda till Application Insights. Application Insights SDK samlar automatiskt in inkommande webbförfrågningar till ditt program, tillsammans med följande telemetri.
Konfigurera telemetri
I det här avsnittet
- Live-mått
- Spårningar (loggar)
- Distribuerad spårning
- Beroenden
- undantag
- Anpassade mått
- Anpassade åtgärder
Livemått
Live-mätvärden kan användas för att snabbt kontrollera om programövervakning via Application Insights är korrekt konfigurerad. Det kan ta några minuter innan telemetri visas i Azure Portal, men fönstret livemått visar CPU-användningen i den körande processen i nästan realtid. Den kan också visa andra telemetrier som begäranden, beroenden och spårningar.
Anmärkning
Realtidsmått aktiveras som standard när du konfigurerar det med hjälp av de rekommenderade anvisningarna för .NET-program.
Aktivera livemått med hjälp av kod för alla .NET-program
Så här konfigurerar du livemått manuellt:
Installera NuGet-paketet Microsoft.ApplicationInsights.PerfCounterCollector.
Följande exempelkonsolappkod visar hur du konfigurerar livemått:
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();
}
}
}
}
Spårningar (loggar)
I det här avsnittet beskrivs hur du skickar loggar för diagnostisk spårning från ASP.NET eller ASP.NET Core-program till Application Insights och sedan utforskar/söker efter loggarna i portalen.
Du kan använda spårningsloggar för att identifiera spårningar som är associerade med varje användarbegäran och korrelera dem med andra händelser och undantagsrapporter.
Application Insights samlar in loggar från ASP.NET Core och andra .NET-appar via ILogger och från klassiska ASP.NET (.NET Framework) via det klassiska SDK:t och korten.
Anmärkning
Som standard skickar Application Insights-providern endast loggar med allvarlighetsgraden
Warningeller högre. Om du vill ta medInformationeller logga på lägre nivå uppdaterar du loggnivåinställningarna iappsettings.json.Microsoft.ApplicationInsights.WorkerServiceNuGet-paketet, som används för att aktivera Application Insights för bakgrundstjänster, ligger utanför omfånget.Mer information om vanliga frågor och svar finns i Loggning med vanliga frågor och svar om .NET.
Välj en loggningsmetod för att generera diagnostikloggar som Application Insights kan samla in.
Installera loggning på din app
För klassiska ASP.NET appar som använder System.Diagnostics-spårningkonfigurerar du en Application Insights TraceListener i konfigurationen.
Lägg till en lyssnare i web.config eller app.config:
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add name="myAppInsightsListener"
type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Anmärkning
Loggfångstmodulen är en användbar adapter för tredjepartsloggare. Men om du inte redan använder NLog, log4Net eller System.Diagnostics.Trace, kan du anropa Application Insights TrackTrace() direkt.
Konfigurera Application Insights för att samla in loggar
Alternativ 1: Lägg till Application Insights i projektet om du inte redan har gjort det. När du lägger till Application Insights i Visual Studio finns det ett alternativ för att inkludera logginsamlaren.
Alternativ 2: Högerklicka på projektet i Solution Explorer för att konfigurera Application Insights. Välj alternativet Konfigurera spårningssamling .
Anmärkning
Om du saknar application insights-menyn eller logginsamlaren kan du läsa den dedikerade felsökningsartikeln.
Manuell installation
Använd den här metoden om projekttypen inte stöds av Installationsprogrammet för Application Insights (till exempel vissa skrivbords-/konsolscenarier) eller om du föredrar explicit kontroll på paketnivå.
Högerklicka på projektet i Solution Explorer och välj Hantera NuGet-paket.
Sök efter Application Insights.
Välj något av följande paket:
-
ILogger: Microsoft.Extensions.Logging.ApplicationInsights
-
System.Diagnostics: Microsoft.ApplicationInsights.TraceListener
-
log4net: Microsoft.ApplicationInsights.Log4NetAppender
-
NLog: Microsoft.ApplicationInsights.NLogTarget
-
Banderoll för Microsoft.ApplicationInsights.EventSourceListener
-
Microsoft.ApplicationInsights.DiagnosticSourceListener
-
Microsoft.ApplicationInsights.EtwCollector
-
ILogger: Microsoft.Extensions.Logging.ApplicationInsights
NuGet-paketet installerar nödvändiga sammansättningar och ändrar web.config eller app.config, om tillämpligt.
Installationsinstruktioner:
Anmärkning
Expandera något av avsnitten nedan för paketspecifika installationsinstruktioner.
ILogger
Microsoft.Extensions.Logging.ApplicationInsightsInstallera .Lägg till
ApplicationInsightsLoggerProvider:
using Microsoft.Extensions.Logging.ApplicationInsights;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Logging.AddApplicationInsights(
configureTelemetryConfiguration: (config) =>
config.ConnectionString = builder.Configuration.GetConnectionString("APPLICATIONINSIGHTS_CONNECTION_STRING"),
configureApplicationInsightsLoggerOptions: (options) => { }
);
builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("your-category", LogLevel.Trace);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
När NuGet-paketet är installerat och providern registreras med beroendeinmatning är appen redo att loggas. Med konstruktorinmatning krävs antingen ILogger eller det generiska alternativet ILogger<TCategoryName> . När de här implementeringarna har lösts tillhandahåller ApplicationInsightsLoggerProvider du dem. Loggade meddelanden eller undantag skickas till Application Insights.
Tänk på följande exempelkontrollant:
public class ValuesController : ControllerBase
{
private readonly ILogger _logger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
}
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
_logger.LogWarning("An example of a Warning trace..");
_logger.LogError("An example of an Error level message");
return new string[] { "value1", "value2" };
}
}
Mer information finns i Logga in ASP.NET Core och Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.
Infoga diagnostiklogganrop (System.Diagnostics.Trace/log4net/NLog)
Om du använder System.Diagnostics.Traceär ett typiskt anrop:
System.Diagnostics.Trace.TraceWarning("Slow response - database01");
Om du föredrar log4net eller NLoganvänder du:
logger.Warn("Slow response - database01");
Använd EventSource-händelser
Du kan konfigurera System.Diagnostics.Tracing.EventSource-händelser som ska skickas till Application Insights som spårningar.
Installera NuGet-paketet
Microsoft.ApplicationInsights.EventSourceListener.Redigera avsnittet i
TelemetryModulesApplicationInsights.config-filen :<Add Type="Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule, Microsoft.ApplicationInsights.EventSourceListener"> <Sources> <Add Name="MyCompany" Level="Verbose" /> </Sources> </Add>
För varje källa kan du ange följande parametrar:
- Namnet anger namnet på den EventSource som ska samlas in.
- Nivån anger loggningsnivån som ska samlas in: Kritisk, Fel, Information, LogAlways, Utförlig eller Varning.
- Nyckelord (valfritt) anger heltalsvärdet för nyckelordskombinationer som ska användas.
Använd DiagnosticSource-händelser
Du kan konfigurera System.Diagnostics.DiagnosticSource-händelser som ska skickas till Application Insights som spårningar.
Installera NuGet-paketet
Microsoft.ApplicationInsights.DiagnosticSourceListener.Redigera avsnittet i
TelemetryModulesApplicationInsights.config-filen :<Add Type="Microsoft.ApplicationInsights.DiagnosticSourceListener.DiagnosticSourceTelemetryModule, Microsoft.ApplicationInsights.DiagnosticSourceListener"> <Sources> <Add Name="MyDiagnosticSourceName" /> </Sources> </Add>
För varje diagnostikkälla som du vill spåra lägger du till en post med Name attributet inställt på namnet på diagnostikkällan.
Använda ETW-händelser
Du kan konfigurera händelsespårning för Windows-händelser (ETW) som ska skickas till Application Insights som spårningar.
Installera NuGet-paketet
Microsoft.ApplicationInsights.EtwCollector.Redigera avsnittet "TelemetryModules" i ApplicationInsights.config-filen :
Anmärkning
ETW-händelser kan bara samlas in om processen som är värd för SDK:t körs under en identitet som är medlem i användare eller administratörer för prestandaloggar.
<Add Type="Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule, Microsoft.ApplicationInsights.EtwCollector">
<Sources>
<Add ProviderName="MyCompanyEventSourceName" Level="Verbose" />
</Sources>
</Add>
För varje källa kan du ange följande parametrar:
- ProviderName är namnet på den ETW-leverantör som används för insamling.
-
ProviderGuid anger GUID för ETW-providern som ska samlas in. Den kan användas i stället för
ProviderName. - Nivå anger loggningsnivån som ska insamlas. Det kan vara Kritisk, Fel, Information, LogAlways, Detaljerad eller Varning.
- Nyckelord (valfritt) anger heltalsvärdet för nyckelordskombinationer som ska användas.
Använd spårnings-API:et direkt
Du kan anropa Application Insights-spårnings-API:et direkt. Loggningsadaptrarna använder det här API:t. Till exempel:
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow response - database01");
En fördel TrackTrace med är att du kan placera relativt långa data i meddelandet. Du kan till exempel koda POST-data där.
Du kan också lägga till en allvarlighetsgrad i meddelandet. Och precis som andra telemetrier kan du lägga till egenskapsvärden för att filtrera eller söka efter olika uppsättningar spårningar. Till exempel:
TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
var telemetryClient = new TelemetryClient(configuration);
telemetryClient.TrackTrace("Slow database response",
SeverityLevel.Warning,
new Dictionary<string, string> { { "database", "db.ID" } });
Nu kan du enkelt filtrera bort alla meddelanden på en viss allvarlighetsnivå som är relaterade till en viss databas i Transaktionssökning .
Konsolprogram
Om du vill lägga till Application Insights-loggning i konsolprogram installerar du först följande NuGet-paket:
I följande exempel används Microsoft.Extensions.Logging.ApplicationInsights paketet och standardbeteendet för ett konsolprogram visas. Paketet Microsoft.Extensions.Logging.ApplicationInsights ska användas i ett konsolprogram eller när du vill ha en minimal implementering av Application Insights utan den fullständiga funktionsuppsättningen, till exempel mått, distribuerad spårning, sampling och telemetriinitierare.
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));
}
Mer information finns i Vilken Application Insights-telemetrityp skapas från ILogger-loggar? Var kan jag se ILogger-loggar i Application Insights?.
Loggningsomfång
Anmärkning
Följande vägledning gäller för ILogger-scenarier (endast ASP.NET Core och konsolen). Det gäller inte för klassiska ASP.NET.
ApplicationInsightsLoggingProvider stöder loggomfattningar som är aktiverade som standard.
Om omfånget är av typen IReadOnlyCollection<KeyValuePair<string,object>>läggs varje nyckel/värde-par i samlingen till i Application Insights-telemetrin som anpassade egenskaper. I följande exempel registreras loggar som TraceTelemetry och har ("MyKey", "MyValue") i egenskaper.
using (_logger.BeginScope(new Dictionary<string, object> { ["MyKey"] = "MyValue" }))
{
_logger.LogError("An example of an Error level message");
}
Om någon annan typ används som omfång lagras den under egenskapen Scope i Application Insights-telemetri. I följande exempel TraceTelemetry har en egenskap som heter Scope som innehåller omfånget.
using (_logger.BeginScope("hello scope"))
{
_logger.LogError("An example of an Error level message");
}
Hitta loggarna
Kör appen i felsökningsläge eller distribuera den live.
Utforska i transaktionssökning
I appens översiktsfönster i Application Insights-portalen väljer du Transaktionssökning där du kan:
- Filtrera på loggspårningar eller på objekt med specifika egenskaper.
- Granska ett specifikt objekt i detalj.
- Hitta andra systemloggdata som relaterar till samma användarbegäran (har samma åtgärds-ID).
- Spara konfigurationen av en sida som en favorit.
Anmärkning
Om ditt program skickar stora mängder data och du använder Application Insights SDK för ASP.NET version 2.0.0-beta3 eller senare kan funktionen för anpassningsbar sampling fungera och bara skicka en del av telemetrin. Läs mer om sampling.
Utforska i Azure Monitor-loggar
ILogger-loggar visas som spårningstelemetri (tabell traces i Application Insights och AppTraces Log Analytics).
Exempel
I Azure-portalen går du till Application Insights och kör:
traces
| where severityLevel >= 2 // 2=Warning, 1=Information, 0=Verbose
| take 50
Distribuerad spårning
Moderna moln - och mikrotjänstarkitekturer har aktiverat enkla, oberoende distributionsbara tjänster som minskar kostnaderna samtidigt som tillgängligheten och dataflödet ökar. Det har dock gjort det svårare att resonera kring och felsöka övergripande system. Distribuerad spårning löser det här problemet genom att tillhandahålla en prestandaprofilerare som fungerar som anropsstackar för moln- och mikrotjänstarkitekturer.
Azure Monitor tillhandahåller två funktioner för användning av distribuerade spårningsdata: transaktionsdiagnostikvyn för en enskild transaktion/begäran och programkartvyn för att visa hur system interagerar.
Application Insights kan övervaka varje komponent separat och identifiera vilken komponent som är ansvarig för fel eller prestandaförsämring med hjälp av distribuerad telemetrikorrelation. Den här artikeln förklarar datamodellen, tekniker för kontextspridning, protokoll och implementering av korrelationstaktik på olika språk och plattformar som används av Application Insights.
Aktivera distribuerad spårning via Application Insights med autoinstrumentation eller SDK:er
Application Insights-agenter och SDK:er för .NET, .NET Core, Java, Node.jsoch JavaScript stöder alla distribuerad spårning internt.
Med rätt Application Insights SDK installerat och konfigurerat, samlas spårningsinformation automatiskt in för populära ramverk, bibliotek och tekniker genom SDK-beroende automatiska insamlare. Den fullständiga listan över tekniker som stöds finns i dokumentationen för beroendebaserad autokollektion.
Alla teknologier kan också spåras manuellt med ett anrop till TrackDependency på TelemetryClient.
Datamodell för telemetrikorrelation
Application Insights definierar en datamodell för distribuerad telemetrikorrelation. Om du vill associera telemetri med en logisk åtgärd har varje telemetriobjekt ett kontextfält med namnet operation_Id. Varje telemetriobjekt i den distribuerade spårningen delar den här identifieraren. Så även om du förlorar telemetri från ett enda lager kan du fortfarande associera telemetri som rapporterats av andra komponenter.
En distribuerad logisk åtgärd består vanligtvis av en uppsättning mindre åtgärder som är begäranden som bearbetas av en av komponenterna.
Telemetri för begäran definierar dessa åtgärder. Varje telemetriobjekt för begäran har ett eget id objekt som identifierar det unikt och globalt. Och alla telemetriobjekt (till exempel spårningar och undantag) som är associerade med begäran bör ange operation_parentId till värdet av begäran id.
Beroendetelemetri representerar varje utgående åtgärd, till exempel ett HTTP-anrop till en annan komponent. Den definierar också sin egen id, som är globalt unik. Telemetri för begäran, initierad av detta beroendekall, utnyttjar detta id som sin operation_parentId.
Du kan skapa en vy över den distribuerade logiska åtgärden med hjälp av operation_Id, operation_parentId och request.id tillsammans med dependency.id. Dessa fält definierar också kausalitetsordningen för telemetrianrop.
I en mikrotjänstmiljö kan spårningar från komponenter gå till olika lagringsobjekt. Varje komponent kan ha en egen anslutningssträng i Application Insights. För att få telemetri för den logiska åtgärden frågar Application Insights data från varje lagringsobjekt.
När antalet lagringsobjekt är stort behöver du en ledtråd om var du ska titta härnäst. Application Insights-datamodellen definierar två fält för att lösa det här problemet: request.source och dependency.target. Det första fältet identifierar komponenten som initierade beroendebegäran. Det andra fältet identifierar vilken komponent som returnerade svaret från beroendeanropet.
För information om hur du frågar från flera olika instanser hänvisas till 'Fråga efter data mellan Log Analytics-arbetsytor, program och resurser i Azure Monitor'.
Example
Nu ska vi titta på ett exempel. Ett program med namnet Aktiekurser visar det aktuella marknadspriset för en aktie med hjälp av ett externt API som heter Stock. Programmet Aktiekurser har en sida med namnet Aktiesida som klientens webbläsare öppnar med hjälp av GET /Home/Stock. Programmet frågar lager-API:et med hjälp av HTTP-anropet GET /api/stock/value.
Du kan analysera den resulterande telemetrin genom att köra en fråga:
(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id
I resultatet delar alla telemetriobjekt roten operation_Id. När ett Ajax-anrop görs från sidan tilldelas ett nytt unikt ID (qJSXU) till beroendetelemetrin och ID:t för pageView används som operation_ParentId. Serverbegäran använder sedan Ajax-ID:t som operation_ParentId.
| objekttyp | name | ID-nummer | operation_ParentId | operation_Id |
|---|---|---|---|---|
| sidvisning | Lagersida | STYz |
STYz |
|
| beroende | GET /Hem/Lager | qJSXU |
STYz |
STYz |
| request | GET Hem/Lager | KqKwlrSt9PA= |
qJSXU |
STYz |
| beroende | GET /api/stock/value | bBrf2L7mm2g= |
KqKwlrSt9PA= |
STYz |
När anropet GET /api/stock/value görs till en extern tjänst måste du känna till serverns identitet så att du kan ange fältet dependency.target på rätt sätt. När den externa tjänsten inte stöder övervakning target ställs den in på tjänstens värdnamn. Ett exempel är stock-prices-api.com. Men om tjänsten identifierar sig genom att returnera ett fördefinierat HTTP-huvud innehåller target den tjänstidentitet som gör att Application Insights kan skapa en distribuerad spårning genom att fråga telemetri från den tjänsten.
Korrelationshuvuden med hjälp av W3C TraceContext
Application Insights övergår till W3C Trace-Context, som definierar:
-
traceparent: Bär det globalt unika åtgärds-ID:t och den unika identifieraren för anropet. -
tracestate: Bär systemspecifikt spårningssammanhang.
Den senaste versionen av Application Insights SDK stöder Trace-Context-protokollet, men du kan behöva välja det. (Bakåtkompatibilitet med det tidigare korrelationsprotokollet som stöds av Application Insights SDK upprätthålls.)
HTTP-korrelationsprotokollet, även kallat Request-Id, är inaktuellt. Det här protokollet definierar två huvuden:
-
Request-Id: Bär det globalt unika ID:t för anropet. -
Correlation-Context: Innehåller samlingen av namn-värdepar för de distribuerade spårningsegenskaperna.
Application Insights definierar också tillägget för HTTP-korrelationsprotokollet. Den använder Request-Context namn/värde-par för att överföra den samling egenskaper som används av den omedelbara anroparen eller anropade. Application Insights SDK använder huvudfältet för att ange fälten dependency.target och request.source.
Datamodellerna W3C Trace-Context och Application Insights mappar på följande sätt:
| Programinsikter | W3C TraceContext |
|---|---|
Id av Request och Dependency |
parent-id |
Operation_Id |
trace-id |
Operation_ParentId |
parent-id för det här spannets moderspann. Det här fältet måste vara tomt om det är ett rotspan. |
Mer information finns i Application Insights telemetridatamodell.
Aktivera stöd för distribuerad spårning i W3C
W3C TraceContext-baserad distribuerad spårning är aktiverad som standard i alla senaste .NET Framework/.NET Core SDK:er, tillsammans med bakåtkompatibilitet med äldre Request-Id protokoll.
Telemetrikorrelation
Korrelation hanteras som standard när en app registreras. Inga särskilda åtgärder krävs.
.NET-runtime stöder distribuerade system med hjälp av Activity och DiagnosticSource
Application Insights .NET SDK använder DiagnosticSource och Activity för att samla in och korrelera telemetri.
Beroenden
Automatiskt spårade beroenden
Application Insights SDK:er för .NET och .NET Core levereras med DependencyTrackingTelemetryModule, vilket är en telemetrimodul som automatiskt samlar in beroenden. Modulen DependencyTrackingTelemetryModule levereras som NuGet-paketet Microsoft.ApplicationInsights.DependencyCollector och hämtas automatiskt när du använder NuGet-paketet Microsoft.ApplicationInsights.Web eller Microsoft.ApplicationInsights.AspNetCore NuGet-paketet.
DependencyTrackingTelemetryModule Spårar för närvarande följande beroenden automatiskt:
| Beroenden | Detaljer |
|---|---|
| HTTP/HTTPS | Lokala eller fjärranslutna HTTP/HTTPS-anrop. |
| WCF-anrop | Spåras endast automatiskt om HTTP-baserade bindningar används. |
| SQL | Samtal som görs med SqlClient. Se avsnittet Avancerad SQL-spårning för att hämta fullständig SQL-fråga för att samla in SQL-frågor. |
| Azure bloblagring, tabellagring eller kölagring | Anrop som görs med Azure Storage-klienten. |
| Azure Event Hubs-klient-SDK | Använd det senaste paketet: https://nuget.org/packages/Azure.Messaging.EventHubs. |
| Azure Service Bus-klient-SDK | Använd det senaste paketet: https://nuget.org/packages/Azure.Messaging.ServiceBus. |
| Azure Cosmos DB | Spåras automatiskt om HTTP/HTTPS används. Spårning för åtgärder i direktläge med TCP registreras automatiskt med hjälp av förhandsversionspaketet >= 3.33.0-preview. Mer information finns i dokumentationen. |
Om beroendet inte samlas in automatiskt kan du spåra det manuellt med ett spårningsberoendeanrop.
Mer information om hur beroendespårning fungerar finns i Beroendespårning i Application Insights.
Konfigurera automatisk beroendespårning i konsolappar
Om du vill spåra beroenden automatiskt från .NET-konsolappar installerar du NuGet-paketet Microsoft.ApplicationInsights.DependencyCollector och initierar DependencyTrackingTelemetryModule:
DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule();
depModule.Initialize(TelemetryConfiguration.Active);
Anmärkning
För .NET Core-konsolappar TelemetryConfiguration.Active är det föråldrat.
Spåra beroenden manuellt
Följande exempel på beroenden, som inte samlas in automatiskt, kräver manuell spårning:
- Azure Cosmos DB spåras endast automatiskt om HTTP/HTTPS används. TCP-läget registreras inte automatiskt av Application Insights för SDK-versioner som är äldre än
2.22.0-Beta1. - Redis
För de beroenden som inte samlas in automatiskt av SDK kan du spåra dem manuellt med hjälp av TrackDependency-API:et som används av standardmodulerna för automatisk insamling.
Exempel
Om du skapar din kod med en sammansättning som du inte skrev själv kan du göra alla anrop till den. Med det här scenariot kan du ta reda på vilket bidrag det ger till dina svarstider.
Om du vill att dessa data ska visas i beroendediagrammen i Application Insights skickar du dem med hjälp TrackDependencyav :
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);
}
TelemetryClient Du kan också ange tilläggsmetoderna StartOperation och StopOperation, som kan användas för att manuellt spåra beroenden enligt vad som visas i Spårning av utgående beroenden.
Inaktivera standardmodulen för beroendespårning
Mer information finns i telemetrimoduler.
Avancerad SQL-spårning för att hämta fullständig SQL-fråga
För SQL-anrop samlas alltid namnet på servern och databasen in och lagras som namnet på den insamlade DependencyTelemetry. Ett annat fält, som kallas data, kan innehålla den fullständiga SQL-frågetexten.
Anmärkning
Azure Functions kräver separata inställningar för att aktivera SQL-textsamling. Mer information finns i Aktivera SQL-frågesamling.
För ASP.NET program samlas den fullständiga SQL-frågetexten in med hjälp av bytekodinstrumentation, vilket kräver användning av instrumentationsmotorn eller med hjälp av NuGet-paketet Microsoft.Data.SqlClient i stället för biblioteket System.Data.SqlClient. Plattformsspecifika steg för att aktivera fullständig SQL Query-samling beskrivs i följande tabell.
| Platform | Steg som krävs för att hämta fullständig SQL-fråga |
|---|---|
| Webbappar i Azure App Service | Öppna fönstret Application Insights i kontrollpanelen för webbappen och aktivera SQL-kommandon under .NET. |
| IIS Server (Azure Virtual Machines, lokalt och så vidare) | Använd antingen Microsoft.Data.SqlClient NuGet-paketet eller använd Application Insights Agent PowerShell-modulen för att installera instrumentationsmotorn och starta om IIS. |
| Azure Cloud Services | Lägg till en startuppgift för att installera StatusMonitor. Appen bör registreras i ApplicationInsights SDK vid byggtiden genom att installera NuGet-paket för ASP.NET eller ASP.NET Core-program. |
| IIS Express | Använd NuGet-paketet Microsoft.Data.SqlClient. |
| Webbjobb i Azure App Service | Använd NuGet-paketet Microsoft.Data.SqlClient. |
Förutom föregående plattformsspecifika steg måste du också uttryckligen välja att aktivera SQL-kommandosamling genom att ApplicationInsights.config ändra filen med följande kod:
<TelemetryModules>
<Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
<EnableSqlCommandTextInstrumentation>true</EnableSqlCommandTextInstrumentation>
</Add>
I föregående fall är rätt sätt att verifiera att instrumentationsmotorn är korrekt installerad genom att verifiera att SDK-versionen av insamlad DependencyTelemetry är rddp. Användning av rdddsd eller rddf indikerar att beroenden samlas in via DiagnosticSource eller EventSource motringningar, så den fullständiga SQL-frågan samlas inte in.
Exceptions
Undantag i webbprogram kan rapporteras med Application Insights. Du kan korrelera misslyckade begäranden med undantag och andra händelser på både klienten och servern så att du snabbt kan diagnostisera orsakerna. I det här avsnittet får du lära dig hur du konfigurerar undantagsrapportering, rapporterar undantag explicit, diagnostiserar fel med mera.
Konfigurera undantagsrapportering
Du kan konfigurera Application Insights för att rapportera undantag som inträffar på antingen servern eller klienten. Beroende på vilken plattform ditt program är beroende av behöver du rätt tillägg eller SDK.
Om du vill att undantag ska rapporteras från ditt program på serversidan bör du överväga följande scenarier:
- Lägg till Application Insights-tillägget för Azure-webbappar.
- Lägg till programövervakningstillägget för virtuella Azure-datorer och Skalningsuppsättningar för virtuella Azure-datorer i IIS-värdbaserade appar.
- Lägg till Application Insights SDK i din appkod, kör Application Insights Agent för IIS-webbservrar eller aktivera Java-agenten för Java-webbappar.
Viktigt!
Det här avsnittet fokuserar på .NET Framework-appar ur ett kodexempelperspektiv. Några av metoderna som fungerar för .NET Framework är föråldrade i .NET Core SDK.
Diagnostisera fel och undantag
Application Insights har en hanterad programprestandahantering som hjälper dig att diagnostisera fel i dina övervakade program.
Detaljerade anvisningar finns i Undersöka fel, prestanda och transaktioner med Application Insights.
Anpassad spårning och loggdata
För att få diagnostikdata som är specifika för din app kan du infoga kod för att skicka egna telemetridata. Dina anpassade telemetri- eller loggdata visas i diagnostiksökningen tillsammans med begäran, sidvyn och andra automatiskt insamlade data.
Med hjälp av Microsoft.VisualStudio.ApplicationInsights.TelemetryClienthar du flera TILLGÄNGLIGA API:er:
- TelemetryClient.TrackEvent används vanligtvis för att övervaka användningsmönster, men de data som skickas visas också under Anpassade händelser i diagnostiksökningen. Händelser namnges och kan innehålla strängegenskaper och numeriska mått som du kan filtrera dina diagnostiksökningar på.
- TelemetryClient.TrackTrace låter dig skicka längre data, till exempel POST-information.
- TelemetryClient.TrackException skickar undantagsinformation, till exempel stackspårningar till Application Insights.
Om du vill se dessa händelser öppnar du Sök på den vänstra menyn. Välj den nedrullningsbara menyn Händelsetyper och välj sedan Anpassad händelse, Spårning eller Undantag.
Anmärkning
Om din app genererar stora mängder telemetri minskar modulen för anpassningsbar sampling automatiskt volymen som skickas till portalen genom att endast skicka en representativ del av händelserna. Händelser som ingår i samma åtgärd markeras eller avmarkeras som en grupp så att du kan navigera mellan relaterade händelser. Mer information finns i Sampling i Application Insights.
Se POST-begärandedata
Information om begäran inkluderar inte de data som skickas till din app i ett POST-anrop. Så här rapporterar du dessa data:
- Lägg till Application Insights SDK i din appkod.
- Infoga kod i programmet för att anropa Microsoft.ApplicationInsights.TrackTrace(). Skicka POST-data i meddelandeparametern. Det finns en gräns för den tillåtna storleken, så du bör bara försöka skicka viktiga data.
- När du undersöker en misslyckad begäran letar du upp de associerade spårningarna.
Samla in undantag och relaterade diagnostikdata
Som standard visas inte alla undantag som orsakar fel i din app i portalen. Om du använder JavaScript SDK på dina webbsidor visas webbläsarfel. De flesta undantag på serversidan fångas dock upp av IIS, så du måste lägga till kod för att samla in och rapportera dem.
Du kan:
- Logga undantag explicit genom att infoga kod i undantagshanterare för att rapportera undantagen.
- Samla in undantag automatiskt genom att konfigurera ditt ASP.NET ramverk. De nödvändiga tilläggen skiljer sig åt för olika typer av ramverk.
Rapportera undantag explicit
Det enklaste sättet att rapportera är att infoga ett anrop till trackException() i en undantagshanterare.
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);
}
Parametrarna för egenskaper och mått är valfria, men de är användbara för att filtrera och lägga till extra information. Om du till exempel har en app som kan köra flera spel kan du hitta alla undantagsrapporter som är relaterade till ett visst spel. Du kan lägga till så många objekt som du vill i varje ordlista.
Webbläsarfel
De flesta webbläsarfel rapporteras.
Om din webbsida innehåller skriptfiler från nätverk för innehållsleverans eller andra domäner kontrollerar du att skripttaggen har attributet crossorigin="anonymous" och att servern skickar CORS-huvuden. Med det här beteendet kan du hämta en stackspårning och information för ohanterade JavaScript-undantag från dessa resurser.
Återanvänd din telemetriklient
Anmärkning
Vi rekommenderar att du instansierar en TelemetryClient gång och återanvänder den under hela programmets livslängd.
Med Dependency Injection (DI) i .NET, lämplig .NET SDK och korrekt konfiguration av Application Insights för DI, kan du kräva TelemetryClient som en konstruktorparameter.
public class ExampleController : ApiController
{
private readonly TelemetryClient _telemetryClient;
public ExampleController(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
}
I föregående exempel TelemetryClient matas ExampleController in i klassen.
Webbformulär
För webbformulär kan HTTP-modulen samla in undantagen när inga omdirigeringar har konfigurerats med CustomErrors. Men när du har aktiva omdirigeringar lägger du till följande rader i Application_Error funktionen i Global.asax.cs.
void Application_Error(object sender, EventArgs e)
{
if (HttpContext.Current.IsCustomErrorEnabled &&
Server.GetLastError () != null)
{
_telemetryClient.TrackException(Server.GetLastError());
}
}
I föregående exempel _telemetryClient är en variabel med klassomfattning av typen TelemetryClient.
MVC
Från och med Application Insights Web SDK version 2.6 (beta 3 och senare) samlar Application Insights in ohanterade undantag som genereras automatiskt i MVC 5+-kontrollantmetoderna. Om du tidigare har lagt till en anpassad hanterare för att spåra sådana undantag kan du ta bort den för att förhindra dubbel spårning av undantag.
Det finns flera scenarier när ett undantagsfilter inte kan hantera fel korrekt när undantag utlöses:
- Från styrenhetskonstruktorer
- Från meddelandehanterare
- Under routning
- Under svarsinnehålls serialisering
- Under programstart
- I bakgrundsaktiviteter
Alla undantag som hanteras av programmet måste fortfarande spåras manuellt. Ohanterade undantag från kontrollanter resulterar vanligtvis i ett svar på 500 "internt serverfel". Om ett sådant svar konstrueras manuellt till följd av ett hanterat undantag, eller inget undantag alls, spåras det i motsvarande telemetri för begäran med ResultCode 500. Application Insights SDK kan dock inte spåra ett motsvarande undantag.
Stöd för tidigare versioner
Om du använder MVC 4 (och tidigare) av Application Insights Web SDK 2.5 (och tidigare) läser du följande exempel för att spåra undantag.
Expandera för att visa instruktioner för tidigare versioner
Om CustomErrors-konfigurationen är Offär undantag tillgängliga för HTTP-modulen att samla in. Men om det är inställt på RemoteOnly (standard) eller Onrensas undantaget och är inte tillgängligt för Application Insights att samla in automatiskt. Du kan åtgärda det beteendet genom att åsidosätta klassen System.Web.Mvc.HandleErrorAttribute och tillämpa den åsidosatta klassen enligt de olika MVC-versionerna här (se GitHub-källan):
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
Ersätt Attributet HandleError med det nya attributet i dina kontrollanter:
namespace MVC2App.Controllers
{
[AiHandleError]
public class HomeController : Controller
{
// Omitted for brevity
}
}
MVC 3
Registrera dig AiHandleErrorAttribute som ett globalt filter i Global.asax.cs:
public class MyMvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AiHandleErrorAttribute());
}
}
MVC 4, MVC 5
Registrera dig AiHandleErrorAttribute som ett globalt filter i FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// Default replaced with the override to track unhandled exceptions
filters.Add(new AiHandleErrorAttribute());
}
}
Webb-API
Från och med Application Insights Web SDK version 2.6 (beta 3 och senare) samlar Application Insights in ohanterade undantag som genereras i kontrollantmetoderna automatiskt för Web API 2+. Om du tidigare har lagt till en anpassad hanterare för att spåra sådana undantag, enligt beskrivningen i följande exempel, kan du ta bort den för att förhindra dubbel spårning av undantag.
Det finns flera fall som undantagsfiltren inte kan hantera. Till exempel:
- Undantag som genereras från styrenhetskonstruktorer.
- Undantag som genereras från meddelandehanterare.
- Undantag som utlöses under routning.
- Undantag som utlöses under svarsinnehålls serialisering.
- Undantag som utlöses när programmet startas.
- Undantag som genereras i bakgrundsaktiviteter.
Alla undantag som hanteras av programmet måste fortfarande spåras manuellt. Ohanterade undantag från kontrollanter resulterar vanligtvis i ett svar på 500 "internt serverfel". Om ett sådant svar konstrueras manuellt till följd av ett hanterat undantag, eller inget undantag alls, spåras det i en motsvarande telemetri för begäran med ResultCode 500. Application Insights SDK kan dock inte spåra ett motsvarande undantag.
Stöd för tidigare versioner
Om du använder Web API 1 (och tidigare) av Application Insights Web SDK 2.5 (och tidigare) läser du följande exempel för att spåra undantag.
Expandera för att visa instruktioner för tidigare versioner
Webb-API 1.x
Åsidosätt 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);
}
}
}
Du kan lägga till det här åsidosatta attributet till specifika kontrollanter eller lägga till det i den globala filterkonfigurationen WebApiConfig i klassen:
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());
}
}
}
Webb-API 2.x
Lägg till en implementering av 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);
}
}
}
Lägg till det här kodfragmentet i tjänsterna i 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());
}
}
}
Som alternativ kan du:
- Ersätt den enda
ExceptionHandlerinstansen med en anpassad implementering avIExceptionHandler. Den här undantagshanteraren anropas bara när ramverket fortfarande kan välja vilket svarsmeddelande som ska skickas, inte när anslutningen avbryts, till exempel. - Använd undantagsfilter enligt beskrivningen i föregående avsnitt på Web API 1.x-kontrollanter, som inte anropas i alla fall.
WCF
Lägg till en klass som utökar Attribute och implementerar IErrorHandler och 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)
{
}
}
}
Lägg till attributet i tjänstimplementeringarna:
namespace WcfService4
{
[AiLogException]
public class Service1 : IService1
{
// Omitted for brevity
}
}
Prestandaräknare för undantag
Om du har installerat Azure Monitor Application Insights-agenten på servern kan du få ett diagram över undantagsfrekvensen som mäts av .NET. Både hanterade och ohanterade .NET-undantag ingår.
Öppna fliken metrics explorer och lägg till ett nytt diagram. Under Prestandaräknare väljer du Undantagsfrekvens.
.NET Framework beräknar frekvensen genom att räkna antalet undantag i ett intervall och dividera med intervallets längd.
Det här antalet skiljer sig från antalet undantag som beräknas av Application Insights-portalens inventeringsrapporter TrackException . Samplingsintervallen skiljer sig åt och SDK skickar TrackException inte rapporter för alla hanterade och ohanterade undantag.
Anpassad måttsamling
Azure Monitor Application Insights .NET och .NET Core SDK:er har två olika metoder för att samla in anpassade mått:
- Metoden
TrackMetric(), som saknar föraggregering. - Metoden
GetMetric(), som har föraggregering.
Vi rekommenderar att du använder aggregering, så TrackMetric()det är inte längre den bästa metoden för att samla in anpassade mått. Den här artikeln beskriver hur du använder GetMetric() metoden och en del av logiken bakom hur den fungerar.
Expandera om du vill veta mer om föraggregering jämfört med API för icke-föraggregering
Metoden TrackMetric() skickar råtelemetri som anger ett mått. Det är ineffektivt att skicka ett enda telemetriobjekt för varje värde. Metoden TrackMetric() är också ineffektiv när det gäller prestanda eftersom varje TrackMetric(item) går igenom hela SDK-pipelinen för telemetriinitierare och processorer.
Till skillnad från TrackMetric()hanterar GetMetric() lokal föraggregering åt dig och skickar sedan bara ett aggregerat sammanfattningsmått med ett fast intervall på en minut. Om du behöver noggrant övervaka vissa anpassade mått på den andra eller till och med millisekundersnivån kan du göra det samtidigt som du bara ådrar dig lagrings- och nätverkstrafikkostnaden för att bara övervaka varje minut. Det här beteendet minskar också risken för begränsning eftersom det totala antalet telemetriobjekt som behöver skickas för ett aggregerat mått minskar avsevärt.
I Application Insights samlas anpassade mått in via TrackMetric() och GetMetric() omfattas inte av sampling. Sampling av viktiga mått kan leda till scenarier där aviseringar som bygger på dessa mått blir otillförlitliga. Genom att aldrig sampla dina anpassade mått kan du vara säker på att när dina aviseringströsklar överskrids utlöses en avisering. Eftersom anpassade mått inte samplas finns det vissa potentiella problem.
Trendspårning i ett mått varje sekund, eller med ett ännu mer detaljerat intervall, kan resultera i:
- Ökade kostnader för datalagring. Det finns en kostnad som är kopplad till hur mycket data du skickar till Azure Monitor. Ju mer data du skickar, desto större blir den totala kostnaden för övervakning.
- Ökad nätverkstrafik eller prestandakostnader. I vissa scenarier kan den här kostnaden ha både en ekonomisk kostnad och en programprestandakostnad.
- Risk för inmatningsbegränsning. Azure Monitor släpper datapunkter ("throttles") när din app skickar en hög telemetrifrekvens på kort tid.
Begränsning är ett problem eftersom det kan leda till missade aviseringar. Villkoret för att utlösa en avisering kan inträffa lokalt och sedan tas bort vid inmatningsslutpunkten på grund av att för mycket data skickas. Vi rekommenderar inte att du använder TrackMetric() för .NET och .NET Core om du inte har implementerat din egen lokala aggregeringslogik. Om du försöker spåra varje instans som en händelse inträffar under en viss tidsperiod kanske det TrackEvent() passar bättre. Tänk på att anpassade händelser till skillnad från anpassade mått omfattas av sampling. Du kan fortfarande använda TrackMetric() även utan att skriva en egen lokal föraggregering. Men om du gör det, var medveten om fallgroparna.
Sammanfattningsvis rekommenderar GetMetric() vi att eftersom den utför föraggregering ackumuleras värden från alla Track() anrop och skickar en sammanfattning/aggregering en gång i minuten. Metoden GetMetric() kan avsevärt minska kostnaderna och prestandakostnaderna genom att skicka färre datapunkter samtidigt som all relevant information samlas in.
Kom igång med GetMetric
I våra exempel ska vi använda ett grundläggande .NET Core 3.1-arbetstjänstprogram. Om du vill replikera testmiljön som används med dessa exempel följer du steg 1–6 under .NET Core Worker Service-programmet. De här stegen lägger till Application Insights i en grundläggande arbetstjänstprojektmall. Begreppen gäller för alla allmänna program där SDK:t kan användas, inklusive webbappar och konsolappar.
Skicka mått
Ersätt innehållet i worker.cs filen med följande kod:
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);
}
}
}
}
När du kör exempelkoden ser du att loopen while körs upprepade gånger utan att telemetri skickas i Visual Studio-utdatafönstret. Ett enda telemetriobjekt skickas runt 60-sekundersmarkeringen, vilket i vårt test ser ut så här:
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"}}}}
Det här enskilda telemetriobjektet representerar en sammanställning av 41 distinkta måttmätningar. Eftersom vi skickade samma värde om och om igen har vi en standardavvikelse (stDev) av 0 med identiska högsta (max) och lägsta (min) värden. Egenskapen value representerar en summa av alla enskilda värden som aggregerades.
Anmärkning
Metoden GetMetric stöder inte spårning av det sista värdet (till exempel gauge) eller spårning av histogram eller distributioner.
Om vi undersöker vår Application Insights-resurs i logs(Analytics) -upplevelsen skulle det enskilda telemetriobjektet se ut som följande skärmbild.
Anmärkning
Även om råtelemetriobjektet inte innehöll en explicit summaegenskap/fält när det matades in skapar vi en åt dig. I det här fallet representerar både value egenskapen och valueSum samma sak.
Du kan också komma åt din anpassade måtttelemetri i avsnittet Mått i portalen som både ett loggbaserat och anpassat mått. Följande skärmbild är ett exempel på ett loggbaserat mått.
Referens för cachemått för användning med högt dataflöde
Måttvärden kan observeras ofta i vissa fall. En tjänst med högt dataflöde som bearbetar 500 begäranden per sekund kanske vill generera 20 telemetrimått för varje begäran. Resultatet innebär att du spårar 10 000 värden per sekund. I sådana scenarier med högt dataflöde kan användarna behöva hjälpa SDK:t genom att undvika vissa sökningar.
Till exempel utförde föregående exempel en sökning efter ett handtag för måttet ComputersSold och spårade sedan ett observerat värde på 42. I stället kan handtaget cachelagras för flera spåranrop:
//...
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);
}
}
Förutom att cachelagra måtthandtaget minskades Task.Delay även föregående exempel till 50 millisekunder så att loopen skulle köras oftare. Resultatet är 772 TrackValue() anrop.
Flerdimensionella mått
Exemplen i föregående avsnitt visar nolldimensionella mått. Mått kan också vara flerdimensionella. Vi stöder för närvarande upp till 10 dimensioner.
Här är ett exempel på hur du skapar ett endimensionellt mått:
//...
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);
}
}
Om du kör exempelkoden i minst 60 sekunder skickas tre distinkta telemetriobjekt till Azure. Varje objekt representerar aggregeringen av en av de tre formfaktorerna. Precis som tidigare kan du undersöka mer i vyn Loggar (analys).
I metrics Explorer:
Observera att du inte kan dela upp måttet med din nya anpassade dimension eller visa din anpassade dimension med måttvyn.
Som standard är flerdimensionella mått i måttutforskaren inte aktiverade i Application Insights-resurser.
Aktivera flerdimensionella mått
Om du vill aktivera flerdimensionella mått för en Application Insights-resurs väljer du Användning och uppskattade kostnader>Anpassade mått> för anpassade måttdimensioner >OK. Mer information finns i Anpassade måttdimensioner och föraggregering.
När du har gjort ändringen och skickat ny flerdimensionell telemetri kan du välja Tillämpa delning.
Anmärkning
Endast nyligen skickade mått efter att funktionen aktiverades i portalen har lagrade dimensioner.
Visa dina måttaggregeringar för varje FormFactor dimension.
Använd MetricIdentifier när det finns fler än tre dimensioner
För närvarande stöds 10 dimensioner. Om du använder fler än tre dimensioner måste du använda 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");
Anpassad måttkonfiguration
Om du vill ändra måttkonfigurationen måste du göra ändringar på den plats där måttet initieras.
Specialdimensionsnamn
Mått använder inte telemetrikontexten för de TelemetryClient som används för att komma åt dem. Att använda specialdimensionsnamn som är tillgängliga som konstanter i MetricDimensionNames klassen är den bästa lösningen för den här begränsningen.
Måttaggregeringar som skickas av följande Special Operation Request Size mått har Context.Operation.Name angetts till Special Operation. Metoden TrackMetric() eller någon annan TrackXXX() metod har OperationName angetts korrekt till 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);
//...
}
}
I det här fallet använder du de specialdimensionsnamn som anges i MetricDimensionNames klassen för att ange TelemetryContext värdena.
När måttaggregatet som kommer från nästa instruktion till exempel skickas till Application Insights-molnslutpunkten är dess Context.Operation.Name datafält inställt på Special Operation:
_telemetryClient.GetMetric("Request Size", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation");
Värdet för den här specialdimensionen kopieras till TelemetryContext och används inte som en normal dimension. Om du även vill behålla en åtgärdsdimension för normal måttutforskning måste du skapa en separat dimension för detta ändamål:
_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Tak för dimensioner och tidsserier
Om du vill förhindra att telemetriundersystemet oavsiktligt använder dina resurser kan du styra det maximala antalet dataserier per mått. Standardgränserna är högst 1 000 totala dataserier per mått och högst 100 olika värden per dimension.
Viktigt!
Använd låga kardinalvärden för dimensioner för att undvika begränsning.
När det gäller begränsning av dimension och tidsserier använder Metric.TrackValue(..) vi för att se till att gränserna följs. Om gränserna redan har nåtts Metric.TrackValue(..) returneras False och värdet spåras inte. Annars returneras True. Det här beteendet är användbart om data för ett mått kommer från användarindata.
Konstruktorn MetricConfiguration tar några alternativ för hur du hanterar olika serier inom respektive mått och ett objekt i en klass som implementerar IMetricSeriesConfiguration som anger aggregeringsbeteende för varje enskild serie av måttet:
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är det maximala antalet datatidsserier som ett mått kan innehålla. När den här gränsen har nåtts returnerar anrop tillTrackValue()det normalt en ny serie .false -
valuesPerDimensionLimitbegränsar antalet distinkta värden per dimension på ett liknande sätt. -
restrictToUInt32Valuesavgör om endast icke-negativa heltalsvärden ska spåras eller inte.
Här är ett exempel på hur du skickar ett meddelande för att veta om gränsen överskrids:
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);
}
Spårning av anpassade åtgärder
Application Insights SDK:er spårar automatiskt inkommande HTTP-begäranden och anrop till beroende tjänster, till exempel HTTP-begäranden och SQL-frågor. Spårning och korrelation av begäranden och beroenden ger dig insyn i hela programmets svarstider och tillförlitlighet för alla mikrotjänster som kombinerar det här programmet.
Det finns en klass med programmönster som inte kan stödjas allmänt. Korrekt övervakning av sådana mönster kräver manuell kodinstrumentation. Det här avsnittet beskriver några mönster som kan kräva manuell instrumentering, till exempel anpassad köbearbetning och tidskrävande bakgrundsuppgifter.
Det här avsnittet innehåller vägledning om hur du spårar anpassade åtgärder med Application Insights SDK.
Översikt
En åtgärd är ett logiskt arbete som körs av ett program. Den har ett namn, starttid, varaktighet, resultat och en kontext för körning som användarnamn, egenskaper och resultat. Om åtgärd A initierades av åtgärd B anges åtgärd B som överordnad för A. En åtgärd kan bara ha en överordnad åtgärd, men den kan ha många underordnade åtgärder. Mer information om åtgärder och telemetrikorrelation finns i Application Insights telemetrikorrelation.
I Application Insights .NET SDK beskrivs åtgärden av den abstrakta klassen OperationTelemetry och dess underordnade RequestTelemetry och DependencyTelemetry.
Spårning av inkommande åtgärder
Application Insights webb-SDK samlar automatiskt in HTTP-begäranden för ASP.NET program som körs i en IIS-pipeline och alla ASP.NET Core-program. Det finns lösningar som stöds av communityn för andra plattformar och ramverk. Om programmet inte stöds av någon av de standardlösningar eller lösningar som stöds av communityn kan du instrumentera det manuellt.
Ett annat exempel som kräver anpassad spårning är arbetaren som tar emot objekt från kön. För vissa köer spåras anropet för att lägga till ett meddelande i den här kön som ett beroende. Den övergripande åtgärd som beskriver meddelandebearbetning samlas inte in automatiskt.
Nu ska vi se hur sådana åtgärder kan spåras.
På hög nivå är uppgiften att skapa RequestTelemetry och ange kända egenskaper. När åtgärden är klar spårar du telemetrin. I följande exempel visas den här uppgiften.
HTTP-begäran i en lokalt installerad Owin-app
I det här exemplet sprids spårningskontexten enligt HTTP-protokollet för korrelation. Du bör förvänta dig att få rubriker som beskrivs där.
Expandera för att visa kod
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);
}
}
HTTP-protokollet för korrelation deklarerar Correlation-Context också huvudet. Det utelämnas här för enkelhetens skull.
Köinstrumentation
W3C-spårningskontexten och HTTP-protokollet för korrelationspasskorrelationsinformation med HTTP-begäranden, men varje köprotokoll måste definiera hur samma information skickas längs kömeddelandet. Vissa köprotokoll, till exempel AMQP, tillåter överföring av fler metadata. Andra protokoll, till exempel Azure Storage Queue, kräver att kontexten kodas i meddelandets nyttolast.
Anmärkning
Spårning mellan komponenter stöds inte för köer ännu.
Med HTTP, om din producent och konsument skickar telemetri till olika Application Insights-resurser, visar transaktionsdiagnostikupplevelsen och Programkarta transaktioner och mappar från slutpunkt till slutpunkt. För köer stöds inte den här funktionen än.
Service Bus-kö
Information om spårning finns i Distribuerad spårning och korrelation via Azure Service Bus-meddelanden.
Azure Storage-kö
I följande exempel visas hur du spårar Azure Storage-köåtgärderna och korrelerar telemetri mellan producenten, konsumenten och Azure Storage.
Lagringskön har ett HTTP-API. Alla anrop till kön spåras av Application Insights Dependency Collector för HTTP-begäranden. Den konfigureras som standard för ASP.NET- och ASP.NET Core-program. Med andra typer av program kan du läsa dokumentationen om konsolprogram.
Du kanske också vill korrelera Application Insights-åtgärds-ID:t med ID:t för lagringsbegäran. Information om hur du anger och hämtar en klient för lagringsbegäran och ett serverbegärans-ID finns i Övervaka, diagnostisera och felsöka Azure Storage.
Eftersom Lagringsköer stöder HTTP-API:et spåras alla åtgärder med kön automatiskt av Application Insights. I många fall bör den här instrumentationen vara tillräcklig. För att korrelera spårningar på konsumentsidan med producentspårningar måste du skicka en korrelationskontext som liknar hur vi gör det i HTTP-protokollet för korrelation.
Det här exemplet visar hur du spårar åtgärden Enqueue . Du kan:
-
Korrelera återförsök (om några): De har alla en gemensam överordnad som är åtgärden
Enqueue. Annars spåras de som underordnade till den inkommande begäran. Om det finns flera logiska begäranden till kön kan det vara svårt att hitta vilket anrop som resulterade i återförsök. - Korrelera lagringsloggar (om och när det behövs): De korreleras med Application Insights-telemetri.
Åtgärden Enqueue är underordnad en överordnad åtgärd. Ett exempel är en inkommande HTTP-begäran. HTTP-beroendeanropet är underordnad åtgärden Enqueue och barnbarnet till den inkommande begäran.
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);
}
}
Om du vill minska mängden telemetri i dina programrapporter eller om du inte vill spåra Enqueue åtgärden av andra skäl använder du API:et Activity direkt:
- Skapa (och starta) en ny
Activityi stället för att starta Application Insights-åtgärden. Du behöver inte tilldela några egenskaper för den förutom åtgärdsnamnet. - Serialisera
yourActivity.Idi meddelandets nyttolast i stället föroperation.Telemetry.Id. Du kan också användaActivity.Current.Id.
På samma sätt kan andra köåtgärder instrumenteras. En granskningsåtgärd bör instrumenteras på ett liknande sätt som en dequeue-åtgärd. Instrumentering av köhanteringsåtgärder är inte nödvändigt. Application Insights spårar åtgärder som HTTP, och i de flesta fall räcker det.
När du instrumentera borttagning av meddelanden kontrollerar du att du anger åtgärdsidentifierarna (korrelation). Du kan också använda API:et Activity . Sedan behöver du inte ange åtgärdsidentifierare för telemetriobjekten eftersom Application Insights SDK gör det åt dig:
- Skapa en ny
Activitynär du har fått ett objekt från kön. - Använd
Activity.SetParentId(message.ParentId)för att korrelera konsument- och producentloggar. -
ActivityStarta . - Spåra dequeue-, process- och borttagningsåtgärder med hjälp av hjälpfunktioner
Start/StopOperation. Gör det från samma asynkrona kontrollflöde (körningskontext). På så sätt korreleras de korrekt. -
ActivityStoppa . - Använd
Start/StopOperationeller anropaTracktelemetri manuellt.
Beroendetyper
Application Insights använder beroendetyp för att anpassa användargränssnittsupplevelser. För köer identifieras följande typer av som förbättrar upplevelsen av DependencyTelemetrytransaktionsdiagnostik:
-
Azure queueför Azure Storage-köer -
Azure Event Hubsför Azure Event Hubs -
Azure Service Busför Azure Service Bus
Satsvis bearbetning
Med vissa köer kan du ta bort flera meddelanden med en begäran. Bearbetningen av sådana meddelanden är förmodligen oberoende och tillhör de olika logiska åtgärderna. Det går inte att korrelera åtgärden Dequeue med ett visst meddelande som bearbetas.
Varje meddelande ska bearbetas i sitt eget asynkrona kontrollflöde. Mer information finns i avsnittet Spårning av utgående beroenden .
Långvariga bakgrundsaktiviteter
Vissa program startar tidskrävande åtgärder som kan orsakas av användarbegäranden. Ur spårnings-/instrumentationsperspektivet skiljer det sig inte från instrumentation för begäran eller beroende:
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);
}
}
I det här exemplet telemetryClient.StartOperation skapar DependencyTelemetry och fyller korrelationskontexten. Anta att du har en överordnad åtgärd som skapades av inkommande begäranden som schemalagt åtgärden. Så länge som BackgroundTask startar i samma asynkrona kontrollflöde som en inkommande begäran korreleras den med den överordnade åtgärden.
BackgroundTask och alla kapslade telemetriobjekt korreleras automatiskt med den begäran som orsakade den, även när begäran har avslutats.
När aktiviteten startar från bakgrundstråden som inte har någon åtgärd (Activity) associerad med den, BackgroundTask har den ingen överordnad. Den kan dock ha kapslade åtgärder. Alla telemetriobjekt som rapporteras från aktiviteten korreleras till de som skapats DependencyTelemetry i BackgroundTask.
Spårning av utgående beroenden
Du kan spåra din egen beroendetyp eller en åtgärd som inte stöds av Application Insights.
Metoden Enqueue i Service Bus-kön eller lagringskön kan fungera som exempel för sådan anpassad spårning.
Den allmänna metoden för anpassad beroendespårning är att:
- Anropa metoden
TelemetryClient.StartOperation(tillägg) som fyller deDependencyTelemetryegenskaper som behövs för korrelation och vissa andra egenskaper, till exempel start, tidsstämpel och varaktighet. - Ange andra anpassade egenskaper för
DependencyTelemetry, till exempel namnet och alla andra kontexter som du behöver. - Ring ett beroendeanrop och vänta på det.
- Stoppa åtgärden med
StopOperationnär den är klar. - Hantera undantag.
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.
}
}
}
Om du tar bort en åtgärd stoppas åtgärden, så du kan göra det i stället för att anropa StopOperation.
Varning
I vissa fall kan ett ohanterat undantag förhindrafinally att anropas, så åtgärder kanske inte spåras.
Bearbetning och spårning av parallella åtgärder
Anrop StopOperation stoppar bara den åtgärd som startades. Om den aktuella åtgärden som körs inte matchar den som du vill stoppa, StopOperation gör ingenting. Den här situationen kan inträffa om du startar flera åtgärder parallellt i samma körningskontext.
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;
Se till att du alltid anropar StartOperation och bearbetar åtgärden i samma asynkron metod för att isolera åtgärder som körs parallellt. Om åtgärden är synkron (eller inte asynkron), omsluter du processen och spårar med 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-åtgärder jämfört med System.Diagnostics.Activity
System.Diagnostics.Activity representerar den distribuerade spårningskontexten och används av ramverk och bibliotek för att skapa och sprida kontext i och utanför processen och korrelera telemetriobjekt.
Activity fungerar tillsammans med System.Diagnostics.DiagnosticSource som meddelandemekanism mellan ramverket/biblioteket för att meddela om intressanta händelser som inkommande eller utgående begäranden och undantag.
Aktiviteter är funktioner på den översta nivån i Application Insights. Automatisk beroende- och begärandeinsamling är starkt beroende av dem tillsammans med DiagnosticSource händelser. Om du har skapat Activity i ditt program skulle det inte leda till att Application Insights-telemetri skapas. Application Insights måste ta emot DiagnosticSource händelser och känna till händelsenamn och händelsedata för att omvandla Activity till telemetri.
Varje Application Insights-åtgärd (begäran eller beroende) omfattar Activity. När StartOperation anropas skapas Activity den under.
StartOperation är det rekommenderade sättet att spåra telemetrier för begäran eller beroende manuellt och se till att allt är korrelerat.
Räknare i Application Insights
Application Insights stöder prestandaräknare och händelseräknare. Den här guiden ger en översikt över båda, inklusive deras syfte, konfiguration och användning i .NET-program.
Översikt
Prestandaräknare är inbyggda i Windows-operativsystemet och erbjuder fördefinierade mått som CPU-användning, minnesförbrukning och diskaktivitet. Dessa räknare är idealiska för att övervaka standardprestandamått med minimal konfiguration. De hjälper till att spåra resursanvändning eller felsöka flaskhalsar på systemnivå i Windows-baserade program men stöder inte anpassade programspecifika mått.
Händelseräknare fungerar på flera plattformar, inklusive Windows, Linux och macOS. De gör det möjligt för utvecklare att definiera och övervaka enkla, anpassningsbara programspecifika mått, vilket ger mer flexibilitet än prestandaräknare. Händelseräknare är användbara när systemmåtten inte räcker till eller när detaljerad telemetri behövs i plattformsoberoende program. De kräver explicit implementering och konfiguration, vilket gör installationen mer arbetsintensiv.
Prestandaräknare
Windows tillhandahåller olika prestandaräknare, till exempel de som används för att samla in statistik för processor, minne och diskanvändning. Du kan också definiera dina egna prestandaräknare.
Programmet stöder insamling av prestandaräknare om den körs under Internet Information Server (IIS) på en lokal värd eller en virtuell dator med administrativ åtkomst. Program som körs som Azure Web Apps kan inte komma åt prestandaräknare direkt, men Application Insights samlar in en delmängd av tillgängliga räknare.
Tips/Råd
Precis som andra mått kan du ange en avisering för att varna om en räknare går utanför en angiven gräns. Om du vill ange en avisering öppnar du fönstret Aviseringar och väljer Lägg till avisering.
Förutsättningar
Ge apppooltjänstkontot behörighet att övervaka prestandaräknare genom att lägga till det i gruppen Användare av prestandaövervakare .
net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"
Visa räknare
Fönstret Mått visar standarduppsättningen med prestandaräknare.
Standardräknare för ASP.NET webbprogram:
- % Process\Processortid
- % process\Normaliserad processortid
- Minne\Tillgängliga byte
- ASP.NET begäranden per sekund
- .NET Common Language Runtime-undantag (CLR) utlöses per sekund
- ASP.NET ApplicationsRequest-körningstid
- Process\Privata byte
- Bearbeta\I/O-databyte per sekund
- ASP.NET program\Begäranden i programkö
- Processor(_Total)\% processortid
Lägg till räknare
Om prestandaräknaren du vill använda inte ingår i listan med mått kan du lägga till den.
Alternativ 1: Konfiguration i ApplicationInsights.config
Ta reda på vilka räknare som är tillgängliga på servern med hjälp av det här PowerShell-kommandot på den lokala servern:
Get-Counter -ListSet *Mer information finns i
Get-Counter.Öppna
ApplicationInsights.config.Om du lade till Application Insights i din app under utvecklingen:
- Redigera
ApplicationInsights.configi projektet. - Distribuera om den till dina servrar.
- Redigera
Redigera direktivet för prestandainsamlare:
<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>
Du registrerar både standardräknare och räknare som du implementerar själv.
\Objects\Processes är ett exempel på en standardräknare som är tillgänglig i alla Windows-system.
\Sales(photo)\# Items Sold är ett exempel på en anpassad räknare som kan implementeras i en webbtjänst.
Formatet är \Category(instance)\Counter, eller för kategorier som inte har instanser, bara \Category\Counter.
Parametern ReportAs krävs för räknarnamn som inte matchar [a-zA-Z()/-_ \.]+.
Om du anger en instans blir den en dimension CounterInstanceName av det rapporterade måttet.
Alternativ 2: Konfiguration i kod
Se följande avsnitt.
Samla in prestandaräknare i kod för ASP.NET webbprogram eller .NET/.NET Core-konsolprogram
Om du vill samla in systemprestandaräknare och skicka dem till Application Insights kan du anpassa följande kodfragment:
var perfCollectorModule = new PerformanceCollectorModule();
perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
@"\Process([replace-with-application-process-name])\Page Faults/sec", "PageFaultsPerfSec"));
perfCollectorModule.Initialize(TelemetryConfiguration.Active);
Eller så kan du göra samma sak med anpassade mått som du skapade:
var perfCollectorModule = new PerformanceCollectorModule();
perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
@"\Sales(photo)\# Items Sold", "Photo sales"));
perfCollectorModule.Initialize(TelemetryConfiguration.Active);
Prestandaräknare för program som körs i Azure Web Apps och Windows-containrar i Azure App Service
Både ASP.NET och ASP.NET Core-program som distribueras till Azure Web Apps körs i en speciell sandbox-miljö. Program som distribueras till Azure App Service kan använda en Windows-container eller finnas i en sandbox-miljö. Om programmet distribueras i en Windows-container är alla standardprestandaräknare tillgängliga i containeravbildningen.
Sandbox-miljön tillåter inte direkt åtkomst till systemprestandaräknare. En begränsad delmängd av räknare exponeras dock som miljövariabler enligt beskrivningen i Perf-räknare som exponeras som miljövariabler. Endast en delmängd av räknare är tillgänglig i den här miljön. Den fullständiga listan finns i Perf-räknare som exponeras som miljövariabler.
Application Insights SDK för ASP.NET och ASP.NET Core identifierar om kod distribueras till en webbapp eller en container som inte är Windows. Identifieringen avgör om den samlar in prestandaräknare i en sandbox-miljö eller använder standardsamlingsmekanismen när den finns på en Windows-container eller virtuell dator.
Log Analytics-frågor för prestandaräknare
Du kan söka efter och visa prestandaräknarrapporter i Log Analytics.
PerformanceCounters-schemat visar category, counter namn och instance namn på varje prestandaräknare. I telemetrin för varje program ser du bara räknare för det programmet. Om du till exempel vill se vilka räknare som är tillgängliga:
performanceCounters | summarize count(), avg(value) by category, instance, counter
Instance Här refererar till prestandaräknarens instans, inte rollen eller serverdatorinstansen. Prestandaräknarens instansnamn segmentar vanligtvis räknare, till exempel processortid, efter namnet på processen eller programmet.
Så här hämtar du ett diagram över tillgängligt minne under den senaste perioden:
performanceCounters | where counter == "Available Bytes" | summarize avg(value), min(value) by bin(timestamp, 1h) | render timechart
Precis som andra telemetrier har performanceCounters också en kolumn cloud_RoleInstance som anger identiteten för den värdserverinstans som appen körs på. Om du till exempel vill jämföra appens prestanda på de olika datorerna:
performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)
Vanliga frågor och svar om prestandaräknare
Mer information om vanliga frågor och svar finns i Vanliga frågor och svar om prestandaräknare.
Händelseräknare
EventCounter är .NET/.NET Core-mekanismen för att publicera och använda räknare eller statistik. EventCounters stöds på alla operativsystemplattformar – Windows, Linux och macOS. Det kan ses som en plattformsoberoende motsvarighet för PerformanceCounters som endast stöds i Windows-system.
Medan användare kan publicera anpassade händelseräknare för att uppfylla sina behov publicerar .NET en uppsättning av dessa räknare som standard. Det här dokumentet går igenom de steg som krävs för att samla in och visa händelseräknare (systemdefinierade eller användardefinierade) i Azure Application Insights.
Tips/Råd
Precis som andra mått kan du ange en avisering för att varna om en räknare går utanför en angiven gräns. Om du vill ange en avisering öppnar du fönstret Aviseringar och väljer Lägg till avisering.
Använda Application Insights för att samla in EventCounters
Application Insights stöder insamling EventCounters med dess EventCounterCollectionModule, som är en del av det nyligen släppta NuGet-paketet Microsoft.ApplicationInsights.EventCounterCollector.
EventCounterCollectionModule aktiveras automatiskt när du använder Antingen AspNetCore eller WorkerService.
EventCounterCollectionModule samlar in räknare med en icke-konfigurerbar samlingsfrekvens på 60 sekunder. Det krävs inga särskilda behörigheter för att samla in EventCounters. För ASP.NET Core-program vill du också lägga till paketet Microsoft.ApplicationInsights.AspNetCore .
dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore
Insamlade standardräknare
Från och med 2.15.0-versionen av antingen AspNetCore SDK eller WorkerService SDK samlas inga räknare in som standard. Själva modulen är aktiverad så att användarna kan lägga till önskade räknare för att samla in dem.
En lista över välkända räknare som publicerats av .NET Runtime finns i dokumentet Tillgängliga räknare .
Anpassa räknare som ska samlas in
I följande exempel visas hur du lägger till/tar bort räknare. Den här anpassningen görs som en del av programtjänstkonfigurationen när Application Insights-telemetrisamlingen har aktiverats med antingen AddApplicationInsightsTelemetry() eller AddApplicationInsightsWorkerService(). Följande är en exempelkod från ett ASP.NET Core-program. För andra typer av applikationer, se konfigurera telemetrimoduler.
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"));
}
);
Inaktivera eventcounter-samlingsmodul
EventCounterCollectionModule kan inaktiveras med hjälp ApplicationInsightsServiceOptionsav .
I följande exempel används ASP.NET Core SDK.
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;
var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);
En liknande metod kan också användas för Worker Service SDK, men namnområdet måste ändras enligt följande exempel.
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.Extensions.DependencyInjection;
var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);
Log Analytics-frågor för händelseräknare
Du kan söka efter och visa händelseräknarerapporter i Log Analytics i tabellen customMetrics .
Kör till exempel följande fråga för att se vilka räknare som samlas in och är tillgängliga för frågor:
customMetrics | summarize avg(value) by name
Om du vill hämta ett diagram över en specifik räknare (till exempel: ThreadPool Completed Work Item Count) under den senaste perioden kör du följande fråga.
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
Precis som andra telemetrier har customMetrics också en kolumn cloud_RoleInstance som anger identiteten för den värdserverinstans som appen körs på. Föregående fråga visar räknarvärdet per instans och kan användas för att jämföra prestanda för olika serverinstanser.
Vanliga frågor och svar om händelseräknare
Mer information om vanliga frågor och svar finns i Vanliga frågor och svar om händelseräknare.
Filtrera och berika telemetri
I det här avsnittet
- Filtrera och förbearbeta telemetri
- Telemetriinitierare
- Telemetriprocessor
- Provtagning
- Utöka data via HTTP
Filtrera och förbearbeta telemetri
Du kan skriva kod för att filtrera, ändra eller utöka telemetrin innan den skickas från SDK:t. Bearbetningen innehåller data som skickas från standardtelemetrimodulerna, till exempel INSAMLING av HTTP-begäranden och beroendeinsamling.
Filtrering kan ändra eller ta bort telemetri innan den skickas från SDK:t genom att implementera
ITelemetryProcessor. Du kan till exempel minska mängden telemetri genom att exkludera begäranden från robotar. Till skillnad från sampling har du fullständig kontroll över vad som skickas eller tas bort, men det påverkar alla mått som baseras på aggregerade loggar. Beroende på hur du tar bort objekt kan du också förlora möjligheten att navigera mellan relaterade objekt.Lägg till eller ändra egenskaper i telemetri som skickas från din app genom att implementera en
ITelemetryInitializer. Du kan till exempel lägga till beräknade värden eller versionsnummer för att filtrera data i portalen.Sampling minskar mängden telemetri utan att påverka din statistik. Den håller ihop relaterade datapunkter så att du kan navigera mellan dem när du diagnostiserar ett problem. I portalen multipliceras det totala antalet för att kompensera för samplingen.
Anmärkning
SDK-API:et används för att skicka anpassade händelser och mått.
Filtering
Den här tekniken ger dig direkt kontroll över vad som ingår eller undantas från telemetriströmmen. Filtrering kan användas för att ta bort telemetriobjekt från att skickas till Application Insights. Du kan använda filtrering med sampling eller separat.
Om du vill filtrera telemetri skriver du en telemetriprocessor och registrerar den med TelemetryConfiguration. All telemetri går igenom din processor. Du kan välja att släppa den från strömmen eller ge den till nästa processor i kedjan. Telemetri från standardmodulerna, till exempel HTTP-begärandeinsamlaren och beroendeinsamlaren, och telemetri som du spårade själv ingår. Du kan till exempel filtrera bort telemetri om begäranden från robotar eller lyckade beroendeanrop.
Varning
Om du filtrerar telemetrin som skickas från SDK:t med hjälp av processorer kan du förvränga den statistik som visas i portalen och göra det svårt att följa relaterade objekt.
Överväg i stället att använda sampling.
ITelemetryProcessor och ITelemetryInitializer
Vad är skillnaden mellan telemetriprocessorer och telemetriinitierare?
- Det finns vissa överlappningar i vad du kan göra med dem. Båda kan användas för att lägga till eller ändra egenskaper för telemetri, men vi rekommenderar att du använder initierare för detta ändamål.
- Telemetriinitierare körs alltid före telemetriprocessorer.
- Telemetriinitierare kan anropas mer än en gång. Enligt konventionen anger de inte någon egenskap som redan har angetts.
- Med telemetriprocessorer kan du helt ersätta eller ta bort ett telemetriobjekt.
- Alla registrerade telemetriinitierare anropas för varje telemetriobjekt. För telemetriprocessorer garanterar SDK att den första telemetriprocessorn anropas. Om resten av processorerna anropas eller inte bestäms av de föregående telemetriprocessorerna.
- Använd telemetriinitierare för att utöka telemetri med fler egenskaper eller åsidosätta en befintlig. Använd en telemetriprocessor för att filtrera bort telemetri.
Lägg till/ändra egenskaper
Använd telemetriinitierare för att utöka telemetri med ytterligare information eller för att åsidosätta telemetriegenskaper som anges av standardtelemetrimodulerna.
Application Insights för ett webbpaket samlar till exempel in telemetri om HTTP-begäranden. Som standard flaggas alla begäranden med svarskoden >=400 som misslyckade. Om du i stället vill behandla 400 som en framgång kan du ange en telemetri-initialiserare som ställer in framgångsegenskapen.
Om du anger en telemetriinitierare anropas den när någon av Metoderna Track*() anropas. Den här initiatorn innehåller Track() metoder som anropas av standardtelemetrimodulerna. Enligt konventionen anger dessa moduler inte någon egenskap som redan har angetts av en initiator. Telemetriinitierare anropas innan telemetriprocessorer anropas, så alla berikanden som görs av initiatorer är synliga för processorer.
Telemetriinitierare
Om du vill utöka telemetri med ytterligare information eller åsidosätta telemetriegenskaper som anges av standardtelemetrimodulerna använder du telemetriinitierare.
Telemetriinitierare anger kontextegenskaper som skickas tillsammans med varje telemetriobjekt. Du kan skriva egna initierare för att ange kontextegenskaper.
Standardinitierarna anges antingen av webben eller WindowsServer NuGet-paket:
| Initierare | Description |
|---|---|
AccountIdTelemetryInitializer |
Anger egenskapen AccountId . |
AuthenticatedUserIdTelemetryInitializer |
Anger egenskapen AuthenticatedUserId som anges av JavaScript SDK. |
AzureRoleEnvironmentTelemetryInitializer |
Uppdaterar kontextens RoleNameRoleInstance egenskaper och Device för alla telemetriobjekt med information som extraheras från Azure-körningsmiljön. |
BuildInfoConfigComponentVersionTelemetryInitializer |
Version Uppdaterar egenskapen för kontexten Component för alla telemetriobjekt med värdet som extraheras från BuildInfo.config filen som skapas av MS Build. |
ClientIpHeaderTelemetryInitializer |
Uppdaterar egenskapen för Ip kontexten för Location alla telemetriobjekt baserat på X-Forwarded-For HTTP-huvudet för begäran. |
DeviceTelemetryInitializer |
Uppdaterar följande egenskaper för kontexten Device för alla telemetriobjekt:• Type är inställd på PC.• Id är inställt på domännamnet för den dator där webbappen körs.• OemName anges till det värde som extraheras från fältet Win32_ComputerSystem.Manufacturer med hjälp av WMI.• Model anges till det värde som extraheras från fältet Win32_ComputerSystem.Model med hjälp av WMI.• NetworkType är inställt på värdet som extraheras från NetworkInterface egenskapen.• Language är inställt på namnet på CurrentCulture egenskapen. |
DomainNameRoleInstanceTelemetryInitializer |
RoleInstance Uppdaterar egenskapen för kontexten Device för alla telemetriobjekt med domännamnet för den dator där webbprogrammet körs. |
OperationNameTelemetryInitializer |
Name Uppdaterar egenskapen RequestTelemetry för och Name egenskapen för kontexten Operation för alla telemetriobjekt baserat på HTTP-metoden och namnen på den ASP.NET MVC-styrenhet och åtgärd som anropas för att bearbeta begäran. |
OperationIdTelemetryInitializer eller OperationCorrelationTelemetryInitializer |
Uppdaterar kontextegenskapen Operation.Id för alla telemetriobjekt som spåras när en begäran hanteras med den automatiskt genererade RequestTelemetry.Id. |
SessionTelemetryInitializer |
Id Uppdaterar egenskapen för kontexten Session för alla telemetriobjekt med värdet som extraheras från cookien ai_session som genereras av ApplicationInsights JavaScript-instrumentationskoden som körs i användarens webbläsare. |
SyntheticTelemetryInitializer eller SyntheticUserAgentTelemetryInitializer |
Uppdaterar egenskaperna , Useroch Session kontexten Operationför alla telemetriobjekt som spåras när en begäran hanteras från en syntetisk källa, till exempel ett tillgänglighetstest eller en sökmotorrobot. Som standard visar metrics Explorer inte syntetisk telemetri.Uppsättningen <Filters> som identifierar egenskaperna för begäranden. |
UserTelemetryInitializer |
Uppdaterar kontextens IdAcquisitionDate egenskaper och User för alla telemetriobjekt med värden som extraheras från cookien ai_user som genereras av Application Insights JavaScript-instrumentationskoden som körs i användarens webbläsare. |
WebTestTelemetryInitializer |
Anger användar-ID, sessions-ID och syntetiska källegenskaper för HTTP-begäranden som kommer från tillgänglighetstester. Uppsättningen <Filters> som identifierar egenskaperna för begäranden. |
Anmärkning
För .NET-program som körs i Azure Service Fabric kan du inkludera Microsoft.ApplicationInsights.ServiceFabric NuGet-paketet. Det här paketet innehåller en FabricTelemetryInitializer egenskap som lägger till Service Fabric-egenskaper till telemetriobjekt. Mer information finns på GitHub-sidan om de egenskaper som lagts till av det här NuGet-paketet.
Lägg till ITelemetryInitializer
Den här bloggen beskriver ett projekt för att diagnostisera beroendeproblem genom att automatiskt skicka regelbundna pingar till beroenden.
Definiera initieraren
using System; using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.DataContracts; using Microsoft.ApplicationInsights.Extensibility; namespace MvcWebRole.Telemetry { /* * Custom TelemetryInitializer that overrides the default SDK * behavior of treating response codes >= 400 as failed requests * */ public class MyTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { var requestTelemetry = telemetry as RequestTelemetry; // Is this a TrackRequest() ? if (requestTelemetry == null) return; int code; bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code); if (!parsed) return; if (code >= 400 && code < 500) { // If we set the Success property, the SDK won't change it: requestTelemetry.Success = true; // Allow us to filter these requests in the portal: requestTelemetry.Properties["Overridden400s"] = "true"; } // else leave the SDK to set the Success property } } }Läs in din initierare
Alternativ 1: Konfiguration i kod
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
Alternativ 2: Konfiguration i ApplicationInsights.config
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
...
</TelemetryInitializers>
</ApplicationInsights>
Se mer av det här exemplet.
Anmärkning
Kontrollera att filenapplicationinsights.config finns i utdatakatalogen och innehåller alla ändringar som gjorts nyligen.
Exempel på ITelemetryInitializers
Lägga till en anpassad egenskap
Följande exempelinitierare lägger till en anpassad egenskap för varje spårad telemetri.
public void Initialize(ITelemetry item)
{
var itemProperties = item as ISupportProperties;
if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
{
itemProperties.Properties["customProp"] = "customValue";
}
}
Lägga till ett molnrollnamn och en molnrollinstans
Steg 1: Skriv anpassad TelemetryInitializer
Följande exempelinitierare anger namnet på molnrollen till varje spårad telemetri.
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;
namespace CustomInitializer.Telemetry
{
public class MyTelemetryInitializer : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
//set custom role name here
telemetry.Context.Cloud.RoleName = "Custom RoleName";
telemetry.Context.Cloud.RoleInstance = "Custom RoleInstance";
}
}
}
}
Steg 2: Läs in en initiator till TelemetryConfiguration
I filenApplicationInsights.config :
<ApplicationInsights>
<TelemetryInitializers>
<!-- Fully qualified type name, assembly name: -->
<Add Type="CustomInitializer.Telemetry.MyTelemetryInitializer, CustomInitializer"/>
...
</TelemetryInitializers>
</ApplicationInsights>
En alternativ metod för ASP.NET webbappar är att instansiera initiatorn i kod. I följande exempel visas kod i filen Global.aspx.cs :
using Microsoft.ApplicationInsights.Extensibility;
using CustomInitializer.Telemetry;
protected void Application_Start()
{
// ...
TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
Kontrollera klientens IP-adress som används för geoplatsmappningar
Följande exempelinitierare anger klientens IP-adress, som används för geoplatsmappning, i stället för IP-adressen för klient socket, under telemetriinmatning.
public void Initialize(ITelemetry telemetry)
{
var request = telemetry as RequestTelemetry;
if (request == null) return true;
request.Context.Location.Ip = "{client ip address}"; // Could utilize System.Web.HttpContext.Current.Request.UserHostAddress;
return true;
}
Telemetriprocessorer
Telemetriprocessorer kan filtrera och ändra varje telemetriobjekt innan det skickas från SDK:t till portalen.
Implementera
ITelemetryProcessor.Telemetriprocessorer skapar en bearbetningskedja. När du instansierar en telemetriprocessor får du en referens till nästa processor i kedjan. När en telemetridatapunkt skickas till processmetoden utför den sitt arbete och anropar sedan (eller anropar inte) nästa telemetriprocessor i kedjan.
using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.DataContracts; public class SuccessfulDependencyFilter : ITelemetryProcessor { private ITelemetryProcessor Next { get; set; } // next will point to the next TelemetryProcessor in the chain. public SuccessfulDependencyFilter(ITelemetryProcessor next) { this.Next = next; } public void Process(ITelemetry item) { // To filter out an item, return without calling the next processor. if (!OKtoSend(item)) { return; } this.Next.Process(item); } // Example: replace with your own criteria. private bool OKtoSend (ITelemetry item) { var dependency = item as DependencyTelemetry; if (dependency == null) return true; return dependency.Success != true; } }Lägg till processorn.
Infoga det här kodfragmentet i ApplicationInsights.config:
<TelemetryProcessors> <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9"> <!-- Set public property --> <MyParamFromConfigFile>2-beta</MyParamFromConfigFile> </Add> </TelemetryProcessors>Du kan skicka strängvärden från .config-filen genom att ange offentliga namngivna egenskaper i din klass.
Varning
Var noga med att matcha typnamnet och eventuella egenskapsnamn i .config-filen med klass- och egenskapsnamnen i koden. Om .config-filen refererar till en icke-existerande typ eller egenskap kan SDK:t tyst misslyckas med att skicka telemetri.
Du kan också initiera filtret i koden. I en lämplig initieringsklass, till exempel AppStart i
Global.asax.cs, infogar du processorn i kedjan:Anmärkning
Följande kodexempel är föråldrat, men görs tillgängligt här för eftervärlden. Överväg att komma igång med OpenTelemetry eller migrera till OpenTelemetry.
var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; builder.Use((next) => new SuccessfulDependencyFilter(next)); // If you have more processors: builder.Use((next) => new AnotherProcessor(next)); builder.Build();Telemetriklienter som skapats efter den här punkten använder dina processorer.
Telemetriprocessor för anpassningsbar sampling (från 2.0.0-beta3)
Den här funktionen är aktiverad som standard. Om din app skickar betydande telemetri tar den här processorn bort en del av den.
<TelemetryProcessors> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> </Add> </TelemetryProcessors>Parametern ger det mål som algoritmen försöker uppnå. Varje instans av SDK:t fungerar oberoende av varandra. Så om servern är ett kluster med flera datorer multipliceras den faktiska telemetrivolymen i enlighet med detta.
Läs mer om sampling.
Telemetriprocessor för fast sampling (från 2.0.0-beta1)
Det finns också en standardtelemetriprocessor för sampling (från 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>
Exempelfilter
Syntetiska begäranden
Filtrera bort robotar och webbtester. Även om Metrics Explorer ger dig möjlighet att filtrera bort syntetiska källor, minskar det här alternativet trafik- och inmatningsstorleken genom att filtrera dem i själva SDK:t.
public void Process(ITelemetry item)
{
if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
// Send everything else:
this.Next.Process(item);
}
Autentiseringen misslyckades
Filtrera bort begäranden med svaret "401".
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null &&
request.ResponseCode.Equals("401", StringComparison.OrdinalIgnoreCase))
{
// To filter out an item, return without calling the next processor.
return;
}
// Send everything else
this.Next.Process(item);
}
Filtrera bort snabba fjärrberoendeanrop
Om du bara vill diagnostisera anrop som är långsamma filtrerar du bort de snabba.
Anmärkning
Den här filtreringen förvränger den statistik som visas i portalen.
public void Process(ITelemetry item)
{
var request = item as DependencyTelemetry;
if (request != null && request.Duration.TotalMilliseconds < 100)
{
return;
}
this.Next.Process(item);
}
Provtagning
Mer information om hur du konfigurerar sampling för ASP.NET program finns i Sampling i Application Insights.
Utöka data via HTTP
var requestTelemetry = HttpContext.Current?.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;
if (requestTelemetry != null)
{
requestTelemetry.Properties["myProp"] = "someData";
}
Hantera SDK-komponenter
I det här avsnittet
- Telemetrikanaler
- Telemetrimoduler
- Inaktivera telemetri
- ApplicationId-provider
- Samling med ögonblicksbilder
Du kan anpassa Application Insights SDK för ASP.NET, ASP.NET Core och Worker Service för att ändra standardkonfigurationen.
Application Insights .NET SDK består av många NuGet-paket. Kärnpaketet tillhandahåller API:et för att skicka telemetri till Application Insights. Fler paket tillhandahåller telemetrimoduler och initierare för automatisk spårning av telemetri från ditt program och dess kontext. Genom att justera konfigurationsfilen kan du aktivera eller inaktivera telemetrimoduler och initierare. Du kan också ange parametrar för vissa av dem.
Konfigurationsfilen heter ApplicationInsights.config eller ApplicationInsights.xml. Namnet beror på typen av program. Det läggs automatiskt till i projektet när du installerar de flesta versioner av SDK:et.
När du använder den automatiserade upplevelsen från Visual Studio-mallprojekten som stöder Add>Application Insights TelemetryApplicationInsights.config skapas filen som standard i projektrotmappen. När den har kompilerats kopieras den till mappen bin. Den läggs också till i en webbapp av Application Insights Agent på en IIS-server.
Viktigt!
Konfigurationsfilen ignoreras om tillägget för Azure-webbplatser eller tillägget för virtuella Azure-datorer och skalningsuppsättningar för virtuella Azure-datorer används.
Det finns ingen motsvarande fil som styr SDK:t på en webbsida.
Telemetrikanaler
Telemetrikanaler är en integrerad del av Application Insights SDK:er. De hanterar buffring och överföring av telemetri till Application Insights-tjänsten. .NET- och .NET Core-versionerna av SDK:erna har två inbyggda telemetrikanaler: InMemoryChannel och ServerTelemetryChannel. Det här avsnittet beskriver varje kanal och visar hur du anpassar kanalbeteendet.
Anmärkning
Mer information om vanliga frågor och svar finns i Vanliga frågor och svar om telemetrikanaler
Vad är telemetrikanaler?
Telemetrikanaler ansvarar för buffring av telemetriobjekt och skickar dem till Application Insights-tjänsten, där de lagras för frågor och analys. En telemetrikanal är alla klasser som implementerar Microsoft.ApplicationInsights.ITelemetryChannel gränssnittet.
Metoden Send(ITelemetry item) för en telemetrikanal anropas när alla telemetriinitierare och telemetriprocessorer anropas. Därför når inte alla objekt som tappas av en telemetriprocessor kanalen. Metoden Send() skickar vanligtvis inte objekten till serverdelen direkt. Vanligtvis buffrar den dem i minnet och skickar dem i batchar för effektiv överföring.
Undvik att anropa Flush() om det inte är viktigt att skicka buffrad telemetri omedelbart. Använd den bara i scenarier som programavstängning, undantagshantering eller när du använder kortvariga processer som bakgrundsjobb eller kommandoradsverktyg. I webbprogram eller långvariga tjänster hanterar SDK telemetri som skickas automatiskt. Att ringa Flush() i onödan kan orsaka prestandaproblem.
Live Metrics Stream har också en anpassad kanal som driver direktuppspelning av telemetri. Den här kanalen är oberoende av den vanliga telemetrikanalen och det här dokumentet gäller inte för den.
Inbyggda telemetrikanaler
Application Insights .NET och .NET Core SDK:er levereras med två inbyggda kanaler:
InMemoryChannel: En lätt kanal som buffrar objekt i minnet tills de skickas. Objekt buffrad i minnet och töms en gång var 30:e sekund, eller när 500 objekt buffrats. Den här kanalen ger minimala tillförlitlighetsgarantier eftersom den inte försöker skicka telemetri igen efter ett fel. Den här kanalen behåller inte heller objekt på disken. Så alla osedda objekt går förlorade permanent vid programavstängning, oavsett om det är graciöst eller inte. Den här kanalen implementerar en
Flush()metod som kan användas för att tvinga bort alla minnesinterna telemetriobjekt synkront. Den här kanalen passar bra för kortvariga program där en synkron tömning är idealisk.Den här kanalen är en del av det större Microsoft.ApplicationInsights NuGet-paketet och är standardkanalen som SDK använder när inget annat har konfigurerats.
ServerTelemetryChannel: En mer avancerad kanal som har återförsöksprinciper och möjligheten att lagra data på en lokal disk. Den här kanalen försöker skicka telemetri igen om tillfälliga fel inträffar. Den här kanalen använder också lokal disklagring för att hålla objekt på disk under nätverksstopp eller stora telemetrivolymer. På grund av dessa mekanismer för återförsök och lokal disklagring anses den här kanalen vara mer tillförlitlig. Vi rekommenderar det för alla produktionsscenarier. Den här kanalen är standard för ASP.NET och ASP.NET Core-program som konfigureras enligt den officiella dokumentationen. Den här kanalen är optimerad för serverscenarier med tidskrävande processer. Metoden
Flush()som implementeras av den här kanalen är inte synkron.Den här kanalen levereras som NuGet-paketet Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel och hämtas automatiskt när du använder antingen Microsoft.ApplicationInsights.Web eller Microsoft.ApplicationInsights.AspNetCore NuGet-paketet.
Konfigurera en telemetrikanal
Du konfigurerar en telemetrikanal genom att ställa in den på den aktiva telemetrikonfigurationen. För ASP.NET program innebär konfigurationen att du ställer in telemetrikanalinstansen till eller genom att TelemetryConfiguration.ActiveApplicationInsights.configändra . För ASP.NET Core-program innebär konfigurationen att du lägger till kanalen i containern för beroendeinmatning.
I följande avsnitt visas exempel på hur du konfigurerar StorageFolder inställningen för kanalen i olika programtyper.
StorageFolder är bara en av de konfigurerbara inställningarna. En fullständig lista över konfigurationsinställningar finns i avsnittet Konfigurerbara inställningar i kanaler senare i den här artikeln.
Alternativ 1: Konfiguration i kod
Följande kod konfigurerar en ServerTelemetryChannel instans med StorageFolder inställd på en anpassad plats. Lägg till den här koden i början av programmet, vanligtvis i Application_Start() metoden i 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;
}
Alternativ 2: Konfiguration i ApplicationInsights.config
I följande avsnitt från ApplicationInsights.config visas kanalen ServerTelemetryChannel som konfigurerats med StorageFolder inställd på en anpassad plats:
<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 i kod för konsolprogram
För konsolappar är koden densamma för både .NET och .NET Core:
var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
Driftinformation om ServerTelemetryChannel
ServerTelemetryChannel lagrar ankommande objekt i en minnesintern buffert. Objekten serialiseras, komprimeras och lagras i en instans en Transmission gång var 30:e sekund eller när 500 objekt buffras. En enskild Transmission instans innehåller upp till 500 objekt och representerar en batch telemetri som skickas via ett enda HTTPS-anrop till Application Insights-tjänsten.
Som standard kan högst 10 Transmission instanser skickas parallellt. Om telemetrin anländer snabbare, eller om nätverket eller Application Insights-serverdelen är långsam, Transmission lagras instanser i minnet. Standardkapaciteten för den här minnesinterna Transmission bufferten är 5 MB. När minnesintern kapacitet överskrids Transmission lagras instanser på en lokal disk upp till en gräns på 50 MB.
Transmission instanser lagras på den lokala disken även när det finns nätverksproblem. Endast de objekt som lagras på en lokal disk överlever en programkrasch. De skickas när programmet startar igen. Om nätverksproblem kvarstår ServerTelemetryChannel använder du en exponentiell backoff-logik som sträcker sig från 10 sekunder till 1 timme innan du försöker skicka telemetri igen.
Konfigurerbara inställningar i kanaler
Den fullständiga listan över konfigurerbara inställningar för varje kanal finns i:
Här är de vanligaste inställningarna för ServerTelemetryChannel:
MaxTransmissionBufferCapacity: Den maximala mängden minne, i byte, som används av kanalen för att buffrar överföringar i minnet. När den här kapaciteten nås lagras nya objekt direkt på den lokala disken. Standardvärdet är 5 MB. Att ange ett högre värde leder till mindre diskanvändning, men kom ihåg att objekt i minnet går förlorade om programmet kraschar.MaxTransmissionSenderCapacity: Det maximala antaletTransmissioninstanser som skickas till Application Insights samtidigt. Standardvärdet är 10. Den här inställningen kan konfigureras till ett högre tal, vilket vi rekommenderar när en stor mängd telemetri genereras. Hög volym inträffar vanligtvis under belastningstestning eller när samplingen är avstängd.StorageFolder: Den mapp som används av kanalen för att lagra objekt på disk efter behov. I Windows används antingen %LOCALAPPDATA% eller %TEMP% om ingen annan sökväg uttryckligen anges. I andra miljöer än Windows används som standard följande platser (i ordning): %TMPDIR%, /var/tmp/ eller /tmp/.
Vilken kanal ska jag använda?
Vi rekommenderar för ServerTelemetryChannel de flesta produktionsscenarier som omfattar långvariga program. Mer information om att rensa telemetri finns i om att använda Flush().
När ska du använda Flush()
Metoden Flush() skickar en buffrad telemetri omedelbart. Den bör dock endast användas i specifika scenarier.
Använd Flush() när:
- Programmet håller på att stängas av och du vill se till att telemetri skickas innan du avslutar.
- Du är i en undantagshanterare och måste garantera att telemetri levereras.
- Du skriver en kortvarig process som ett bakgrundsjobb eller CLI-verktyg som avslutas snabbt.
Undvik att använda Flush() i långvariga program, till exempel webbtjänster. SDK hanterar automatiskt buffring och överföring. Att anropa Flush() i onödan kan orsaka prestandaproblem och garanterar inte att alla data skickas, särskilt när du använder ServerTelemetryChannel, som inte spolas synkront.
Telemetrimoduler
Application Insights samlar automatiskt in telemetri om specifika arbetsbelastningar utan att användaren behöver manuell spårning.
Som standard är följande moduler för automatisk insamling aktiverade. Du kan inaktivera eller konfigurera dem för att ändra deras standardbeteende.
Varje telemetrimodul samlar in en specifik typ av data och använder kärn-API:et för att skicka data. Modulerna installeras av olika NuGet-paket, som också lägger till de nödvändiga raderna i filen .config.
| Area | Description |
|---|---|
| Spårning av begäranden | Samlar in telemetri för begäranden (svarstid, resultatkod) för inkommande webbbegäranden. Modul: Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.Web |
| Beroendespårning | Samlar in telemetri om utgående beroenden (HTTP-anrop, SQL-anrop). Installera Application Insights Agent för att arbeta i IIS. Du kan också skriva anpassad beroendespårning med TrackDependency API. Stöder automatisk instrumentering med App Service och övervakning av virtuella datorer och virtuella maskinens skalningsuppsättningar. Modul: Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.DependencyCollector |
| Prestandaräknare | Samlar in Windows-prestandaräknare (CPU, minne, nätverksbelastning från IIS-installationer). Ange vilka räknare (inklusive anpassade). Mer information finns i Samla in systemprestandaräknare. Modul: Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModuleNuGet:Microsoft.ApplicationInsights.PerfCounterCollector |
| Händelseräknare | Samlar in .NET EventCounters. Rekommenderas för ASP.NET Core och plattformsoberoende i stället för Windows-perf-räknare. Modul: EventCounterCollectionModule (SDK ≥ 2.8.0) |
| Live-mått (QuickPulse) | Samlar in telemetri för fönstret Live Metrics. Modul: QuickPulseTelemetryModule |
| Pulsslag (App Service) | Skickar pulsslag och anpassade mått för App Service-miljön. Modul: AppServicesHeartbeatTelemetryModule |
| Heartbeats (virtuella datorer och skalningsuppsättningar för virtuella datorer) | Skickar pulsslag och anpassade mått för azure VM-miljö. Modul: AzureInstanceMetadataTelemetryModule |
| Telemetri för diagnostik | Rapporterar fel i Application Insights-instrumentationskoden (till exempel saknade räknare, ITelemetryInitializer undantag). Spårningstelemetri visas i Diagnostiksökning.Modul: Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModuleNuGet:Microsoft.ApplicationInsights Not: Om du bara installerar det här paketet skapas inte ApplicationInsights.config-filen automatiskt. |
| Utvecklarläge (felsökaren är ansluten) | Tvingar TelemetryChannel att skicka objekt omedelbart när felsökningsprogrammet är kopplat. Minskar svarstiden men ökar processor-/nätverkskostnaderna.Modul: Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModuleNuGet:Application Insights Windows Server |
| Undantagsspårning (webb) | Spårar ohanterade undantag i webbappar. Se Fel och undantag. Modul: Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModuleNuGet:Microsoft.ApplicationInsights.Web |
| Undantagsspårning (ej observerad/ohanterad) | Spårar undantag för oobserverade aktiviteter och ohanterade undantag för arbetsroller, Windows-tjänster och konsolappar. Modules: • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule• Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModuleNuGet:Microsoft.ApplicationInsights.WindowsServer |
| EventSource-spårning | Skickar konfigurerade EventSource-händelser till Application Insights som spårningar. Modul: Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModuleNuGet:Microsoft.ApplicationInsights.EventSourceListener |
| ETW-insamlare | Skickar konfigurerade ETW-providerhändelser till Application Insights som spårningar. Modul: Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModuleNuGet:Microsoft.ApplicationInsights.EtwCollector |
| Core API (inte en modul) |
Kärn-API som används av andra telemetrikomponenter och för anpassad telemetri. Modul: Microsoft.ApplicationInsights packageNuGet:Microsoft.ApplicationInsights Not: Om du bara installerar det här paketet skapas inte ApplicationInsights.config-filen automatiskt. |
Konfigurera telemetrimoduler
Använd avsnittet TelemetryModules i ApplicationInsights.config för att konfigurera, lägga till eller ta bort moduler. Följande exempel:
- Konfigurera
DependencyTrackingTelemetryModule(aktivera W3C-rubrikinmatning). - Konfigurera
EventCounterCollectionModule(rensa standardvärden och lägg till en enskild räknare). - Inaktivera perf-counter-samling genom att ta bort
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>
Anmärkning
Den exakta uppsättningen moduler som finns i din ApplicationInsights.config beror på vilka SDK-paket du har installerat.
Inaktivera telemetri
Det finns en nod i konfigurationsfilen för varje modul. Om du vill inaktivera en modul tar du bort noden eller kommenterar ut den.
Anslutningssträng
Den här inställningen avgör i vilken Application Insights-resurs dina data visas. Vanligtvis skapar du en separat resurs, med en separat anslutningssträng, för vart och ett av dina program.
Se Anslutningssträngar i Application Insights för kodexempel.
Om du till exempel vill ange anslutningssträngen dynamiskt för att skicka resultat från ditt program till olika resurser kan du utelämna anslutningssträngen från konfigurationsfilen och ange den i kod i stället.
Om du vill ange anslutningssträngen för alla instanser av TelemetryClient, inklusive standardtelemetrimoduler, gör du det här steget i en initieringsmetod, till exempel global.aspx.cs i en ASP.NET-tjänst:
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);
Om du vill skicka en specifik uppsättning händelser till en annan resurs kan du ange nyckeln för en specifik telemetriklient:
var tc = new TelemetryClient();
tc.Context.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
tc.TrackEvent("myEvent");
// ...
Om du vill hämta en ny anslutningssträng skapar du en ny resurs i Application Insights-portalen.
ApplicationId-provider
Anmärkning
För ASP.NET är den här providern tillgänglig från och med SDK v2.6.0*.
Syftet med den här providern är att söka efter ett program-ID baserat på en anslutningssträng. Program-ID ingår i RequestTelemetry och DependencyTelemetry används för att fastställa korrelation i portalen.
Den här funktionen är tillgänglig genom att ange TelemetryConfiguration.ApplicationIdProvider.
Gränssnitt: IApplicationIdProvider
public interface IApplicationIdProvider
{
bool TryGetApplicationId(string instrumentationKey, out string applicationId);
}
Vi tillhandahåller två implementeringar i Microsoft.ApplicationInsights SDK: ApplicationInsightsApplicationIdProvider och DictionaryApplicationIdProvider.
ApplicationInsightsApplicationIdProvider
Den här omslutningen är för vårt profil-API. Den begränsar begäranden och cacheresultat. Den här providern inkluderas automatiskt när du installerar antingen Microsoft.ApplicationInsights.DependencyCollector eller Microsoft.ApplicationInsights.Web.
Klassen exponerar en valfri egenskap med namnet ProfileQueryEndpoint. Som standard är den inställd på https://dc.services.visualstudio.com/api/profiles/{0}/appId.
Om du behöver konfigurera en proxy rekommenderar vi att du proxysöker basadressen och ser till att sökvägen innehåller /api/profiles/{0}/appId. Vid körning {0} ersätts med instrumentationsnyckeln för varje begäran.
Exempelkonfiguration via 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>
Exempelkonfiguration via kod
TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();
DictionaryApplicationIdProvider
Den här statiska providern förlitar sig på dina konfigurerade instrumentationsnyckel/program-ID-par.
Den här klassen har Defined egenskapen, som är en Dictionary<string,string> av instrumentationsnyckel/program-ID-par.
Den här klassen har den valfria egenskapen Next, som kan användas för att konfigurera en annan provider att använda när en anslutningssträng begärs som inte finns i konfigurationen.
Exempelkonfiguration via 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>
Exempelkonfiguration via kod
TelemetryConfiguration.Active.ApplicationIdProvider = new DictionaryApplicationIdProvider{
Defined = new Dictionary<string, string>
{
{"InstrumentationKey_1", "ApplicationId_1"},
{"InstrumentationKey_2", "ApplicationId_2"}
}
};
Konfigurera ögonblicksbildsamling
Information om hur du konfigurerar insamling av ögonblicksbilder för ASP.NET- och ASP.NET Core-program finns i Aktivera ögonblicksbildsfelsökare för .NET-appar i Azure Service Fabric, Cloud Services och virtuella datorer.
Lägga till övervakning på klientsidan
De föregående avsnitten gav vägledning om metoder för att automatiskt och manuellt konfigurera övervakning på serversidan. Om du vill lägga till övervakning på klientsidan använder du JavaScript SDK på klientsidan. Du kan övervaka en webbsidas transaktioner på klientsidan genom att lägga till ett JavaScript-SDK-inläsningsskript (Web) före den avslutande </head> taggen för sidans HTML.
Även om det är möjligt att manuellt lägga till SDK-inläsningsskriptet för JavaScript (Web) i sidhuvudet på varje HTML-sida rekommenderar vi att du i stället lägger till JavaScript-SDK-inläsningsskriptet (Web) på en primär sida. Den åtgärden injicerar JavaScript (webb) SDK-laddningsskriptet i alla sidor på en webbplats.
För den mallbaserade ASP.NET MVC-appen från den här artikeln är filen som du behöver redigera _Layout.cshtml. Du hittar den under Vy>Delat. Om du vill lägga till övervakning på klientsidan öppnar du _Layout.cshtml och följer skriptbaserade installationsinstruktioner för JavaScript (Web) SDK Loader i artikeln om JavaScript SDK-konfiguration på klientsidan.
Kärn-API för anpassade händelser och mått
Infoga några rader kod i programmet för att ta reda på vad användarna gör med det eller för att diagnostisera problem. Du kan skicka telemetri från enhets- och skrivbordsappar, webbklienter och webbservrar. Använd Application Insights-kärntelemetri-API:et för att skicka anpassade händelser och mått och dina egna versioner av standardtelemetri. Det här API:et är samma API som standarddatainsamlaren i Application Insights använder.
API-sammanfattning
Kärn-API:et är enhetligt på alla plattformar, förutom några varianter som GetMetric (endast.NET).
| Metod | Används för |
|---|---|
TrackPageView |
Sidor, skärmar, fönster eller formulär. |
TrackEvent |
Användaråtgärder och andra händelser. Används för att spåra användarbeteende eller för att övervaka prestanda. |
GetMetric |
Noll- och flerdimensionella mått, centralt konfigurerad aggregering, endast C#. |
TrackMetric |
Prestandamått som kölängder som inte är relaterade till specifika händelser. |
TrackException |
Logga undantag för diagnos. Spåra var de inträffar i förhållande till andra händelser och granska stackspårningar. |
TrackRequest |
Logga frekvensen och varaktigheten för serverbegäranden för prestandaanalys. |
TrackTrace |
Loggmeddelanden för resursdiagnostik. Du kan också samla in loggar från tredje part. |
TrackDependency |
Logga varaktigheten och frekvensen för anrop till externa komponenter som appen är beroende av. |
Du kan koppla egenskaper och mått till de flesta av dessa telemetrianrop.
Förutsättningar
Om du inte har någon referens för Application Insights SDK ännu:
Lägg till Application Insights SDK i projektet.
I din enhets- eller webbserverkod inkluderar du:
Hämta en TelemetryClient-instans
Hämta en instans av TelemetryClient:
Anmärkning
Om du använder Azure Functions v2+ eller Azure WebJobs v3+ läser du Övervaka Azure Functions.
Anmärkning
För ASP.NET Core-appar och icke-HTTP/Worker för .NET/.NET Core-appar hämtar du en instans av TelemetryClient från beroendeinjektionscontainern enligt beskrivningen i respektive dokumentation.
private TelemetryClient telemetry = new TelemetryClient();
Om du ser ett meddelande om att den här metoden är föråldrad kan du läsa mer i microsoft/ApplicationInsights-dotnet#1152 .
Inkommande HTTP-begäranden registreras automatiskt. Du kanske vill skapa fler instanser av TelemetryClient för andra moduler i din app. Du kan till exempel ha en TelemetryClient instans i mellanprogramsklassen för att rapportera affärslogikhändelser. Du kan ange egenskaper som UserId och DeviceId för att identifiera datorn. Den här informationen är kopplad till alla händelser som instansen skickar.
TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";
Anmärkning
TelemetryClient är trådsäker.
TrackEvent
I Application Insights är en anpassad händelse en datapunkt som du kan visa i Metrics Explorer som ett aggregerat antal och i Diagnostiksökning som enskilda förekomster. (Det är inte relaterat till MVC eller andra ramverkshändelser.)
Infoga TrackEvent anrop i koden för att räkna olika händelser. Du kanske till exempel vill spåra hur ofta användare väljer en viss funktion. Eller så kanske du vill veta hur ofta de uppnår vissa mål eller gör specifika typer av misstag.
I en spelapp kan du till exempel skicka ett evenemang när en användare vinner spelet:
Anpassade händelser i Log Analytics
Telemetrin är tillgänglig i customEvents tabellen på fliken Application Insights-loggar eller användningsupplevelsen. Händelser kan komma från trackEvent(..) eller plugin-programmet Click Analytics Autocollection.
Om samplingen är i drift visar egenskapen itemCount ett värde som är större än 1. Innebär till exempel itemCount==10 att av 10 anrop till trackEvent()överförde samplingsprocessen bara en av dem. Om du vill få ett korrekt antal anpassade händelser använder du kod som customEvents | summarize sum(itemCount).
Anmärkning
itemCount har ett minimivärde på ett; själva posten representerar en inmatning.
GetMetric
Information om hur du effektivt använder anropet GetMetric() för att samla in lokalt föraggregerade mått för .NET- och .NET Core-program finns i Anpassad måttsamling i .NET och .NET Core.
TrackMetric
Anmärkning
Microsoft.ApplicationInsights.TelemetryClient.TrackMetric är inte den bästa metoden för att skicka mått. Mått bör alltid föraggregeras under en tidsperiod innan de skickas. Använd en av överlagringarna GetMetric(..) för att hämta ett måttobjekt för åtkomst till SDK-föraggregeringsfunktioner.
Om du implementerar din egen föraggregeringslogik kan du använda TrackMetric() metoden för att skicka de resulterande aggregeringarna. Om ditt program kräver att ett separat telemetriobjekt skickas vid varje tillfälle utan aggregering över tid, har du förmodligen ett användningsfall för händelsetelemetri. Se även TelemetryClient.TrackEvent(Microsoft.ApplicationInsights.DataContracts.EventTelemetry).
Application Insights kan kartlägga mått som inte är kopplade till vissa händelser. Du kan till exempel övervaka en kölängd med jämna mellanrum. Med mått är de enskilda mätningarna av mindre intresse än variationerna och trenderna, och därför är statistiska diagram användbara.
Om du vill skicka mått till Application Insights kan du använda API:et TrackMetric(..) . Det finns två sätt att skicka ett mått:
Enskilt värde. Varje gång du utför en mätning i ditt program skickar du motsvarande värde till Application Insights.
Anta till exempel att du har ett mått som beskriver antalet objekt i en container. Under en viss tidsperiod placerar du först tre objekt i containern och tar sedan bort två objekt. Därför skulle du ringa
TrackMetrictvå gånger. Först skickar du värdet3och skickar sedan värdet-2. Application Insights lagrar båda värdena åt dig.Aggregat. När du arbetar med mått är varje enskild mätning sällan av intresse. I stället är en sammanfattning av vad som hände under en viss tidsperiod viktig. En sådan sammanfattning kallas aggregering.
I föregående exempel är
1den aggregerade måttsumman för den tidsperioden och antalet måttvärden är2. När du använder aggregeringsmetoden anroparTrackMetricdu bara en gång per tidsperiod och skickar aggregeringsvärdena. Vi rekommenderar den här metoden eftersom den avsevärt kan minska kostnaderna och prestandakostnaderna genom att skicka färre datapunkter till Application Insights, samtidigt som all relevant information samlas in.
Exempel med ett enda värde
Så här skickar du ett enda måttvärde:
var sample = new MetricTelemetry();
sample.Name = "queueLength";
sample.Sum = 42.3;
telemetryClient.TrackMetric(sample);
Anpassade mått i Log Analytics
Telemetrin är tillgänglig i customMetrics tabellen i Application Insights Analytics. Varje rad representerar ett anrop till trackMetric(..) i din app.
-
valueSum: Summan av mätningarna. Om du vill hämta medelvärdet dividerar du medvalueCount. -
valueCount: Antalet mått som aggregerades i det härtrackMetric(..)anropet.
Anmärkning
valueCount har ett minimivärde på ett; posten i sig representerar en post.
Sidvisningar
I en enhets- eller webbsidaapp skickas telemetri för sidvisning som standard när varje skärm eller sida läses in. Men du kan ändra standardvärdet för att spåra sidvisningar vid fler eller olika tidpunkter. I en app som till exempel visar flikar eller fönster kanske du vill spåra en sida när användaren öppnar ett nytt fönster.
Användar- och sessionsdata skickas som egenskaper tillsammans med sidvyer, så användar- och sessionsdiagram kommer till liv när det finns telemetri för sidvisning.
Anpassade sidvyer
Sidtelemetri i Log Analytics
I Log Analytics visar två tabeller data från webbläsaråtgärder:
-
pageViews: Innehåller data om URL:en och sidrubriken. -
browserTimings: Innehåller data om klientprestanda som den tid det tar att bearbeta inkommande data.
För att ta reda på hur lång tid det tar för webbläsaren att bearbeta olika sidor:
browserTimings
| summarize avg(networkDuration), avg(processingDuration), avg(totalDuration) by name
Så här upptäcker du populariteten för olika webbläsare:
pageViews
| summarize count() by client_Browser
Koppla sidvisningar till AJAX-anrop genom att ansluta till beroenden:
pageViews
| join (dependencies) on operation_Id
TrackRequest
Server-SDK:t använder TrackRequest för att logga HTTP-begäranden.
Du kan också anropa det själv om du vill simulera begäranden i en kontext där du inte har webbtjänstmodulen igång.
Det rekommenderade sättet att skicka telemetri för begäran är när begäran fungerar som en åtgärdskontext.
Åtgärdskontext
Du kan korrelera telemetriobjekt genom att associera dem med åtgärdskontexten. Standardmodulen för spårning av begäranden gör det för undantag och andra händelser som skickas medan en HTTP-begäran bearbetas. I Sök och Analys kan du enkelt hitta alla händelser som är associerade med begäran med hjälp av dess åtgärds-ID.
När du spårar telemetri manuellt är det enklaste sättet att säkerställa telemetrikorrelation genom att använda det här mönstret:
// Establish an operation context and associated telemetry item:
using (var operation = telemetryClient.StartOperation<RequestTelemetry>("operationName"))
{
// Telemetry sent in here uses the same operation ID.
...
telemetryClient.TrackTrace(...); // or other Track* calls
...
// Set properties of containing telemetry item--for example:
operation.Telemetry.ResponseCode = "200";
// Optional: explicitly send telemetry item:
telemetryClient.StopOperation(operation);
} // When operation is disposed, telemetry item is sent.
Mer information om korrelation finns i Telemetrikorrelation i Application Insights.
Tillsammans med att ange en åtgärdskontext StartOperation skapar ett telemetriobjekt av den typ som du anger. Den skickar telemetriobjektet när du tar bort åtgärden eller om du uttryckligen anropar StopOperation. Om du använder RequestTelemetry som telemetrityp är dess varaktighet inställd på det tidsintervall mellan start och stopp.
Telemetriobjekt som rapporteras inom ett driftsområde blir underordnade objekt till en sådan operation. Åtgärdskontexter kan kapslas.
I Sök används åtgärdskontexten för att skapa listan Relaterade objekt .
Mer information om spårning av anpassade åtgärder finns i Spåra anpassade åtgärder med Application Insights .NET SDK.
Begäranden i Log Analytics
I Application Insights Analytics visas begäranden i requests tabellen.
Om samplingen är i drift visar egenskapen itemCount ett värde som är större än 1. Innebär till exempel itemCount==10 att av 10 anrop till trackRequest()överförde samplingsprocessen bara en av dem. Om du vill få ett korrekt antal begäranden och genomsnittlig varaktighet segmenterade efter begärandenamn använder du kod som:
requests
| summarize count = sum(itemCount), avgduration = avg(duration) by name
TrackException
Skicka undantag till Application Insights:
- Att räkna dem, som en indikation på frekvensen för ett problem.
- För att undersöka enskilda förekomster.
Rapporterna innehåller stackspårningsinformation.
SDK:erna fångar upp många undantag automatiskt, så du behöver inte alltid anropa TrackException explicit.
Undantag i Log Analytics
I Application Insights Analytics visas undantag i exceptions tabellen.
Om samplingen är i drift visar egenskapen itemCount ett värde som är större än 1. Innebär till exempel itemCount==10 att av 10 anrop till trackException()överförde samplingsprocessen bara en av dem. Om du vill få ett korrekt antal undantag segmenterade efter typ av undantag använder du kod som:
exceptions
| summarize sum(itemCount) by type
Det mesta av den viktiga stackinformationen extraheras redan i separata variabler, men du kan dra isär details strukturen för att få mer. Eftersom den här strukturen är dynamisk bör du omvandla resultatet till den typ du förväntar dig. Till exempel:
exceptions
| extend method2 = tostring(details[0].parsedStack[1].method)
Om du vill associera undantag med deras relaterade begäranden använder du en koppling:
exceptions
| join (requests) on operation_Id
TrackTrace
Använd TrackTrace för att diagnostisera problem genom att skicka en "breadcrumb trail" till Application Insights. Du kan skicka delar av diagnostikdata och inspektera dem i Diagnostiksökning.
I .NET logganpassare, använd den här API:et för att skicka tredjepartsloggar till portalen.
telemetry.TrackTrace(message, SeverityLevel.Warning, properties);
Logga en diagnostikhändelse som att ange eller lämna en metod.
| Parameter | Description |
|---|---|
message |
Diagnostikdata. Kan vara mycket längre än ett namn. |
properties |
Karta över sträng till sträng. Mer data används för att filtrera undantag i portalen. Standardvärdet är tomt. |
severityLevel |
Värden som stöds: SeverityLevel.ts. |
Du kan söka efter meddelandeinnehåll, men till skillnad från egenskapsvärden kan du inte filtrera på det.
Storleksgränsen på message är mycket högre än gränsen för egenskaper. En fördel TrackTrace med är att du kan placera relativt långa data i meddelandet. Du kan till exempel koda POST-data där.
Du kan också lägga till en allvarlighetsgrad i meddelandet. Och precis som andra telemetrier kan du lägga till egenskapsvärden som hjälper dig att filtrera eller söka efter olika uppsättningar spårningar. Till exempel:
var telemetry = new Microsoft.ApplicationInsights.TelemetryClient();
telemetry.TrackTrace("Slow database response",
SeverityLevel.Warning,
new Dictionary<string,string> { {"database", db.ID} });
I Sök kan du sedan enkelt filtrera bort alla meddelanden på en viss allvarlighetsnivå som är relaterade till en viss databas.
Spårningar i Log Analytics
I Application Insights Analytics visas anrop till TrackTrace i traces-tabellen.
Om samplingen är i drift visar egenskapen itemCount ett värde som är större än 1. Innebär till exempel itemCount==10 att av 10 anrop till trackTrace()överförde samplingsprocessen bara en av dem. Om du vill få ett korrekt antal spårningsanrop använder du kod som traces | summarize sum(itemCount).
TrackDependency
Använd anropet TrackDependency för att spåra svarstiderna och framgångsfrekvensen för anrop till en extern kod. Resultaten visas i beroendediagrammen i portalen. Följande kodfragment måste läggas till varhelst ett beroendeanrop görs.
Anmärkning
För .NET och .NET Core kan du alternativt använda TelemetryClient.StartOperation metoden (tillägg) som fyller de DependencyTelemetry egenskaper som behövs för korrelation och vissa andra egenskaper som starttid och varaktighet, så du behöver inte skapa en anpassad timer som med följande exempel. Mer information finns i avsnittet om spårning av utgående beroenden i Spåra anpassade åtgärder med Application Insights .NET SDK.
var success = false;
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
success = dependency.Call();
}
catch(Exception ex)
{
success = false;
telemetry.TrackException(ex);
throw new Exception("Operation went wrong", ex);
}
finally
{
timer.Stop();
telemetry.TrackDependency("DependencyType", "myDependency", "myCall", startTime, timer.Elapsed, success);
}
Kom ihåg att server-SDK:erna innehåller en beroendemodul som identifierar och spårar vissa beroendeanrop automatiskt, till exempel till databaser och REST-API:er. Du måste installera en agent på servern för att modulen ska fungera.
Du använder det här anropet om du vill spåra anrop som den automatiserade spårningen inte fångar upp.
Om du vill inaktivera standardmodulen för beroendespårning i C# redigerar duApplicationInsights.config och tar bort referensen till DependencyCollector.DependencyTrackingTelemetryModule.
Beroenden i Log Analytics
I Application Insights AnalyticstrackDependency visas anrop upp i dependencies tabellen.
Om samplingen är i drift visar egenskapen itemCount ett värde som är större än 1. Innebär till exempel itemCount==10 att av 10 anrop till trackDependency()överförde samplingsprocessen bara en av dem. Om du vill få ett korrekt antal beroenden segmenterade efter målkomponent använder du kod som:
dependencies
| summarize sum(itemCount) by target
Om du vill associera beroenden med deras relaterade begäranden använder du en sammanfogning:
dependencies
| join (requests) on operation_Id
Rensa data
Normalt skickar SDK:t data med fasta intervall, vanligtvis 30 sekunder, eller när bufferten är full, vilket vanligtvis är 500 objekt. I vissa fall kanske du vill tömma bufferten. Ett exempel är om du använder SDK:t i ett program som stängs av.
När du använder Flush()rekommenderar vi det här mönstret:
telemetry.Flush();
// Allow some time for flushing before shutdown.
System.Threading.Thread.Sleep(5000);
När du använder FlushAsync()rekommenderar vi det här mönstret:
await telemetryClient.FlushAsync()
// No need to sleep
Vi rekommenderar att du alltid rensar som en del av programavstängningen för att garantera att telemetri inte går förlorad.
Anmärkning
Granska Autoflush-konfigurationen: Att aktivera autoflush i din web.config-fil kan leda till prestandaförsämring i .NET-applikationer som är instrumenterade med Application Insights. Med autoflush aktiverat resulterar varje anrop av System.Diagnostics.Trace.Trace* metoder i att enskilda telemetriobjekt skickas som separata distinkta webbbegäranden till inmatningstjänsten. Detta kan potentiellt orsaka nätverks- och lagringsöverbelastning på dina webbservrar. För bättre prestanda rekommenderar vi att du inaktiverar autoflush och även använder ServerTelemetryChannel, som är utformad för en effektivare telemetriöverföring.
Funktionen är asynkron för serverns telemetrikanal.
Autentiserade användare
I en webbapp identifieras användare som standard med cookies . En användare kan räknas mer än en gång om de kommer åt din app från en annan dator eller webbläsare, eller om de tar bort cookies.
Om användarna loggar in på din app kan du få ett mer exakt antal genom att ange det autentiserade användar-ID:t i webbläsarkoden. Det är inte nödvändigt att använda användarens faktiska inloggningsnamn. Det behöver bara vara ett ID som är unikt för den användaren. Den får inte innehålla mellanslag eller någon av tecknen ,;=|.
Användar-ID:t anges också i en sessionscookie och skickas till servern. Om server-SDK:t är installerat skickas det autentiserade användar-ID:t som en del av kontextegenskaperna för både klient- och servertelemetri. Du kan sedan filtrera och söka på den.
Om appen grupperar användare till konton kan du också skicka en identifierare för kontot. Samma teckenbegränsningar gäller.
I Metrics Explorer kan du skapa ett diagram som räknar användare, autentiserade och användarkonton.
Du kan också söka efter klientdatapunkter med specifika användarnamn och konton.
Anmärkning
Egenskapen EnableAuthenticationTrackingJavaScript i klassen ApplicationInsightsServiceOptions i .NET Core SDK förenklar JavaScript-konfigurationen som behövs för att mata in användarnamnet som autentiserings-ID för varje spårning som skickas av Application Insights JavaScript SDK.
När den här egenskapen är inställd truepå skrivs användarnamnet från användaren i ASP.NET Core ut tillsammans med telemetri på klientsidan. Därför krävs det inte längre att lägga till appInsights.setAuthenticatedUserContext manuellt eftersom det redan har injicerats av SDK:t för ASP.NET Core. Auth-ID:t skickas också till servern där SDK i .NET Core identifierar och använder det för all telemetri på serversidan, enligt beskrivningen i JavaScript API-referensen.
För JavaScript-program som inte fungerar på samma sätt som ASP.NET Core MVC, till exempel SPA-webbappar, måste du fortfarande lägga appInsights.setAuthenticatedUserContext till manuellt.
Filtrera, söka efter och segmentera dina data med hjälp av egenskaper
Du kan koppla egenskaper och mått till dina händelser, mått, sidvisningar, undantag och andra telemetridata.
Egenskaper är strängvärden som du kan använda för att filtrera telemetrin i användningsrapporterna. Om din app till exempel tillhandahåller flera spel kan du koppla namnet på spelet till varje händelse så att du kan se vilka spel som är mer populära.
Det finns en gräns på 8 192 för stränglängden. Om du vill skicka stora datasegment använder du meddelandeparametern TrackTraceför .
Mått är numeriska värden som kan visas grafiskt. Du kanske till exempel vill se om det sker en gradvis ökning av poängen som dina spelare uppnår. Graferna kan segmenteras efter de egenskaper som skickas med händelsen så att du kan få separata eller staplade grafer för olika spel.
Måttvärdena ska vara större än eller lika med 0 för att visas korrekt.
Det finns vissa begränsningar för antalet egenskaper, egenskapsvärden och mått som du kan använda.
// Set up some properties and metrics:
var properties = new Dictionary <string, string>
{{"game", currentGame.Name}, {"difficulty", currentGame.Difficulty}};
var metrics = new Dictionary <string, double>
{{"Score", currentGame.Score}, {"Opponents", currentGame.OpponentCount}};
// Send the event:
telemetry.TrackEvent("WinGame", properties, metrics);
Viktigt!
Kontrollera att du inte loggar personligt identifierbar information i egenskaper.
Alternativt sätt att ange egenskaper och mått
Om det är enklare kan du samla in parametrarna för en händelse i ett separat objekt:
var event = new EventTelemetry();
event.Name = "WinGame";
event.Metrics["processingTime"] = stopwatch.Elapsed.TotalMilliseconds;
event.Properties["game"] = currentGame.Name;
event.Properties["difficulty"] = currentGame.Difficulty;
event.Metrics["Score"] = currentGame.Score;
event.Metrics["Opponents"] = currentGame.Opponents.Length;
telemetry.TrackEvent(event);
Varning
Återanvänd inte samma telemetriobjektinstans (event i det här exemplet) för att anropa Track*() flera gånger. Den här metoden kan leda till att telemetri skickas med felaktig konfiguration.
Anpassade mått och egenskaper i Log Analytics
I Log Analytics visas anpassade mått och egenskaper i attributen customMeasurements och customDimensions för varje telemetripost.
Om du till exempel lägger till en egenskap med namnet "game" i din begärans telemetri räknar frågan förekomsterna av olika värden av "game" och visar medelvärdet av det anpassade måttet "score".
requests
| summarize sum(itemCount), avg(todouble(customMeasurements.score)) by tostring(customDimensions.game)
Observera att:
- När du extraherar ett värde från
customDimensionsellercustomMeasurementsJSON har det en dynamisk typ, så du måste omvandla dettostringellertodouble. - Om du vill ta hänsyn till möjligheten till sampling ska du inte
sum(itemCount)användacount().
Tidshändelser
Ibland vill du visa hur lång tid det tar att utföra en åtgärd. Du kanske till exempel vill veta hur lång tid det tar för användarna att överväga val i ett spel. Använd måttparametern för att hämta den här informationen.
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
// ... perform the timed action ...
stopwatch.Stop();
var metrics = new Dictionary <string, double>
{{"processingTime", stopwatch.Elapsed.TotalMilliseconds}};
// Set up some properties:
var properties = new Dictionary <string, string>
{{"signalSource", currentSignalSource.Name}};
// Send the event:
telemetry.TrackEvent("SignalProcessed", properties, metrics);
Standardegenskaper för anpassad telemetri
Om du vill ange standardegenskapsvärden för några av de anpassade händelser som du skriver anger du dem i en TelemetryClient instans. De är kopplade till varje telemetriobjekt som skickas från klienten.
using Microsoft.ApplicationInsights.DataContracts;
var gameTelemetry = new TelemetryClient();
gameTelemetry.Context.GlobalProperties["Game"] = currentGame.Name;
// Now all telemetry is automatically sent with the context property:
gameTelemetry.TrackEvent("WinGame");
Enskilda telemetrianrop kan åsidosätta standardvärdena i sina egenskapsordlistor.
Om du vill lägga till egenskaper för all telemetri, inklusive data från standardsamlingsmoduler, implementerar du ITelemetryInitializer.
Inaktivera telemetri
För att dynamiskt stoppa och starta insamling och överföring av telemetri:
using Microsoft.ApplicationInsights.Extensibility;
TelemetryConfiguration.Active.DisableTelemetry = true;
Utvecklarläge
När du felsöker är det fördelaktigt att telemetrin skickas snabbare genom bearbetningskedjan så att du kan se resultaten omedelbart. Du får även andra meddelanden som hjälper dig att spåra eventuella problem med telemetrin. Stäng av den i produktion eftersom den kan göra din app långsammare.
Ange instrumentationsnyckeln för vald anpassad telemetri
var telemetry = new TelemetryClient();
telemetry.InstrumentationKey = "---my key---";
// ...
Dynamisk anslutningssträng
För att undvika att blanda telemetri från utvecklings-, test- och produktionsmiljöer kan du skapa separata Application Insights-resurser och ändra deras nycklar beroende på miljön.
I stället för att hämta instrumentationsnyckeln från konfigurationsfilen kan du ange den i koden. Ange nyckeln i en initieringsmetod, till exempel global.aspx.cs i en ASP.NET tjänst:
protected void Application_Start()
{
Microsoft.ApplicationInsights.Extensibility.
TelemetryConfiguration.Active.InstrumentationKey =
// - for example -
WebConfigurationManager.Settings["ikey"];
...
}
TelemetriContext
TelemetryClient har en kontextegenskap som innehåller värden som skickas tillsammans med alla telemetridata. De anges normalt av standardtelemetrimodulerna, men du kan också ange dem själv. Till exempel:
telemetry.Context.Operation.Name = "MyOperationName";
Om du anger något av dessa värden själv kan du överväga att ta bort relevant rad från ApplicationInsights.config så att dina värden och standardvärdena inte blir förvirrade.
- Komponent: Appen och dess version.
- Enhet: Data om enheten där appen körs. I webbappar är det den server eller klientenhet som telemetrin skickas från.
- InstrumentationKey: Application Insights-resursen i Azure där telemetrin visas. Den hämtas vanligtvis från ApplicationInsights.config.
- Plats: Enhetens geografiska plats.
-
Åtgärd: I webbappar, den aktuella HTTP-begäran. I andra apptyper kan du ange det här värdet för att gruppera händelser tillsammans.
- ID: Ett genererat värde som korrelerar olika händelser så att du kan hitta relaterade objekt när du inspekterar en händelse i Diagnostiksökning.
- Namn: En identifierare, vanligtvis URL:en för HTTP-begäran.
- SyntheticSource: Om den inte är null eller tom har en sträng som anger att källan till begäran har identifierats som en robot eller ett webbtest. Som standard undantas den från beräkningar i Metrics Explorer.
- Session: Användarens session. ID:t är inställt på ett genererat värde som ändras när användaren inte har varit aktiv på ett tag.
- Användare: Användarinformation.
Gränser
Det finns vissa gränser för antalet mått och händelser per program, dvs. per instrumentationsnyckel. Gränserna beror på vilken prisplan du väljer.
| Resource | Standardgräns | Maximigräns | Noteringar |
|---|---|---|---|
| Totala data per dag | 100 GB | Kontakta kundsupporten | Du kan ange ett tak för att minska data. Om du behöver mer data kan du öka gränsen i portalen, upp till 1 000 GB. För kapaciteter som är större än 1 000 GB skickar du e-post till AIDataCap@microsoft.com. |
| Strypning | 32 000 händelser/sekund | Kontakta kundsupporten | Gränsen mäts under en minut. |
| Datakvarhållningsloggar | 30 till 730 dagar | 730 dagar | Den här resursen är för Loggar. |
| Datakvarhållningsmått | 90 dagar | 90 dagar | Den här resursen är för Metrics Explorer. |
| Kvarhållning av detaljerade resultat för flerstegstest för tillgänglighet | 90 dagar | 90 dagar | Den här resursen innehåller detaljerade resultat för varje steg. |
| Maximal storlek på telemetriobjekt | 64 KB | 64 KB | |
| Maximalt antal telemetriobjekt per batch | 64,000 | 64,000 | |
| Namnlängd för egenskaper och mätvärden | 150 | 150 | Se även typscheman. |
| Stränglängd för egenskapsvärde | 8,192 | 8,192 | Se även typscheman. |
| Längd för spårnings- och undantagsmeddelande | 32,768 | 32,768 | Se även typscheman. |
| Tillgänglighetstester räknas per Application Insights-resurs | 100 | 100 | |
| Antal tillgänglighetstester per resursgrupp | 800 | 800 | Se Azure Resource Manager |
| Maximalt antal omdirigeringar per tillgänglighetstest | 10 | 10 | |
| Tillgänglighetstester med lägsta testfrekvens | 300 sekunder | Anpassade testfrekvenser eller frekvenser på mindre än 5 minuter kräver anpassade TrackAvailability-implementeringar . | |
| .NET Profiler och Snapshot Debugger datalagring | Två veckor | Kontakta supporten. Maximal kvarhållningsgräns är sex månader. | |
| .NET Profiler-data skickas per dag | Ingen begränsning | Ingen gräns. | |
| Ögonblicksbildsfelsökardata som skickas varje dag | 30 ögonblicksbilder per dag per övervakad app | Ingen gräns. | Antalet ögonblicksbilder som samlas in per program kan ändras via konfigurationen. |
Mer information om priser och kvoter finns i Application Insights-fakturering.
Om du vill undvika att nå datahastighetsgränsen använder du sampling.
Information om hur länge data sparas finns i Datakvarhållning och sekretess.
Exempelapplikationer
.NET Core-konsolprogram: Använd det här exemplet om du använder ett konsolprogram som skrivits i .NET Core (2.0 eller senare) eller .NET Framework (4.7.2 eller senare).
ASP.NET Grundläggande bakgrundsaktiviteter med HostedServices: Använd det här exemplet om du är i ASP.NET Core och skapar bakgrundsuppgifter i enlighet med officiell vägledning.
.NET Core Worker Service: Använd det här exemplet om du har ett .NET Worker Service-program i enlighet med officiell vägledning.
Felsökning
Se den dedikerade felsökningsartikeln.
Testa anslutningen mellan din applikationsvärd och insamlingstjänsten
Application Insights SDK:er och agenter skickar telemetri för att matas in som REST-anrop till våra inmatningsslutpunkter. Du kan testa anslutningen från webbservern eller programvärddatorn till slutpunkterna för inmatningstjänsten med hjälp av råa REST-klienter från PowerShell- eller curl-kommandon. Se Felsöka programtelemetri som saknas i Azure Monitor Application Insights.
SDK med öppen källkod
För de senaste uppdateringarna och buggfixarna, se releasenoterna.
Versionsanteckningar
För version 2.12 och senare: .NET Programvaruutvecklingskit (SDK:er) inklusive ASP.NET, ASP.NET Core och loggningsadaptrar
Våra tjänstuppdateringar sammanfattar även större Förbättringar av Application Insights.
Nästa steg
- Mer information om vanliga frågor och svar finns i:
- Kontrollera att du kör en version av Application Insights SDK som stöds .
- Se datamodellen för Application Insights-typer och datamodeller.
- Lägg till syntetiska transaktioner för att testa att din webbplats är tillgänglig från hela världen med tillgänglighetsövervakning.
- Kontrollera användarhandboken för System.Diagnostics.Activity för att se hur vi korrelerar telemetri.
- Konfigurera en samling ögonblicksbilder för att se tillståndet för källkod och variabler när ett undantag utlöses.
Referensdokument
- Referens för datatyper för ASP.NET SDK och ASP.NET Core SDK.
- SDK-kod för ASP.NET SDK och ASP.NET Core SDK.