Поделиться через


Мониторинг приложений .NET и Node.js с помощью Application Insights (классический API 2.x)

Замечание

Ознакомьтесь с рекомендациями по поддержке Application Insights SDK в соответствии с нашей политикой поддержки классического API SDK.

Caution

Для новых приложений используйте Azure Monitor OpenTelemetry Distro. Он предоставляет аналогичный интерфейс и сопоставимые функциональные возможности с пакетом SDK Application Insights. Чтобы перейти на предложение на основе OpenTelemetry, ознакомьтесь с рекомендациями по миграции.

В этой статье объясняется, как включить и настроить Application Insights для .NET (ASP.NET, ASP.NET Core и рабочей службы) и приложений Node.js. Application Insights может собирать следующие данные телеметрии из приложений:

Поддерживаемые сценарии

Поддерживается ASP.NET ASP.NET Core Служба рабочего процесса
Операционная система Windows Windows, Linux или macOS Windows, Linux или macOS
Метод размещения Внутрипроцессный режим (IIS или IIS Express) Внутри процесса или вне процесса Консоль или фоновая служба (обычно выполняется как процесс с помощью интерфейса командной строки dotnet или в качестве управляющей программы Windows или Linux)
Метод развертывания Web Deploy, MSI или ручное копирование файлов Зависимые от платформы или автономные Зависимые от платформы или автономные
Веб-сервер Службы интернет-информации (IIS) Internet Information Server (IIS) или Kestrel Неприменимо (веб-сервер не предназначен для рабочих нагрузок, отличных от HTTP, таких как обмен сообщениями, фоновые задачи и консольные приложения)
Платформа размещения Azure App Service (Windows), Azure Virtual Machines или локальные серверы Функционал Web Apps в Azure App Service, Azure Virtual Machines, Docker и Azure Kubernetes Service (AKS). Azure Virtual Machines, Azure Kubernetes Service (AKS), контейнеры или любая среда, где поддерживается .NET Core
версия .NET .NET Framework 4.6.1 и более поздних версий Все официально поддерживаемые версии .NET, которые не отображаются в предварительной версии Все официально поддерживаемые версии .NET, которые не отображаются в предварительной версии

Пакет SDK для рабочей службы не выполняет сбор данных телеметрии самостоятельно. Вместо этого он содержит другие известные автоматические сборщики Application Insights, такие как DependencyCollector, PerfCounterCollector и ApplicationInsightsLoggingProvider. Этот пакет SDK предоставляет методы расширения на IServiceCollection, чтобы включать и настраивать сбор телеметрии.

Замечание

Рабочая служба — это длительное фоновое приложение, которое выполняет задачи за пределами конвейера HTTP-запроса или ответа. Пакет SDK Application Insights для рабочей службы можно использовать в недавно введенной .NET Core Worker Service, фоновых задачах в ASP.NET Core и консольных приложениях, таких как .NET Core и .NET Framework.

Добавьте Application Insights

В этом разделе

Prerequisites

Инструментирование приложения с помощью пакета SDK Application Insights

В этом разделе описано, как добавить Application Insights в веб-приложение на основе шаблона.

ASP.NET

  1. Добавьте в проект следующие пакеты NuGet и их зависимости.

  2. В некоторых случаях файл ApplicationInsights.config создается автоматически. Если файл уже существует, перейдите к шагу 4.

    Создайте его самостоятельно, если он отсутствует. В корневом каталоге приложения ASP.NET создайте файл с именем ApplicationInsights.config.

  3. Скопируйте в созданный файл следующую конфигурацию в формате XML.


    Нажмите, чтобы развернуть конфигурацию
    <?xml version="1.0" encoding="utf-8"?>
    <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
      <TelemetryInitializers>
        <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer" />
        <Add Type="Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web">
          <!-- Extended list of bots:
                search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->
          <Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>
        </Add>
        <Add Type="Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.AzureAppServiceRoleNameFromHostNameHeaderInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web" />
      </TelemetryInitializers>
      <TelemetryModules>
        <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
          <ExcludeComponentCorrelationHttpHeadersOnDomains>
            <!-- 
            Requests to the following hostnames will not be modified by adding correlation headers.
            Add entries here to exclude additional hostnames.
            NOTE: this configuration will be lost upon NuGet upgrade.
            -->
            <Add>core.windows.net</Add>
            <Add>core.chinacloudapi.cn</Add>
            <Add>core.cloudapi.de</Add>
            <Add>core.usgovcloudapi.net</Add>
          </ExcludeComponentCorrelationHttpHeadersOnDomains>
          <IncludeDiagnosticSourceActivities>
            <Add>Microsoft.Azure.EventHubs</Add>
            <Add>Azure.Messaging.ServiceBus</Add>
          </IncludeDiagnosticSourceActivities>
        </Add>
        <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
          <!--
          Use the following syntax here to collect additional performance counters:
    
          <Counters>
            <Add PerformanceCounter="\Process(??APP_WIN32_PROC??)\Handle Count" ReportAs="Process handle count" />
            ...
          </Counters>
    
          PerformanceCounter must be either \CategoryName(InstanceName)\CounterName or \CategoryName\CounterName
    
          NOTE: performance counters configuration will be lost upon NuGet upgrade.
    
          The following placeholders are supported as InstanceName:
            ??APP_WIN32_PROC?? - instance name of the application process for Win32 counters.
            ??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.
            ??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.
          -->
        </Add>
        <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.AppServicesHeartbeatTelemetryModule, Microsoft.AI.WindowsServer" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.AzureInstanceMetadataTelemetryModule, Microsoft.AI.WindowsServer">
          <!--
          Remove individual fields collected here by adding them to the ApplicationInsighs.HeartbeatProvider
          with the following syntax:
    
          <Add Type="Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights">
            <ExcludedHeartbeatProperties>
              <Add>osType</Add>
              <Add>location</Add>
              <Add>name</Add>
              <Add>offer</Add>
              <Add>platformFaultDomain</Add>
              <Add>platformUpdateDomain</Add>
              <Add>publisher</Add>
              <Add>sku</Add>
              <Add>version</Add>
              <Add>vmId</Add>
              <Add>vmSize</Add>
              <Add>subscriptionId</Add>
              <Add>resourceGroupName</Add>
              <Add>placementGroupId</Add>
              <Add>tags</Add>
              <Add>vmScaleSetName</Add>
            </ExcludedHeartbeatProperties>
          </Add>
    
          NOTE: exclusions will be lost upon upgrade.
          -->
        </Add>
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer" />
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer">
          <!--</Add>
        <Add Type="Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer">-->
        </Add>
        <Add Type="Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web">
          <Handlers>
            <!-- 
            Add entries here to filter out additional handlers:
    
            NOTE: handler configuration will be lost upon NuGet upgrade.
            -->
            <Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>
            <Add>System.Web.StaticFileHandler</Add>
            <Add>System.Web.Handlers.AssemblyResourceLoader</Add>
            <Add>System.Web.Optimization.BundleHandler</Add>
            <Add>System.Web.Script.Services.ScriptHandlerFactory</Add>
            <Add>System.Web.Handlers.TraceHandler</Add>
            <Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>
            <Add>System.Web.HttpDebugHandler</Add>
          </Handlers>
        </Add>
        <Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web" />
        <Add Type="Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web" />
      </TelemetryModules>
      <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
      <TelemetrySinks>
        <Add Name="default">
          <TelemetryProcessors>
            <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector" />
            <Add Type="Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights" />
            <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
              <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
              <ExcludedTypes>Event</ExcludedTypes>
            </Add>
            <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel">
              <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
              <IncludedTypes>Event</IncludedTypes>
            </Add>
            <!--
              Adjust the include and exclude examples to specify the desired semicolon-delimited types. (Dependency, Event, Exception, PageView, Request, Trace)
            -->
          </TelemetryProcessors>
          <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel" />
        </Add>
      </TelemetrySinks>
      <!-- 
        Learn more about Application Insights configuration with ApplicationInsights.config here:
        http://go.microsoft.com/fwlink/?LinkID=513840
      -->
      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
    </ApplicationInsights>
    
  4. Добавьте строку подключения, которую можно сделать двумя способами:

    • (рекомендуется) задайте строку подключения в конфигурации.

      Перед закрывающим тегом </ApplicationInsights> в ApplicationInsights.config добавьте строку подключения для вашего ресурса Application Insights. Вы можете найти строку подключения на панели обзора недавно созданного ресурса Application Insights.

      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
      
    • Установите строку подключения в коде.

      Укажите connection string в классе program.cs.

      var configuration = new TelemetryConfiguration
      {
          ConnectionString = "Copy the connection string from your Application Insights resource"
      };
      
  5. На том же уровне проекта, что и файл ApplicationInsights.config , создайте папку с именем ErrorHandler с новым файлом C# с именем AiHandleErrorAttribute.cs. Содержимое файла выглядит следующим образом:

    using System;
    using System.Web.Mvc;
    using Microsoft.ApplicationInsights;
    
    namespace WebApplication10.ErrorHandler //namespace will vary based on your project name
    {
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
        public class AiHandleErrorAttribute : HandleErrorAttribute
        {
            public override void OnException(ExceptionContext filterContext)
            {
                if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
                {
                    //If customError is Off, then AI HTTPModule will report the exception
                    if (filterContext.HttpContext.IsCustomErrorEnabled)
                    {   
                        var ai = new TelemetryClient();
                        ai.TrackException(filterContext.Exception);
                    } 
                }
                base.OnException(filterContext);
            }
        }
    }
    
  6. В папке App_Start откройте файл FilterConfig.cs и измените его в соответствии с примером:

    using System.Web;
    using System.Web.Mvc;
    
    namespace WebApplication10 //Namespace will vary based on project name
    {
        public class FilterConfig
        {
            public static void RegisterGlobalFilters(GlobalFilterCollection filters)
            {
                filters.Add(new ErrorHandler.AiHandleErrorAttribute());
            }
        }
    }
    
  7. Если Web.config уже обновлены, пропустите этот шаг. В противном случае измените этот файл следующим образом.


    Нажмите, чтобы развернуть конфигурацию
    <?xml version="1.0" encoding="utf-8"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      https://go.microsoft.com/fwlink/?LinkId=301880
      -->
    <configuration>
      <appSettings>
        <add key="webpages:Version" value="3.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.7.2" />
        <httpRuntime targetFramework="4.7.2" />
        <!-- Code added for Application Insights start -->
        <httpModules>
          <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
        </httpModules>
        <!-- Code added for Application Insights end -->
      </system.web>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />
            <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
          </dependentAssembly>
          <!-- Code added for Application Insights start -->
          <dependentAssembly>
            <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
          </dependentAssembly>
          <!-- Code added for Application Insights end -->
        </assemblyBinding>
      </runtime>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
        </compilers>
      </system.codedom>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <!-- Code added for Application Insights start -->
        <modules>
          <remove name="TelemetryCorrelationHttpModule" />
          <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="managedHandler" />
          <remove name="ApplicationInsightsWebTracking" />
          <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
        </modules>
        <!-- Code added for Application Insights end -->
      </system.webServer>
    </configuration>
    

На этом этапе вы успешно настроили мониторинг приложений на стороне сервера. При запуске веб-приложения вы увидите, что данные телеметрии начинают отображаться в Application Insights.

ASP.NET Core

  1. Установите пакет NuGet SDK Application Insights для ASP.NET Core.

    Мы рекомендуем всегда использовать последнюю стабильную версию. Найдите полные заметки о выпуске пакета SDK в репозитории open-source GitHub.

    В следующем примере кода показаны изменения, которые нужно внести в файл .csproj вашего проекта:

    <ItemGroup>
        <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.21.0" />
    </ItemGroup>
    
  2. Добавьте AddApplicationInsightsTelemetry() в класс program.cs .

    Добавьте builder.Services.AddApplicationInsightsTelemetry(); после WebApplication.CreateBuilder() метода, как в следующем примере:

    // This method gets called by the runtime. Use this method to add services to the container.
    var builder = WebApplication.CreateBuilder(args);
    
    // The following line enables Application Insights telemetry collection.
    builder.Services.AddApplicationInsightsTelemetry();
    
    // This code adds other services for your application.
    builder.Services.AddMvc();
    
    var app = builder.Build();
    
  3. Добавьте строку подключения, которую можно добавить тремя способами добавления.

    • (рекомендуется) задайте строку подключения в конфигурации.

      Задайте connection string в appsettings.json и убедитесь, что файл конфигурации копируется в корневую папку приложения во время публикации.

      {
          "Logging": {
              "LogLevel": {
                  "Default": "Information",
                  "Microsoft.AspNetCore": "Warning"
              }
          },
          "AllowedHosts": "*",
          "ApplicationInsights": {
              "ConnectionString": "<YOUR-CONNECTION-STRING>"
          }
      }
      
    • Задайте connection string в переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING или ApplicationInsights:ConnectionString в файле конфигурации JSON.

      Рассмотрим пример.

      • SET ApplicationInsights:ConnectionString = <Copy connection string from Application Insights Resource Overview>
      • SET APPLICATIONINSIGHTS_CONNECTION_STRING = <Copy connection string from Application Insights Resource Overview>
      • Как правило, APPLICATIONINSIGHTS_CONNECTION_STRING используется в веб-приложениях. Его также можно использовать во всех местах, где поддерживается этот пакет SDK.

      Замечание

      Строка подключения, указанная в коде, имеет приоритет над переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING, и имеет приоритет над другими параметрами.

    • Установите строку подключения в коде.

      Предоставьте строку подключения в составе аргумента ApplicationInsightsServiceOptions для AddApplicationInsightsTelemetry в классе Program.cs.

Секреты пользователей и другие поставщики конфигурации

Если вы хотите сохранить строку подключения в пользовательских секретах ASP.NET Core или получить её из другого поставщика конфигурации, можно использовать перегрузку с параметром Microsoft.Extensions.Configuration.IConfiguration. Примером параметра является services.AddApplicationInsightsTelemetry(Configuration);.

В Microsoft.ApplicationInsights.AspNetCore версии 2.15.0 и более поздних версиях, вызов services.AddApplicationInsightsTelemetry() автоматически считывает connection string из Microsoft.Extensions.Configuration.IConfiguration приложения. Нет необходимости явно предоставлять IConfiguration.

Если IConfiguration загружает конфигурации из нескольких поставщиков, то services.AddApplicationInsightsTelemetry отдаёт приоритет конфигурации из appsettings.json, независимо от порядка добавления поставщиков. Используйте метод services.AddApplicationInsightsTelemetry(IConfiguration) для чтения конфигурации из IConfiguration без этого особого подхода для appsettings.json.

Служба рабочего процесса

В этом разделе
Использование пакета SDK Application Insights для рабочей службы
  1. Установите пакет Microsoft.ApplicationInsights.WorkerService в приложение.

    В следующем фрагменте кода показаны изменения, которые необходимо добавить в файл проекта .csproj :

        <ItemGroup>
            <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
        </ItemGroup>
    
  2. Настройте строку подключения в переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING или в конфигурации (appsettings.json).

    Скриншот с обзором и строкой подключения Application Insights.

  3. Получение экземпляра ILogger или TelemetryClient из контейнера внедрения зависимостей (DI) путем вызова serviceProvider.GetRequiredService<TelemetryClient>(); или с использованием конструкторного внедрения. Этот шаг активирует настройку TelemetryConfiguration, а также модулей автосбора.

Конкретные инструкции для каждого типа приложения описаны в следующих разделах.

приложение .NET Core Worker Service

Полный пример предоставляется на веб-сайте NuGet.

  1. Скачайте и установите пакет SDK .NET.

  2. Создайте проект Worker Service, используя новый шаблон проекта Visual Studio или командную строку dotnet new worker.

  3. Добавьте пакет Microsoft.ApplicationInsights.WorkerService в приложение.

  4. Добавьте services.AddApplicationInsightsTelemetryWorkerService(); в CreateHostBuilder() метод в Program.cs классе, как в следующем примере:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                    services.AddApplicationInsightsTelemetryWorkerService();
                });
    
  5. Измените значение Worker.cs в следующем примере:

        using Microsoft.ApplicationInsights;
        using Microsoft.ApplicationInsights.DataContracts;
    
        public class Worker : BackgroundService
        {
            private readonly ILogger<Worker> _logger;
            private TelemetryClient _telemetryClient;
            private static HttpClient _httpClient = new HttpClient();
    
            public Worker(ILogger<Worker> logger, TelemetryClient tc)
            {
                _logger = logger;
                _telemetryClient = tc;
            }
    
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                while (!stoppingToken.IsCancellationRequested)
                {
                    _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
    
                    using (_telemetryClient.StartOperation<RequestTelemetry>("operation"))
                    {
                        _logger.LogWarning("A sample warning message. By default, logs with severity Warning or higher is captured by Application Insights");
                        _logger.LogInformation("Calling bing.com");
                        var res = await _httpClient.GetAsync("https://bing.com");
                        _logger.LogInformation("Calling bing completed with status:" + res.StatusCode);
                        _telemetryClient.TrackEvent("Bing call event completed");
                    }
    
                    await Task.Delay(1000, stoppingToken);
                }
            }
        }
    
  6. Настройте строку подключения.

    Скриншот, на котором показан обзор Application Insights и строка подключения.

    Замечание

    Рекомендуется указать строку подключения в конфигурации. В следующем примере кода показано, как указать connection string в appsettings.json. Убедитесь, что appsettings.json копируется в корневую папку приложения при публикации.

        {
            "ApplicationInsights":
            {
                "ConnectionString" : "<YOUR-CONNECTION-STRING>"
            },
            "Logging":
            {
                "LogLevel":
                {
                    "Default": "Warning"
                }
            }
        }
    

Кроме того, укажите connection string в переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING.

Как правило, APPLICATIONINSIGHTS_CONNECTION_STRING указывает строку подключения для приложений, размещенных в веб-приложениях как веб-задания.

Замечание

Connection string, указанный в коде, имеет приоритет над переменной среды APPLICATIONINSIGHTS_CONNECTION_STRING, которая имеет приоритет над другими параметрами.

ASP.NET Core фоновые задачи с хостируемыми службами

документ описывает создание фоновых задач в приложении ASP.NET Core.

Полный пример представлен на этой странице GitHub.

  1. Установите пакет Microsoft.ApplicationInsights.WorkerService в приложение.

  2. Добавьте services.AddApplicationInsightsTelemetryWorkerService(); в ConfigureServices() метод, как в следующем примере:

        public static async Task Main(string[] args)
        {
            var host = new HostBuilder()
                .ConfigureAppConfiguration((hostContext, config) =>
                {
                    config.AddJsonFile("appsettings.json", optional: true);
                })
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddLogging();
                    services.AddHostedService<TimedHostedService>();
    
                    // connection string is read automatically from appsettings.json
                    services.AddApplicationInsightsTelemetryWorkerService();
                })
                .UseConsoleLifetime()
                .Build();
    
            using (host)
            {
                // Start the host
                await host.StartAsync();
    
                // Wait for the host to shutdown
                await host.WaitForShutdownAsync();
            }
        }
    

    Следующий код для TimedHostedService, где находится логика фоновой задачи:

        using Microsoft.ApplicationInsights;
        using Microsoft.ApplicationInsights.DataContracts;
    
        public class TimedHostedService : IHostedService, IDisposable
        {
            private readonly ILogger _logger;
            private Timer _timer;
            private TelemetryClient _telemetryClient;
            private static HttpClient httpClient = new HttpClient();
    
            public TimedHostedService(ILogger<TimedHostedService> logger, TelemetryClient tc)
            {
                _logger = logger;
                this._telemetryClient = tc;
            }
    
            public Task StartAsync(CancellationToken cancellationToken)
            {
                _logger.LogInformation("Timed Background Service is starting.");
    
                _timer = new Timer(DoWork, null, TimeSpan.Zero,
                    TimeSpan.FromSeconds(1));
    
                return Task.CompletedTask;
            }
    
            private void DoWork(object state)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
    
                using (_telemetryClient.StartOperation<RequestTelemetry>("operation"))
                {
                    _logger.LogWarning("A sample warning message. By default, logs with severity Warning or higher is captured by Application Insights");
                    _logger.LogInformation("Calling bing.com");
                    var res = httpClient.GetAsync("https://bing.com").GetAwaiter().GetResult();
                    _logger.LogInformation("Calling bing completed with status:" + res.StatusCode);
                    _telemetryClient.TrackEvent("Bing call event completed");
                }
            }
        }
    
  3. Настройте строку подключения. Используйте тот же appsettings.json из предыдущего примера .NET Worker Service.

консольное приложение .NET Core/.NET Framework

Как упоминалось в начале этой статьи, новый пакет можно использовать для включения телеметрии Application Insights даже из обычного консольного приложения. Этот пакет предназначен для netstandard2.0, поэтому его можно использовать для консольных приложений в .NET Core или более поздней версии и .NET Framework или более поздней версии.

Полный пример представлен на этой странице GitHub.

  1. Установите пакет Microsoft.ApplicationInsights.WorkerService в приложение.

  2. Измените Program.cs , как показано в следующем примере:

        using Microsoft.ApplicationInsights;
        using Microsoft.ApplicationInsights.DataContracts;
        using Microsoft.ApplicationInsights.WorkerService;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;
        using System;
        using System.Net.Http;
        using System.Threading.Tasks;
    
        namespace WorkerSDKOnConsole
        {
            class Program
            {
                static async Task Main(string[] args)
                {
                    // Create the DI container.
                    IServiceCollection services = new ServiceCollection();
    
                    // Being a regular console app, there is no appsettings.json or configuration providers enabled by default.
                    // Hence connection string and any changes to default logging level must be specified here.
                    services.AddLogging(loggingBuilder => loggingBuilder.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("Category", LogLevel.Information));
                    services.AddApplicationInsightsTelemetryWorkerService((ApplicationInsightsServiceOptions options) => options.ConnectionString = "<YOUR-CONNECTION-STRING>");
    
                    // To pass a connection string
                    // - aiserviceoptions must be created
                    // - set connectionstring on it
                    // - pass it to AddApplicationInsightsTelemetryWorkerService()
    
                    // Build ServiceProvider.
                    IServiceProvider serviceProvider = services.BuildServiceProvider();
    
                    // Obtain logger instance from DI.
                    ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();
    
                    // Obtain TelemetryClient instance from DI, for additional manual tracking or to flush.
                    var telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();
    
                    var httpClient = new HttpClient();
    
                    while (true) // This app runs indefinitely. Replace with actual application termination logic.
                    {
                        logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
    
                        // Replace with a name which makes sense for this operation.
                        using (telemetryClient.StartOperation<RequestTelemetry>("operation"))
                        {
                            logger.LogWarning("A sample warning message. By default, logs with severity Warning or higher is captured by Application Insights");
                            logger.LogInformation("Calling bing.com");                    
                            var res = await httpClient.GetAsync("https://bing.com");
                            logger.LogInformation("Calling bing completed with status:" + res.StatusCode);
                            telemetryClient.TrackEvent("Bing call event completed");
                        }
    
                        await Task.Delay(1000);
                    }
    
                    // Explicitly call Flush() followed by sleep is required in console apps.
                    // This is to ensure that even if application terminates, telemetry is sent to the back-end.
                    telemetryClient.Flush();
                    Task.Delay(5000).Wait();
                }
            }
        }
    

Это консольное приложение также использует то же значение по умолчанию TelemetryConfiguration. Его можно настроить так же, как и в примерах в предыдущих разделах.

Развертывание агента Application Insights для локальных серверов

В этом разделе

Агент Application Insights — это модуль PowerShell, опубликованный в PowerShell Gallery. Он заменяет собой монитор состояния. Данные телеметрии отправляются на портал Azure, где можно мониторить приложение.

Полный список поддерживаемых сценариев автоинструментации см. в статье "Поддерживаемые среды", "Языки" и поставщики ресурсов.

Замечание

В настоящее время модуль поддерживает бескодовое инструментирование для веб-приложения ASP.NET и ASP.NET Core, размещенное на сервере IIS. Используйте пакет SDK для инструментирования Java и Node.js приложений.

Замечание

По умолчанию для ASP.NET Core приложений включен мониторинг на стороне клиента. Если вы хотите отключить мониторинг на стороне клиента, определите переменную среды на сервере со следующими сведениями:

  • Имя: APPINSIGHTS_JAVASCRIPT_ENABLED
  • Значение: false

Начало работы

В этом разделе содержатся команды быстрого запуска, которые, как ожидается, будут работать для большинства сред. Инструкции зависят от PowerShell Gallery для распространения обновлений. Эти команды поддерживают параметр PowerShell -Proxy.

Описание этих команд, инструкции по настройке и сведения об устранении неполадок см. в разделе Подробные инструкции.

Если у вас нет подписки Azure, создайте учетную запись free перед началом работы.

Замечание

Необходимые компоненты находятся в разделе Поддержка транспортного уровня безопасности (TLS) в PowerShell Gallery.

  1. Установите модуль (запуск от имени администратора):

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
    Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
    Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
    Install-Module -Name PowerShellGet -Force
    
  2. Установите агент Application Insights (запуск от имени администратора):

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
    Install-Module -Name Az.ApplicationMonitor -AllowPrerelease -AcceptLicense
    

    Замечание

    Переключатель AllowPrerelease в командлете Install-Module позволяет установить бета-релиз.

    Дополнительные сведения см. в разделе Install-Module.

  3. Включение мониторинга:

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force
    Enable-ApplicationInsightsMonitoring -ConnectionString 'InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/'
    
Вариант 2. Скачивание и установка агента Application Insights вручную (в автономном режиме)
  1. Скачайте последнюю версию модуля из PowerShell Gallery.

  2. Распакуйте и установите агент Application Insights:

    $pathToNupkg = "C:\Users\t\Desktop\Az.ApplicationMonitor.0.3.0-alpha.nupkg"
    $pathToZip = ([io.path]::ChangeExtension($pathToNupkg, "zip"))
    $pathToNupkg | rename-item -newname $pathToZip
    $pathInstalledModule = "$Env:ProgramFiles\WindowsPowerShell\Modules\Az.ApplicationMonitor"
    Expand-Archive -LiteralPath $pathToZip -DestinationPath $pathInstalledModule
    
  3. Включение мониторинга:

    Enable-ApplicationInsightsMonitoring -ConnectionString 'InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/'
    

Подробные инструкции

В этом разделе описывается, как подключиться к PowerShell Gallery и скачать модуль ApplicationMonitor. Включены наиболее распространенные параметры, которые нужны для начала работы. Мы также предоставляем инструкции по скачиванию вручную, если у вас нет доступа к Интернету.

Запустите PowerShell от имени администратора с повышенной политикой выполнения

Это важно

Чтобы внести изменения на вашем компьютере, PowerShell нужны разрешения на уровне администратора.

Политика выполнения

  • Описание: по умолчанию запуск сценариев PowerShell отключен. Мы рекомендуем разрешать сценарии RemoteSigned только в текущем контексте.
  • Справка: Общие сведения о политиках выполнения и Set-ExecutionPolicy.
  • Команда: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process.
  • Необязательный параметр:
    • -Force. Обходит запрос подтверждения.

Примеры ошибок

Install-Module : The 'Install-Module' command was found in the module 'PowerShellGet', but the module could not be
loaded. For more information, run 'Import-Module PowerShellGet'.

Import-Module : File C:\Program Files\WindowsPowerShell\Modules\PackageManagement\1.3.1\PackageManagement.psm1 cannot
be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
Предварительные требования для PowerShell

Проведите аудит экземпляра PowerShell, выполнив команду $PSVersionTable. Эта команда выдает следующий результат:

Name                           Value
----                           -----
PSVersion                      5.1.17763.316
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.316
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Эти инструкции были написаны и протестированы на компьютере под управлением Windows 10 и следующих версий.

Эти действия подготовят сервер к скачиванию модулей из PowerShell Gallery.

Замечание

PowerShell Gallery поддерживается в Windows 10, Windows Server 2016 и PowerShell 6+. Дополнительные сведения о более ранних версиях см. в разделе Установка PowerShellGet.

  1. Запустите PowerShell от имени администратора с помощью политики выполнения с повышенными правами.

  2. Установите диспетчер пакетов NuGet.

    • Описание. Этот поставщик должен взаимодействовать с репозиториями на основе NuGet, такими как PowerShell Gallery.
    • Справочная информация: Install-PackageProvider.
    • Команда: Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201.
    • Необязательные параметры:
      • -Proxy. Указывает прокси-сервер для запроса.
      • -Force. Обходит запрос подтверждения.

    Вы получите этот запрос, если NuGet не настроен:

    NuGet provider is required to continue
    PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories.
    The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
    'C:\Users\t\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running
    'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install and import
    the NuGet provider now?
    [Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):
    
  3. Настройте PowerShell Gallery в качестве доверенного репозитория.

    • Описание. По умолчанию PowerShell Gallery является ненадежным репозиторием.
    • Справка: Set-PSRepository.
    • Команда: Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted.
    • Необязательный параметр:
      • -Proxy. Указывает прокси-сервер для запроса.

    Вы получите этот запрос, если PowerShell Gallery не является доверенным:

    Untrusted repository
    You are installing the modules from an untrusted repository.
    If you trust this repository, change its InstallationPolicy value
    by running the Set-PSRepository cmdlet. Are you sure you want to
    install the modules from 'PSGallery'?
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"):
    

    Можно подтвердить это изменение и провести аудит всех PSRepositories, выполнив команду Get-PSRepository.

  4. Установите PowerShellGet последней версии.

    • Описание. Этот модуль содержит средства, используемые для получения других модулей из PowerShell Gallery. Версия 1.0.0.1 поставляется с Windows 10 и Windows Server. Требуется версия 1.6.0 или более поздняя. Чтобы определить, какая версия установлена, выполните команду Get-Command -Module PowerShellGet.
    • Справка: Установка PowerShellGet.
    • Команда: Install-Module -Name PowerShellGet.
    • Необязательные параметры:
      • -Proxy. Указывает прокси-сервер для запроса.
      • -Force. Обходит предупреждение "уже установлено" и устанавливает последнюю версию.

    Эта ошибка возникает, если вы не используете последнюю версию PowerShellGet:

    Install-Module : A parameter cannot be found that matches parameter name 'AllowPrerelease'.
    At line:1 char:20
    Install-Module abc -AllowPrerelease
                   ~~~~~~~~~~~~~~~~
    CategoryInfo          : InvalidArgument: (:) [Install-Module], ParameterBindingException
    FullyQualifiedErrorId : NamedParameterNotFound,Install-Module
    
  5. Перезапустите PowerShell. Загрузить новую версию в текущем сеансе невозможно. Новые сеансы PowerShell загружают последнюю версию PowerShellGet.

Эти шаги загружают модуль Az.ApplicationMonitor из PowerShell Gallery.

  1. Убедитесь, что выполнены все предварительные требования для PowerShell Gallery.
  2. Запустите PowerShell от имени администратора с помощью политики выполнения с повышенными правами.
  3. Установите модуль Az.ApplicationMonitor.
    • Справка: Install-Module.
    • Команда: Install-Module -Name Az.ApplicationMonitor.
    • Необязательные параметры:
      • -Proxy. Указывает прокси-сервер для запроса.
      • -AllowPrerelease. Позволяет устанавливать альфа- и бета-релизы.
      • -AcceptLicense. Обходит запрос "Принять лицензию".
      • -Force. Обходит предупреждение "Недоверенный репозиторий".
Вариант 2. Скачивание и установка модуля вручную (в автономном режиме)

Если по какой-либо причине подключиться к модулю PowerShell не удается, вы можете скачать и установить модуль Az.ApplicationMonitor вручную.

Скачивание последней версии файла nupkg вручную
  1. Перейдите к https://www.powershellgallery.com/packages/Az.ApplicationMonitor.
  2. Выберите последнюю версию файла в таблице Журнал версий.
  3. В разделе Параметры установки выберите пункт Скачивание вручную.
Вариант 2.1. Установка в каталог модулей PowerShell

Установите модуль PowerShell вручную в каталог PowerShell, чтобы его можно было обнаружить с помощью сеансов PowerShell. Дополнительные сведения см. в статье Установка модуля PowerShell.

Распакуйте nupkg в виде ZIP-файла с помощью Expand-Archive (версия 1.0.1.0)

  • Описание: базовая версия Microsoft.PowerShell.Archive (версии 1.0.1.0) не может распаковать файлы nupkg. Переименуйте файл, добавив расширение ZIP.

  • Справка: Expand-Archive.

  • Команда:

    $pathToNupkg = "C:\az.applicationmonitor.0.3.0-alpha.nupkg"
    $pathToZip = ([io.path]::ChangeExtension($pathToNupkg, "zip"))
    $pathToNupkg | rename-item -newname $pathToZip
    $pathInstalledModule = "$Env:ProgramFiles\WindowsPowerShell\Modules\az.applicationmonitor"
    Expand-Archive -LiteralPath $pathToZip -DestinationPath $pathInstalledModule
    

Распакуть nupkg с помощью Expand-Archive (версия 1.1.0.0)

  • Описание: для распаковки файлов nupkg без изменения расширения используйте текущую версию Expand-Archive.

  • Справка: Expand-Archive и Microsoft.PowerShell.Archive.

  • Команда:

    $pathToNupkg = "C:\az.applicationmonitor.0.2.1-alpha.nupkg"
    $pathInstalledModule = "$Env:ProgramFiles\WindowsPowerShell\Modules\az.applicationmonitor"
    Expand-Archive -LiteralPath $pathToNupkg -DestinationPath $pathInstalledModule
    
Вариант 2.2. Распакуируйте и импортируйте nupkg вручную

Установите модуль PowerShell вручную в каталог PowerShell, чтобы его можно было обнаружить с помощью сеансов PowerShell. Дополнительные сведения см. в статье Установка модуля PowerShell.

Если вы устанавливаете модуль в любой другой каталог, импортируйте модуль с помощью команды Import-Module вручную.

Это важно

Библиотеки динамических ссылок (DLL) устанавливаются с помощью относительных путей. Сохраните содержимое пакета в требуемый каталог среды выполнения и убедитесь в том, что разрешения на доступ разрешают чтение, но не запись.

  1. Измените расширение на ZIP и извлеките содержимое пакета в требуемый каталог установки.
  2. Найдите путь к файлу Az.ApplicationMonitor.psd1.
  3. Запустите PowerShell от имени администратора с помощью политики выполнения с повышенными правами.
  4. Загрузите модуль с помощью команды Import-Module Az.ApplicationMonitor.psd1.
Перенаправление трафика через прокси-сервер

При мониторинге компьютера в частной интрасети необходимо маршрутизировать HTTP-трафик через прокси-сервер.

Команды PowerShell для скачивания и установки Az.ApplicationMonitor из PowerShell Gallery поддерживают параметр -Proxy. При написании сценариев установки следуйте приведенным выше инструкциям.

Пакет SDK Application Insights должен отправлять данные телеметрии приложения в Корпорацию Майкрософт. Рекомендуем настроить параметры прокси-сервера для вашего приложения в файле web.config. Дополнительные сведения см. в разделе Как добиться сквозной передачи через прокси-сервер?.

Включение мониторинга

Для включения мониторинга используйте команду Enable-ApplicationInsightsMonitoring.

Подробное описание использования этого командлета см. в справочнике API.

Справочник по API

Это важно

  • Для выполнения следующих командлетов требуется сеанс PowerShell с правами администратора и повышенной политикой выполнения. Дополнительные сведения см. в статье Запуск PowerShell от имени администратора с повышенной политикой выполнения.
  • Для выполнения следующих командлетов требуется проверить и принять нашу лицензию и заявление о конфиденциальности.
  • Подсистема инструментирования добавляет больше накладных расходов и по умолчанию отключается.

В этом разделе описаны следующие командлеты, которые относятся к модулю Az.ApplicationMonitor PowerShell:

Замечание

Разверните любой из приведенных ниже разделов для получения дополнительных сведений, включая примеры, параметры и выходные данные.

Enable-InstrumentationEngine

Включает модуль инструментирования, настроив некоторые разделы реестра. Перезапустите IIS, чтобы изменения вступили в силу.

Движок инструментирования может дополнять данные, собранные программными комплектами разработки (SDK) .NET. Он собирает события и сообщения, описывающие выполнение управляемого процесса. Эти события и сообщения включают в себя коды результатов зависимостей, глаголы HTTP и текст команды SQL.

Включите модуль инструментирования, если:

  • Вы уже включили мониторинг с помощью командлета Enable , но не включили подсистему инструментирования.
  • Вы вручную инструментировали приложение с помощью пакетов SDK .NET и хотите собирать дополнительные данные телеметрии.
Примеры
Enable-InstrumentationEngine
Параметры
Параметр Description
-ПринятьЛицензию Необязательно. Используйте этот переключатель, чтобы принять условия лицензии и заявление о конфиденциальности в установках без графического интерфейса.
-Многословный Общий параметр. Используйте этот параметр для вывода подробных журналов.
Выходные данные

Пример выходных данных из успешного включения подсистемы инструментирования:

Configuring IIS Environment for instrumentation engine...
Configuring registry for instrumentation engine...
Enable-ApplicationInsightsMonitoring

Позволяет без программирования подключать мониторинг приложений IIS на целевой системе.

Этот командлет изменяет файл конфигурации applicationHost.config в IIS и устанавливает некоторые ключи реестра. Он создает файл applicationinsights.ikey.config, определяющий ключ инструментирования, используемый каждым приложением. IIS загружает RedfieldModule при запуске, который внедряет пакет SDK Application Insights в приложения при запуске приложений. Перезапустите IIS, чтобы изменения вступили в силу.

После включения мониторинга рекомендуется использовать Live Metrics, чтобы быстро проверить, отправляет ли ваше приложение данные телеметрии.

Примеры
Пример с одной строкой подключения

В этом примере все приложения на текущем компьютере обеспечиваются одной строкой подключения.

Enable-ApplicationInsightsMonitoring -ConnectionString 'InstrumentationKey=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;IngestionEndpoint=https://xxxx.applicationinsights.azure.com/'
Пример с одним ключом инструментирования

В этом примере все приложения на текущем компьютере предоставляются с одним ключом инструментирования.

Enable-ApplicationInsightsMonitoring -InstrumentationKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Пример с картой сопоставления ключей инструментирования

В этом примере:

  • MachineFilter соответствует текущему компьютеру с помощью подстановочного знака '.*'.
  • AppFilter='WebAppExclude' обеспечивает ключ инструментирования null. Указанное приложение не инструментировано.
  • AppFilter='WebAppOne' присваивает указанному приложению уникальный ключ инструментирования.
  • AppFilter='WebAppTwo' присваивает указанному приложению уникальный ключ инструментирования.
  • AppFilter '.*' использует подстановочный знак для сопоставления любых веб-приложений, которые еще не совпадают, и назначает ключ инструментирования по умолчанию.
  • Для удобочитаемости добавляются пробелы.
Enable-ApplicationInsightsMonitoring -InstrumentationKeyMap `
    ` @(@{MachineFilter='.*';AppFilter='WebAppExclude'},
        ` @{MachineFilter='.*';AppFilter='WebAppOne';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx1'}},
        ` @{MachineFilter='.*';AppFilter='WebAppTwo';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx2'}},
        ` @{MachineFilter='.*';AppFilter='.*';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxdefault'}})
  • MachineFilter — это обязательный regex C# для имени компьютера или виртуальной машины.
    • ".*" соответствует всем
    • Имя_компьютера соответствует только компьютерам с указанным именем.
  • AppFilter — это обязательное регулярное выражение C# для имени сайта IIS. Список сайтов на сервере можно получить, выполнив команду get-iissite.
    • ".*" соответствует всем
    • SiteName соответствует только веб-сайту в IIS с точно указанным именем.
  • InstrumentationKey требуется для включения мониторинга приложений, соответствующих двум предыдущим фильтрам.
    • Если необходимо определить правила для исключения мониторинга, оставьте значение null.
Параметры
Параметр Description
-Включить движок инструментирования Необязательно. Используйте этот параметр, чтобы модуль инструментирования собирал события и сообщения о том, что происходит во время выполнения управляемого процесса. Эти события и сообщения включают в себя коды результатов зависимостей, глаголы HTTP и текст команды SQL.

Модуль инструментирования добавляет нагрузку и по умолчанию отключен.
-ПринятьЛицензию Необязательно. Используйте этот переключатель, чтобы принять условия лицензии и заявление о конфиденциальности в установках без графического интерфейса.
-ИгнорироватьОбщуюКонфигурацию Если у вас есть кластер веб-серверов, возможно, вы используете общедоступную конфигурацию. Внедрить HttpModule в эту общую конфигурацию невозможно. Этот скрипт завершается ошибкой с сообщением о необходимости дополнительных шагов установки. Используйте этот параметр, чтобы пропустить эту проверку и продолжить установку необходимых компонентов.

Дополнительные сведения см. в статье Известные конфликты с общедоступной конфигурацией службы IIS.
-Многословный Общий параметр. Используйте этот параметр для отображения подробных журналов.
-WhatIf Общий параметр. Используйте этот параметр для тестирования и проверки входных параметров без фактического включения мониторинга.
Выходные данные
Пример вывода данных при успешном включении
Initiating Disable Process
Applying transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config'
'C:\Windows\System32\inetsrv\config\applicationHost.config' backed up to 'C:\Windows\System32\inetsrv\config\applicationHost.config.backup-2019-03-26_08-59-52z'
in :1,237
No element in the source document matches '/configuration/location[@path='']/system.webServer/modules/add[@name='ManagedHttpModuleHelper']'
Not executing RemoveAll (transform line 1, 546)
Transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config' was successfully applied. Operation: 'disable'
GAC Module will not be removed, since this operation might cause IIS instabilities
Configuring IIS Environment for codeless attach...
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IISADMIN[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS[Environment]
Configuring IIS Environment for instrumentation engine...
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IISADMIN[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS[Environment]
Configuring registry for instrumentation engine...
Successfully disabled Application Insights Agent
Installing GAC module 'C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\0.2.0\content\Runtime\Microsoft.AppInsights.IIS.ManagedHttpModuleHelper.dll'
Applying transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config'
Found GAC module Microsoft.AppInsights.IIS.ManagedHttpModuleHelper.ManagedHttpModuleHelper, Microsoft.AppInsights.IIS.ManagedHttpModuleHelper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
'C:\Windows\System32\inetsrv\config\applicationHost.config' backed up to 'C:\Windows\System32\inetsrv\config\applicationHost.config.backup-2019-03-26_08-59-52z_1'
Transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config' was successfully applied. Operation: 'enable'
Configuring IIS Environment for codeless attach...
Configuring IIS Environment for instrumentation engine...
Configuring registry for instrumentation engine...
Updating app pool permissions...
Successfully enabled Application Insights Agent
Disable-InstrumentationEngine

Отключает модуль инструментирования, удаляя некоторые ключи реестра. Перезапустите IIS, чтобы изменения вступили в силу.

Примеры
Disable-InstrumentationEngine
Параметры
Параметр Description
-Многословный Общий параметр. Используйте этот параметр для вывода подробных журналов.
Выходные данные
Пример выходных данных для успешного отключения модуля инструментирования
Configuring IIS Environment for instrumentation engine...
Registry: removing 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IISADMIN[Environment]'
Registry: removing 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC[Environment]'
Registry: removing 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS[Environment]'
Configuring registry for instrumentation engine...
Disable-ApplicationInsightsMonitoring

Отключает мониторинг на конечном компьютере. Этот командлет удаляет изменения в конфигурацию IIS applicationHost.config и удаляет разделы реестра.

Примеры
Disable-ApplicationInsightsMonitoring
Параметры
Параметр Description
-Многословный Общий параметр. Используйте этот параметр для отображения подробных журналов.
Выходные данные
Пример выходных данных для успешного отключения мониторинга
Initiating Disable Process
Applying transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config'
'C:\Windows\System32\inetsrv\config\applicationHost.config' backed up to 'C:\Windows\System32\inetsrv\config\applicationHost.config.backup-2019-03-26_08-59-00z'
in :1,237
No element in the source document matches '/configuration/location[@path='']/system.webServer/modules/add[@name='ManagedHttpModuleHelper']'
Not executing RemoveAll (transform line 1, 546)
Transformation to 'C:\Windows\System32\inetsrv\config\applicationHost.config' was successfully applied. Operation: 'disable'
GAC Module will not be removed, since this operation might cause IIS instabilities
Configuring IIS Environment for codeless attach...
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IISADMIN[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS[Environment]
Configuring IIS Environment for instrumentation engine...
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IISADMIN[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC[Environment]
Registry: skipping non-existent 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS[Environment]
Configuring registry for instrumentation engine...
Successfully disabled Application Insights Agent
Get-ApplicationInsightsMonitoringConfig

Возвращает файл конфигурации и выводит значения на консоль.

Примеры
Get-ApplicationInsightsMonitoringConfig
Параметры

Никакие параметры не требуются.

Выходные данные
Пример выходных данных чтения файла конфигурации
RedfieldConfiguration:
Filters:
0)InstrumentationKey: AppFilter: WebAppExclude MachineFilter: .*
1)InstrumentationKey: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx2 AppFilter: WebAppTwo MachineFilter: .*
2)InstrumentationKey: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxdefault AppFilter: .* MachineFilter: .*
Get-ApplicationInsightsMonitoringStatus

Этот командлет предоставляет сведения об устранении неполадок агента Application Insights. Используйте этот командлет для изучения состояния мониторинга, версии модуля PowerShell и для проверки выполняющегося процесса. Этот командлет сообщает сведения о версии и сведения о ключевых файлах, необходимых для мониторинга.

Примеры
Пример: состояние приложения

Выполните команду Get-ApplicationInsightsMonitoringStatus, чтобы отобразить состояние мониторинга веб-сайтов.

Get-ApplicationInsightsMonitoringStatus

IIS Websites:

SiteName               : Default Web Site
ApplicationPoolName    : DefaultAppPool
SiteId                 : 1
SiteState              : Stopped

SiteName               : DemoWebApp111
ApplicationPoolName    : DemoWebApp111
SiteId                 : 2
SiteState              : Started
ProcessId              : not found

SiteName               : DemoWebApp222
ApplicationPoolName    : DemoWebApp222
SiteId                 : 3
SiteState              : Started
ProcessId              : 2024
Instrumented           : true
InstrumentationKey     : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx123

SiteName               : DemoWebApp333
ApplicationPoolName    : DemoWebApp333
SiteId                 : 4
SiteState              : Started
ProcessId              : 5184
AppAlreadyInstrumented : true

В этом примере:

  • Идентификатор компьютера — это анонимный идентификатор, используемый для уникальной идентификации сервера. Если вы создаете запрос на поддержку, нам нужен этот идентификатор, чтобы найти журналы для сервера.

  • Веб-сайт по умолчанию остановлен в службе IIS

  • Служба IIS отображает DemoWebApp111 как запущенную, но приложение не получает никаких запросов. В отчете не отображается запущенный процесс (ProcessId: не найден).

  • DemoWebApp222 работает и отслеживается (инструментировано: true). Исходя из пользовательской конфигурации, для этого сайта был определен ключ инструментирования xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx123.

  • DemoWebApp3333 вручную инструментируется с помощью пакета SDK Application Insights. Агент Application Insights обнаруживает пакет SDK и не отслеживает этот сайт.

  • Наличие AppAlreadyInstrumented : true указывает на то, что агент Application Insights обнаружил конфликтующую библиотеку DLL, загруженную в веб-приложение, при условии, что это приложение инструментировано вручную, и поэтому агент отступил и не выполняет инструментирование этого процесса.

  • Instrumented : true указывает, что агент Application Insights успешно инструментировал веб-приложение, работающее в указанном w3wp.exe процессе.

Пример: сведения о модуле PowerShell

Выполните команду Get-ApplicationInsightsMonitoringStatus -PowerShellModule, чтобы отобразить сведения о текущем модуле:

Get-ApplicationInsightsMonitoringStatus -PowerShellModule

PowerShell Module version:
0.4.0-alpha

Application Insights SDK version:
2.9.0.3872

Executing PowerShell Module Assembly:
Microsoft.ApplicationInsights.Redfield.Configurator.PowerShell, Version=2.8.14.11432, Culture=neutral, PublicKeyToken=31bf3856ad364e35

PowerShell Module Directory:
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\0.2.2\content\PowerShell

Runtime Paths:
ParentDirectory (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content

ConfigurationPath (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\applicationInsights.ikey.config

ManagedHttpModuleHelperPath (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AppInsights.IIS.ManagedHttpModuleHelper.dll

RedfieldIISModulePath (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.RedfieldIISModule.dll

InstrumentationEngine86Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation32\MicrosoftInstrumentationEngine_x86.dll

InstrumentationEngine64Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\MicrosoftInstrumentationEngine_x64.dll

InstrumentationEngineExtensionHost86Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation32\Microsoft.ApplicationInsights.ExtensionsHost_x86.dll

InstrumentationEngineExtensionHost64Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\Microsoft.ApplicationInsights.ExtensionsHost_x64.dll

InstrumentationEngineExtensionConfig86Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation32\Microsoft.InstrumentationEngine.Extensions.config

InstrumentationEngineExtensionConfig64Path (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\Microsoft.InstrumentationEngine.Extensions.config

ApplicationInsightsSdkPath (Exists: True)
C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.dll
Пример: состояние среды выполнения

Можно проверить процесс на инструментированном компьютере, чтобы определить, все ли необходимые библиотеки DLL загружены. Если отслеживание работает, то должно быть загружено не менее 12 библиотек DLL.

Выполните команду Get-ApplicationInsightsMonitoringStatus -InspectProcess.

Get-ApplicationInsightsMonitoringStatus -InspectProcess

iisreset.exe /status
Status for IIS Admin Service ( IISADMIN ) : Running
Status for Windows Process Activation Service ( WAS ) : Running
Status for Net.Msmq Listener Adapter ( NetMsmqActivator ) : Running
Status for Net.Pipe Listener Adapter ( NetPipeActivator ) : Running
Status for Net.Tcp Listener Adapter ( NetTcpActivator ) : Running
Status for World Wide Web Publishing Service ( W3SVC ) : Running

handle64.exe -accepteula -p w3wp
BF0: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.ServerTelemetryChannel.dll
C58: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.AzureAppServices.dll
C68: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.DependencyCollector.dll
C78: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.WindowsServer.dll
C98: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.Web.dll
CBC: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.PerfCounterCollector.dll
DB0: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.AI.Agent.Intercept.dll
B98: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.RedfieldIISModule.dll
BB4: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.RedfieldIISModule.Contracts.dll
BCC: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.Redfield.Lightup.dll
BE0: File  (R-D)   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.dll

listdlls64.exe -accepteula w3wp
0x0000000019ac0000  0x127000  C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\MicrosoftInstrumentationEngine_x64.dll
0x00000000198b0000  0x4f000   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\Microsoft.ApplicationInsights.ExtensionsHost_x64.dll
0x000000000c460000  0xb2000   C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Instrumentation64\Microsoft.ApplicationInsights.Extensions.Base_x64.dll
0x000000000ad60000  0x108000  C:\Windows\TEMP\2.4.0.0.Microsoft.ApplicationInsights.Extensions.Intercept_x64.dll
Параметры

По умолчанию этот командлет сообщает о состоянии мониторинга веб-приложений. Используйте этот параметр, чтобы проверить успешность инструментирования приложения. Вы также можете проверить, какой ключ инструментирования был сопоставлен с этим сайтом.

Параметр Description
-PowerShellModule Необязательно. Используйте этот параметр, чтобы сообщить номера версий и пути библиотек DLL, необходимые для мониторинга. Используйте этот параметр, если необходимо указать версию любой библиотеки DLL, включая пакет SDK для Application Insights.
-InspectProcess Необязательно. Используйте этот параметр для сообщения о том, запущен ли сервер IIS. Он загружает внешние средства, чтобы определить, загружаются ли необходимые библиотеки DLL в среду выполнения IIS. Если по какой-то причине этот процесс завершится сбоем, можно выполнить следующие команды вручную:

* iisreset.exe /status
* \[handle64.exe\](/sysinternals/downloads/handle) -p w3wp \| findstr /I "InstrumentationEngine AI. ApplicationInsights"
* \[listdlls64.exe\](/sysinternals/downloads/listdlls) w3wp \| findstr /I "InstrumentationEngine AI ApplicationInsights"
-Force Необязательно. Используется только с InspectProcess. Используйте этот параметр, чтобы пропустить запрос пользователя, который отображается перед загрузкой дополнительных средств.
Set-ApplicationInsightsMonitoringConfig

Задает файл конфигурации без выполнения полной переустановки. Перезапустите IIS, чтобы изменения вступили в силу.

Это важно

Для этого командлета требуется сеанс PowerShell с правами администратора.

Примеры
Пример с одним ключом инструментирования

В этом примере все приложения на текущем компьютере предоставляются с одним ключом инструментирования.

Enable-ApplicationInsightsMonitoring -InstrumentationKey xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Пример с картой сопоставления ключей инструментирования

В этом примере:

  • MachineFilter соответствует текущему компьютеру с помощью подстановочного знака '.*'.
  • AppFilter='WebAppExclude' обеспечивает ключ инструментирования null. Указанное приложение не инструментировано.
  • AppFilter='WebAppOne' присваивает указанному приложению уникальный ключ инструментирования.
  • AppFilter='WebAppTwo' присваивает указанному приложению уникальный ключ инструментирования.
  • AppFilter использует подстановочный знак '.*', чтобы сопоставить веб-приложения, которые еще не были сопоставлены, и назначить ключ инструментирования по умолчанию.
  • Для удобочитаемости добавляются пробелы.
Enable-ApplicationInsightsMonitoring -InstrumentationKeyMap `
    ` @(@{MachineFilter='.*';AppFilter='WebAppExclude'},
      ` @{MachineFilter='.*';AppFilter='WebAppOne';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx1'}},
      ` @{MachineFilter='.*';AppFilter='WebAppTwo';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx2'}},
      ` @{MachineFilter='.*';AppFilter='.*';InstrumentationSettings=@{InstrumentationKey='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxdefault'}})
Параметры
Параметр Description
-ИнструментированиеKey Обязательное. Используйте этот параметр, чтобы указать один ключ инструментирования для использования всеми приложениями на конечном компьютере.
-ИнструментированиеKeyMap Обязательное. Этот параметр используется для предоставления нескольких ключей инструментирования и сопоставления ключей инструментирования, используемых каждым приложением.

Можно создать один скрипт установки для нескольких компьютеров, установив параметр MachineFilter.

Это важно

Приложения соответствуют правилам в порядке их предоставления. Укажите наиболее конкретные правила в первую очередь и последние наиболее универсальные правила.

Это важно

Расширенная функция маршрутизации InstrumentationKeyMap сопоставляет приложения Internet Information Services (IIS) на одной машине с ресурсами Application Insights. Эта функция применяется к приложениям ASP.NET и ASP.NET Core, размещенным в IIS, которые агент Application Insights автоматически инструментирует.

Как работает сопоставление

  • Карта определяет упорядоченный список правил с именем filters. Первое правило сопоставления вступает в силу. Сначала поставьте конкретные правила и завершите добавлением универсального правила.
  • Каждое правило может назначать другой ресурс Application Insights соответствующим приложениям. Предпочтительно использовать строки подключения в поддерживаемых случаях, так как инструментальные ключи являются устаревшими.

Доступные фильтры

  • MachineFilter или machineFilter: регулярное выражение C#, соответствующее имени компьютера или виртуальной машины. .* соответствует всем именам.
  • AppFilter или appFilter: регулярное выражение C#, соответствующее имени сайта IIS (HostingEnvironment.SiteName). Этот фильтр требуется, если не указаны VirtualPathFilter или virtualPathFilter.
  • VirtualPathFilter или virtualPathFilter: регулярное выражение C#, соответствующее виртуальному пути IIS (HostingEnvironment.ApplicationVirtualPath). Используйте этот фильтр, чтобы нацелиться на одно приложение в рамках сайта.

Сопоставление терминологии

  • Командлеты PowerShell используют MachineFilter, AppFilter и VirtualPathFilter.
  • Azure VM и JSON расширений Virtual Machine Scale Sets используют machineFilter, appFilter и virtualPathFilter, и задается ресурс через instrumentationSettings.

Подсказка

Включите окончательное правило, соответствующее всем приложениям, например .*, и примените ресурс по умолчанию, чтобы сделать поведение явным.

Фигура карты этого командлета

  • Укажите -InstrumentationKeyMap в качестве массива хэш-элементов PowerShell.
  • Для этого командлета задайте целевой ресурс для каждого правила InstrumentationSettings=@{ InstrumentationKey = '<ikey>' }.
  • Если требуется один ресурс для всех приложений на компьютере, используйте -ConnectionString или -InstrumentationKey вместо этого.
Start-ApplicationInsightsMonitoringTrace

Собирает события трассировки событий Windows (ETW), которые создает среда выполнения подключения без кода. Используйте этот командлет в качестве более простой альтернативы запуску PerfView.

События печатаются на консоль в реальном времени и записываются в файл .etl. Вы можете открыть файл .etl с помощью PerfView для более глубокого анализа.

Этот командлет выполняется до тех пор, пока не достигнет времени ожидания (по умолчанию — 5 минут) или пока вы его не остановите вручную Ctrl + C.

Примеры
Как собирать события

Используйте этот поток, если необходимо изучить, почему приложение IIS не инструментируется.

Среда выполнения подключения без кода выдает события ETW при запуске IIS и при запуске приложения.

  1. В командной строке администратора выполните команду iisreset /stop, чтобы остановить IIS и все веб-приложения.
  2. Начните трассировку, выполнив этот командлет.
  3. В командной строке с правами администратора выполните iisreset /start для запуска IIS.
  4. Активируйте запуск, перейдя в приложение.
  5. После завершения загрузки приложения нажмите Ctrl + C , чтобы остановить или разрешить время ожидания завершения сеанса.
Какие события собирать

Вы можете выбрать, какие источники событий следует включить:

  1. -CollectSdkEvents собирает события из пакета SDK Application Insights.
  2. -CollectRedfieldEvents собирает события из агента Application Insights и среды выполнения Redfield, что полезно для диагностики запуска IIS и приложений.
  3. Укажите оба переключателя, чтобы собрать оба набора.
  4. Если параметр не указан, оба набора собираются по умолчанию.
Параметры
Параметр Description
-MaxDurationInMinutes (Максимальная продолжительность в минутах) Необязательно. Задает время сбора до истечения времени ожидания. Значение по умолчанию — 5 минут.
-LogDirectory Необязательно. Каталог, в который должен быть записан файл .etl. По умолчанию файл создается в каталоге PowerShell модуля. Полный путь отображается при запуске сеанса.
Сбор событий SDK Необязательно. Включите события пакета SDK Application Insights.
-CollectRedfieldEvents Необязательно. Включите события из агента Application Insights и среды выполнения Redfield.
-Многословный Общий параметр. Выводит подробные журналы.

Выходные данные

Пример журналов запуска приложений
Start-ApplicationInsightsMonitoringTrace -CollectRedfieldEvents
Starting...
Log File: C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\logs\20190627_144217_ApplicationInsights_ETW_Trace.etl
Tracing enabled, waiting for events.
Tracing will timeout in 5 minutes. Press CTRL+C to cancel.
2:42:31 PM EVENT: Microsoft-ApplicationInsights-IIS-ManagedHttpModuleHelper Trace Resolved variables to: MicrosoftAppInsights_ManagedHttpModulePath='C:\Program Files\WindowsPowerShell\Modules\Az.ApplicationMonitor\content\Runtime\Microsoft.ApplicationInsights.RedfieldIISModule.dll', MicrosoftAppInsights_ManagedHttpModuleType='Microsoft.ApplicationInsights.RedfieldIISModule.RedfieldIISModule'
2:42:31 PM EVENT: Microsoft-ApplicationInsights-IIS-ManagedHttpModuleHelper Trace Resolved variables to: MicrosoftDiagnosticServices_ManagedHttpModulePath2='', MicrosoftDiagnosticServices_ManagedHttpModuleType2=''
2:42:31 PM EVENT: Microsoft-ApplicationInsights-IIS-ManagedHttpModuleHelper Trace Environment variable 'MicrosoftDiagnosticServices_ManagedHttpModulePath2' or 'MicrosoftDiagnosticServices_ManagedHttpModuleType2' is null, skipping managed dll loading

Развертывание агента Application Insights для виртуальных машин и масштабируемых наборов виртуальных машин

В этом разделе

Включите мониторинг Azure MonitorApplication Insights с помощью автоинструментария для приложений ASP.NET и ASP.NET Core, размещённых на виртуальных машинах Azure и в наборах масштабируемых виртуальных машин Azure.

Разверните агент Application Insights с помощью расширения виртуальной машины. Агент автоматически передает те же сигналы зависимостей, что и пакет SDK. Используйте PowerShell для автоматизации крупномасштабных развертываний.

Замечание

  • Для приложений Java используйте агент Application Insights Java 3.0, который автоматически собирает данные о наиболее популярных библиотеках, платформах, журналах и зависимостях, а также о многих других конфигурациях.
  • Node.js и Python приложения, работающие на виртуальных машинах Azure и Azure Virtual Machine Scale Sets не поддерживают автоинструментацию. Вместо этого используйте Azure Monitor OpenTelemetry Distro.
  • Сведения о мониторинге гостей виртуальных машин в дополнение к приложениям, размещенным на них, см. в разделе гостевых данных виртуальной машины.

Полный список поддерживаемых сценариев автоинструментации см. в статье "Поддерживаемые среды", "Языки" и поставщики ресурсов.

Включение мониторинга для виртуальных машин

Портал Azure или PowerShell можно использовать для включения мониторинга виртуальных машин.

Вариант 1. Портал Azure
  1. На портале Azure перейдите к ресурсу Application Insights. Скопируйте строку подключения в буфер обмена.

    Скриншот, содержащий connection string.

  2. Перейдите на виртуальную машину. В разделе Параметры в меню слева выберите Расширения и приложения>Добавить.

    Снимок экрана: панель

  3. Выберите агент Application Insights>Далее.

    Снимок экрана: панель

  4. Вставьте connection string, скопированные на шаге 1, и выберите Review + create.

    Снимок экрана: вкладка

Вариант 2. PowerShell

Замечание

Вы новичок в PowerShell? Ознакомьтесь с Руководством по началу работы.

Установите или обновите агент Application Insights в качестве расширения для виртуальных машин Azure.

# define variables to match your environment before running
$ResourceGroup = "<myVmResourceGroup>"
$VMName = "<myVmName>"
$Location = "<myVmLocation>"
$ConnectionString = "<myAppInsightsResourceConnectionString>"

$publicCfgJsonString = @"
{
    "redfieldConfiguration": {
        "instrumentationKeyMap": {
        "filters": [
            {
            "appFilter": ".*",
            "machineFilter": ".*",
            "virtualPathFilter": ".*",
            "instrumentationSettings" : {
                "connectionString": "$ConnectionString"
            }
            }
        ]
        }
    }
    }
"@

$privateCfgJsonString = '{}'
    
Set-AzVMExtension -ResourceGroupName $ResourceGroup -VMName $VMName -Location $Location -Name "ApplicationMonitoringWindows" -Publisher "Microsoft.Azure.Diagnostics" -Type "ApplicationMonitoringWindows" -Version "2.8" -SettingString $publicCfgJsonString -ProtectedSettingString $privateCfgJsonString

Замечание

Для более сложных развертываний в масштабе можно использовать цикл PowerShell для установки или обновления расширения агента Application Insights на нескольких виртуальных машинах.

Запрос состояния расширения агента Application Insights для Azure виртуальных машин:

Get-AzVMExtension -ResourceGroupName "<myVmResourceGroup>" -VMName "<myVmName>" -Name ApplicationMonitoringWindows -Status

Получите список установленных расширений для виртуальных машин Azure:

Get-AzResource -ResourceId "/subscriptions/<mySubscriptionId>/resourceGroups/<myVmResourceGroup>/providers/Microsoft.Compute/virtualMachines/<myVmName>/extensions"

Удалите расширение агента Application Insights из Azure виртуальных машин:

Remove-AzVMExtension -ResourceGroupName "<myVmResourceGroup>" -VMName "<myVmName>" -Name "ApplicationMonitoring"

Замечание

Проверьте установку, выбрав Live Metrics Stream в ресурсе Application Insights, связанном со строкой подключения, используемой для развертывания расширения агента Application Insights. Если вы отправляете данные из нескольких виртуальных машин, выберите целевые виртуальные машины Azure под Server Name. Для начала потока данных может потребоваться до минуты.

КартаКлючейИнструментации (настройки расширения)

Это важно

Расширенная функция маршрутизации InstrumentationKeyMap сопоставляет приложения Internet Information Services (IIS) на одной машине с ресурсами Application Insights. Эта функция применяется к приложениям ASP.NET и ASP.NET Core, размещенным в IIS, которые агент Application Insights автоматически инструментирует.

Как работает сопоставление

  • Карта определяет упорядоченный список правил с именем filters. Первое правило сопоставления вступает в силу. Сначала поставьте конкретные правила и завершите добавлением универсального правила.
  • Каждое правило может назначать другой ресурс Application Insights соответствующим приложениям. Предпочтительно использовать строки подключения в поддерживаемых случаях, так как инструментальные ключи являются устаревшими.

Доступные фильтры

  • MachineFilter или machineFilter: регулярное выражение C#, соответствующее имени компьютера или виртуальной машины. .* соответствует всем именам.
  • AppFilter или appFilter: регулярное выражение C#, соответствующее имени сайта IIS (HostingEnvironment.SiteName). Этот фильтр требуется, если не указаны VirtualPathFilter или virtualPathFilter.
  • VirtualPathFilter или virtualPathFilter: регулярное выражение C#, соответствующее виртуальному пути IIS (HostingEnvironment.ApplicationVirtualPath). Используйте этот фильтр, чтобы нацелиться на одно приложение в рамках сайта.

Сопоставление терминологии

  • Командлеты PowerShell используют MachineFilter, AppFilter и VirtualPathFilter.
  • Azure VM и JSON расширений Virtual Machine Scale Sets используют machineFilter, appFilter и virtualPathFilter, и задается ресурс через instrumentationSettings.

Подсказка

Включите окончательное правило, соответствующее всем приложениям, например .*, и примените ресурс по умолчанию, чтобы сделать поведение явным.

Где применяется расширение для виртуальных машин и наборов масштабируемости виртуальных машин

Поместите карту в redfieldConfiguration.instrumentationKeyMap.filters в общедоступных параметрах расширения (-SettingString для виртуальных машин, -Setting для Virtual Machine Scale Sets). Имена свойств записываются в стиле lower camel case. Задайте целевой ресурс по правилу с помощью instrumentationSettings.connectionString.

{
  "redfieldConfiguration": {
    "instrumentationKeyMap": {
      "filters": [
        {
          "machineFilter": ".*",
          "appFilter": ".*",
          "instrumentationSettings": {
            "connectionString": "<your-APPLICATIONINSIGHTS_CONNECTION_STRING>"
          }
        }
      ]
    }
  }
}

Включение мониторинга для масштабируемых наборов виртуальных машин

Портал Azure или PowerShell можно использовать для мониторинга масштабируемых наборов виртуальных машин.

Вариант 1. Портал Azure

Следуйте предыдущим шагам для виртуальных машин, но вместо этого перейдите к вашим наборам масштабирования виртуальных машин.

Вариант 2. PowerShell

Установите или обновите агент Application Insights в качестве расширения для масштабируемых наборов виртуальных машин:

# Set resource group, vmss name, and connection string to reflect your environment
$ResourceGroup = "<myVmResourceGroup>"
$VMSSName = "<myVmName>"
$ConnectionString = "<myAppInsightsResourceConnectionString>"
$publicCfgHashtable =
@{
  "redfieldConfiguration"= @{
    "instrumentationKeyMap"= @{
      "filters"= @(
        @{
          "appFilter"= ".*";
          "machineFilter"= ".*";
          "virtualPathFilter"= ".*";
          "instrumentationSettings" = @{
            "connectionString"= "$ConnectionString"
          }
        }
      )
    }
  }
};
$privateCfgHashtable = @{};
$vmss = Get-AzVmss -ResourceGroupName $ResourceGroup -VMScaleSetName $VMSSName
Add-AzVmssExtension -VirtualMachineScaleSet $vmss -Name "ApplicationMonitoringWindows" -Publisher "Microsoft.Azure.Diagnostics" -Type "ApplicationMonitoringWindows" -TypeHandlerVersion "2.8" -Setting $publicCfgHashtable -ProtectedSetting $privateCfgHashtable
Update-AzVmss -ResourceGroupName $vmss.ResourceGroupName -Name $vmss
# Note: Depending on your update policy, you might need to run Update-AzVmssInstance for each instance

Получите список установленных расширений для масштабируемых наборов виртуальных машин:

Get-AzResource -ResourceId "/subscriptions/<mySubscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/<myVmssName>/extensions"

Удалите расширение мониторинга приложений из масштабируемых наборов виртуальных машин:

# set resource group and vmss name to reflect your environment
$vmss = Get-AzVmss -ResourceGroupName "<myResourceGroup>" -VMScaleSetName "<myVmssName>"
Remove-AzVmssExtension -VirtualMachineScaleSet $vmss -Name "ApplicationMonitoringWindows"
Update-AzVmss -ResourceGroupName $vmss.ResourceGroupName -Name $vmss.Name -VirtualMachineScaleSet $vmss
# Note: Depending on your update policy, you might need to run Update-AzVmssInstance for each instance

Устранение неполадок

Инструкции по устранению неполадок см. в разделе "Проблемы" при развертывании расширения агента мониторинга Application Insights для виртуальных машин и масштабируемых наборов виртуальных машин.

Убедитесь, что "Application Insights" получает данные телеметрии

ASP.NET & ASP.NET Core

Запустите приложение и выполните запросы к нему. Теперь данные телеметрии должны передаваться в Application Insights. Пакет SDK для Application Insights автоматически собирает входящие веб-запросы в приложение, а также следующие данные телеметрии.

Служба рабочего процесса

Запустите приложение. Работники из всех предыдущих примеров делают HTTP-вызов каждую секунду на bing.com, а также записывают несколько логов с помощью ILogger. Эти строки упаковываются внутри StartOperation вызова TelemetryClient, который используется для создания операции. В этом примере RequestTelemetry именуется "операция".

Application Insights собирает эти логи ILogger с уровнем серьезности "Предупреждение" или выше по умолчанию, а также информацию о зависимостях. Они коррелируются RequestTelemetry в родительско-дочернем отношении. Корреляция также работает по границам процесса или сети. Например, если вызов был выполнен в другой мониторируемый компонент, он также коррелируется с этим родителем.

Эта настраиваемая операция RequestTelemetry может рассматриваться как эквивалент входящего веб-запроса в типичном веб-приложении. Не обязательно использовать операцию, но она лучше всего подходит для модели данных корреляции Application Insights. RequestTelemetry действует как родительская операция, и каждая телеметрия, созданная внутри итерации рабочего процесса, рассматривается как логическая принадлежность к той же операции.

Этот подход также гарантирует, что данные телеметрии, созданные автоматически и вручную, имеют одинаковые operation_idзначения. Так как выборка основана operation_id, алгоритм выборки либо сохраняет, либо удаляет все данные телеметрии из одной итерации.

Сбор данных телеметрии

В этом разделе

Онлайн метрики

Динамические метрики можно использовать для быстрого проверки правильности настройки мониторинга приложений с помощью Application Insights. Данные телеметрии могут занять несколько минут, чтобы появиться на портале Azure, но в области динамических метрик показано использование ЦП выполняющегося процесса практически в режиме реального времени. Она также может отображать другие данные телеметрии, такие как запросы, зависимости и трассировки.

Замечание

Динамические метрики включены по умолчанию при его подключении с помощью рекомендуемых инструкций для приложений .NET.

Начало работы

  1. Включите живые метрики с помощью SDK Application Insights, выполнив рекомендации по конкретному языку.

    • ASP.NET: включен по умолчанию, но также можно включить вручную с помощью кода.
    • ASP.NET Core: включен по умолчанию, но также можно включить вручную с помощью кода.
    • .NET/.NET Core Console/Worker: включен по умолчанию.
  2. Откройте ресурс Application Insights для приложения на портале Azure. Выберите динамические метрики, которые перечислены в разделе "Исследование " в меню слева.

  3. Защитите канал управления, включив проверку подлинности Microsoft Entra при использовании пользовательских фильтров.

Поддерживаемые функции
Language Базовые метрики Метрики производительности Настраиваемая фильтрация Пример данных телеметрии Разделение ЦП по процессам
платформа .NET Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS)
.NET Core (target=.NET Framework) Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS) Поддерживается (LTS)
.NET Core (цель=.NET Core) Поддерживается (LTS) Supported* Поддерживается (LTS) Поддерживается (LTS) Не поддерживаются

К базовым метрикам относится количество запросов, зависимостей и исключений. К метрикам производительности (счетчикам производительности) относятся память и ЦП. Пример данных телеметрии демонстрирует поток подробных сведений о неудачных запросах и зависимостях, исключениях, событиях и трассировках.

Поддержка PerfCounters немного зависит от версий .NET Core, которые не предназначены для платформы .NET Framework:

  • Метрики PerfCounters поддерживаются при запуске в Azure App Service для Windows ASP.NET Core (пакет SDK версии 2.4.1 или более поздней версии).
  • PerfCounters поддерживаются при запуске приложения на любой машине с Windows для приложений, нацеленных на .NET Core LTS или более позднюю версию.
  • PerfCounters поддерживаются при запуске приложения где угодно (например, Linux, Windows, служба приложений для Linux или контейнеры), но только для приложений, ориентированных на .NET Core LTS или более позднюю версию.

Включение динамических метрик с помощью кода для любого приложения .NET

ASP.NET

Чтобы настроить динамические метрики вручную, выполните приведенные действия.

  1. Установите пакет NuGet Microsoft.ApplicationInsights.PerfCounterCollector.

  2. В следующем примере кода консольного приложения показана настройка динамических метрик:

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.ConnectionString = "<YOUR-CONNECTION-STRING>";
            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>";
            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();
            }
        }
    }
}
ASP.NET Core

Чтобы настроить динамические метрики вручную, выполните приведенные действия.

  1. Установите пакет NuGet Microsoft.ApplicationInsights.PerfCounterCollector.

  2. В следующем примере кода консольного приложения показана настройка динамических метрик:

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse;

// Create a TelemetryConfiguration instance.
TelemetryConfiguration config = TelemetryConfiguration.CreateDefault();
config.ConnectionString = "<YOUR-CONNECTION-STRING>";
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>";
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();
}

Приведенный выше пример предназначен для консольного приложения, но тот же код можно использовать в любых .NET приложениях.

Это важно

Если для автоматического сбора данных включены другие модули телеметрии, убедитесь, что та же конфигурация, используемая для инициализации этих модулей, используется для модуля оперативно собираемых метрик.

Замечание

Конфигурация по умолчанию собирает журналы ILoggerWarning и журналы с более важными сведениями. Дополнительные сведения см. в разделе Как настроить сбор журналов ILogger?.

Служба рабочего процесса

Журналы, создаваемые с помощью ILogger, с уровнем серьезности "Предупреждение" или выше, автоматически фиксируются. Чтобы изменить это поведение, явно переопределите конфигурацию ведения журнала для поставщика ApplicationInsights, как показано в следующем коде. Следующая конфигурация позволяет Application Insights собирать все Information журналы и более критические журналы.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Важно отметить, что в следующем примере поставщик Application Insights не будет собирать журналы Information. Он не записывает его, так как пакет SDK добавляет фильтр ведения журнала по умолчанию, который предписывает ApplicationInsights записывать только Warning журналы и более серьезные журналы. Application Insights требует явного переопределения.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  }
}

Замечание

Application Insights учитывает уровни журналов, настроенные с помощью ConfigureLogging(...) в коде. Если используется только appsettings.json, а ConfigureLogging не переопределяется явно, уровень журнала по умолчанию — Предупреждение.

Дополнительные сведения см. в документации ILogger , чтобы настроить уровни логирования, которые фиксируются в Application Insights.

Трассировка (журнал)

В этом разделе объясняется, как отправлять журналы трассировки диагностики из ASP.NET или ASP.NET Core приложений в Application Insights, а затем изучить и искать эти журналы на портале.

Журналы трассировки можно использовать для идентификации трассировок, связанных с каждым запросом пользователя, и сопоставлять их с другими событиями и отчетами об исключениях.

Application Insights записывает журналы из ASP.NET Core и других приложений .NET через ILogger и из классических ASP.NET (.NET Framework) с помощью классического пакета SDK и адаптеров.

Замечание

  • По умолчанию, поставщик Application Insights отправляет только журналы с уровнем серьезности Warning или выше. Чтобы включить Information или более низкий уровень журналов, обновите параметры уровня журнала в appsettings.json.

  • Пакет Microsoft.ApplicationInsights.WorkerService NuGet, используемый для включения Application Insights для фоновых служб, не входит в рамки охвата.

  • Чтобы просмотреть часто задаваемые вопросы (FAQ), см. Logging с .NET FAQ.

Установка ведения журнала в приложении

ASP.NET

Выберите подход к ведению журнала для генерации диагностических записей, которые может собирать Application Insights.

Для классических приложений ASP.NET, использующих трассировку System.Diagnostics, настройте Application Insights TraceListener в конфигурации.

Добавьте прослушиватель к web.config или app.config.

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

Замечание

Модуль записи журналов — это полезный адаптер для сторонних средств ведения журнала. Однако если вы еще не используете NLog, log4Net или System.Diagnostics.Traceрассмотрите возможность вызова Application Insights TrackTrace() напрямую.

Настройка Application Insights для сбора журналов

Вариант 1. Добавьте Application Insights в проект, если это еще не сделано. При добавлении Application Insights в Visual Studio есть возможность включить сборщик журналов.

Option 2: Щелкните правой кнопкой мыши на вашем проекте в Solution Explorer, чтобы настроить Application Insights. Выберите параметр "Настройка коллекции трассировки ".

Замечание

Если у вас отсутствуют меню Application Insights или параметр сборщика журналов, обратитесь к выделенной статье по устранению неполадок.

ASP.NET Core

Пакет SDK Application Insights для ASP.NET Core уже собирает журналы ILogger по умолчанию. Если вы используете пакет SDK, вам обычно не нужно также вызывать builder.Logging.AddApplicationInsights() и можно проигнорировать последующие инструкции по установке ILogger.

Если требуется только перенаправление журналов, а не полный стек телеметрии, можно использовать пакет провайдера Microsoft.Extensions.Logging.ApplicationInsights для сбора журналов.

Установка вручную

Используйте этот метод, если тип проекта не поддерживается установщиком Application Insights (например, некоторыми сценариями настольных компьютеров и консоли) или если вы предпочитаете явный элемент управления на уровне пакета.

  1. В Обозреватель решений щелкните правой кнопкой мыши на вашем проекте и выберите Управление пакетами NuGet.

  2. Найдите Application Insights.

  3. Выберите один из следующих пакетов:

Пакет NuGet устанавливает необходимые сборки и изменяет web.config или app.config, если применимо.

Инструкции по установке:

Замечание

Разверните любой из приведенных ниже разделов для инструкций по установке для конкретного пакета.


ILogger
  1. Установите Microsoft.Extensions.Logging.ApplicationInsights.

  2. Добавить 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();

После установки пакета NuGet и регистрации поставщика в контексте внедрения зависимостей приложение готово к ведению журналов. С инъекцией конструктора требуется либо ILogger, либо альтернатива ILogger<TCategoryName> для универсального типа. ApplicationInsightsLoggerProvider предоставляет их при разрешении этих реализаций. Зарегистрированные сообщения или исключения отправляются в Application Insights.

Рассмотрим следующий пример контроллера:

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

Дополнительные сведения см. в разделе Logging в ASP.NET Core и Какой тип телеметрии создается в Application Insights из журналов ILogger? Где можно увидеть журналы ILogger в Application Insights?.

Вставка вызовов журнала диагностики (System.Diagnostics.Trace / log4net / NLog)

Если используется System.Diagnostics.Trace, типичный вызов будет следующим:

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

Если вы предпочитаете log4net или NLog, используйте:

    logger.Warn("Slow response - database01");
Использование событий EventSource

События System.Diagnostics.Tracing.EventSource можно настроить для отправки в Application Insights в виде трассировок.

  1. Установите пакет NuGet Microsoft.ApplicationInsights.EventSourceListener.

  2. Измените TelemetryModules раздел файлаApplicationInsights.config :

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

Для каждого источника можно задать следующие параметры:

  • Имя указывает имя объекта EventSource для сбора.
  • Уровень указывает уровень ведения журнала для сбора: Критический, Ошибка, Информационный, LogAlways, Подробный, или Предупреждение.
  • Ключевые слова (необязательно) указывают целочисленное значение сочетаний ключевых слов для использования.
Использование событий DiagnosticSource

События System.Diagnostics.DiagnosticSource можно настроить для отправки в Application Insights в качестве трассировок.

  1. Установите пакет NuGet Microsoft.ApplicationInsights.DiagnosticSourceListener.

  2. Измените TelemetryModules раздел файлаApplicationInsights.config :

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

Для каждого источника диагностики, который требуется трассировать, добавьте запись с атрибутом Name , заданным для имени источника диагностики.

Использование событий ETW

Можно настроить события трассировки для Windows (ETW) так, чтобы они отправлялись в Application Insights в виде следов.

  1. Установите пакет NuGet Microsoft.ApplicationInsights.EtwCollector.

  2. Измените раздел "TelemetryModules" файла ApplicationInsights.config :

Замечание

События ETW можно собирать только в том случае, если процесс, в котором размещен SDK, выполняется от имени участника группы Пользователи журнала производительности или Администраторы.

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

Для каждого источника можно задать следующие параметры:

  • ProviderName — это имя поставщика ETW для сбора.
  • ProviderGuid указывает GUID поставщика ETW для сбора. Его можно использовать вместо ProviderName.
  • Уровень задает уровень ведения журнала для сбора. Это может быть Критическое, Ошибка, Информационная, LogAlways, Verbose или Предупреждение.
  • Ключевые слова (необязательно) задают целочисленное значение сочетаний ключевых слов для использования.
Использование API трассировки напрямую

Trace API Application Insights можно вызывать непосредственно. Адаптеры ведения журнала используют этот API. Рассмотрим пример.

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

Преимущество TrackTrace заключается в том, что в сообщении можно поместить относительно длинные данные. Например, можно закодировать данные POST там.

Вы также можете добавить уровень серьезности в сообщение. И, как и другие данные телеметрии, можно добавить значения свойств для фильтрации или поиска различных наборов трассировок. Рассмотрим пример.

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

Теперь вы можете легко отфильтровать все сообщения определенного уровня серьезности, относящиеся к определенной базе данных.

Консольное приложение

Чтобы добавить ведение журнала Application Insights в консольные приложения, сначала установите следующие пакеты NuGet:

В следующем примере используется Microsoft.Extensions.Logging.ApplicationInsights пакет и демонстрируется поведение по умолчанию для консольного приложения. Пакет Microsoft.Extensions.Logging.ApplicationInsights следует использовать в консольном приложении или всякий раз, когда требуется минимальная реализация Application Insights без полного набора функций, таких как метрики, распределенные трассировки, выборки и инициализаторы телеметрии.

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

Для получения дополнительной информации см. какой тип телеметрии Application Insights создается из логов ILogger и где можно увидеть логи ILogger в Application Insights?.

Области ведения журнала

Замечание

Следующее руководство относится к сценариям ILogger (только ASP.NET Core и консоли). Это не относится к классической версии ASP.NET.

ApplicationInsightsLoggingProvider поддерживает области журналов, которые включены по умолчанию.

Если область имеет тип IReadOnlyCollection<KeyValuePair<string,object>>, каждая пара "ключ-значение" в коллекции добавляется в телеметрию Application Insights в качестве настраиваемых свойств. В следующем примере журналы фиксируются как TraceTelemetry и включают ("MyKey", "MyValue") в свойствах.

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

Если в качестве области используется иной тип, он сохраняется в свойстве Scope в телеметрии Application Insights. В следующем примере TraceTelemetry имеет свойство Scope, которое содержит область.

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

Найдите ваши журналы

Запустите приложение в режиме отладки или разверните его в реальном времени.

В области обзора приложения на портале Application Insights выберите "Поиск ", где можно:

  • Фильтрация по трассировкам журнала или элементам с определенными свойствами.
  • Подробно проверьте определенный элемент.
  • Найдите другие данные журнала системы, относящиеся к тому же запросу пользователя (имеет тот же идентификатор операции).
  • Сохраните конфигурацию страницы в качестве избранного.

Замечание

Если ваше приложение отправляет большие объемы данных и вы используете пакет SDK Application Insights для ASP.NET версии 2.0.0-beta3 или более поздней, функция адаптивной выборки может работать и отправлять только часть телеметрии. Дополнительные сведения о выборке.

Просмотр журналов Azure Monitor

Журналы ILogger отображаются как данные телеметрии трассировки (таблица traces в Application Insights и AppTraces в Log Analytics).

Пример

На портале Azure перейдите в Application Insights и выполните следующую команду:

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

Распределенная трассировка

Современные архитектуры облачных и микрослужб включили простые, независимо развертываемые службы, которые сокращают затраты при увеличении доступности и пропускной способности. Тем не менее, это сделало всю систему более сложной для понимания и отладки. Распределенная трассировка решает эту проблему, предоставляя профилировщик производительности, который работает как стеки вызовов для облачных и микросервисных архитектур.

Azure Monitor предоставляет два опыта использования распределенных данных трассировки: диагностики транзакции для одной транзакции или запроса, а также карты приложений, чтобы показать взаимодействие систем.

Application Insights может отслеживать каждый компонент отдельно и обнаруживать, какой компонент отвечает за сбои или снижение производительности с помощью корреляции распределенной телеметрии. В этой статье объясняется модель данных, методы распространения контекста, протоколы и реализация тактики корреляции на разных языках и платформах, используемых Application Insights.

Включите распределённую трассировку через Application Insights с помощью автоинструментирования или пакетов SDK.

Агенты Application Insights и пакеты SDK для .NET, .NET Core, Java, Node.jsи JavaScript поддерживают собственную распределенную трассировку.

Если SDK Application Insights установлено и настроено правильно, то данные трассировки автоматически собираются для популярных фреймворков, библиотек и технологий с помощью автоматических сборщиков зависимостей SDK. Полный список поддерживаемых технологий доступен в документации по автоколлекции зависимостей.

Любые технологии также можно отслеживать вручную с помощью вызова TrackDependency в TelemetryClient.

Модель данных для корреляции телеметрии

Application Insights определяет модель данных для корреляции распределенной телеметрии. Для связывания телеметрии с логической операцией каждый элемент телеметрии имеет поле operation_Idконтекста. Каждый элемент телеметрии в распределенной трассировке использует этот идентификатор. Таким образом, даже если вы теряете данные телеметрии из одного слоя, вы по-прежнему можете связать данные телеметрии, сообщаемые другими компонентами.

Распределенная логическая операция обычно состоит из набора небольших операций, обрабатываемых одним из компонентов. Запрос телеметрии определяет эти операции. Каждый элемент телеметрии запроса имеет свой собственный id идентификатор, определяющий его уникально и глобально. И все элементы телеметрии (например, трассировки и исключения), связанные с запросом, должны установить operation_parentId в значение запроса id.

Телеметрия зависимостей представляет каждую исходящую операцию, например вызов HTTP к другому компоненту. Он также определяет свой собственный id, который глобально уникален. Запрос телеметрии, инициированный этим вызовом зависимости, использует это id в качестве operation_parentId.

Вы можете создать представление распределенной логической операции с помощью operation_Id, operation_parentId, request.id и dependency.id. Эти поля также определяют причинно-следственный порядок вызовов телеметрии.

В среде микрослужб трассировки из компонентов могут направляться в разные элементы хранилища. Каждый компонент может иметь собственную строку подключения в Application Insights. Чтобы получить данные телеметрии для логической операции, Application Insights запрашивает данные из каждого элемента хранилища.

Если количество элементов хранилища большое, вам потребуется указание о том, где искать дальше. Модель данных Application Insights определяет два поля для решения этой проблемы: request.source и dependency.target. Первое поле определяет компонент, инициирующий запрос зависимостей. Второе поле определяет, какой компонент вернул ответ вызова зависимостей.

Сведения о запросах из нескольких разных экземпляров см. в разделе Query Log Analytics в рабочих областях, приложениях и ресурсах в Azure Monitor.

Пример

Рассмотрим пример. Приложение под названием "Цены акций" показывает текущую рыночную цену акций с помощью внешнего API с именем Stock. Приложение "Цены на акции" имеет страницу с именем "Фондовая страница", которая открывается в веб-браузере клиента с помощью GET /Home/Stock. Приложение запрашивает API stock с помощью http-вызова GET /api/stock/value.

Чтобы проанализировать полученную телеметрию, выполните запрос:

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

В результатах все элементы телеметрии имеют общий корень operation_Id. При вызове Ajax на странице новый уникальный идентификатор (qJSXU) назначается телеметрии зависимостей, а идентификатор pageView используется как operation_ParentId. Затем запрос сервера использует идентификатор Ajax в качестве operation_ParentId.

Тип элемента имя Идентификатор operation_ParentId идентификатор_операции
pageView Страница фондового рынка STYz STYz
зависимость GET /Home/Stock qJSXU STYz STYz
request GET Главная/Запасы KqKwlrSt9PA= qJSXU STYz
зависимость GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

При вызове GET /api/stock/value внешней службы необходимо знать идентификацию сервера, чтобы можно было соответствующим образом установить поле dependency.target. Если внешняя служба не поддерживает мониторинг, target устанавливается в имя узла службы. Примером является stock-prices-api.com. Но если служба идентифицирует себя путем возврата предопределенного заголовка HTTP, target содержит удостоверение службы, позволяющее Application Insights создавать распределенную трассировку путем запроса телеметрии из этой службы.

Заголовки корреляции с помощью W3C TraceContext

Application Insights переходит в контекст трассировки W3C, который определяет:

  • traceparent: содержит глобальный уникальный идентификатор операции и уникальный идентификатор вызова.
  • tracestate: содержит контекст трассировки для конкретной системы.

Последняя версия пакета SDK Application Insights поддерживает протокол Trace-Context, но может потребоваться принять его. (Поддерживается обратная совместимость с предыдущим протоколом корреляции, поддерживаемым пакетом SDK Application Insights.)

Протокол HTTP корреляции, также называемый Request-Id, устарел. Этот протокол определяет два заголовка:

  • Request-Id: несет глобально уникальный идентификатор вызова.
  • Correlation-Context: содержит коллекцию пар "имя-значение" свойств распределенной трассировки.

Application Insights также определяет расширение для протокола HTTP корреляции. Он использует Request-Context пары "имя-значение" для распространения коллекции свойств, используемых непосредственным вызывающим или вызываемой стороной. Пакет SDK Application Insights использует этот заголовок для задания полей dependency.target и request.source.

Модели данных W3C Trace-Context и Application Insights сопоставляются следующим образом:

Application Insights W3C TraceContext
Id и RequestDependency parent-id
Operation_Id trace-id
Operation_ParentId родительский идентификатор родительского диапазона этого диапазона. Это поле должно быть пустым, если это корневой диапазон.

Дополнительные сведения см. в модели данных телеметрии Application Insights.

Включение поддержки распределенной трассировки W3C

Распределенная трассировка на основе W3C TraceContext включена по умолчанию во всех последних версиях SDK для .NET Framework и .NET Core и с поддержкой обратной совместимости с устаревшим протоколом Request-Id.

Корреляция данных телеметрии

Корреляция обрабатывается по умолчанию при подключении приложения. Никаких специальных действий не требуется.

среда выполнения .NET поддерживает распределенную функциональность с помощью Activity и DiagnosticSource

Пакет SDK для Application Insights .NET использует DiagnosticSource и Activity для сбора и сопоставления данных телеметрии.

Зависимости

Автоматически отслеживаемые зависимости

Пакеты SDK Application Insights для .NET и .NET Core поставляются с DependencyTrackingTelemetryModule, модулем телеметрии, который автоматически собирает зависимости. Модуль DependencyTrackingTelemetryModule поставляется как пакет NuGet Microsoft.ApplicationInsights.DependencyCollector и автоматически добавляется при использовании Microsoft.ApplicationInsights.Web пакета NuGet или Microsoft.ApplicationInsights.AspNetCore пакета NuGet.

Сейчас DependencyTrackingTelemetryModule автоматически отслеживает следующие зависимости:

Зависимости Сведения
HTTP/HTTPS Локальные или удаленные вызовы HTTP/HTTPS.
Вызовы WCF Отслеживается автоматически только при использовании привязок на основе HTTP.
SQL Вызовы, выполненные с помощью SqlClient. Сбор данных об SQL-запросах описан в разделе Расширенное отслеживание SQL для получения полного SQL-запроса.
Azure Blob Storage, Azure Table Storage, или Azure Queue Storage Вызовы, выполненные с помощью клиента Azure Storage.
Azure Event Hubs клиентский пакет SDK Используйте последний пакет: https://nuget.org/packages/Azure.Messaging.EventHubs.
Azure Service Bus клиентский пакет SDK Используйте последний пакет: https://nuget.org/packages/Azure.Messaging.ServiceBus.
Azure Cosmos DB Автоматически отслеживается, если используется HTTP/HTTPS. Трассировка операций в прямом режиме с tcp автоматически фиксируется с помощью предварительного просмотра пакета >= 3.33.0-preview. Дополнительные сведения см. в документации.

Если данные о зависимости автоматически не собираются, вы можете вручную использовать вызов функции отслеживания зависимости.

Дополнительные сведения о том, как работает отслеживание зависимостей, см. в разделе "Отслеживание зависимостей" в Application Insights.

Как выполняется автоматическое отслеживание зависимостей?

  • Инструментирование байт-кода применяется в применении к выбранным методам с помощью InstrumentationEngine, включается через StatusMonitor или расширение Application Insights для Azure App Service.

  • Обратные вызовы EventSource используются для перехвата телеметрии из библиотек .NET, которые генерируют структурированные события.

  • DiagnosticSource обратные вызовы используются в более новых .NET и .NET Core SDK для сбора телеметрии из библиотек, поддерживающих распределенную трассировку.

Настройка автоматического отслеживания зависимостей в консольных приложениях

Чтобы автоматически отслеживать зависимости из консольных приложений .NET, установите пакет NuGet Microsoft.ApplicationInsights.DependencyCollector и инициализировать DependencyTrackingTelemetryModule:

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

Замечание

Для консольных приложений .NET Core TelemetryConfiguration.Active устарел.

Отслеживание зависимостей вручную

Примеры зависимостей, которые не обеспечивают автоматический сбор данных и требуют отслеживания вручную:

  • Azure Cosmos DB отслеживается автоматически, только если используется HTTP/HTTPS. Режим TCP не фиксируется автоматически в Application Insights для версий SDK старше 2.22.0-Beta1.
  • Redis

Если пакет SDK не собирает данные о зависимостях автоматически, вы можете отслеживать их вручную, используя API-интерфейс TrackDependency, применяемый стандартными модулями автоматического сбора.

Пример

Если при компиляции кода используется сборка, написанная не вами, вы можете засекать время всех ее вызовов. Этот сценарий позволит вам узнать, какой вклад он вносит в ваше время отклика.

Чтобы эти данные отображались в диаграммах зависимостей Application Insights, отправляйте их с использованием TrackDependency:


    var startTime = DateTime.UtcNow;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    try
    {
        // making dependency call
        success = dependency.Call();
    }
    finally
    {
        timer.Stop();
        telemetryClient.TrackDependency("myDependencyType", "myDependencyCall", "myDependencyData", startTime, timer.Elapsed, success);
    }

Помимо этого, TelemetryClient предоставляет методы расширения StartOperation и StopOperation, которые можно использовать для отслеживания зависимостей вручную, как показано в разделе Отслеживание исходящих зависимостей.

Отключение стандартного модуля отслеживания зависимостей

Дополнительные сведения см. в модулях телеметрии.

Расширенное отслеживание SQL для получения полного SQL-запроса

Для вызовов SQL всегда собирается и сохраняется имя сервера и базы данных как имя собранных данных DependencyTelemetry. Другое поле с именем data может содержать весь текст SQL-запроса.

Замечание

Azure Functions требует отдельных параметров для включения коллекции текста SQL. Дополнительные сведения см. в разделе "Включение сбора запросов SQL".

ASP.NET

Для приложений ASP.NET полный текст SQL-запроса собирается с помощью инструментирования байт-кода, что требует использования движка инструментирования или использования пакета NuGet Microsoft.Data.SqlClient вместо библиотеки System.Data.SqlClient. Действия, необходимые для включения сбора полного текста SQL-запросов на конкретных платформах, приведены в следующей таблице.

Platform Действия для получения полного SQL-запроса
Web Apps в Azure App Service На панели управления веб-приложения откройте область Application Insights и включите SQL команды в .NET.
IIS Server (Azure Virtual Machines, локальная среда и т. д.) Используйте пакет NuGet Microsoft.Data.SqlClient или модуль PowerShell агента Application Insights, чтобы установить механизм инструментирования и перезапустить IIS.
Azure Cloud Services Добавьте задачу запуска для установки StatusMonitor.
Приложение должно быть подключено к пакету SDK ApplicationInsights во время сборки, установив пакеты NuGet для ASP.NET или ASP.NET Core приложений.
IIS Express Используйте пакет NuGet Microsoft.Data.SqlClient.
Веб-задания в Azure App Service Используйте пакет NuGet Microsoft.Data.SqlClient.

В дополнение к описанным выше действиям для разных платформ необходимо явно включить сбор команд SQL, внеся в файл ApplicationInsights.config следующий код:

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

Для приложений ASP.NET Core необходимо выбрать коллекцию текста SQL с помощью:

services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, o) => { module. EnableSqlCommandTextInstrumentation = true; });

В приведенных выше случаях, чтобы надлежащим образом проверить установку подсистемы инструментирования, убедитесь, что собираемые данные DependencyTelemetry относятся к пакету SDK версии rddp. Использование rdddsd или rddf указывает, когда зависимости собираются через DiagnosticSource или EventSource обратные вызовы, поэтому полный SQL-запрос не сохраняется.

Exceptions

Исключения в веб-приложениях можно отправлять с помощью Application Insights. Вы можете сопоставить неудачные запросы с исключениями и другими событиями на клиенте и сервере, чтобы быстро диагностировать причины. В этом разделе вы узнаете, как настроить отчеты об исключениях, явным образом сообщать об исключениях, проводить диагностику сбоев и выполнять другие действия.

Настройка отчетов об исключениях

Application Insights можно настроить для создания отчетов об исключениях, происходящих на сервере или клиенте. В зависимости от платформы приложения требуется соответствующее расширение или пакет SDK.

Server-side

Чтобы получать сообщения об исключениях из вашего серверного приложения, рассмотрите следующие сценарии:

  • Добавьте расширение Application Insights для веб-приложений Azure.
  • Добавьте Application Monitoring Extension для виртуальных машин Azure и масштабируемых наборов виртуальных машин Azure с приложениями, размещенными в IIS.
  • Add the Application Insights SDK в код приложения, запустите агент Application Insights для веб-серверов IIS или включите агент Java для веб-приложений Java.
Client-side

Пакет SDK JavaScript предоставляет возможность создания отчетов на стороне клиента об исключениях, происходящих в веб-браузерах. Сведения о настройке отчетов об исключениях на клиенте см. в разделе Application Insights для веб-страниц.

Платформы приложений

При использовании некоторых платформ приложений требуется дополнительная конфигурация. Рассмотрим следующие технологии:

Это важно

Этот раздел посвящен .NET приложениям Framework с точки зрения примера кода. Некоторые методы, которые работают для платформы .NET Framework, устарели в пакете SDK .NET Core.

Диагностика сбоев и исключений

портал Azure

Application Insights поставляется с проверенным интерфейсом управления производительностью приложений для диагностики сбоев в отслеживаемых приложениях.

Подробные инструкции см. в статье "Исследование сбоев, производительности и транзакций с помощью Application Insights".

Visual Studio
  1. Откройте решение приложения в Visual Studio. Запустите приложение на сервере или на компьютере разработки с помощью F5. Повторно создайте исключение.

  2. Откройте окно поиска Application Insights телеметрии в Visual Studio. При отладке выберите раскрывающийся список Application Insights .

  3. Выберите отчет об исключении для отображения трассировки стека. Чтобы открыть соответствующий файл кода, выберите ссылку на строку в трассировке стека.

    Если CodeLens включен, отображаются данные об исключениях:

    Снимок экрана: уведомление CodeLens об исключениях.

Настраиваемые данные трассировки и логов

Чтобы получить диагностические данные, относящиеся к приложению, можно вставить код для отправки собственных данных телеметрии. Пользовательские данные телеметрии или журнала отображаются в диагностическом поиске вместе с запросами, представлением страниц и другими автоматически собранными данными.

Используя Microsoft.VisualStudio.ApplicationInsights.TelemetryClient, у вас есть несколько доступных API.

  • TelemetryClient.TrackEvent обычно используется для мониторинга шаблонов использования, но данные, которые он отправляет, также отображаются в разделе "Пользовательские события " в поиске диагностики. События именуются и могут содержать строковые свойства и числовые метрики, на которых можно фильтровать диагностические поиски.
  • TelemetryClient.TrackTrace позволяет отправлять более длинные данные, такие как сведения POST.
  • TelemetryClient.TrackException отправляет сведения об исключении, например, трассировки стека, в Application Insights.

Чтобы просмотреть эти события, в меню слева откройте "Поиск". Выберите в раскрывающемся меню Типы событий, а затем выберите Пользовательское событие, Трассировка или Исключение.

Снимок экрана: экран поиска.

Замечание

Если приложение создает большие объемы телеметрии, модуль адаптивной выборки автоматически уменьшает объем, отправленный на портал, отправляя только репрезентативную долю событий. События, которые являются частью той же операции, выбираются или удаляются в качестве группы, чтобы можно было перемещаться между связанными событиями. Дополнительные сведения см. в статье Выборка в Application Insights.

Просмотр данных запроса POST

Сведения о запросе не включают данные, отправленные вашему приложению через POST-запрос. Чтобы сообщить об этих данных, выполните указанные ниже действия.

  • Добавьте пакет SDK Application Insights в код приложения.
  • Вставьте код в приложение, чтобы вызвать Microsoft.ApplicationInsights.TrackTrace(). Отправьте данные POST в параметре сообщения. Существует ограничение на допустимый размер, поэтому следует попытаться отправить только необходимые данные.
  • При изучении неудачного запроса найдите связанные трассировки.

По умолчанию на портале отображаются не все исключения, которые вызывают сбои в приложении. Если вы используете пакет SDK JavaScript на веб-страницах, вы увидите исключения браузера. Однако большинство исключений на стороне сервера перехватываются службами IIS, поэтому необходимо добавить некоторый код для записи и отправки отчетов.

Вы можете:

  • Явно регистрируйте исключения, вставляя код в обработчики исключений для их отчета.
  • Перехватывайте исключения автоматически, настроив ASP.NET. Необходимые дополнения отличаются для различных типов платформы.
Явно сообщайте об исключениях

Самый простой способ отчета — вставить вызов trackException() в обработчик исключений.

C#
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);
}
JavaScript
try
{
    // ...
}
catch (ex)
{
    appInsights.trackException(ex, "handler loc",
    {
        Game: currentGame.Name,
        State: currentGame.State.ToString()
    });
}

Свойства и параметры измерений являются необязательными, но они полезны для фильтрации и добавления дополнительных сведений. Например, если у вас есть приложение, которое может выполнять несколько игр, можно найти отчеты об исключениях, связанные с определенной игрой. Вы можете добавить столько элементов, сколько нужно для каждого словаря.

Исключения браузера

Сообщается о большинстве исключений браузера.

Если веб-страница содержит файлы скриптов из сетей доставки содержимого или других доменов, убедитесь, что тег скрипта имеет атрибут crossorigin="anonymous" и что сервер отправляет заголовки CORS. Это поведение позволяет получить трассировку стека и подробные сведения об необработанных исключениях JavaScript из этих ресурсов.

Повторное использование клиента телеметрии

Замечание

Рекомендуется инициировать TelemetryClient один раз и использовать его повторно в течение всего жизненного цикла приложения.

При использовании Dependency Injection (DI) в .NET, соответствующего SDK для .NET и правильной настройки Application Insights для DI, вы можете указывать в качестве параметра конструктора.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

В предыдущем примере TelemetryClient внедряется в класс ExampleController.

Веб-формы

Для веб-форм модуль HTTP может собирать исключения, если не настроены перенаправления с помощью CustomErrors. Однако при наличии активных перенаправлений добавьте следующие строки в функцию Application_Error в Global.asax.cs.

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

В предыдущем примере _telemetryClient — это переменная класса типа TelemetryClient.

MVC

Начиная с веб-SDK версии Application Insights 2.6 (бета 3 и более поздних), Application Insights автоматически собирает необработанные исключения, возникающие в методах контроллеров MVC 5 и последующих версий. Если вы ранее добавили пользовательский обработчик для отслеживания таких исключений, его можно удалить, чтобы предотвратить двойное отслеживание исключений.

Существует несколько сценариев, когда фильтр исключений не может правильно обрабатывать ошибки при возникновении исключений:

  • Из конструкторов контроллеров
  • Из обработчиков сообщений
  • Во время маршрутизации
  • Во время сериализации содержимого ответа
  • Во время запуска приложения
  • В фоновых задачах

Все исключения, обрабатываемые приложением, по-прежнему должны отслеживаться вручную. Необработанные исключения, исходящие из контроллеров, обычно приводят к ответу "Внутренняя ошибка сервера" 500. Если такой ответ создается вручную в результате обработанного исключения или отсутствия исключения, он отслеживается в соответствующей телеметрии запроса со статусом ResultCode 500. Однако пакет SDK Application Insights не может отслеживать соответствующее исключение.

Поддержка предыдущих версий

Если вы используете MVC 4 (и более ранее) веб-пакета SDK Application Insights 2.5 (и выше), ознакомьтесь со следующими примерами для отслеживания исключений.


Разверните, чтобы просмотреть инструкции для предыдущих версий

Если конфигурация CustomErrors равна Off, исключения доступны для сбора HTTP модуля. Однако если задано значение RemoteOnly (по умолчанию) или On, исключение очищается и недоступно для автоматического сбора службой Application Insights. Это поведение можно исправить, переопределив класс System.Web.Mvc.HandleErrorAttribute и применив переопределенный класс, как показано для различных версий MVC (см. исходный код GitHub):

using System;
using System.Web.Mvc;
using Microsoft.ApplicationInsights;

namespace MVC2App.Controllers
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AiHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
            {
                //The attribute should track exceptions only when CustomErrors setting is On
                //if CustomErrors is Off, exceptions will be caught by AI HTTP Module
                if (filterContext.HttpContext.IsCustomErrorEnabled)
                {   //Or reuse instance (recommended!). See note above.
                    var ai = new TelemetryClient();
                    ai.TrackException(filterContext.Exception);
                }
            }
            base.OnException(filterContext);
        }
    }
}

MVC 2

Замените атрибут HandleError новым атрибутом в контроллерах:

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

Образец

MVC 3

Зарегистрируйтесь AiHandleErrorAttribute в качестве глобального фильтра в Global.asax.cs:

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

Образец

MVC 4, MVC 5

Зарегистрируйтесь AiHandleErrorAttribute в качестве глобального фильтра в FilterConfig.cs:

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

Образец

Веб-API

Начиная с веб-SDK версии Application Insights 2.6 (бета-версия 3 и более поздние), Application Insights автоматически собирает необработанные исключения, вызываемые в методах контроллера для веб-API 2+. Если вы ранее добавили пользовательский обработчик для отслеживания таких исключений, как описано в следующих примерах, его можно удалить, чтобы предотвратить двойное отслеживание исключений.

Существует несколько случаев, когда фильтры исключений не могут обрабатываться. Рассмотрим пример.

  • Исключения, брошенные конструкторами контроллеров.
  • Исключения, выбрасываемые обработчиками сообщений.
  • Исключения, создаваемые во время маршрутизации.
  • Исключения, генерируемые во время сериализации содержимого ответа.
  • Исключение, возникающее во время запуска приложения.
  • Исключение, возникающее в фоновых задачах.

Все исключения, обрабатываемые приложением, по-прежнему должны отслеживаться вручную. Необработанные исключения, исходящие из контроллеров, обычно приводят к ответу "Внутренняя ошибка сервера" 500. Если такой ответ вручную создается в результате обработанного исключения или при отсутствии исключения, он фиксируется в соответствующей телеметрии запроса с ResultCode 500. Однако пакет SDK Application Insights не может отслеживать соответствующее исключение.

Поддержка предыдущих версий

Если вы используете веб-API 1 (и более ранние версии) веб-пакета SDK Application Insights 2.5 (и более ранних версий), ознакомьтесь со следующими примерами для отслеживания исключений.


Разверните, чтобы просмотреть инструкции для предыдущих версий

Веб-API 1.x

Переопределить 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);
    }
    }
}

Вы можете добавить этот переопределенный атрибут в определенные контроллеры или в конфигурацию глобального фильтра в классе WebApiConfig.

using System.Web.Http;
using WebApi1.x.App_Start;

namespace WebApi1.x
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional });
    
            // ...
            config.EnableSystemDiagnosticsTracing();
    
            // Capture exceptions for Application Insights:
            config.Filters.Add(new AiExceptionFilterAttribute());
        }
    }
}

Образец

Веб-API 2.x

Добавьте реализацию 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);
        }
    }
}

Добавьте этот фрагмент кода в службы в 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());
        }
    }
}

Образец

В качестве альтернативы можно:

  • Замените единственный экземпляр ExceptionHandler пользовательской реализацией IExceptionHandler. Этот обработчик исключений вызывается только в том случае, если платформа по-прежнему может выбрать, какое сообщение ответа нужно отправить, а не при прерывании подключения, например.
  • Используйте фильтры исключений, как описано в предыдущем разделе в контроллерах веб-API 1.x, которые не вызываются во всех случаях.

WCF

Добавьте класс, который расширяет Attribute и реализует IErrorHandler и 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)
        {
        }
      }
    }

Добавьте атрибут в реализации службы:

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

Образец

Счетчики производительности исключений

Если вы установили агент Azure Monitor Application Insights на сервере, вы можете получить диаграмму скорости исключений, измеряемую .NET. Включены и обработанные, и необработанные .NET исключения.

Откройте вкладку обозревателя метрик и добавьте новую диаграмму. В разделе Счетчики производительности выберите частоту исключений.

Платформа .NET вычисляет частоту, подсчитывая количество исключений в интервале и разделяя по длине интервала.

Это число отличается от количества исключений, рассчитываемого порталом Application Insights, который учитывает отчеты TrackException. Интервалы выборки отличаются, и SDK не отправляет отчеты для всех обработанных и необработанных исключений.

Настраиваемая коллекция метрик

Пакеты SDK Azure Monitor для .NET Application Insights и .NET Core имеют два разных метода сбора пользовательских метрик:

  • Метод TrackMetric(), который не имеет предварительной агрегации данных.
  • Метод GetMetric() , имеющий предварительную агрегацию.

Мы рекомендуем использовать агрегирование, поэтому TrackMetric()больше не является предпочтительным методом сбора пользовательских метрик. В этой статье описывается использование GetMetric() метода и некоторые из причин его работы.


Раскройте, чтобы узнать больше о предварительной агрегации и неагрегирующем API

Метод TrackMetric() отправляет необработанные данные телеметрии, обозначающие метрику. Неэффективно отправлять один элемент телеметрии для каждого значения. Метод TrackMetric() также неэффективн в плане производительности, так как каждый TrackMetric(item) проходит через полный конвейер пакета SDK для инициализаторов телеметрии и процессоров.

В отличие от TrackMetric(), GetMetric() обрабатывает локальную предварительную агрегацию, а затем отправляет только агрегированную метрику с фиксированным интервалом в одну минуту. Если необходимо тщательно отслеживать некоторые пользовательские метрики на уровне секунд или даже миллисекунд, это можно сделать, не неся дополнительных затрат на хранение и сетевой трафик кроме как для мониторинга раз в минуту. Это поведение также значительно снижает риск регулирования, так как общее количество элементов телеметрии, которые необходимо отправить для агрегированной метрики, значительно снижается.

В Application Insights пользовательские метрики, собранные с помощью TrackMetric() и GetMetric() не подвергаются выборке. Выборка важных метрик может привести к сценариям, в которых оповещения, основанные на этих метриках, становятся ненадежными. Никогда не выполняя выборку кастомных метрик, вы можете быть уверены, что при превышении ваших пороговых значений оповещение поступает. Поскольку пользовательские метрики не подвергаются выборке, существуют некоторые потенциальные проблемы.

Отслеживание трендов в метрике каждые секунды или на еще более детализированном интервале может привести к следующему:

  • Увеличение затрат на хранение данных. Существует стоимость, связанная с объемом данных, которые вы отправляете в Azure Monitor. Чем больше данных вы отправляете, тем больше общей стоимости мониторинга.
  • Увеличение нагрузки на сетевой трафик или производительность. В некоторых сценариях эта нагрузка может иметь как денежные, так и затраты на производительность приложений.
  • Риск ограничения приема. Azure Monitor сбрасывает точки данных ("ограничение") когда ваше приложение отправляет телеметрию с высокой частотой в короткий интервал времени.

Ограничение скорости является проблемой, так как это может привести к пропуску оповещений. Условие для активации оповещения может происходить локально, а затем удаляться в конечной точке приема из-за слишком большого объема отправленных данных. Мы не рекомендуем использовать TrackMetric() для .NET и .NET Core, если только вы не реализовали собственную логику локальной агрегации. Если вы пытаетесь отслеживать каждый экземпляр события в течение заданного периода времени, возможно, вы обнаружите, что TrackEvent() подходит лучше. Помните, что в отличие от пользовательских метрик, пользовательские события подвергаются выборке. Вы по-прежнему можете использовать TrackMetric() даже без написания собственной локальной предагрегации. Но если вы это делаете, помните о ловушках.

Вкратце, мы рекомендуем GetMetric() так как она выполняет предварительное агрегирование, она накапливает значения из всех Track() вызовов и отправляет сводку/агрегат каждую минуту. Метод GetMetric() может значительно сократить затраты и производительность, отправив меньше точек данных, а также собирая все соответствующие сведения.

Начало работы с GetMetric

В наших примерах мы будем использовать простое приложение рабочей службы на платформе .NET Core 3.1. Если вы хотите реплицировать тестовую среду, используемую с этими примерами, выполните действия 1–6 в разделе .NET приложение Core Worker Service. Эти действия добавляют Application Insights в базовый шаблон проекта рабочей службы. Основные понятия применяются к любому общему приложению, в котором можно использовать пакет SDK, включая веб-приложения и консольные приложения.

Отправка метрик

Замените содержимое worker.cs файла следующим кодом:

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

При запуске примера кода в окне вывода Visual Studio отображается цикл while, повторяющийся без отправки данных телеметрии. Один элемент телеметрии отправляется вокруг 60-секундной отметки, которая в нашем тесте выглядит следующим образом:

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

Этот элемент телеметрии представляет агрегат 41 различных измерений метрик. Так как мы отправляли одно и то же значение снова и снова, у нас есть стандартное отклонение () с идентичными максимальными (stDev0) max и минимальными (min) значениями. Свойство value представляет сумму всех отдельных значений, которые были агрегированы.

Замечание

Метод GetMetric не поддерживает отслеживание последнего значения (например, gauge) или отслеживания гистограмм или распределения.

Если мы рассмотрим ресурс Application Insights в интерфейсе Logs (Analytics), отдельный элемент телеметрии будет выглядеть на следующем снимке экрана.

Скриншот, показывающий окно запроса в Log Analytics.

Замечание

Как только необработанный элемент телеметрии не содержал явного свойства или поля суммы после обработки, мы добавляем его для вас. В этом случае и value, и valueSum представляют одно и то же свойство.

Вы также можете получить доступ к пользовательской телеметрии метрик в разделе "Метрики " портала как на основе журнала, так и на основе пользовательской метрики. На следующем снимке экрана представлен пример лог-метрики.

Скриншот, показывающий представление Metrics Explorer.

Справочник по метрике кэша для использования высокой пропускной способности

Значения метрик могут часто наблюдаться в некоторых случаях. Например, служба высокой пропускной способности, обрабатывающая 500 запросов в секунду, может потребоваться выдавать 20 метрик телеметрии для каждого запроса. Результат означает отслеживание 10 000 значений в секунду. В таких сценариях с высокой пропускной способностью пользователям может потребоваться помочь SDK, избегая некоторых запросов.

Например, предыдущий пример выполнил поиск дескриптора для метрики ComputersSold , а затем отслеживал наблюдаемое значение 42. Вместо этого дескриптор может кэшироваться для нескольких вызовов отслеживания:

//...

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

Помимо кэширования дескриптора метрик, предыдущий пример также сократил Task.Delay до 50 миллисекунд, чтобы цикл выполнялся чаще. Результатом является 772 TrackValue() вызовов.

Многомерные метрики

В примерах, приведенных в предыдущем разделе, показаны метрики нулевого измерения. Метрики также могут быть многомерными. В настоящее время мы поддерживаем до 10 измерений.

Ниже приведен пример создания одномерной метрики:

//...

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

Выполнение примера кода не менее 60 секунд приводит к отправке трех отдельных элементов телеметрии в Azure. Каждый элемент представляет агрегат одного из трех форм-факторов. Как и раньше, вы можете продолжить изучение в представлении Журналов (Аналитика).

Скриншот, показывающий представление Log Analytics многомерной метрики.

В обозревателе метрик:

Скриншот, показывающий пользовательские метрики.

Обратите внимание, что вы не можете разделить метрику по новому пользовательскому измерению или просмотреть пользовательское измерение с помощью представления метрик.

Снимок экрана: поддержка разделения.

По умолчанию многомерные метрики в обозревателе метрик не включаются в ресурсы Application Insights.

Включение многомерных метрик

Чтобы включить многомерные метрики для ресурса Application Insights, выберите «Использование и предполагаемые затраты»>«Пользовательские метрики»>«Включить оповещения для измерений пользовательских метрик»>ОК. Дополнительные сведения см. в разделе "Пользовательские измерения метрик" и предварительное агрегирование.

После внесения этого изменения и отправки новых многомерных данных телеметрии можно выбрать "Применить разделение".

Замечание

Только метрики, отправленные после включения функции на портале, имеют сохраненные измерения.

Снимок экрана: применение разделения.

Просмотрите агрегаты метрик для каждого FormFactor измерения.

Снимок экрана, показывающий форм-факторы.

Использование MetricIdentifier при наличии более трех измерений

В настоящее время поддерживаются 10 измерений. Использование более трех измерений требует использования 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");

Настраиваемая конфигурация метрик

Если вы хотите изменить конфигурацию метрик, необходимо внести изменения в место, где инициализирована метрика.

Специальные имена измерений

Метрики не используют контекст телеметрии TelemetryClient, который применяется для доступа к ним. Использование специальных имен измерений, доступных в качестве констант в MetricDimensionNames классе, является оптимальным решением для этого ограничения.

Агрегаты метрик, отправленные приведенными ниже Special Operation Request Size метриками , не имеют Context.Operation.Name значения Special Operation. Метод TrackMetric() или любой другой метод TrackXXX() задан OperationName правильно на 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);
                //...
            }
                   
        }

В этом случае используйте специальные имена измерений, перечисленные в MetricDimensionNames классе, чтобы указать TelemetryContext значения.

Например, если агрегат метрик, полученный из следующей инструкции, отправляется в конечную точку облака Application Insights, поле данных Context.Operation.Name имеет значение Special Operation:

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

Значение этого специального измерения копируется в TelemetryContext и не используется в качестве обычного измерения. Если вы хотите также сохранить измерение операции для обычного исследования метрик, необходимо создать отдельное измерение для этой цели:

_telemetryClient.GetMetric("Request Size", "Operation Name", MetricDimensionNames.TelemetryContext.Operation.Name).TrackValue(requestSize, "Special Operation", "Special Operation");
Ограничение измерений и временных рядов

Чтобы предотвратить случайное использование ресурсов подсистемой телеметрии, можно управлять максимальным количеством рядов данных на метрики. Ограничения по умолчанию — не более 1000 общих рядов данных на одну метрику и не более 100 различных значений на одно измерение.

Это важно

Используйте низкие значения для измерений, чтобы избежать ограничения.

В контексте ограничения измерений и временных рядов мы используем Metric.TrackValue(..) , чтобы убедиться, что ограничения выполняются. Если ограничения уже достигнуты, Metric.TrackValue(..) возвращается False и значение не отслеживается. В противном случае возвращается значение True. Это поведение полезно, если данные для метрики исходят из ввода пользователем.

Конструктор MetricConfiguration принимает некоторые параметры управления различными рядами в соответствующей метрике и объект класса, реализующего IMetricSeriesConfiguration, который указывает поведение агрегации для каждой отдельной серии этой метрики.

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 doesn't track the metric, and returns false.
  • seriesCountLimit — максимальное количество временных рядов данных, которые может содержать метрика. Когда это ограничение достигнуто, вызовы к TrackValue(), которые обычно приводят к новой серии, возвращают false.
  • valuesPerDimensionLimit ограничивает число уникальных значений для каждого измерения аналогичным образом.
  • restrictToUInt32Values определяет, следует ли отслеживать только неотрицательные целые значения.

Пример отправки сообщения для проверки превышения лимитов.

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

Отслеживание пользовательских операций

Пакеты SDK Application Insights автоматически отслеживают входящие HTTP-запросы и вызовы зависимых служб, например HTTP-запросы и SQL-запросы. Отслеживание и корреляция запросов и зависимостей обеспечивают видимость отклика и надежности всего приложения во всех микрослужбах, которые объединяют это приложение.

Существует класс шаблонов приложений, которые не могут поддерживаться универсально. Для правильного мониторинга таких шаблонов требуется вручную инструментировать код. В этом разделе рассматриваются несколько шаблонов, которые могут потребовать ручного инструментирования, например настраиваемую обработку очередей и выполнение длительных фоновых задач.

В этом разделе содержатся рекомендации по отслеживанию пользовательских операций с помощью пакета SDK Application Insights.

Обзор

Операция — это логическая часть работы, выполняемая приложением. Он имеет имя, время начала, длительность, результат и контекст выполнения, например имя пользователя, свойства и результат. Если операция A была инициирована операцией B, операция B устанавливается как родительская для A. Операция может иметь только один родительский объект, но может иметь множество дочерних операций. Дополнительные сведения об операциях и корреляции телеметрии см. в разделе Корреляция телеметрии в Application Insights.

В пакете SDK для Application Insights .NET операция описывается абстрактным классом OperationTelemetry и потомками RequestTelemetry и DependencyTelemetry.

Отслеживание входящих операций

Веб-пакет SDK Application Insights автоматически собирает HTTP-запросы для приложений ASP.NET, работающих в конвейере IIS и всех ASP.NET Core приложениях. Существуют решения, поддерживаемые сообществом для других платформ и фреймворков. Если приложение не поддерживается ни одним из стандартных или поддерживаемых сообществом решений, его можно настроить вручную.

Другим примером, требующим пользовательского отслеживания, является работник, который получает элементы из очереди. Для некоторых очередей вызов для добавления сообщения в эту очередь отслеживается как зависимость. Высокоуровневая операция, описывающая обработку сообщений, не собирается автоматически.

Давайте посмотрим, как можно отслеживать такие операции.

На высоком уровне задача состоит в создании RequestTelemetry и задании известных свойств. После завершения операции вы отслеживаете данные телеметрии. В следующем примере показана эта задача.

HTTP-запрос в локальном приложении Owin

В этом примере контекст трассировки распространяется в соответствии с протоколом HTTP для корреляции. Вы должны ожидать получения заголовков, описанных там.


Развернуть для просмотра кода
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 для корреляции также объявляет Correlation-Context заголовок. Это опущено здесь для простоты.

Мониторинг очередей

Контекст трассировки W3C и HTTP-протокол для корреляции передают корреляционные данные с HTTP-запросами, но каждый протокол очереди должен определить, как те же данные передаются в сообщении очереди. Некоторые протоколы очередей, такие как AMQP, позволяют передавать дополнительные метаданные. Другие протоколы, такие как Azure Storage Queue, требуют, чтобы контекст был закодирован в полезную нагрузку сообщения.

Замечание

Трассировка между компонентами пока не поддерживается для очередей.

Если ваш производитель и потребитель отправляют данные телеметрии в разные ресурсы Application Insights, опыт диагностики транзакций и карта приложений показывают транзакции и сопоставляют их от начала до конца. Для очередей эта возможность пока не поддерживается.

очередь «Service Bus»

Сведения о трассировке см. в разделе Распределенная трассировка и корреляция через обмен сообщениями в Azure Service Bus.

очередь в Azure Storage

В следующем примере показано, как отслеживать операции очереди Azure Storage и связывать телеметрию между производителем, потребителем и Azure Storage.

Очередь хранилища имеет HTTP-API. Все вызовы очереди отслеживаются сборщиком зависимостей Application Insights для HTTP-запросов. Он настроен по умолчанию для приложений ASP.NET и ASP.NET Core. Сведения о других типах приложений см. в документации по консольным приложениям.

Кроме того, может потребоваться сопоставить идентификатор операции Application Insights с идентификатором запроса хранилища. Сведения о настройке и получении клиента запроса хранилища и идентификатора запроса сервера см. в разделе Monitor, диагностика и устранение неполадок Azure Storage.

Enqueue

Так как очереди хранилища поддерживают API HTTP, все операции с очередью автоматически отслеживаются Application Insights. Во многих случаях этот инструментарий должен быть достаточным. Чтобы сопоставить трассировки на стороне потребителя с трассировками производителя, необходимо передать некоторый контекст корреляции аналогично тому, как мы делаем это в протоколе HTTP для корреляции.

В этом примере показано, как отслеживать Enqueue операцию. Вы можете:

  • Корреляция повторных попыток (если есть): все они имеют один общий родительский объект, который является операцией Enqueue . В противном случае они отслеживаются как подчиненные объекты входящего запроса. Если в очереди есть несколько логических запросов, может быть трудно найти, какой вызов привел к повторным попыткам.
  • Сопоставляйте журналы хранилища (если и при необходимости): они коррелируются с данными телеметрии Application Insights.

Операция Enqueue является дочерним элементом родительской операции. Примером является входящий HTTP-запрос. Вызов зависимостей HTTP является дочерним Enqueue элементом операции и внуком входящего запроса.

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

Чтобы уменьшить объем отчетов телеметрии приложения или если вы не хотите отслеживать Enqueue операцию по другим причинам, используйте Activity API напрямую:

  • Создайте (и запустите) новую Activity вместо запуска операции Application Insights. Вам не нужно назначать какие-либо свойства, кроме имени операции.
  • Сериализуйте yourActivity.Id в полезные данные сообщения вместо operation.Telemetry.Id. Также можно использовать Activity.Current.Id.
Удаление из очереди

Enqueue Аналогичным образом фактический HTTP-запрос в очередь хранилища автоматически отслеживается Application Insights. Предположительно операция Enqueue выполняется в родительском контексте, например в контексте входящего запроса. Пакеты SDK Application Insights автоматически сопоставляют такие операции и ее часть HTTP с родительским запросом и другими данными телеметрии в той же области.

Операция Dequeue сложна. Пакет SDK Application Insights автоматически отслеживает HTTP-запросы. Но он не знает контекст корреляции, пока сообщение не будет проанализировано. Невозможно сопоставить HTTP-запрос, чтобы получить сообщение с остальной частью телеметрии, особенно при получении нескольких сообщений.

public async Task<MessagePayload> Dequeue(CloudQueue queue)
{
    var operation = telemetryClient.StartOperation<DependencyTelemetry>("dequeue " + queue.Name);
    operation.Telemetry.Type = "Azure queue";
    operation.Telemetry.Data = "Dequeue " + queue.Name;

    try
    {
        var message = await queue.GetMessageAsync();
    }
    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);
    }

    return null;
}
Процедура

В следующем примере входящие сообщения отслеживаются таким образом, как входящий HTTP-запрос:

public async Task Process(MessagePayload message)
{
    // After the message is dequeued from the queue, create RequestTelemetry to track its processing.
    RequestTelemetry requestTelemetry = new RequestTelemetry { Name = "process " + queueName };
    
    // It might also make sense to get the name from the message.
    requestTelemetry.Context.Operation.Id = message.RootId;
    requestTelemetry.Context.Operation.ParentId = message.ParentId;

    var operation = telemetryClient.StartOperation(requestTelemetry);

    try
    {
        await ProcessMessage();
    }
    catch (Exception e)
    {
        telemetryClient.TrackException(e);
        throw;
    }
    finally
    {
        // Update status code and success as appropriate.
        telemetryClient.StopOperation(operation);
    }
}

Аналогичным образом можно инструментировать другие операции очереди. Операция просмотра должна быть инструментирована аналогичным образом, как операция вывода. Инструментирование операций управления очередями не является необходимым. Application Insights отслеживает такие операции, как HTTP, и в большинстве случаев достаточно.

При инструментировании удаления сообщений убедитесь, что заданы идентификаторы операции (корреляции). Кроме того, можно использовать Activity API. Затем вам не нужно задавать идентификаторы операций в элементах телеметрии, так как пакет SDK Application Insights делает это для вас:

  • Создайте новый Activity элемент после того, как вы получили элемент из очереди.
  • Используйте Activity.SetParentId(message.ParentId) для сопоставления журналов потребителей и производителей.
  • Запустите Activity.
  • Отслеживайте операции извлечения из очереди, обработки и удаления с помощью Start/StopOperation помощников. Сделайте это из одного и того же асинхронного потока управления (контекст выполнения). Таким образом, они коррелируются должным образом.
  • Остановите Activity.
  • Используйте Start/StopOperation или вызовите Track данные телеметрии вручную.
Типы зависимостей

Application Insights использует тип зависимостей для настройки пользовательского интерфейса. Для очередей он распознает следующие типы DependencyTelemetry , которые улучшают возможности диагностики транзакций:

  • Azure queue для очередей Azure Storage
  • Azure Event Hubs для Azure Event Hubs
  • Azure Service Bus для Azure Service Bus
Пакетная обработка

В некоторых очередях можно извлечь несколько сообщений с одним запросом. Обработка таких сообщений предположительно является независимой и принадлежит разным логическим операциям. Невозможно сопоставить Dequeue операцию с определенным обработанным сообщением.

Каждое сообщение должно обрабатываться в собственном асинхронном потоке управления. Дополнительные сведения см. в разделе отслеживания исходящих зависимостей .

Длительные фоновые задачи

Некоторые приложения запускают длительные операции, которые могут быть вызваны запросами пользователей. С точки зрения трассировки и инструментирования он не отличается от инструментирования запросов или зависимостей:

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

В этом примере telemetryClient.StartOperation создает DependencyTelemetry и заполняет контекст корреляции. Допустим, у вас есть исходная операция, созданная входящими запросами, которые запланировали выполнение операции. Пока BackgroundTask запускается в том же асинхронном потоке управления, что и входящий запрос, это связано с этой родительской операцией. BackgroundTask и все вложенные элементы телеметрии автоматически коррелируются с запросом, вызвавшего его, даже после завершения запроса.

Когда задача начинается с фонового потока, к которому не прикреплена операция (Activity), он не имеет родительского (BackgroundTask). Однако он может иметь вложенные операции. Все элементы телеметрии, сообщаемые из задачи, коррелируются с DependencyTelemetry созданным в BackgroundTask.

Отслеживание исходящих зависимостей

Вы можете отслеживать собственный тип зависимостей или операцию, которая не поддерживается Application Insights.

Метод Enqueue в очереди Service Bus или очереди хранилища может служить примером для такого пользовательского отслеживания.

Общий подход для отслеживания пользовательских зависимостей заключается в том, чтобы:

  • Вызовите метод расширения TelemetryClient.StartOperation, который заполняет свойства DependencyTelemetry, необходимые для корреляции, а также некоторые другие свойства, такие как начало, метка времени и продолжительность.
  • Задайте другие настраиваемые свойства в поле DependencyTelemetry, например имя и любой другой контекст.
  • Сделайте вызов зависимости и дождитесь результата.
  • Остановите операцию после StopOperation завершения.
  • Обработка исключений.
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.
        }
    }
}

Прекращение операции приводит к ее остановке, поэтому вы можете сделать это вместо вызова StopOperation.

Предупреждение

В некоторых случаях необработаемое исключение может препятствоватьfinally вызову, поэтому операции могут не отслеживаться.

Параллельные операции обработки и отслеживания

Вызов StopOperation останавливает только запущенную операцию. Если текущая выполняющаяся операция не соответствует той, которую вы хотите остановить, StopOperation ничего не делает. Эта ситуация может произойти при параллельном запуске нескольких операций в одном контексте выполнения.

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;

Убедитесь, что вы всегда вызываете StartOperation и обрабатываете операцию в одном асинхронном методе, чтобы изолировать операции, выполняемые параллельно. Если операция синхронна (или не асинхронна), оберните процесс и отслеживайте его с помощью 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 и System.Diagnostics.Activity

System.Diagnostics.Activity представляет контекст распределенной трассировки и используется платформами и библиотеками для создания и распространения контекста внутри и за пределами процесса и сопоставления элементов телеметрии. Activity работает вместе с System.Diagnostics.DiagnosticSource механизмом уведомлений между платформой или библиотекой, чтобы уведомить о интересных событиях, таких как входящие или исходящие запросы и исключения.

Действия — это функции верхнего уровня в Application Insights. Автоматическая зависимость и сбор запросов сильно зависят от них вместе с событиями DiagnosticSource . Если вы создали Activity в вашем приложении, это не приведет к созданию телеметрии Application Insights. Application Insights должен получать события DiagnosticSource, а также знать имена событий и нагрузку данных для перевода Activity в данные телеметрии.

Каждая операция Application Insights (запрос или зависимость) включает в себя Activity. При вызове StartOperation он создает Activity внизу. StartOperation является рекомендуемым способом для ручного отслеживания телеметрии запросов или зависимостей и обеспечения их сопоставления.

Счетчики

Application Insights поддерживает счетчики производительности и счетчики событий. В этом руководстве представлены общие сведения об их назначении, настройке и использовании в .NET приложениях.

  • счетчики Performance встроены в операционную систему Windows и предлагают стандартные метрики, такие как использование ЦП, потребление памяти и действие диска. Эти счетчики идеально подходят для мониторинга стандартных метрик производительности с минимальной настройкой. Они помогают отслеживать использование ресурсов или устранять узкие места на уровне системы в приложениях на основе Windows, но не поддерживают пользовательские метрики для конкретных приложений.

  • счетчики Event работают на нескольких платформах, включая Windows, Linux и macOS. Они позволяют разработчикам определять и отслеживать упрощенные настраиваемые метрики для конкретных приложений, обеспечивая большую гибкость, чем счетчики производительности. Счетчики событий полезны, если системные метрики недостаточно или когда требуется подробная телеметрия в кроссплатформенных приложениях. Они требуют явной реализации и настройки, что делает настройку более интенсивной.

Счетчики производительности

Windows предоставляет различные счетчики перформанса, например те, которые используются для сбора статистики использования процессора, памяти и диска. Вы также можете определить собственные счетчики производительности.

Ваше приложение поддерживает сбор счетчиков производительности, если оно выполняется под управлением Internet Information Services (IIS) на локальном сервере или виртуальной машине с административным доступом. Приложения, работающие как Azure Web Apps, не могут напрямую получать доступ к счетчикам производительности, но Application Insights собирает подмножество доступных счетчиков.

Подсказка

Как и другие метрики, можно задать оповещение , чтобы предупредить, выходит ли счетчик за пределы указанного предела. Чтобы задать оповещение, откройте панель "Оповещения " и нажмите кнопку "Добавить оповещение".

Prerequisites

Предоставьте учетной записи службы пула приложений разрешение на мониторинг счетчиков производительности, добавив его в группу Performance Monitor Users.

net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"
Просмотр счетчиков

На панели метрик показан набор счетчиков производительности по умолчанию.

ASP.NET

Счетчики по умолчанию для веб-приложений ASP.NET:

  • % процесса\Время процессора
  • % процесс\Время процессора нормализовано
  • Память\Доступные байты
  • Запросы в секунду ASP.NET
  • исключения .NET Общей Среды Выполнения (CLR), брошенные в секунду
  • Время выполнения запроса в ASP.NET приложениях
  • Процесс\Private Bytes
  • Процесс\Ввод-Вывод данных байт/сек
  • ASP.NET приложения\запросы в очереди приложений
  • Процессор(_Total)\ время процессора%
ASP.NET Core

Счетчики по умолчанию для веб-приложений ASP.NET Core:

  • % процесса\Время процессора
  • % процесс\Время процессора нормализовано
  • Память\Доступные байты
  • Процесс\Private Bytes
  • Процесс\Ввод-Вывод данных байт/сек
  • Процессор(_Total)\ время процессора%

Замечание

Поддержка счетчиков производительности в ASP.NET Core ограничена:

  • SDK версии 2.4.1 и более поздних версий собирают счетчики производительности, если приложение работает в Azure Web Apps (Windows).
  • Пакет SDK версии 2.7.1 и более поздних версий собирает счетчики производительности, если приложение работает в Windows и предназначено для NETSTANDARD2.0 или более поздней версии.
  • Для приложений, предназначенных для платформы .NET Framework, все версии пакета SDK поддерживают счетчики производительности.
  • Пакет SDK версии 2.8.0 и более поздних версий поддерживает счетчик ЦП и памяти в Linux. Ни один другой счетчик не поддерживается в Linux. Чтобы получить системные счетчики в Linux (и других средах, отличных от Windows), используйте счетчики событий.
Добавление счетчиков

Если нужный счетчик производительности не включен в список метрик, его можно добавить.

ASP.NET

Вариант 1. Настройка в ApplicationInsights.config

  1. Узнайте, какие счетчики доступны на сервере с помощью этой команды PowerShell на локальном сервере:

    Get-Counter -ListSet *
    

    Дополнительные сведения см. в разделе Get-Counter.

  2. Откройте ApplicationInsights.config.

    Если вы добавили Application Insights в приложение во время разработки:

    1. Измените ApplicationInsights.config в вашем проекте.
    2. Повторно разверните его на серверах.
  3. Измените директиву коллектора производительности:

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

Вы фиксируете как стандартные счетчики, так и счетчики, которые вы реализуете самостоятельно. \Objects\Processes является примером стандартного счетчика, доступного во всех системах Windows. \Sales(photo)\# Items Sold пример пользовательского счетчика, который может быть реализован в веб-службе.

Формат — это \Category(instance)\Counterили для категорий, которые не имеют экземпляров, просто \Category\Counter.

Параметр ReportAs требуется для имен счетчиков, которые не соответствуют [a-zA-Z()/-_ \.]+.

Если вы указываете экземпляр, он становится размерностью CounterInstanceName отчётной метрики.

Вариант 2. Конфигурация в коде

См. следующий раздел.

ASP.NET Core

Настройте PerformanceCollectorModule после метода WebApplication.CreateBuilder() внутри Program.cs.

using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// The following configures PerformanceCollectorModule.

builder.Services.ConfigureTelemetryModule<PerformanceCollectorModule>((module, o) =>
    {
        // The application process name could be "dotnet" for ASP.NET Core self-hosted applications.
        module.Counters.Add(new PerformanceCounterCollectionRequest(@"\Process([replace-with-application-process-name])\Page Faults/sec", "DotnetPageFaultsPerfSec"));
    });

var app = builder.Build();
Сбор счетчиков производительности в коде для веб-приложений ASP.NET или консольных приложений .NET/.NET Core

Чтобы собрать счетчики производительности системы и отправить их в Application Insights, можно адаптировать следующий фрагмент кода:

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

Или вы можете сделать то же самое с пользовательскими метриками, созданными вами:

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Sales(photo)\# Items Sold", "Photo sales"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);
Счетчики производительности для приложений, работающих в Azure Web Apps и контейнерах Windows на Azure App Service

Как ASP.NET, так и ASP.NET Core приложения, развернутые в Azure Web Apps, запускаются в специальной среде песочницы. Приложения, развернутые в Azure App Service, могут использовать контейнер Windows или размещаться в изолированной среде. Если приложение развертывается в контейнере Windows, все стандартные счетчики производительности доступны на образе контейнера.

Среда песочницы не разрешает прямой доступ к счетчикам производительности системы. Однако ограниченное подмножество счетчиков предоставляется в виде переменных среды, как описано в счетчиках Perf, предоставляемых как переменные среды. В этой среде доступно только подмножество счетчиков.

Пакет SDK Application Insights для ASP.NET и ASP.NET Core определяет, развертывается ли код в веб-приложении или контейнере, отличном от Windows. Обнаружение определяет, собирает ли он счетчики производительности в песочнице или использует стандартный механизм сбора данных при размещении на Windows контейнере или виртуальной машине.

Запросы в Log Analytics для счетчиков производительности

Вы можете искать и отображать отчеты счетчиков производительности в Log Analytics.

Схема performanceCounters раскрывает category, counter имя и instance имя каждого счетчика производительности. В телеметрии для каждого приложения отображаются только счетчики для этого приложения. Например, чтобы узнать, какие счетчики доступны:

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

Здесь Instance относится к экземпляру счетчика производительности, а не к роли или экземпляру компьютера сервера. Имя экземпляра счетчика производительности обычно сегментирует счетчики, например время процессора, по имени процесса или приложения.

Чтобы получить диаграмму доступной памяти за последний период:

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

Как и другие данные телеметрии, performanceCounters также имеет столбец cloud_RoleInstance, который указывает идентификатор экземпляра хост-сервера, на котором работает ваше приложение. Например, чтобы сравнить производительность приложения на разных компьютерах:

performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)
Вопросы и ответы о счетчиках производительности

Чтобы ознакомиться с часто задаваемыми вопросами (FAQ), см. Вопросы и ответы о счетчиках производительности.

Счетчики событий

EventCounter — это механизм .NET/.NET Core для публикации и использования счетчиков или статистики. EventCounters поддерживаются во всех платформах ОС — Windows, Linux и macOS. Его можно рассматривать как кроссплатформенный эквивалент PerformanceCounters, который поддерживается только в системах Windows.

Хотя пользователи могут публиковать любые настраиваемые счетчики событий в соответствии с потребностями, .NET публикует набор этих счетчиков по умолчанию. В этом документе описаны шаги, необходимые для сбора и просмотра счетчиков событий (определенных системой или пользователем) в Azure Application Insights.

Подсказка

Как и другие метрики, можно задать оповещение , чтобы предупредить, выходит ли счетчик за пределы указанного предела. Чтобы задать оповещение, откройте панель "Оповещения " и нажмите кнопку "Добавить оповещение".

Использование Application Insights для сбора EventCounters

Application Insights поддерживает сбор EventCounters при помощи его EventCounterCollectionModule, которая является частью недавно выпущенного пакета NuGet Microsoft.ApplicationInsights.EventCounterCollector. EventCounterCollectionModule автоматически включается при использовании AspNetCore или WorkerService. EventCounterCollectionModule собирает счетчики с неконфигурируемой частотой сбора в 60 секунд. Для сбора eventCounters не требуются специальные разрешения. Для приложений ASP.NET Core также необходимо добавить пакет Microsoft.ApplicationInsights.AspNetCore.

dotnet add package Microsoft.ApplicationInsights.EventCounterCollector
dotnet add package Microsoft.ApplicationInsights.AspNetCore
Собранные счетчики по умолчанию

Начиная с версии 2.15.0 пакета SDK AspNetCore или пакета SDK WorkerService, счетчики по умолчанию не собираются. Сам модуль включен, чтобы пользователи могли добавлять нужные счетчики для их сбора.

Список известных счетчиков, опубликованных средой выполнения .NET, см. в документе Available Counters.

Настройка счетчиков для сбора данных

В следующем примере показано, как добавить или удалить счетчики. Эта настройка будет выполнена как часть конфигурации службы приложений после включения сбора данных телеметрии Application Insights с использованием либо AddApplicationInsightsTelemetry(), либо AddApplicationInsightsWorkerService(). Ниже приведен пример кода из приложения ASP.NET Core. Сведения о других типах приложений см. в разделе "Настройка модулей телеметрии".

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"));
        }
    );
Отключение модуля коллекции EventCounter

EventCounterCollectionModule можно отключить с помощью ApplicationInsightsServiceOptions.

В следующем примере используется пакет SDK ASP.NET Core.

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

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

Аналогичный подход также можно использовать для пакета SDK для рабочей службы, но пространство имен должно быть изменено, как показано в следующем примере.

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

var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions();
applicationInsightsServiceOptions.EnableEventCounterCollectionModule = false;
builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions);
запросы Log Analytics для счетчиков событий

Отчеты счетчиков событий можно искать в Log Analytics в таблице customMetrics.

Например, выполните следующий запрос, чтобы узнать, какие счетчики собираются и доступны для запроса:

customMetrics | summarize avg(value) by name

Чтобы получить диаграмму определенного счетчика (например: ThreadPool Completed Work Item Count) за последний период, выполните следующий запрос.

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

Как и другие данные телеметрии, пользовательские метрики также имеют столбец cloud_RoleInstance, указывающий идентификатор экземпляра сервера узла, на котором работает ваше приложение. Предыдущий запрос показывает значение счетчика для каждого экземпляра и может использоваться для сравнения производительности разных экземпляров сервера.

Вопросы и ответы о счетчиках событий

Чтобы просмотреть часто задаваемые вопросы (ЧАВО), см. ЧАВО по счетчикам событий.

Коллекция моментальных снимков

Сведения о настройке коллекции моментальных снимков для приложений ASP.NET и ASP.NET Core см. в статье Включение отладки моментальных снимков для приложений .NET в Azure Service Fabric, облачных службах и виртуальных машинах.

Обработка и фильтрация телеметрии

В этом разделе

Фильтрация и предварительная обработка телеметрии

Вы можете написать код для фильтрации, изменения или обогащения телеметрии перед отправкой из пакета SDK. Обработка включает данные, отправленные из стандартных модулей телеметрии, таких как сбор HTTP-запросов и сбор зависимостей.

  • Фильтрация может изменять или удалять данные телеметрии перед отправкой из пакета SDK путем реализации ITelemetryProcessor. Например, можно уменьшить объем телеметрии, исключив запросы от роботов. В отличие от выборки, у вас есть полный контроль над отправкой или отбрасыванием данных, но это влияет на любые метрики, основанные на агрегированных журналах. В зависимости от способа удаления элементов вы также можете потерять возможность навигации между связанными элементами.

  • Добавьте или измените свойства для любых данных телеметрии, отправляемых из вашего приложения, путем реализации ITelemetryInitializer. Например, можно добавить вычисляемые значения или номера версий, с помощью которых можно фильтровать данные на портале.

  • Выборка уменьшает объем данных телеметрии, не влияя на статистику. Он объединяет связанные точки данных, чтобы можно было перемещаться между ними при диагностике проблемы. На портале общие показатели умножаются, чтобы компенсировать отклонения выборки.

Замечание

API пакета SDK используется для отправки пользовательских событий и метрик.

Filtering

Этот метод обеспечивает прямой контроль над тем, что включается или исключается из потока телеметрии. Фильтрация может использоваться для исключения отправляемых телеметрических данных в Application Insights. Фильтрацию можно использовать с сэмплированием или отдельно.

Чтобы отфильтровать данные телеметрии, необходимо написать обработчик телеметрии и зарегистрировать его в TelemetryConfiguration. Все данные телеметрии проходят через процессор. Вы можете удалить его из потока или передать его следующему процессору в цепочке. Данные телеметрии из стандартных модулей, таких как сборщик HTTP-запросов и сборщик зависимостей, а также данные телеметрии, которые вы отслеживали самостоятельно. Например, можно отфильтровать данные телеметрии о запросах от роботов или успешных вызовов зависимостей.

Предупреждение

Фильтрация данных телеметрии, отправляемой из SDK с помощью процессоров, может исказить статистику, которую вы видите на портале, и затруднить отслеживание связанных элементов.

Вместо этого рекомендуется использовать выборку.

ITelemetryProcessor и ITelemetryInitializer

Какова разница между процессорами телеметрии и инициализаторами телеметрии?

  • Есть некоторые пересечения в том, что вы можете делать с ними. Их можно использовать для добавления или изменения свойств телеметрии, хотя мы рекомендуем использовать инициализаторы для этой цели.
  • Инициализаторы телеметрии всегда выполняются перед процессорами телеметрии.
  • Инициализаторы телеметрии могут вызываться несколько раз. По соглашению они не задают какое-либо свойство, которое уже было задано.
  • Процессоры телеметрии позволяют полностью заменить или отменить элемент телеметрии.
  • Все зарегистрированные инициализаторы телеметрии вызываются для каждого элемента телеметрии. Для процессоров телеметрии пакет SDK гарантирует вызов первого процессора телеметрии. Определение того, будут ли вызваны остальные процессоры, осуществляется предыдущими процессорами телеметрии.
  • Инициализаторы телеметрии используются для дополнения телеметрии большим количеством свойств или переопределения существующих. Используйте обработчик телеметрии для фильтрации телеметрии.

Добавление и изменение свойств

Инициализаторы телеметрии используются для обогащения телеметрии дополнительными сведениями или переопределения свойств телеметрии, заданных стандартными модулями телеметрии.

Например, Application Insights для веб-пакета собирает данные телеметрии о HTTP-запросах. По умолчанию он отмечает любой запрос с кодом >=400 как ошибочный. Если вместо этого вы хотите рассматривать 400 как успешный, можно предоставить инициализатор телеметрии, который задает свойство успешности.

Если вы предоставляете инициализатор телеметрии, он вызывается всякий раз, когда вызывается любой из методов Track*(). Этот инициализатор включает Track() методы, вызываемые стандартными модулями телеметрии. По соглашению эти модули не задают никаких свойств, которые уже были заданы инициализатором. Инициализаторы телеметрии вызываются перед вызовом процессоров телеметрии, поэтому любые обогащения, выполненные инициализаторами, видны процессорам.

Инициализаторы телеметрии

Чтобы дополнить данные телеметрии дополнительными сведениями или переопределить свойства телеметрии, заданные стандартными модулями телеметрии, используйте инициализаторы телеметрии.

Инициализаторы телеметрии задают свойства контекста, отправляемые вместе с каждым элементом телеметрии. Вы можете написать собственные инициализаторы, чтобы задать свойства контекста.

Стандартные инициализаторы устанавливаются либо веб-пакетами NuGet, либо пакетами NuGet для WindowsServer.

Инициализатор Description
AccountIdTelemetryInitializer Задает свойство AccountId.
AuthenticatedUserIdTelemetryInitializer Задает свойство, заданное AuthenticatedUserId пакетом SDK для JavaScript.
AzureRoleEnvironmentTelemetryInitializer Обновляет свойства RoleName и RoleInstance контекста Device для всех элементов телеметрии с информацией, извлеченной из среды выполнения Azure.
BuildInfoConfigComponentVersionTelemetryInitializer Обновляет свойство Version, связанное с контекстом Component, для всех элементов телеметрии, используя значение, извлеченное из файла, созданного в процессе MS Build, BuildInfo.config.
ClientIpHeaderTelemetryInitializer Обновляет свойство Ip в контексте Location всех элементов телеметрии на основе заголовка HTTP запроса X-Forwarded-For.
DeviceTelemetryInitializer Обновляет следующие свойства контекста Device для всех элементов телеметрии:

Type имеет значение PC.
Id задано доменное имя компьютера, на котором выполняется веб-приложение.
OemName имеет значение, извлеченное из Win32_ComputerSystem.Manufacturer поля с помощью WMI.
Model имеет значение, извлеченное из Win32_ComputerSystem.Model поля с помощью WMI.
NetworkType имеет значение, извлеченное из NetworkInterface свойства.
Language установлено в имя свойства CurrentCulture.
DomainNameRoleInstanceTelemetryInitializer Обновляет свойство RoleInstance в контексте Device для всех элементов телеметрии, используя доменное имя компьютера, на котором работает веб-приложение.
OperationNameTelemetryInitializer Обновляет свойство Name объекта RequestTelemetry и свойство Name контекста Operation всех элементов телеметрии, исходя из метода HTTP, а также имен контроллера и действия ASP.NET MVC, которые вызываются для обработки запроса.
OperationIdTelemetryInitializer или OperationCorrelationTelemetryInitializer Обновляет свойство контекста Operation.Id для всех элементов телеметрии, отслеживаемых при обработке запроса с автоматически созданным RequestTelemetry.Id.
SessionTelemetryInitializer Обновляет свойство Id в контексте Session для всех элементов телеметрии со значением, выбранным из файла cookie ai_session, созданного кодом инструментирования JavaScript ApplicationInsights, запущенным в браузере пользователя.
SyntheticTelemetryInitializer или SyntheticUserAgentTelemetryInitializer Обновляет свойства User, Session и контексты Operation всех элементов телеметрии, отслеживаемых при обработке запроса из синтетического источника, например, теста доступности или поискового бота. По умолчанию обозреватель метрик не отображает искусственные данные телеметрии.

Набор <Filters> , определяющий свойства запросов.
UserTelemetryInitializer Обновляет свойства Id и AcquisitionDate контекста User для всех элементов телеметрии, используя значения, извлеченные из файла cookie ai_user, созданного кодом инструментирования JavaScript Application Insights, выполняемым в браузере пользователя.
WebTestTelemetryInitializer Задает идентификатор пользователя, идентификатор сеанса и синтетические свойства источника для HTTP-запросов, поступающих из тестов доступности.

Набор <Filters> , определяющий свойства запросов.

Замечание

Для .NET приложений, работающих в Azure Service Fabric, можно включить пакет NuGet Microsoft.ApplicationInsights.ServiceFabric. Этот пакет содержит FabricTelemetryInitializer свойство, которое добавляет свойства Service Fabric в элементы телеметрии. Дополнительные сведения см. на странице GitHub о свойствах, добавленных этим пакетом NuGet.

Добавить ITelemetryInitializer

Этот блог описывает проект для диагностики проблем зависимости путем автоматической отправки регулярных пингов в зависимости.

  1. Определение инициализатора

    using System;
    using Microsoft.ApplicationInsights.Channel;
    using Microsoft.ApplicationInsights.DataContracts;
    using Microsoft.ApplicationInsights.Extensibility;
    
    namespace MvcWebRole.Telemetry
    {
      /*
       * Custom TelemetryInitializer that overrides the default SDK
       * behavior of treating response codes >= 400 as failed requests
       *
       */
        public class MyTelemetryInitializer : ITelemetryInitializer
        {
            public void Initialize(ITelemetry telemetry)
            {
                var requestTelemetry = telemetry as RequestTelemetry;
                // Is this a TrackRequest() ?
                if (requestTelemetry == null) return;
                int code;
                bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code);
                if (!parsed) return;
                if (code >= 400 && code < 500)
                {
                    // If we set the Success property, the SDK won't change it:
                    requestTelemetry.Success = true;
    
                    // Allow us to filter these requests in the portal:
                    requestTelemetry.Properties["Overridden400s"] = "true";
                }
                // else leave the SDK to set the Success property
            }
        }
    }
    
  2. Загрузка инициализатора

ASP.NET

Вариант 1. Конфигурация в коде

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

Вариант 2. Конфигурация в ApplicationInsights.config

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

Дополнительные примеры см. в этом примере.

Замечание

Убедитесь, что файлapplicationinsights.config находится в выходном каталоге и содержит последние изменения.

ASP.NET Core

Добавление инициализатора с помощью ApplicationInsights.config или TelemetryConfiguration.Active недопустимо для приложений ASP.NET Core.

Для приложений, написанных с помощью ASP.NET Core, добавление нового инициализатора телеметрии выполняется путем добавления его в контейнер DependencyInjection, как показано ниже. Выполните этот шаг в методе Startup.ConfigureServices .

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();

var app = builder.Build();

Замечание

builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>(); работает с простыми инициализаторами. Для других builder.Services.AddSingleton(new MyCustomTelemetryInitializer() { fieldName = "myfieldName" }); требуется.

Удаление инициализаторов телеметрии

Инициализаторы телеметрии представлены по умолчанию. Чтобы удалить все или некоторые инициализаторы телеметрии, используйте следующий пример кода после вызова метода AddApplicationInsightsTelemetry().

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// Remove a specific built-in telemetry initializer
var tiToRemove = builder.Services.FirstOrDefault<ServiceDescriptor>
                    (t => t.ImplementationType == typeof(AspNetCoreEnvironmentTelemetryInitializer));
if (tiToRemove != null)
{
    builder.Services.Remove(tiToRemove);
}

// Remove all initializers
// This requires importing namespace by using Microsoft.Extensions.DependencyInjection.Extensions;
builder.Services.RemoveAll(typeof(ITelemetryInitializer));

var app = builder.Build();
Служба рабочего процесса

Добавление инициализатора с помощью ApplicationInsights.config или TelemetryConfiguration.Active недопустимо для пакета SDK для рабочей службы.

Для приложений, написанных с помощью рабочей службы, добавление нового инициализатора телеметрии выполняется путем добавления его в DependencyInjection контейнер, как показано ниже. Выполните этот шаг в методе Startup.ConfigureServices .

    using Microsoft.ApplicationInsights.Extensibility;

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();
        services.AddApplicationInsightsTelemetryWorkerService();
    }
Удаление инициализаторов телеметрии

Инициализаторы телеметрии присутствуют по умолчанию. Чтобы удалить все или некоторые инициализаторы телеметрии, используйте следующий пример кода после вызова метода AddApplicationInsightsTelemetryWorkerService().

   public void ConfigureServices(IServiceCollection services)
   {
        services.AddApplicationInsightsTelemetryWorkerService();
        // Remove a specific built-in telemetry initializer.
        var tiToRemove = services.FirstOrDefault<ServiceDescriptor>
                            (t => t.ImplementationType == typeof(AspNetCoreEnvironmentTelemetryInitializer));
        if (tiToRemove != null)
        {
            services.Remove(tiToRemove);
        }

        // Remove all initializers.
        // This requires importing namespace by using Microsoft.Extensions.DependencyInjection.Extensions;
        services.RemoveAll(typeof(ITelemetryInitializer));
   }

Примеры ITelemetryInitializers

Добавление настраиваемого свойства

Следующий пример инициализатора добавляет пользовательское свойство ко всем отслеживаемым данным телеметрии.

public void Initialize(ITelemetry item)
{
    var itemProperties = item as ISupportProperties;
    if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
    {
        itemProperties.Properties["customProp"] = "customValue";
    }
}
Добавьте имя облачной роли и экземпляр облачной роли

Шаг 1: Написание пользовательского TelemetryInitializer

Следующий пример инициализатора задает имя облачной роли для каждой отслеживаемой телеметрии.

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

Шаг 2. Загрузка инициализатора в TelemetryConfiguration

ASP.NET

В файлеApplicationInsights.config :

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

Альтернативный метод для веб-приложений ASP.NET - инициализация инициализатора в коде. В следующем примере показан код в файле Global.aspx.cs :

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

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

Чтобы добавить новый TelemetryInitializer экземпляр, добавьте его в контейнер внедрения зависимостей. В следующем примере показан этот подход. Добавьте этот код в метод ConfigureServices класса Startup.cs.

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;
 public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}
Управление IP-адресом клиента, используемым для сопоставления геолокаций

Следующий пример инициализатора задает IP-адрес клиента, который используется для сопоставления географического расположения вместо IP-адреса сокета клиента во время приема данных телеметрии.

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

Обработчики данных телеметрии

Обработчики телеметрии могут фильтровать и изменять каждый элемент телеметрии перед отправкой из пакета SDK на портал.

Реализовать ITelemetryProcessor

Процессоры телеметрии создают цепочку обработки. При создании экземпляра обработчика телеметрии вы получите ссылку на следующий процессор в цепочке. Когда точка данных телеметрии передается методу процесса, она выполняет свою работу, а затем вызывает (или не вызывает) следующий обработчик телеметрии в цепочке.

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

Добавьте ваш процессор

ASP.NET

Вставьте этот фрагмент кода в ApplicationInsights.config:

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

Можно передать строковые значения из файла .config, предоставив общедоступные именованные свойства в классе.

Предупреждение

Обратите внимание, что имя типа и все имена свойств в файле .config соответствуют именам классов и свойств в коде. Если файл .config ссылается на несуществующий тип или свойство, пакет SDK может автоматически не отправлять данные телеметрии.

Кроме того, можно инициализировать фильтр в коде. Например, в подходящем классе инициализации, например, в AppStart, вставьте ваш процессор в Global.asax.cs цепочку.

Замечание

Следующий пример кода устарел, но доступен здесь для потомства. Попробуйте приступить к работе с OpenTelemetry или перейти на 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();

Клиенты телеметрии, созданные после этого момента, используют процессоры.

Обработчик телеметрии адаптивной выборки (от 2.0.0-beta3)

Эта функция включена по умолчанию. Если приложение отправляет значительные данные телеметрии, этот процессор удаляет некоторые из него.


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

Параметр предоставляет целевой объект, который алгоритм пытается достичь. Каждый экземпляр пакета SDK работает независимо. Таким образом, если сервер является кластером нескольких компьютеров, фактический объем телеметрии умножается соответствующим образом.

Дополнительные сведения о выборке.

Процессор телеметрии фиксированной частоты (от 2.0.0-beta1)

Существует также стандартный обработчик телеметрии выборки (от 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>
ASP.NET Core

Замечание

Добавление процессора с помощью ApplicationInsights.config или TelemetryConfiguration.Active недопустимо для приложений ASP.NET Core или если вы используете пакет SDK Microsoft.ApplicationInsights.WorkerService.

Для ASP.NET Core добавление нового процессора телеметрии выполняется с помощью метода расширения AddApplicationInsightsTelemetryProcessor в IServiceCollection, как показано ниже. Этот метод вызывается в методе ConfigureServices класса Startup.cs .

var builder = WebApplication.CreateBuilder(args);

// ...
builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddApplicationInsightsTelemetryProcessor<MyFirstCustomTelemetryProcessor>();

// If you have more processors:
builder.Services.AddApplicationInsightsTelemetryProcessor<MySecondCustomTelemetryProcessor>();

var app = builder.Build();

Чтобы зарегистрировать процессоры телеметрии, требующие параметров в ASP.NET Core, создайте настраиваемый класс, реализующий ITelemetryProcessorFactory. Вызовите конструктор с требуемыми параметрами в методе Create , а затем используйте AddSingleton<ITelemetryProcessorFactory, MyTelemetryProcessorFactory>().

Служба рабочего процесса

Замечание

Добавление процессора с помощью ApplicationInsights.config или TelemetryConfiguration.Active недопустимо для приложений ASP.NET Core или если вы используете пакет SDK Microsoft.ApplicationInsights.WorkerService.

Для рабочей службы добавление нового процессора телеметрии выполняется с помощью метода расширения AddApplicationInsightsTelemetryProcessor на IServiceCollection, как показано ниже. Этот метод вызывается в методе ConfigureServices класса Startup.cs .

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.AddApplicationInsightsTelemetryProcessor<MyFirstCustomTelemetryProcessor>();
        // If you have more processors:
        services.AddApplicationInsightsTelemetryProcessor<MySecondCustomTelemetryProcessor>();
    }

Примеры фильтров

Искусственные запросы

Отфильтруйте боты и веб-тесты. Хотя обозреватель метрик предоставляет возможность отфильтровать синтетические источники, этот параметр уменьшает объем трафика и объем данных, осуществляя фильтрацию на уровне самого SDK.

public void Process(ITelemetry item)
{
    if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
    
    // Send everything else:
    this.Next.Process(item);
}
Сбой проверки подлинности

Отфильтровать запросы с помощью ответа "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);
}
Исключить быстрые удаленные вызовы зависимостей

Если вы хотите диагностировать только медленные вызовы, отфильтруйте быстрые вызовы.

Замечание

Эта фильтрация искажает статистику, видимую на портале.

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

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

Выборка

Сведения о настройке выборки для приложений ASP.NET и ASP.NET Core см. в статье Sampling в Application Insights.

Служба рабочего процесса

Пакет SDK Application Insights для рабочей службы поддерживает выборку фиксированной частоты и адаптивную выборку. Адаптивная выборка включена по умолчанию. Выборка может быть отключена опцией EnableAdaptiveSampling в ApplicationInsightsServiceOptions.

Чтобы настроить другие параметры выборки, можно использовать следующий пример:

using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.ApplicationInsights.Extensibility;

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
{
   var telemetryProcessorChainBuilder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;

   // Using adaptive sampling
   telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond: 5);

   // Alternately, the following configures adaptive sampling with 5 items per second, and also excludes DependencyTelemetry from being subject to sampling:
   // telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Dependency");
});

builder.Services.AddApplicationInsightsTelemetryWorkerService(new ApplicationInsightsServiceOptions
{
   EnableAdaptiveSampling = false,
});

var app = builder.Build();

Обогащение данных через HTTP

ASP.NET

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

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

ASP.NET Core

HttpContext.Features.Get<RequestTelemetry>().Properties["myProp"] = someData

Конфигурация пакета SDK

В этом разделе

Вы можете настроить пакет SDK Application Insights для ASP.NET, ASP.NET Core и рабочей службы, чтобы изменить конфигурацию по умолчанию.

ASP.NET

Пакет SDK .NET Application Insights состоит из множества пакетов NuGet. Основной пакет предоставляет API для отправки данных телеметрии в Application Insights. Дополнительные пакеты предоставляют модули телеметрии и инициализаторы для автоматического отслеживания телеметрии из приложения и его контекста. Изменив файл конфигурации, можно включить или отключить модули телеметрии и инициализаторы. Можно также задать параметры для некоторых из них.

Файл конфигурации называется ApplicationInsights.config или ApplicationInsights.xml. Имя зависит от типа приложения. Он автоматически добавляется в проект при установке большинства версий пакета SDK.

По умолчанию при использовании автоматизированного опыта из проектов шаблонов Visual Studio, которые поддерживают Add>Application Insights Telemetry, файл ApplicationInsights.config создается в корневой папке проекта. После компиляции он копируется в папку bin. Он также добавляется в веб-приложение агентом Application Insights на сервере IIS.

Нет эквивалентного файла для управления пакетом SDK на веб-странице.

ASP.NET Core

В приложениях ASP.NET Core все изменения конфигурации вносятся в метод ConfigureServices() вашего класса Startup.cs, если не указано иное.

Замечание

В приложениях ASP.NET Core изменение конфигурации путем изменения TelemetryConfiguration.Active не поддерживается.

Служба рабочего процесса

Заданный по умолчанию TelemetryConfiguration, используемый пакетом SDK рабочей службы, аналогичен автоматической настройке, применяемой в приложениях ASP.NET или ASP.NET Core, за исключением инициализаторов телеметрии, используемых для обогащения данных телеметрии из HttpContext.

Вы можете настроить пакет SDK Application Insights для рабочей службы, чтобы изменить конфигурацию по умолчанию. Пользователи пакета SDK для Application Insights ASP.NET Core могут быть знакомы с изменением конфигурации ASP.NET Core с помощью встроенного в ASP.NET Core внедрения зависимостей. Пакет SDK для рабочей службы также основан на аналогичных принципах. Вносите почти все изменения конфигурации в разделе ConfigureServices(), вызывая соответствующие методы на IServiceCollection, как описано в следующем разделе.

Замечание

При использовании пакета SDK для рабочей службы изменение конфигурации путем изменения TelemetryConfiguration.Active не поддерживается и изменения не будут отражены.

Каналы телеметрии

Каналы телеметрии являются неотъемлемой частью пакетов SDK Application Insights. Они управляют буферизацией и передачей данных телеметрии в службу Application Insights. В версиях SDK для .NET и .NET Core есть два встроенных канала телеметрии: InMemoryChannel и ServerTelemetryChannel. В этом разделе описывается каждый канал и показано, как настроить поведение канала.

Замечание

Чтобы просмотреть часто задаваемые вопросы (FAQ), см. часто задаваемые вопросы о каналах телеметрии

Что такое каналы телеметрии?

Каналы телеметрии отвечают за буферизацию элементов телеметрии и отправку их в службу Application Insights, где они хранятся для запроса и анализа. Канал телеметрии — это любой класс, реализующий Microsoft.ApplicationInsights.ITelemetryChannel интерфейс.

Метод Send(ITelemetry item) канала телеметрии вызывается после вызова всех инициализаторов телеметрии и процессоров телеметрии. Таким образом, любые элементы, отброшенные обработчиком телеметрии, не достигают канала. Метод Send() как правило не отправляет элементы в серверную часть мгновенно. Как правило, он буферизирует их в памяти и отправляет их в пакеты для эффективной передачи.

Flush() Избегайте вызовов, если не важно немедленно отправлять буферизованные данные телеметрии. Используйте его только в таких сценариях, как завершение работы приложения, обработка исключений или использование кратковременных процессов, таких как фоновые задания или средства командной строки. В веб-приложениях или длительных службах SDK автоматически обрабатывает передачу телеметрических данных. Вызов Flush() ненужно может вызвать проблемы с производительностью.

Поток живых метрик также имеет настраиваемый канал, который обеспечивает прямую трансляцию данных телеметрии. Этот канал не зависит от обычного канала телеметрии, и этот документ не применяется к нему.

Встроенные каналы телеметрии

Пакеты SDK для Application Insights .NET и .NET Core поставляются с двумя встроенными каналами.

  • InMemoryChannel: Упрощенный канал, который буферизирует элементы в памяти, пока они не будут отправлены. Элементы буферизуются в памяти и сбрасываются каждые 30 секунд или когда в буфере накапливается 500 элементов. Этот канал предлагает минимальные гарантии надежности, так как он не повторяет отправку данных телеметрии после сбоя. Этот канал также не хранит элементы на диске. Таким образом, любые неотосланные элементы теряются окончательно после завершения работы приложения, независимо от того, корректное это завершение или нет. Этот канал реализует метод Flush(), который можно использовать для принудительной очистки любых телеметрических элементов, находящихся в памяти, синхронно. Этот канал идеально подходит для краткосрочных приложений, где лучше всего подходит синхронное очищение.

    Этот канал является частью более крупного пакета NuGet Microsoft.ApplicationInsights и является каналом по умолчанию, используемым пакетом SDK, если ничего другого не настроено.

  • ServerTelemetryChannel: Более сложный канал с политиками повторных попыток и возможностью хранения данных на локальном диске. Этот канал повторяет отправку телеметрических данных при возникновении временных ошибок. Этот канал также использует локальное хранилище дисков для хранения элементов на диске во время сбоя сети или больших томов телеметрии. Из-за этих механизмов повторных попыток и локального дискового хранилища этот канал считается более надежным. Мы рекомендуем использовать его для всех рабочих сценариев. Этот канал используется по умолчанию для ASP.NET и ASP.NET Core приложений, настроенных в соответствии с официальной документацией. Этот канал оптимизирован для сценариев сервера с длительными процессами. Метод Flush() , реализованный этим каналом, не синхронный.

    Этот канал поставляется как пакет NuGet Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet и автоматически приобретается при использовании пакета NuGet Microsoft.ApplicationInsights.Web или Microsoft.ApplicationInsights.AspNetCore NuGet.

Настройка канала телеметрии

Канал телеметрии настраивается путем настройки активной конфигурации телеметрии. Для приложений ASP.NET конфигурация включает установку экземпляра канала телеметрии на TelemetryConfiguration.Active или путем изменения ApplicationInsights.config. Для приложений ASP.NET Core конфигурация включает добавление канала в контейнер внедрения зависимостей.

В следующих разделах показаны примеры настройки StorageFolder параметра для канала в различных типах приложений. StorageFolder — это только один из настраиваемых параметров. Полный список параметров конфигурации см. в разделе "Настраиваемые параметры" в разделе каналов далее в этой статье.

ASP.NET

Вариант 1. Конфигурация в коде

Следующий код настраивает ServerTelemetryChannel экземпляр с StorageFolder заданным пользовательским расположением. Добавьте этот код в начале приложения, как правило, в Application_Start() методе в 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;
}

Вариант 2. Конфигурация в ApplicationInsights.config

В следующем разделе из ApplicationInsights.config показан канал ServerTelemetryChannel, настроенный на использование настраиваемого расположения с помощью StorageFolder.

    <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>
ASP.NET Core

Измените ConfigureServices метод Startup.cs класса, как показано здесь:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;

public void ConfigureServices(IServiceCollection services)
{
    // This sets up ServerTelemetryChannel with StorageFolder set to a custom location.
    services.AddSingleton(typeof(ITelemetryChannel), new ServerTelemetryChannel() {StorageFolder = @"d:\temp\applicationinsights" });

    services.AddApplicationInsightsTelemetry();
}

Это важно

Настройка канала с помощью TelemetryConfiguration.Active не поддерживается для приложений ASP.NET Core.

Переопределение ServerTelemetryChannel

Каналом телеметрии по умолчанию является ServerTelemetryChannel. В следующем примере показано, как переопределить его.

using Microsoft.ApplicationInsights.Channel;

var builder = WebApplication.CreateBuilder(args);

// Use the following to replace the default channel with InMemoryChannel.
// This can also be applied to ServerTelemetryChannel.
builder.Services.AddSingleton(typeof(ITelemetryChannel), new InMemoryChannel() {MaxTelemetryBufferCapacity = 19898 });

builder.Services.AddApplicationInsightsTelemetry();

var app = builder.Build();

Замечание

Если вы хотите очистить буфер, см. раздел "Очистка данных". Например, может потребоваться очистить буфер, если вы используете пакет SDK в приложении, которое завершает работу.

Служба рабочего процесса

Канал по умолчанию .ServerTelemetryChannel Его можно переопределить, как показано в следующем примере:

using Microsoft.ApplicationInsights.Channel;

    public void ConfigureServices(IServiceCollection services)
    {
        // Use the following to replace the default channel with InMemoryChannel.
        // This can also be applied to ServerTelemetryChannel.
        services.AddSingleton(typeof(ITelemetryChannel), new InMemoryChannel() {MaxTelemetryBufferCapacity = 19898 });

        services.AddApplicationInsightsTelemetryWorkerService();
    }

Настройка в коде для консольных приложений

Для консольных приложений код совпадает как для .NET, так и для .NET Core:

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

Операционные сведения о ServerTelemetryChannel

ServerTelemetryChannel сохраняет поступающие элементы в буфере в памяти. Элементы сериализуются, сжимаются и хранятся в Transmission экземпляре каждые 30 секунд или при буферизации 500 элементов. Один Transmission экземпляр содержит до 500 элементов и представляет пакет телеметрии, который отправляется через один вызов HTTPS в службу Application Insights.

По умолчанию можно отправлять не более 10 Transmission экземпляров параллельно. Если телеметрия поступает быстрее, или если сеть или серверная часть Application Insights работают медленно, Transmission экземпляры хранятся в памяти. Емкость этого буфера в памяти Transmission по умолчанию составляет 5 МБ. Когда превышена емкость в памяти, экземпляры Transmission хранятся на локальном диске вплоть до 50 МБ.

Transmission экземпляры хранятся на локальном диске даже при проблемах с сетью. Только те элементы, которые хранятся на локальном диске, выживают сбой приложения. Они отправляются всякий раз, когда приложение запускается снова. Если проблемы с сетью сохраняются, ServerTelemetryChannel использует логику экспоненциальной обратной передачи от 10 секунд до 1 часа до повторных попыток отправки данных телеметрии.

Настраиваемые параметры в каналах

Полный список настраиваемых параметров для каждого канала см. в следующей статье.

Ниже приведены наиболее часто используемые параметры для ServerTelemetryChannel:

  • MaxTransmissionBufferCapacity: максимальный объем памяти в байтах, используемый каналом для буферизации передач в памяти. После достижения этой емкости новые элементы хранятся непосредственно на локальном диске. Значение по умолчанию — 5 МБ. Установка более высокого значения приводит к меньшему использованию диска, но помните, что элементы в памяти теряются, если приложение завершает работу.

  • MaxTransmissionSenderCapacity: максимальное количество экземпляров Transmission , отправляемых в Application Insights одновременно. Значение по умолчанию — 10. Этот параметр можно настроить на более высокое число, которое рекомендуется при создании огромного объема телеметрии. Высокий объем обычно возникает во время нагрузочного тестирования или при отключении выборки.

  • StorageFolder: папка, используемая каналом для хранения элементов на диске по мере необходимости. В Windows используется %LOCALAPPDATA% или %TEMP%, если ни один другой путь не указан явным образом. В средах, отличных от Windows, по умолчанию используются следующие расположения (в порядке): %TMPDIR%, /var/tmp/ или /tmp/.

Какой канал следует использовать?

Рекомендуется использовать ServerTelemetryChannel для большинства рабочих сценариев, включающих долго функционирующие приложения. Дополнительные сведения об очистке телеметрии см. в статье об использовании Flush().

Когда следует использовать Flush()

Метод Flush() немедленно отправляет любые буферизованные данные телеметрии. Однако его следует использовать только в определенных сценариях.

Flush() следует использовать в следующих случаях:

  • Перед завершением работы приложения вы хотите убедиться, что данные телеметрии отправлены.
  • Вы находитесь в обработчике исключений и должны гарантировать доставку телеметрии.
  • Вы пишете короткий процесс, например фоновое задание или средство CLI, которое завершается быстро.

Избегайте использования Flush() в длительных приложениях, таких как веб-службы. Пакет SDK автоматически управляет буферизацией и передачей. Выполнение Flush() без необходимости может вызвать проблемы с производительностью и не гарантирует отправку всех данных, особенно при использовании ServerTelemetryChannel, который не осуществляет очистку синхронно.

Модули телеметрии

Application Insights автоматически собирает данные телеметрии о конкретных рабочих нагрузках, не требуя ручного отслеживания пользователем.

Следующие модули автоматического сбора данных включены по умолчанию. Их можно отключать или настраивать для изменения поведения по умолчанию.

ASP.NET

Каждый модуль телеметрии собирает определенные типы данных и использует основной API для отправки данных. Модули устанавливаются различными пакетами NuGet, которые также добавляют необходимые строки в файл .config.

Area Description
Отслеживание запросов Собирает данные телеметрии запроса (время отклика, код результата) для входящих веб-запросов.

Модуль:Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Отслеживание зависимостей Собирает данные телеметрии о исходящих зависимостях (HTTP-вызовы, вызовы SQL). Чтобы работать в IIS, установите агент Application Insights. Вы также можете создать пользовательскую систему отслеживания зависимостей с помощью API TrackDependency. Поддерживает автоинструментирование со Службой приложений и мониторингом виртуальных машин и масштабируемых наборов виртуальных машин.

Модуль:Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.DependencyCollector
Счетчики производительности Собирает Windows счетчики производительности (ЦП, память, сетевая загрузка из установок IIS). Укажите счетчики (включая пользовательские). Дополнительные сведения см. в разделе "Сбор счетчиков производительности системы".

Модуль:Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule
NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
Счетчики событий Собирает .NET EventCounters. Рекомендуется использовать ASP.NET Core и кроссплатформенные решения вместо счетчиков производительности Windows.

Модуль:EventCounterCollectionModule (пакет SDK ≥ 2.8.0)
Динамические метрики (QuickPulse) Собирает данные телеметрии для панели Live Metrics.

Модуль:QuickPulseTelemetryModule
Пульс (служба приложений) Отправляет пульс и пользовательские метрики для среды службы приложений.

Модуль:AppServicesHeartbeatTelemetryModule
Пульс (виртуальные машины и масштабируемые наборы виртуальных машин) Отправляет сигналы состояния и пользовательские метрики для среды виртуальных машин Azure.

Модуль:AzureInstanceMetadataTelemetryModule
Диагностика телеметрии Сообщает об ошибках в коде инструментирования Application Insights (например, отсутствующих счетчиков, ITelemetryInitializer исключений). Данные телеметрии отображаются в поиске диагностики.

Модуль:Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule
NuGet:Microsoft.ApplicationInsights

Заметка: Если вы устанавливаете только этот пакет, файл ApplicationInsights.config не создается автоматически.
Режим разработчика (подключенный отладчик) Принуждает TelemetryChannel мгновенно отправлять элементы при присоединении отладчика. Уменьшает задержку, но увеличивает нагрузку на ЦП или сеть.

Модуль:Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule
NuGet:Application Insights Windows Server
Отслеживание исключений (Интернет) Отслеживает необработанные исключения в веб-приложениях. См. сведения о сбоях и исключениях.

Модуль:Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
Отслеживание исключений (необнаруженные/необработанные) Отслеживает незамеченные исключения задач и необработанные исключения для рабочих ролей, служб Windows и консольных приложений.

Модули:
 • Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule
 • Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule
NuGet:Microsoft.ApplicationInsights.WindowsServer
Отслеживание EventSource Отправляет настроенные события EventSource в Application Insights в качестве трассировок.

Модуль:Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule
NuGet:Microsoft.ApplicationInsights.EventSourceListener
Сборщик ETW Отправляет настроенные события поставщика ETW в Application Insights в виде трассировок.

Модуль:Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule
NuGet:Microsoft.ApplicationInsights.EtwCollector
Базовый API (а не модуль) Основной API , используемый другими компонентами телеметрии и для пользовательской телеметрии.

Модуль:Microsoft.ApplicationInsights package
NuGet:Microsoft.ApplicationInsights
Заметка: Если вы устанавливаете только этот пакет, файл ApplicationInsights.config не создается автоматически.
ASP.NET Core
Area Description
Отслеживание запросов Встроенное отслеживание запросов с помощью интеграции с Application Insights ASP.NET Core.

Модуль:Нет отдельного класса модуля.
NuGet:Microsoft.ApplicationInsights.AspNetCore
Отслеживание зависимостей Через сборщик зависимостей.

NuGet:Microsoft.ApplicationInsights.DependencyCollector
Счетчики производительности только Windows! На кроссплатформенной платформе используйте EventCounterCollectionModule (см. следующую строку).

NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
Счетчики событий Собирает .NET EventCounters. Рекомендуется использовать ASP.NET Core и кроссплатформенные решения вместо счетчиков производительности Windows.

Модуль:EventCounterCollectionModule (пакет SDK 2.8.0 и более поздние версии)
NuGet:Microsoft.ApplicationInsights.EventCounterCollector
Динамические метрики (QuickPulse) Живые метрики поддерживаются в интеграции ASP.NET Core с Application Insights.

Модуль:Нет отдельного класса модуля.
NuGet:Microsoft.ApplicationInsights.AspNetCore
Сборщик пульсов (служба приложений) Отправляет пульс (как пользовательские метрики) с подробными сведениями о среде службы приложений. Встроенный с помощью базового пакета SDK при размещении в службе приложений.

Модуль:Нет отдельного класса модуля.
NuGet:Microsoft.ApplicationInsights.AspNetCore
Сборщик пульсов (виртуальные машины и масштабируемые наборы виртуальных машин) Отправляет сигналы 'heartbeat' в виде пользовательских метрик с подробными сведениями о виртуальной машине в Azure. Встраивается с помощью базового пакета SDK при размещении на виртуальных машинах Azure и масштабируемых наборах виртуальных машин Azure.

Модуль:Нет отдельного класса модуля.
NuGet:Microsoft.ApplicationInsights.AspNetCore
Диагностика телеметрии Сообщает об ошибках в самом коде инструментирования Application Insights (например, не удается получить доступ к счетчикам производительности, ITelemetryInitializer вызывает исключение). Данные телеметрии отображаются в поиске диагностики.

Модуль:Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule
NuGet:Microsoft.ApplicationInsights
Режим разработчика (подключенный отладчик) Доступно одно и то же поведение; класс является частью пакета Windows Server.

Модуль:Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule
NuGet:Microsoft.ApplicationInsights.WindowsServer
Отслеживание исключений (Интернет) Автоматическое отслеживание исключений в интеграции с Application Insights ASP.NET Core

Модуль:Нет отдельного класса модуля.
NuGet:Microsoft.ApplicationInsights.AspNetCore
Отслеживание исключений (необнаруженные/необработанные) Похожее поведение через среду выполнения или интеграцию ASP.NET Core; имена классов специфичны для Windows Server.

NuGet:Microsoft.ApplicationInsights.WindowsServer
Отслеживание EventSource Отправляет настроенные события EventSource в Application Insights в качестве трассировок.

Модуль:Microsoft.ApplicationInsights.EventSourceListener.EventSourceTelemetryModule
NuGet:Microsoft.ApplicationInsights.EventSourceListener
Сборщик ETW только для Windows (ETW) Отправляет настроенные события поставщика ETW в Application Insights в виде трассировок.

Модуль:Microsoft.ApplicationInsights.EtwCollector.EtwCollectorTelemetryModule
NuGet:Microsoft.ApplicationInsights.EtwCollector
Базовый API (а не модуль) Основной API , используемый другими компонентами телеметрии и для пользовательской телеметрии.

Модуль:Microsoft.ApplicationInsights package
NuGet:Microsoft.ApplicationInsights

Настройка модулей телеметрии

ASP.NET

TelemetryModules Используйте раздел в ApplicationInsights.config для настройки, добавления или удаления модулей. В нижеприведённых примерах:

  • Настройте DependencyTrackingTelemetryModule (включите инжекцию заголовков W3C).
  • Настройте EventCounterCollectionModule (очистите настройки по умолчанию и добавьте один счетчик).
  • Отключите сбор счетчиков производительности, удалив 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>

Замечание

Точный набор модулей, присутствующих в вашем ApplicationInsights.config приложении, зависит от установленных пакетов SDK.

ASP.NET Core

Вариант 1. Настройка модулей телеметрии с помощью ConfigureTelemetryModule

Чтобы настроить любой параметр по умолчанию TelemetryModule, используйте метод расширения ConfigureTelemetryModule<T> на IServiceCollection, как показано в следующем примере:

using Microsoft.ApplicationInsights.DependencyCollector;
using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// The following configures DependencyTrackingTelemetryModule.
// Similarly, any other default modules can be configured.
builder.Services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, o) =>
        {
            module.EnableW3CHeadersInjection = true;
        });

// The following removes all default counters from EventCounterCollectionModule, and adds a single one.
builder.Services.ConfigureTelemetryModule<EventCounterCollectionModule>((module, o) =>
        {
            module.Counters.Add(new EventCounterCollectionRequest("System.Runtime", "gen-0-size"));
        });

// The following removes PerformanceCollectorModule to disable perf-counter collection.
// Similarly, any other default modules can be removed.
var performanceCounterService = builder.Services.FirstOrDefault<ServiceDescriptor>(t => t.ImplementationType == typeof(PerformanceCollectorModule));
if (performanceCounterService != null)
{
    builder.Services.Remove(performanceCounterService);
}

var app = builder.Build();

Вариант 2. Настройка модулей телеметрии с помощью ApplicationInsightsServiceOptions

В SDK версий 2.12.2 и более поздних вы можете изменить несколько распространенных параметров, передавая ApplicationInsightsServiceOptions в AddApplicationInsightsTelemetry, как показано в этом примере:

var builder = WebApplication.CreateBuilder(args);

var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();

// Disables adaptive sampling.
aiOptions.EnableAdaptiveSampling = false;

// Disables live metrics (also known as QuickPulse).
aiOptions.EnableQuickPulseMetricStream = false;

builder.Services.AddApplicationInsightsTelemetry(aiOptions);
var app = builder.Build();

В этой таблице содержится полный список параметров ApplicationInsightsServiceOptions.

Setting Description По умолчанию
Включить Модуль Сбора Счетчиков Производительности Включение и отключение PerformanceCounterCollectionModule. True
Модуль телеметрии отслеживания запросов (EnableRequestTracking) Включение и отключение RequestTrackingTelemetryModule. True
EnableEventCounterCollectionModule (Модуль сбора счётчиков событий) Включение и отключение EventCounterCollectionModule. True
Включить модуль телеметрии отслеживания зависимостей Включение и отключение DependencyTrackingTelemetryModule. True
Включить модуль телеметрии Heartbeat для служб приложений Включение и отключение AppServicesHeartbeatTelemetryModule. True
Включить модуль телеметрии метаданных экземпляра Azure Включение и отключение AzureInstanceMetadataTelemetryModule. True
Включить QuickPulseMetricStream Включение и отключение функции LiveMetrics. True
Включить адаптивную выборку Включение и отключение адаптивной выборки. True
Включить HeartBeat Включение и отключение функции пульса. Периодически (15 минут по умолчанию) отправляется пользовательская метрика с именем HeartbeatState с информацией о среде выполнения, например, версии .NET и сведениях о среде Azure, если применимо. True
ДобавитьАвтоматическиСобранныйМетрическийЭкстрактор Включение и отключение AutoCollectedMetrics extractor. Этот обработчик телеметрии отправляет предварительно подготовленные метрики о запросах и зависимостях перед началом выборки. True
ПараметрыЗапросов.ОтслеживаниеИсключений Включение и отключение отчетности о необработанных исключениях модулем сбора запросов. False в netstandard2.0 (так как исключения отслеживаются с ApplicationInsightsLoggerProvider). Значение True в противном случае.
ВключитьМодульДиагностическойТелеметрии (EnableDiagnosticsTelemetryModule) Включение и отключение DiagnosticsTelemetryModule. Отключение приводит к пропускам следующих параметров: EnableHeartbeat, EnableAzureInstanceMetadataTelemetryModuleи EnableAppServicesHeartbeatTelemetryModule. True

Наиболее актуальный список см. в разделе Настраиваемые параметры в ApplicationInsightsServiceOptions.

Рекомендация по настройке пакета SDK для Microsoft.ApplicationInsights.AspNetCore 2.15.0 и выше

В пакете SDK Microsoft.ApplicationInsights.AspNetCore версии 2.15.0 и более поздних версий настройте все параметры, доступные в ApplicationInsightsServiceOptions, в том числе ConnectionString. Используйте экземпляр приложения IConfiguration . Параметры должны находиться в разделе ApplicationInsights, как показано в следующем примере. Следующий раздел из appsettings.json настраивает строку подключения и отключает сбор адаптивных выборок и показателей производительности.

{
    "ApplicationInsights": {
    "ConnectionString": "<YOUR-CONNECTION-STRING>",
    "EnableAdaptiveSampling": false,
    "EnablePerformanceCounterCollectionModule": false
    }
}

Если используется builder.Services.AddApplicationInsightsTelemetry(aiOptions) для ASP.NET Core 6.0 или services.AddApplicationInsightsTelemetry(aiOptions) для ASP.NET Core 3.1 и более ранних версий, он переопределяет параметры из Microsoft.Extensions.Configuration.IConfiguration.

Служба рабочего процесса

Вариант 1. Настройка модулей телеметрии с помощью ConfigureTelemetryModule

Application Insights использует модули телеметрии для автоматического сбора данных телеметрии о конкретных рабочих нагрузках без необходимости отслеживания вручную.

Следующие модули автоколлекции включены по умолчанию. Эти модули отвечают за автоматический сбор данных телеметрии. Их можно отключать или настраивать для изменения поведения по умолчанию.

  • DependencyTrackingTelemetryModule
  • PerformanceCollectorModule
  • QuickPulseTelemetryModule
  • AppServicesHeartbeatTelemetryModule (в настоящее время возникает проблема, связанная с этим модулем телеметрии. Временное решение см. в статье GitHub проблема 1689.)
  • AzureInstanceMetadataTelemetryModule

Чтобы настроить модуль телеметрии по умолчанию, используйте метод расширения ConfigureTelemetryModule на IServiceCollection, как показано в примере ниже.

    using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse;
    using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector;

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetryWorkerService();

            // The following configures QuickPulseTelemetryModule.
            // Similarly, any other default modules can be configured.
            services.ConfigureTelemetryModule<QuickPulseTelemetryModule>((module, o) =>
            {
                module.AuthenticationApiKey = "<YOUR-API-KEY-HERE>";
            });

            // The following removes PerformanceCollectorModule to disable perf-counter collection.
            // Similarly, any other default modules can be removed.
            var performanceCounterService = services.FirstOrDefault<ServiceDescriptor>
                                        (t => t.ImplementationType == typeof(PerformanceCollectorModule));
            if (performanceCounterService != null)
            {
                services.Remove(performanceCounterService);
            }
    }

Вариант 2. Настройка модулей телеметрии с помощью ApplicationInsightsServiceOptions

Вы можете изменить несколько стандартных параметров, передавая ApplicationInsightsServiceOptions в AddApplicationInsightsTelemetryWorkerService, как в следующем примере.

using Microsoft.ApplicationInsights.WorkerService;

public void ConfigureServices(IServiceCollection services)
{
    var aiOptions = new ApplicationInsightsServiceOptions();
    // Disables adaptive sampling.
    aiOptions.EnableAdaptiveSampling = false;

    // Disables live metrics (also known as QuickPulse).
    aiOptions.EnableQuickPulseMetricStream = false;
    services.AddApplicationInsightsTelemetryWorkerService(aiOptions);
}

ApplicationInsightsServiceOptions в этом пакете SDK находится в пространстве имен Microsoft.ApplicationInsights.WorkerService в отличие от Microsoft.ApplicationInsights.AspNetCore.Extensions в пакете SDK ASP.NET Core.

В следующей таблице перечислены часто используемые параметры ApplicationInsightsServiceOptions.

Setting Description По умолчанию
Включить QuickPulseMetricStream Включение и отключение функции динамических метрик. True
Включить адаптивную выборку Включение и отключение адаптивной выборки. True
Включить HeartBeat Включение и отключение функции Heartbeats, которая периодически (15-мин по умолчанию) отправляет пользовательскую метрику с именем HeartBeatState с информацией о среде выполнения, например о версии .NET и Azure среде, если это применимо. True
ДобавитьАвтоматическиСобранныйМетрическийЭкстрактор Включить/Отключить средство извлечения AutoCollectedMetrics, которое является обработчиком телеметрии и отправляет предварительно подготовленные метрики о запросах и зависимостях до выполнения выборки. True
ВключитьМодульДиагностическойТелеметрии (EnableDiagnosticsTelemetryModule) Включение и отключение DiagnosticsTelemetryModule. Отключение этого параметра приводит к пропускам следующих параметров: EnableHeartbeat, EnableAzureInstanceMetadataTelemetryModuleи EnableAppServicesHeartbeatTelemetryModule. True

Наиболее актуальный список см. в настраиваемых параметрах ApplicationInsightsServiceOptions.

Отключение телеметрии

ASP.NET

В файле конфигурации есть узел для каждого модуля. Чтобы отключить модуль, удалите узел или закомментируйте его.

ASP.NET Core

Если вы хотите отключить телеметрию условно и динамически, вы можете получить экземпляр TelemetryConfiguration через контейнер внедрения зависимостей ASP.NET Core в любом месте вашего кода и установить для него флаг DisableTelemetry.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// any custom configuration can be done here:
builder.Services.Configure<TelemetryConfiguration>(x => x.DisableTelemetry = true);

var app = builder.Build();

Предыдущий пример кода предотвращает отправку данных телеметрии в Application Insights. Это не мешает модулям автоматического сбора собирать телеметрию. Если вы хотите удалить определенный модуль автоколлекции, ознакомьтесь с модулями телеметрии.

Служба рабочего процесса

Если вы хотите отключить телеметрию условно и динамически, вы можете получить экземпляр TelemetryConfiguration через контейнер внедрения зависимостей ASP.NET Core в любом месте вашего кода и установить для него флаг DisableTelemetry.

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplicationInsightsTelemetryWorkerService();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, TelemetryConfiguration configuration)
    {
        configuration.DisableTelemetry = true;
        ...
    }

Строка соединения

Этот параметр определяет ресурс Application Insights, в котором отображаются данные. Как правило, вы создаете отдельный ресурс с отдельной строкой подключения для каждого из приложений.

См. строки подключения в Application Insights для примеров кода.

Если вы хотите динамически задать connection string, например отправить результаты из приложения в разные ресурсы, можно опустить connection string из файла конфигурации и задать его в коде.

ASP.NET

Чтобы задать строку подключения для всех экземпляров TelemetryClient, включая стандартные модули телеметрии, выполните этот шаг в методе инициализации, например, в файле global.aspx.cs в ASP.NET службе.

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights;

    protected void Application_Start()
    {
        TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
        configuration.ConnectionString = "<YOUR-CONNECTION-STRING>";
        var telemetryClient = new TelemetryClient(configuration);

Если вы хотите отправить определенный набор событий другому ресурсу, можно задать ключ для конкретного клиента телеметрии:


    var tc = new TelemetryClient();
    tc.Context.ConnectionString = "<YOUR-CONNECTION-STRING>";
    tc.TrackEvent("myEvent");
    // ...

Чтобы получить новую строку подключения, создайте новый ресурс в портале Application Insights.

ASP.NET Core

В ASP.NET Core настройте connection string в Program.cs во время запуска приложения с помощью TelemetryConfiguration из контейнера внедрения зависимостей (DI):

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights;

var builder = WebApplication.CreateBuilder(args);

// Add Application Insights
builder.Services.AddApplicationInsightsTelemetry();

var app = builder.Build();

// Resolve TelemetryConfiguration from DI and set the connection string
var config = app.Services.GetRequiredService<TelemetryConfiguration>();
config.ConnectionString = "<YOUR-CONNECTION-STRING>";

app.Run();

Если вы хотите отправить определенный набор событий другому ресурсу, можно создать новый экземпляр объекта TelemetryClient и явно задать его строку подключения.

using Microsoft.ApplicationInsights;

var tc = new TelemetryClient();
tc.Context.ConnectionString = "<YOUR-CONNECTION-STRING>";
tc.TrackEvent("myEvent");
// ...

Поставщик ApplicationId

Замечание

Для ASP.NET этот поставщик доступен начиная с пакета SDK версии 2.6.0*.

Этот поставщик предназначен для поиска идентификатора приложения на основе строки подключения. Идентификатор приложения включается в RequestTelemetry и DependencyTelemetry, и используется для определения корреляции на портале.

Эта функция доступна по параметру TelemetryConfiguration.ApplicationIdProvider.

Интерфейс: IApplicationIdProvider

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

Мы предоставляем две реализации в пакете SDK Microsoft.ApplicationInsights : ApplicationInsightsApplicationIdProvider и DictionaryApplicationIdProvider.

ApplicationInsightsApplicationIdProvider

Это оболочка для API профилей. Он регулирует запросы и кэширует результаты. Этот поставщик автоматически включается при установке Microsoft.ApplicationInsights.DependencyCollector или Microsoft.ApplicationInsights.Web.

Класс предоставляет необязательное свойство ProfileQueryEndpoint. По умолчанию для него задано значение https://dc.services.visualstudio.com/api/profiles/{0}/appId.

Если необходимо настроить прокси-сервер, мы рекомендуем осуществить проксирование базового адреса и гарантировать включение /api/profiles/{0}/appId пути. При выполнении программы, {0} заменяется на строку подключения для каждого запроса.

ASP.NET

Пример конфигурации с помощью 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>

Пример конфигурации с помощью кода

TelemetryConfiguration.Active.ApplicationIdProvider = new ApplicationInsightsApplicationIdProvider();
ASP.NET Core

Замечание

В ASP.NET Core файл ApplicationInsights.config нет. Настройка выполняется путем внедрения зависимостей (DI) в Program.cs или Startup.cs.

Вы можете переопределить поставщика по умолчанию или настроить его ProfileQueryEndpoint.

using Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId;

var builder = WebApplication.CreateBuilder(args);

// Add Application Insights
builder.Services.AddApplicationInsightsTelemetry();

// Replace default provider with custom configuration
builder.Services.AddSingleton<IApplicationIdProvider>(sp =>
    new ApplicationInsightsApplicationIdProvider
    {
        ProfileQueryEndpoint = "https://custom-proxy/api/profiles/{0}/appId"
    });

var app = builder.Build();
app.Run();

DictionaryApplicationIdProvider

Этот статический поставщик использует настроенные пары строки подключения/идентификатора приложения.

Этот класс имеет свойство Defined, которое представляет собой пару Dictionary<string,string> пар connection string/идентификаторов приложения.

Этот класс имеет необязательное свойство Next, которое можно использовать для настройки другого провайдера, если запрашиваемая строка подключения отсутствует в вашей конфигурации.

ASP.NET

Пример конфигурации с помощью ApplicationInsights.config

<ApplicationInsights>
    ...
    <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.DictionaryApplicationIdProvider, Microsoft.ApplicationInsights">
        <Defined>
            <Type key="ConnectionString_1" value="ApplicationId_1"/>
            <Type key="ConnectionString_2" value="ApplicationId_2"/>
        </Defined>
        <Next Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
    </ApplicationIdProvider>
    ...
</ApplicationInsights>

Пример конфигурации с помощью кода

TelemetryConfiguration.Active.ApplicationIdProvider = new DictionaryApplicationIdProvider{
 Defined = new Dictionary<string, string>
    {
        {"ConnectionString_1", "ApplicationId_1"},
        {"ConnectionString_2", "ApplicationId_2"}
    }
};
ASP.NET Core
using Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// Register DictionaryApplicationIdProvider
builder.Services.AddSingleton<IApplicationIdProvider>(sp =>
    new DictionaryApplicationIdProvider
    {
        Defined = new Dictionary<string, string>
        {
            { "ConnectionString_1", "ApplicationId_1" },
            { "ConnectionString_2", "ApplicationId_2" }
        },
        Next = new ApplicationInsightsApplicationIdProvider() // optional fallback
    });

var app = builder.Build();
app.Run();

Добавление наблюдения на стороне клиента

В предыдущих разделах приведено руководство по методам автоматической и ручной настройки наблюдения на стороне сервера. Чтобы добавить клиентский мониторинг, используйте клиентский пакет SDK JavaScript. Вы можете отслеживать клиентские транзакции любой веб-страницы, добавив скрипт загрузчика пакета SDK JavaScript (Web) перед закрывающим </head> тегом HTML страницы.

Хотя можно вручную добавить скрипт загрузчика пакета SDK JavaScript (Web) в заголовок каждой HTML-страницы, рекомендуется добавить скрипт загрузчика пакета SDK JavaScript (Web) на основную страницу. Это действие внедряет скрипт загрузчика пакета SDK JavaScript (Web) на все страницы сайта.

ASP.NET

Для приложения на основе шаблона ASP.NET MVC из этой статьи файл, который необходимо изменить, _Layout.cshtml. Его можно найти в разделе "Общие представления>". Чтобы добавить мониторинг на стороне клиента, откройте _Layout.cshtml и следуйте инструкциям по настройке загрузчика SDK JavaScript (Web) в статье о конфигурации JavaScript SDK на стороне клиента.

ASP.NET Core

Если у вашего приложения есть клиентские компоненты, выполните следующие шаги, чтобы начать сбор данных телеметрии использования с помощью внедрения скрипта загрузчика SDK JavaScript (Web) через конфигурацию.

  1. В _ViewImports.cshtml добавьте внедрение:

    @inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet
    
  2. В _Layout.cshtml вставьте HtmlHelper в конец <head> раздела, но перед любым другим скриптом. Если вы хотите сообщать о любой пользовательской телеметрии JavaScript со страницы, вставьте её после этого фрагмента кода:

        @Html.Raw(JavaScriptSnippet.FullScript)
    </head>
    

В качестве альтернативы использованию FullScriptScriptBody доступно начиная с пакета SDK Application Insights для ASP.NET Core версии 2.14. Используйте параметр ScriptBody, если необходимо управлять тегом <script> для задания политики безопасности содержимого:

<script> // apply custom changes to this script tag.
    @Html.Raw(JavaScriptSnippet.ScriptBody)
</script>

Имена файлов CSHTML , указанные ранее, относятся к шаблону приложения MVC по умолчанию. В конечном счете, если вы хотите правильно включить мониторинг на стороне клиента для приложения, скрипт загрузчика пакета SDK JavaScript (Web) должен отображаться в <head> разделе каждой страницы приложения, которую вы хотите отслеживать. Добавьте скрипт загрузчика пакета SDK JavaScript (Web) в _Layout.cshtml в шаблон приложения, чтобы включить мониторинг на стороне клиента.

Если проект не включает _Layout.cshtml, вы по-прежнему можете добавить клиентский мониторинг , добавив скрипт загрузчика пакета SDK JavaScript (Web) в эквивалентный файл, который управляет <head> всеми страницами в приложении. Кроме того, можно добавить скрипт загрузчика пакета SDK JavaScript (Web) на несколько страниц, но не рекомендуется.

Замечание

Внедрение JavaScript открывает возможности для настройки по умолчанию. Если требуется конфигурация за пределами настройки строки подключения, необходимо удалить автоматическое внедрение, как это описано, и вручную добавить JavaScript SDK.

Основной API для пользовательских событий и метрик

Вставьте несколько строк кода в приложение, чтобы узнать, что пользователи делают с ним, или помочь диагностировать проблемы. Данные телеметрии можно отправлять с устройств и настольных приложений, веб-клиентов и веб-серверов. Используйте API телеметрии Application Insights для отправки пользовательских событий и метрик и собственных версий стандартной телеметрии. Этот API является тем же API, что и стандартные сборщики данных Application Insights.

Сводка по API

Основной API является универсальным для всех платформ, помимо нескольких вариантов, таких как GetMetric (только .NET).

Метод Используется для
TrackPageView Страницы, экраны, панели или формы.
TrackEvent Действия пользователя и другие события. Используется для отслеживания поведения пользователя или отслеживания производительности.
GetMetric Нульмерные и многомерные метрики, централизованно настроенная агрегация, только C#.
TrackMetric Измерения производительности, такие как длина очереди, не связанная с конкретными событиями.
TrackException Регистрация исключений для диагностики. Отследите, где они происходят по отношению к другим событиям и исследуйте трассировки стека.
TrackRequest Ведение журнала частоты и длительности запросов сервера для анализа производительности.
TrackTrace Сообщения журнала диагностики ресурсов. Вы также можете записывать сторонние журналы.
TrackDependency Ведение журнала длительности и частоты вызовов внешних компонентов, от которые зависит ваше приложение.

Свойства и метрики можно прикрепить к большинству этих вызовов телеметрии.

Prerequisites

Если у вас еще нет ссылки на пакет SDK Application Insights:

  1. Добавьте пакет SDK Application Insights в проект.

  2. В коде устройства или веб-сервера включите следующее:

    using Microsoft.ApplicationInsights;
    

Получить экземпляр TelemetryClient

Получите экземпляр TelemetryClient:

Замечание

Если вы используете Azure Functions версии 2+ или Azure WebJobs версии 3+, см. раздел Monitor Azure Functions.

Замечание

Для приложений ASP.NET Core и не-HTTP/Worker для .NET/.NET Core получите экземпляр TelemetryClient из контейнера внедрения зависимостей, как это описано в соответствующей документации.

private TelemetryClient telemetry = new TelemetryClient();

Если появится сообщение, которое сообщает, что этот метод устарел, дополнительные сведения см. в статье microsoft/ApplicationInsights-dotnet#1152 .

Входящие HTTP-запросы автоматически записываются. Возможно, потребуется создать дополнительные экземпляры TelemetryClient для других модулей приложения. Например, в классе промежуточной системы может быть один TelemetryClient экземпляр для регистрации событий бизнес-логики. Вы можете задать такие свойства, как UserId и DeviceId определить компьютер. Эта информация присоединяется ко всем событиям, которые экземпляр отправляет.

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

Замечание

TelemetryClient является потокобезопасным.

TrackEvent

В Application Insights настраиваемое событие — это точка данных, которую можно отобразить в обозревателе метрик в виде агрегированного количества и в поиске в качестве отдельных вхождений. (Это не связано с MVC или другой платформой "события".)

Вставьте TrackEvent вызовы в код для подсчета различных событий. Например, может потребоваться отслеживать частоту выбора определенной функции пользователями. Или вы можете узнать, насколько часто они достигают определенных целей или делают определенные типы ошибок.

Например, в игровом приложении отправляет событие, когда пользователь выигрывает игру:

telemetry.TrackEvent("WinGame");

Пользовательские события в Log Analytics

Данные телеметрии доступны в таблице на вкладке Application Insights Logs или в опыте использования. События могут поступать из trackEvent(..) или плагина автоколлекции Click Analytics.

Если выборка выполняется, свойство itemCount показывает значение больше 1. Например, itemCount==10 означает, что из 10 вызовов trackEvent(), процесс выборки передает только один из них. Чтобы получить корректное количество пользовательских событий, используйте код, например customEvents | summarize sum(itemCount).

Замечание

itemCount имеет минимальное значение равное одному; сама запись представляет собой элемент.

GetMetric

Сведения о том, как эффективно использовать вызов GetMetric() для записи локальных предварительно подготовленных метрик для приложений .NET и .NET Core, см. в документации Пользовательская коллекция метрик в .NET и .NET Core.

TrackMetric

Замечание

Microsoft.ApplicationInsights.TelemetryClient.TrackMetric не является предпочтительным методом отправки метрик. Метрики всегда должны быть предварительно агрегированы в течение периода времени перед отправкой. Используйте одну из GetMetric(..) перегрузок, чтобы получить объект метрик для доступа к возможностям предварительной агрегации пакета SDK.

Если вы реализуете собственную логику предварительной агрегации, можно использовать TrackMetric() метод для отправки результирующих агрегатов. Если вашему приложению требуется отправлять отдельный элемент телеметрии в каждом случае без агрегирования в течение времени, у вас вероятно есть кейс для телеметрии событий. См. TelemetryClient.TrackEvent(Microsoft.ApplicationInsights.DataContracts.EventTelemetry).

Application Insights может диаграммировать метрики, которые не присоединены к определенным событиям. Например, можно отслеживать длину очереди через регулярные интервалы. С метриками отдельные измерения менее интересны, чем вариации и тенденции, поэтому статистические диаграммы полезны.

Для отправки метрик в Application Insights можно использовать TrackMetric(..) API. Существует два способа отправки метрики:

  • Одно значение. Каждый раз, когда вы выполняете измерение в приложении, вы отправляете соответствующее значение в Application Insights.

    Например, предположим, что у вас есть метрика, описывающая количество элементов в контейнере. В течение определенного периода времени сначала вы помещаете три элемента в контейнер, а затем удаляете два элемента. Соответственно, вы вызвали бы TrackMetric дважды. Сначала необходимо передать значение 3 , а затем передать значение -2. Application Insights хранит оба значения для вас.

  • Агрегирование. При работе с метриками каждое измерение редко представляет интерес. Вместо этого важно сводные сведения о том, что произошло в течение определенного периода времени. Такая сводка называется агрегированием.

    В предыдущем примере совокупная сумма метрик для этого периода времени составляет, 1 а количество значений метрик — 2. При использовании подхода агрегирования вы вызываете TrackMetric только один раз за период времени и отправляете агрегированные значения. Мы рекомендуем этот подход, так как он может значительно сократить затраты и производительность, отправив меньше точек данных в Application Insights, а также собирая все соответствующие сведения.

Примеры однозначных значений

Чтобы отправить одно значение метрики:

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

Пользовательские метрики в Log Analytics

Данные телеметрии доступны в customMetrics таблице в Application Insights Analytics. Каждая строка представляет вызов trackMetric(..) в приложении.

  • valueSum: сумма измерений. Чтобы получить среднее значение, разделите на valueCount.
  • valueCount: количество измерений, которые были агрегированы в этом trackMetric(..) вызове.

Замечание

valueCount имеет минимальное значение одного; Сама запись является элементом.

Просмотры страниц

В приложении на устройстве или веб-странице телеметрия просмотра страницы отправляется по умолчанию при загрузке каждого экрана или страницы. Но вы можете изменить значение по умолчанию для отслеживания просмотров страниц в большее количество или в разное время. Например, в приложении, на котором отображаются вкладки или панели, может потребоваться отслеживать страницу всякий раз, когда пользователь открывает новую панель.

Данные пользователя и сеанса отправляются в виде свойств вместе с просмотрами страниц, поэтому пользовательские и сеансовые диаграммы оживают, когда присутствует телеметрия просмотра страниц.

Пользовательские просмотры страниц

telemetry.TrackPageView("GameReviewPage");

Телеметрия страницы в Log Analytics

В Log Analytics две таблицы отображают данные из операций браузера:

  • pageViews: содержит данные о URL-адресе и заголовке страницы.
  • browserTimings: содержит данные о производительности клиента, например времени, затраченного на обработку входящих данных.

Чтобы узнать, сколько времени занимает браузер для обработки разных страниц:

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

Чтобы узнать популярность различных браузеров, выполните следующие действия.

pageViews
| summarize count() by client_Browser

Чтобы связать представления страниц с вызовами AJAX, используйте зависимости:

pageViews
| join (dependencies) on operation_Id

TrackRequest

Серверный SDK использует TrackRequest для записи HTTP-запросов.

Вы также можете вызвать его самостоятельно, если вы хотите имитировать запросы в контексте, где у вас нет модуля веб-службы.

Рекомендуемый способ отправки телеметрии запроса — когда запрос выступает в качестве контекста операции.

Контекст операции

Можно сопоставить элементы телеметрии вместе, связав их с контекстом операции. Стандартный модуль отслеживания запросов выполняет это для исключений и других событий, отправляемых во время обработки HTTP-запроса. В поиске и аналитике можно легко найти любые события, связанные с запросом, с помощью его идентификатора операции.

При отслеживании телеметрии вручную проще всего обеспечить корреляцию телеметрии с помощью этого шаблона:

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

Дополнительные сведения о корреляции см. в разделе " Корреляция телеметрии" в Application Insights.

Наряду с настройкой контекста операции, StartOperation создает элемент телеметрии того типа, который вы указываете. Он отправляет элемент телеметрии, когда вы завершаете операцию или при явном вызове StopOperation. Если вы используете RequestTelemetry в качестве типа телеметрии, его длительность задается в интервал времени между запуском и остановкой.

Элементы телеметрии, сообщаемые в рамках операции, становятся дочерними элементами такой операции. Контексты операций могут быть вложены.

В поиске контекст операции используется для создания списка связанных элементов .

Снимок экрана: список связанных элементов.

Дополнительные сведения об отслеживании пользовательских операций см. в статье Track custom operations with Application Insights .NET SDK.

Запросы в Log Analytics

В Application Insights Analytics запросы отображаются в requests таблице.

Если выборка выполняется, свойство itemCount показывает значение больше 1. Например, itemCount==10 означает, что из 10 вызовов trackRequest(), процесс выборки передает только один из них. Чтобы получить правильное количество запросов и среднюю длительность, сегментированные по именам запросов, используйте код, например:

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

TrackException

Отправка исключений в Application Insights:

Отчеты включают трассировки стека.

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

Пакеты SDK автоматически перехватывают множество исключений, поэтому не всегда необходимо TrackException вызывать явно.

Исключения в Log Analytics

В Application Insights Analytics в таблице отображаются exceptions исключения.

Если выборка выполняется, свойство itemCount показывает значение больше 1. Например, itemCount==10 означает, что из 10 вызовов trackException(), процесс выборки передает только один из них. Чтобы получить правильное количество исключений, сегментированных по типу исключения, используйте код, например:

exceptions
| summarize sum(itemCount) by type

Большая часть важной информации стека уже извлекается в отдельные переменные, но вы можете разобрать структуру details, чтобы получить больше. Так как эта структура является динамической, следует привести результат к ожидаемому типу. Рассмотрим пример.

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

Чтобы связать исключения со связанными запросами, используйте операцию соединения:

exceptions
| join (requests) on operation_Id

TrackTrace

Используйте TrackTrace, чтобы помочь диагностировать проблемы, отправляя "хлебные крошки" в Application Insights. Вы можете отправлять блоки диагностических данных и проверять их в поиске.

В адаптерах .NET Log используйте этот API для отправки сторонних журналов на портал.

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

Запишите событие диагностики, например, вход в метод или выход из него.

Параметр Description
message Диагностические данные. Может быть гораздо длиннее имени.
properties Сопоставление строк с строкой. Дополнительные данные используются для фильтрации исключений на портале. Значение по умолчанию устанавливается в пустое.
severityLevel Поддерживаемые значения: SeverityLevel.ts.

Вы можете искать содержимое сообщения, но в отличие от значений свойств, вы не можете отфильтровать его.

Ограничение размера на message гораздо выше, чем ограничение на свойства. Преимущество TrackTrace заключается в том, что в сообщении можно поместить относительно длинные данные. Например, можно закодировать данные POST там.

Вы также можете добавить уровень серьезности в сообщение. И, как и другие данные телеметрии, можно добавить значения свойств, чтобы помочь вам фильтровать или искать различные наборы трассировок. Рассмотрим пример.

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

В поиске можно легко отфильтровать все сообщения определенного уровня серьезности, относящиеся к определенной базе данных.

Трассировки в Log Analytics

В Application Insights Analytics вызовы TrackTrace отображаются в таблице traces.

Если выборка выполняется, свойство itemCount показывает значение больше 1. Например, itemCount==10 означает, что из 10 вызовов trackTrace(), процесс выборки передает только один из них. Чтобы получить правильное количество вызовов трассировки, используйте код, например traces | summarize sum(itemCount).

TrackDependency

Используйте вызов TrackDependency для отслеживания времени отклика и частоты успешных вызовов внешнего фрагмента кода. Результаты отображаются на диаграммах зависимостей на портале. Следующий фрагмент кода должен быть добавлен везде, где выполняется вызов зависимостей.

Замечание

Для .NET и .NET Core можно также использовать метод TelemetryClient.StartOperation (extension), который заполняет свойства DependencyTelemetry, необходимые для корреляции, и некоторые другие свойства, такие как время начала и длительность, поэтому вам не нужно создавать настраиваемый таймер, как и в следующих примерах. Дополнительные сведения см. в разделе о отслеживании исходящих зависимостей в отслеживании настраиваемых операций с помощью пакета SDK для Application Insights .NET.

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

Помните, что пакеты SDK сервера включают модуль зависимостей , который обнаруживает и отслеживает определенные вызовы зависимостей автоматически, например для баз данных и REST API. Для работы модуля необходимо установить агент на сервере.

Этот вызов используется, если вы хотите отслеживать вызовы, которые автоматическое отслеживание не перехватывает.

Чтобы отключить стандартный модуль отслеживания зависимостей в C#, измените ApplicationInsights.config и удалите ссылку DependencyCollector.DependencyTrackingTelemetryModule.

Зависимости в Log Analytics

В Application Insights AnalyticstrackDependency вызовы отображаются в dependenciesтаблице.

Если выборка выполняется, itemCount свойство показывает значение больше 1. Например, itemCount==10 означает, что из 10 вызовов trackDependency(), процесс выборки передает только один из них. Чтобы получить правильное количество зависимостей, сегментированных по целевому компоненту, используйте код, например:

dependencies
| summarize sum(itemCount) by target

Чтобы связать зависимости с их соответствующими запросами, используйте соединение:

dependencies
| join (requests) on operation_Id

Очистка данных

Как правило, пакет SDK отправляет данные с фиксированным интервалом, обычно 30 секунд или каждый раз, когда буфер заполнен, что обычно составляет 500 элементов. В некоторых случаях может потребоваться очистить буфер. Например, если вы используете пакет SDK в приложении, которое завершает работу.

При использовании Flush()мы рекомендуем использовать этот шаблон:

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

При использовании FlushAsync()мы рекомендуем использовать этот шаблон:

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

Мы рекомендуем всегда очищать в рамках завершения работы приложения, чтобы гарантировать, что данные телеметрии не потеряны.

Замечание

Проверка настройки Autoflush: Включение функции autoflush в файле web.config может привести к снижению производительности в приложениях .NET, инструментированных с помощью Application Insights. При включении автофлюша каждый вызов System.Diagnostics.Trace.Trace* методов приводит к отправке отдельных элементов телеметрии в виде отдельных веб-запросов в службу приема. Это может привести к нехватке сети и хранилища на веб-серверах. Для повышения производительности рекомендуется отключить автофлюш, а также использовать ServerTelemetryChannel, предназначенный для более эффективной передачи данных телеметрии.

Функция асинхронна для канала телеметрии сервера.

Прошедшие проверку подлинности пользователи

В веб-приложении пользователи по умолчанию определяются файлами cookie . Пользователь может считаться более одного раза, если он обращается к приложению с другого компьютера или браузера или если они удаляют файлы cookie.

Если пользователи входят в приложение, вы можете получить более точное количество, задав идентификатор пользователя, прошедший проверку подлинности, в коде браузера. Не обязательно использовать фактическое имя входа пользователя. Это должен быть только идентификатор, уникальный для этого пользователя. Он не должен включать пробелы или какие-либо символы ,;=|.

Идентификатор пользователя также задается в файле cookie сеанса и отправляется на сервер. Если установлен пакет SDK сервера, идентификатор пользователя, прошедший проверку подлинности, отправляется в рамках свойств контекста телеметрии клиента и сервера. Затем вы можете отфильтровать и выполнить поиск по нему.

Если приложение группирует пользователей в учетные записи, можно также передать идентификатор учетной записи. Применяются те же ограничения символов.

В обозревателе метрик можно создать диаграмму, которая подсчитывает учетные записи пользователей, прошедших проверку подлинности и учетные записи пользователей.

Вы также можете искать точки данных клиентов с определенными именами пользователей и учетными записями.

Замечание

Свойство EnableAuthenticationTrackingJavaScript в классе ApplicationInsightsServiceOptions в пакете SDK .NET Core упрощает настройку JavaScript, необходимую для внедрения имени пользователя в качестве идентификатора проверки подлинности для каждой трассировки, отправленной пакетом SDK JavaScript для Application Insights.

Если для этого свойства задано значение , имя пользователя в ASP.NET Core печатается вместе с телеметрией на стороне клиента . По этой причине добавление appInsights.setAuthenticatedUserContext вручную больше не требуется, так как оно уже внедряется пакетом SDK для ASP.NET Core. Идентификатор проверки подлинности также отправляется на сервер, где пакет SDK в .NET Core определяет и использует его для любой телеметрии на стороне сервера, как описано в справочнике JavaScript API.

Для приложений JavaScript, которые не работают так же, как и ASP.NET Core MVC, например веб-приложения SPA, необходимо добавить appInsights.setAuthenticatedUserContext вручную.

Фильтрация, поиск и сегментирование данных с помощью свойств

Вы можете присоединить свойства и измерения к событиям, метрикам, представлениям страниц, исключениям и другим данным телеметрии.

Свойства — это строковые значения, которые можно использовать для фильтрации телеметрии в отчетах об использовании. Например, если ваше приложение предоставляет несколько игр, вы можете прикрепить имя игры к каждому событию, чтобы увидеть, какие игры более популярны.

В строковой длине имеется ограничение в 8 192. Если вы хотите отправить большие фрагменты данных, используйте параметр TrackTraceсообщения.

Метрики — это числовые значения, которые можно представить графически. Например, вы можете узнать, есть ли постепенное увеличение показателей, которые ваши игроки достигают. Графы можно сегментировать по свойствам, отправляемыми с событием, чтобы получить отдельные или стековые графы для разных игр.

Для правильного отображения значений метрик должно быть больше или равно 0.

Существует ряд ограничений на количество свойств, значений свойств и метрик , которые можно использовать.

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

Это важно

Убедитесь, что вы не регистрируете личную информацию в свойствах.

Альтернативный способ задания свойств и метрик

Если это удобнее, можно собрать параметры события в отдельном объекте:

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

Предупреждение

Не используйте один и тот же экземпляр элемента телеметрии (event в этом примере) для вызова Track*() несколько раз. Эта практика может привести к отправке телеметрии с неправильной конфигурацией.

Пользовательские измерения и свойства в Log Analytics

В Log Analytics пользовательские метрики и характеристики отображаются в атрибутах customMeasurements и customDimensions каждой записи телеметрии.

Например, если добавить свойство с именем "game" в телеметрию запроса, этот запрос подсчитывает количество появлений различных значений для "game" и показывает среднее значение пользовательской метрики "score".

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

Обратите внимание, что:

  • При извлечении значения из customDimensions или customMeasurements JSON он имеет динамический тип, поэтому его необходимо привести tostring или todouble.
  • Чтобы учитывать возможность выборки, используйте sum(itemCount) не count().

События синхронизации

Иногда требуется провести диаграмму времени выполнения действия. Например, может потребоваться узнать, сколько времени пользователи принимают во внимание выбор в игре. Чтобы получить эти сведения, используйте параметр измерения.

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

Свойства по умолчанию для пользовательской телеметрии

Если вы хотите задать значения свойств по умолчанию для некоторых пользовательских событий, которые вы записываете, задайте их в экземпляре TelemetryClient . Они подключены к каждому элементу телеметрии, отправляемого от этого клиента.

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

Отдельные телеметрические вызовы могут заменить значения по умолчанию в контейнерах свойств.

Чтобы добавить свойства ко всем данным телеметрии, включая данные из стандартных модулей коллекции, реализуйте ITelemetryInitializer.

Отключение телеметрии

Для динамической остановки и запуска коллекции и передачи данных телеметрии:

using  Microsoft.ApplicationInsights.Extensibility;

TelemetryConfiguration.Active.DisableTelemetry = true;

Режим разработчика

Во время отладки полезно ускорить передачу данных телеметрии через конвейер, чтобы сразу увидеть результаты. Вы также получаете другие сообщения, которые помогают отслеживать любые проблемы с телеметрией. Отключите его в рабочей среде, так как это может замедлить работу приложения.

TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true;

Установите ключ инструментирования для выбранной пользовательской телеметрии.

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

Динамическая строка подключения

Чтобы избежать смешивания данных телеметрии из сред разработки, тестирования и рабочей среды, можно создавать отдельные ресурсы Application Insights и изменять их ключи в зависимости от среды.

Вместо получения ключа инструментирования из файла конфигурации его можно задать в коде. Задайте ключ в методе инициализации, например global.aspx.cs в службе ASP.NET:

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

TelemetryContext

TelemetryClient имеет свойство Context, содержащее значения, отправляемые вместе со всеми данными телеметрии. Обычно они задаются стандартными модулями телеметрии, но их также можно задать самостоятельно. Рассмотрим пример.

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

Если вы сами задаете какие-либо из этих значений, попробуйте удалить соответствующую строку из ApplicationInsights.config , чтобы ваши значения и стандартные значения не запутались.

  • Компонент: приложение и его версия.
  • Устройство: данные об устройстве, на котором работает приложение. В веб-приложениях телеметрия отправляется с сервера или клиентского устройства.
  • InstrumentationKey: ресурс Application Insights в Azure, где отображается телеметрия. Обычно он загружается из ApplicationInsights.config.
  • Расположение: географическое расположение устройства.
  • Операция: в веб-приложениях текущий HTTP-запрос. В других типах приложений можно задать это значение для группирования событий вместе.
    • Идентификатор: это созданное значение, которое сопоставляет различные события, чтобы при проверке любого события в Диагностическом Поиске можно было найти связанные элементы.
    • Имя: идентификатор, как правило, URL-адрес HTTP-запроса.
    • SyntheticSource: если значение не равно null или пусто, строка, указывающая, что источник запроса был определен как робот или веб-тест. По умолчанию он исключен из вычислений в обозревателе метрик.
  • Сеанс: сеанс пользователя. Идентификатор имеет созданное значение, которое изменяется, когда пользователь не был активным в течение некоторого времени.
  • Пользователь: сведения о пользователе.

Limits

Существуют некоторые ограничения на количество метрик и событий для каждого приложения, то есть на connection string. Пределы зависят от тарифного плана, который вы выберете.

Resource Ограничение по умолчанию Максимальный лимит Примечания.
Общий объем данных в день 100 ГБ Обратитесь в службу поддержки. Вы можете установить ограничение, чтобы сократить объем данных. Если вам нужно больше данных, вы можете увеличить лимит на портале до 1 000 ГБ. Для объемов более 1 000 ГБ отправьте электронное письмо на AIDataCap@microsoft.com.
Ограничение скорости 32 000 событий/секунда Обратитесь в службу поддержки. Предел измеряется в течение минуты.
журналы хранения данных от 30 до 730 дней 730 дней Этот ресурс предназначен для журналов.
Метрики хранения данных 90 дней 90 дней Этот ресурс предназначен для Metrics Explorer.
Многошаговый тест доступности сохранение подробных результатов 90 дней 90 дней Этот ресурс предоставляет подробные результаты каждого этапа.
Максимальный размер элемента телеметрии 64 КБ 64 КБ
Максимальное количество телеметрических данных в пакете 64 000 64 000
Длина названия свойства и метрики сто пятьдесят сто пятьдесят См. схемы типов.
Длина строки значения свойства 8,192 8,192 См. схемы типов.
Длина сообщения трассировки и исключения 32,768 32,768 См. схемы типов.
Тесты доступности на ресурс в службе Application Insights 100 100
Количество доступных тестов для каждой группы ресурсов 800 800 См. раздел Azure Resource Manager
Тесты доступности максимального количества перенаправлений за тест 10 10
Частота минимального тестирования для проверки доступности 300 секунд Для нестандартных частот тестирования или частот менее 5 минут требуются собственные реализации TrackAvailability.
.NET Profiler и Snapshot Debugger хранение данных Две недели Обратитесь в службу поддержки. Максимальный срок хранения составляет шесть месяцев.
.NET Profiler данные, отправляемые в день Без ограничений Без ограничений.
Snapshot Debugger данные, отправленные в день 30 снимков в день для каждого отслеживаемого приложения Без ограничений. Количество снимков, собираемых для каждого приложения, можно изменить через конфигурацию.

Для получения дополнительной информации о ценах и квотах, смотрите выставление счетов Application Insights.

Чтобы избежать достижения ограничения скорости данных, используйте выборку.

Сведения о том, сколько времени хранятся данные, см. в разделе "Хранение и конфиденциальность данных".

Примеры приложений

Консольное приложение .NET Core: Используйте этот пример, если вы используете консольное приложение, написанное на .NET Core (версии 2.0 или выше) или .NET Framework (версии 4.7.2 или выше).

ASP.NET Core фоновые задачи с HostedServices. Используйте этот пример, если вы находитесь в ASP.NET Core и создаете фоновые задачи в соответствии с официальным руководством.

.NET Core Worker Service. Используйте этот пример, если у вас есть приложение .NET Worker Service в соответствии с оффиальным руководством.

Устранение неполадок

См. статьи по устранению неполадок .NET и Node.js.

Проверьте соединение между сервером вашего приложения и службой приема данных

Пакеты SDK и агенты Application Insights отправляют телеметрические данные, которые обрабатываются в виде вызовов REST на наших конечных точках приема. Вы можете протестировать подключение с веб-сервера или хост-компьютера приложения к конечным точкам службы приема, используя чистых REST-клиентов из PowerShell или из команд curl. См. Устранение неполадок с отсутствующей телеметрией приложения в Azure Monitor Application Insights.

Пакет SDK с открытым исходным кодом

Чтение и внесение вклада в код для .NET и Node.js.

Заметки о релизе

Обновления служб также обобщают основные улучшения Application Insights.

Дальнейшие шаги