다음을 통해 공유


Application Insights(클래식 API)를 사용하여 .NET 애플리케이션 및 서비스 모니터링

비고

클래식 API SDK 지원 정책에 대한 Application Insights SDK 지원 지침을 검토합니다.

주의

새 애플리케이션 또는 고객이 Azure Monitor Application Insights에 전원을 공급하려면 Azure Monitor OpenTelemetry Distro를 사용하는 것이 좋습니다. Azure Monitor OpenTelemetry Distro는 Application Insights SDK와 유사한 기능과 환경을 제공합니다. .NET, Node.jsPython에 대한 마이그레이션 가이드를 사용하여 Application Insights SDK에서 마이그레이션할 수 있지만 이전 버전과의 호환성을 위해 몇 가지 기능을 더 추가하기 위해 노력하고 있습니다.

이 문서에서는 ASP.NET, ASP.NET Core 및 비 HTTP(작업자 서비스) 애플리케이션에 대해 Application Insights 를 사용하도록 설정하고 구성하는 방법을 설명합니다. Application Insights는 앱에서 다음 원격 분석을 수집할 수 있습니다.

  • 요청
  • 종속성
  • Exceptions
  • 성능 계수기
  • 추적(로그)
  • 하트비트
  • 사용자 지정 이벤트 및 메트릭 (수동 계측 필요)
  • 페이지 보기 (웹 페이지에 JavaScript SDK 필요)
  • 가용성 테스트 (가용성 테스트를 수동으로 설정해야 합니다.)

지원되는 시나리오

비고

ASP.NET Core용 Application Insights SDK 및 작업자 서비스용 SDK는 애플리케이션이 실행되는 위치 또는 방법에 관계없이 애플리케이션을 모니터링할 수 있습니다. 애플리케이션이 실행 중이고 Azure에 네트워크로 연결되어 있는 경우 원격 분석을 수집할 수 있습니다.

지원됨 ASP.NET ASP.NET Core 작업자 서비스
운영 체제 윈도우즈 Windows, Linux 또는 macOS Windows, Linux 또는 macOS
호스팅 방법 프로세스 내(IIS 또는 IIS Express) 프로세스 내부 또는 프로세스 외부 콘솔 또는 백그라운드 서비스(일반적으로 CLI를 통해 dotnet 또는 Windows 서비스/Linux 디먼으로 프로세스로 실행됨)
배포 방법 웹 배포, MSI 또는 수동 파일 복사 프레임워크 종속 또는 자체 포함 프레임워크 종속 또는 자체 포함
웹 서버 IIS(인터넷 정보 서비스) IIS(인터넷 정보 서버) 또는 Kestrel 해당 없음(웹 서버 없음, 메시징, 백그라운드 작업 및 콘솔 앱과 같은 비 HTTP 워크로드용으로 설계됨)
호스팅 플랫폼 Azure App Service(Windows), Azure Virtual Machines 또는 온-프레미스 서버 Azure App Service, Azure Virtual Machines, Docker 및 AKS(Azure Kubernetes Service)의 Web Apps 기능 Azure Virtual Machines, AKS(Azure Kubernetes Service), 컨테이너 또는 .NET Core가 지원되는 모든 환경
.NET 버전 .NET Framework 4.6.1 이상 미리 보기에 없는 모든 공식적으로 지원되는 .NET 버전 미리 보기에 없는 모든 공식적으로 지원되는 .NET 버전
IDE 비주얼 스튜디오 Visual Studio, Visual Studio Code 또는 명령줄 Visual Studio, Visual Studio Code 또는 명령줄

비고

작업자 서비스는 HTTP 요청/응답 파이프라인 외부에서 작업을 실행하는 장기 실행 백그라운드 애플리케이션입니다. Application Insights SDK for Worker Service는 새로 도입된 .NET Core 작업자 서비스, ASP.NET Core의 백그라운드 작업 및 .NET Core 및 .NET Framework와 같은 콘솔 앱에서 사용할 수 있습니다.

작업자 서비스 SDK는 원격 분석 수집을 단독으로 수행하지 않습니다. 대신 DependencyCollector, PerfCounterCollectorApplicationInsightsLoggingProvider와 같은 다른 잘 알려진 Application Insights 자동 수집기를 제공합니다. 이 SDK는 IServiceCollection에 확장 메서드를 제공하여 원격 분석 수집을 사용하고 구성할 수 있게 합니다.

Application Insights 추가

필수 조건

기본 웹 애플리케이션 만들기

아직 작동하는 웹 애플리케이션이 없는 경우 다음 지침을 사용하여 웹 애플리케이션을 만들 수 있습니다.

  1. Visual Studio를 엽니다.
  2. 새 프로젝트 만들기를 선택합니다.
  3. C#으로 ASP.NET 웹 애플리케이션(.NET Framework)을 선택하고 다음을 선택합니다.
  4. 프로젝트 이름을 입력한 다음 만들기를 선택합니다.
  5. MVC를 선택한 다음 만들기를 선택합니다.

Application Insights 자동 추가(Visual Studio)

이 섹션에서는 템플릿 기반 웹앱에 Application Insights를 자동으로 추가하는 방법을 안내합니다.

Visual Studio의 ASP.NET 웹앱 프로젝트 내에서:

  1. 프로젝트>Application Insights 원격 분석 추가>Application Insights Sdk(로컬)>다음>완료>닫기를 선택합니다.

  2. ApplicationInsights.config 파일을 엽니다.

  3. 닫는 </ApplicationInsights> 태그 앞에 Application Insights 리소스에 대한 연결 문자열이 포함된 선을 추가합니다. 새로 만든 Application Insights 리소스의 개요 창에서 연결 문자열을 찾습니다.

    <ConnectionString>Copy connection string from Application Insights Resource Overview</ConnectionString>
    
  4. 프로젝트>NuGet 패키지 관리>업데이트를 선택합니다. 그런 다음, 각 Microsoft.ApplicationInsights NuGet 패키지를 안정적인 최신 릴리스로 업데이트합니다.

  5. IIS Express를 선택하여 애플리케이션을 실행합니다. 기본 ASP.NET 앱이 열립니다. 사이트의 페이지를 탐색할 때 원격 분석 데이터가 Application Insights로 전송됩니다.

Application Insights를 수동으로 추가(Visual Studio 없음)

이 섹션에서는 템플릿 기반 웹앱에 Application Insights를 수동으로 추가하는 방법을 안내합니다.

  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> 파일의 마지막 태그 앞에 Application Insights 리소스의 연결 문자열을 추가하십시오. 새로 만든 Application Insights 리소스의 개요 창에서 연결 문자열을 찾습니다.

      <ConnectionString>Copy the connection string from your Application Insights resource</ConnectionString>
      
    • 코드에서 연결 문자열 설정합니다.

      program.cs 클래스에 연결 문자열 제공합니다.

      var configuration = new TelemetryConfiguration
      {
          ConnectionString = "Copy the connection string from your Application Insights resource"
      };
      
  5. ApplicationInsights.config 파일과 동일한 프로젝트 수준에서 AiHandleErrorAttribute.cs라는 새 C# 파일이 있는 ErrorHandler라는 폴더를 만듭니다. 파일의 콘텐츠는 다음과 같습니다.

    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에서 수집되기 시작합니다.

Application Insights가 원격 분석을 수신하는지 확인

애플리케이션을 실행하고 이에 대한 요청을 수행합니다. 이제 원격 분석이 Application Insights로 이동합니다. Application Insights SDK는 다음 원격 분석과 함께 애플리케이션에 대한 들어오는 웹 요청을 자동으로 수집합니다.

원격 분석 구성

이 부분에서는

라이브 메트릭

라이브 메트릭을 사용하면 Application Insights를 통한 애플리케이션 모니터링이 올바르게 구성되었는지 신속하게 확인할 수 있습니다. 원격 분석이 Azure Portal에 표시되는 데 몇 분 정도 걸릴 수 있지만 라이브 메트릭 창에는 실행 중인 프로세스의 CPU 사용량이 거의 실시간으로 표시됩니다. 또한 요청, 종속성, 추적 등의 다른 원격 분석 데이터도 표시할 수 있습니다.

비고

라이브 메트릭은 .NET 애플리케이션에 권장되는 지침을 사용하여 온보딩할 때 기본적으로 사용하도록 설정됩니다.

모든 .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.InstrumentationKey = "INSTRUMENTATION-KEY-HERE";
            QuickPulseTelemetryProcessor quickPulseProcessor = null;
            config.DefaultTelemetrySink.TelemetryProcessorChainBuilder
                .Use((next) =>
                {
                    quickPulseProcessor = new QuickPulseTelemetryProcessor(next);
                    return quickPulseProcessor;
                })
                .Build();

            var quickPulseModule = new QuickPulseTelemetryModule();

            // Secure the control channel.
            // This is optional, but recommended.
            quickPulseModule.AuthenticationApiKey = "YOUR-API-KEY-HERE";
            quickPulseModule.Initialize(config);
            quickPulseModule.RegisterTelemetryProcessor(quickPulseProcessor);

            // Create a TelemetryClient instance. It is important
            // to use the same TelemetryConfiguration here as the one
            // used to set up live metrics.
            TelemetryClient client = new TelemetryClient(config);

            // This sample runs indefinitely. Replace with actual application logic.
            while (true)
            {
                // Send dependency and request telemetry.
                // These will be shown in live metrics.
                // CPU/Memory Performance counter is also shown
                // automatically without any additional steps.
                client.TrackDependency("My dependency", "target", "http://sample",
                    DateTimeOffset.Now, TimeSpan.FromMilliseconds(300), true);
                client.TrackRequest("My Request", DateTimeOffset.Now,
                    TimeSpan.FromMilliseconds(230), "200", true);
                Task.Delay(1000).Wait();
            }
        }
    }
}

추적(로그)

이 섹션에서는 ASP.NET 또는 ASP.NET Core 애플리케이션에서 Application Insights로 진단 추적 로그를 보낸 다음 포털에서 해당 로그를 탐색/검색하는 방법을 설명합니다.

추적 로그를 사용하여 각 사용자 요청과 연결된 추적을 식별하고 다른 이벤트 및 예외 보고서와 상호 연결할 수 있습니다.

Application Insights는 ILogger를 통해 ASP.NET Core 및 기타 .NET 앱의 로그를 캡처하고 클래식 SDK 및 어댑터를 통해 클래식 ASP.NET(.NET Framework)에서 로그를 캡처합니다.

비고

  • 기본적으로 Application Insights 공급자는 심각도 Warning 이상의 로그만 보냅니다. Information 로그를 포함하거나 하위 수준 로그를 포함하려면 appsettings.json에서 로그 수준 설정을 업데이트합니다.

  • 백그라운드 서비스에 Application Insights를 사용하도록 설정하는 데 사용되는 Microsoft.ApplicationInsights.WorkerService NuGet 패키지는 여기서 다루지 않습니다.

  • FAQ(질문과 대답)를 검토하려면 .NET FAQ를 사용하여 로깅을 참조하세요.

Application Insights에서 수집할 수 있는 진단 로그를 내보내는 로깅 방법을 선택합니다.

앱에 로깅 설치

System.Diagnostics 추적을 사용하는 클래식 ASP.NET 앱의 경우 구성에서 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를 추가합니다. Visual Studio에서 Application Insights를 추가할 때 로그 수집기를 포함하는 옵션이 있습니다.

옵션 2: 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하여 Application Insights를 구성합니다. 추적 컬렉션 구성 옵션을 선택합니다.

비고

Application Insights 메뉴 또는 로그 수집기 옵션이 없나요? 문제 해결을 시도합니다.

수동 설치

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

자세한 내용은 ASP.NET Core 로그인ILogger 로그에서는 어떤 Application Insights 원격 분석 유형을 생성하나요? Application Insights의 어디에서 ILogger 로그를 볼 수 있나요?를 참조하세요.

진단 로그 호출 삽입(System.Diagnostics.Trace / log4net / NLog)

사용하는 System.Diagnostics.Trace경우 일반적인 호출은 다음과 같습니다.

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

선호하는 경우 log4net 또는 NLog을 사용하십시오.

    logger.Warn("Slow response - database01");
EventSource 이벤트 사용

Application Insights에 추적으로 보내도록 System.Diagnostics.Tracing.EventSource 이벤트를 구성할 수 있습니다.

  1. Microsoft.ApplicationInsights.EventSourceListener NuGet 패키지를 설치합니다.

  2. TelemetryModules ApplicationInsights.config 파일의 섹션을 편집합니다.

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

각 원본에 대해 다음 매개 변수를 설정할 수 있습니다.

  • 이름은 수집할 EventSource의 이름을 지정합니다.
  • 수준은 수집할 로깅 레벨을 지정합니다. 중요, 오류, 정보 제공, LogAlways, 상세 또는 경고입니다.
  • 키워드 (선택 사항)는 사용할 키워드 조합의 정수 값을 지정합니다.
DiagnosticSource 이벤트 사용

Application Insights에 추적으로 보내도록 System.Diagnostics.DiagnosticSource 이벤트를 구성할 수 있습니다.

  1. Microsoft.ApplicationInsights.DiagnosticSourceListener NuGet 패키지를 설치합니다.

  2. TelemetryModules ApplicationInsights.config 파일의 섹션을 편집합니다.

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

추적하려는 각 진단 소스에 대해 Name 특성 집합이 포함된 항목을 진단 소스 이름에 추가합니다.

ETW 이벤트 사용

Application Insights에 추적으로 전송되도록 ETW(Windows용 이벤트 추적) 이벤트를 구성할 수 있습니다.

  1. Microsoft.ApplicationInsights.EtwCollector NuGet 패키지를 설치합니다.

  2. ApplicationInsights.config 파일의 "TelemetryModules" 섹션을 편집합니다.

비고

ETW 이벤트는 SDK를 호스트하는 프로세스가 성능 로그 사용자 또는 관리자의 멤버인 ID로 실행되는 경우에만 수집할 수 있습니다.

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

각 원본에 대해 다음 매개 변수를 설정할 수 있습니다.

  • ProviderName 은 수집할 ETW 공급자의 이름입니다.
  • ProviderGuid 는 수집할 ETW 공급자의 GUID를 지정합니다. ProviderName 대신 사용할 수 있습니다.
  • 수준은 수집할 로깅 수준을 설정합니다. 중요, 오류, 정보, LogAlways, 자세한 정보 또는 경고일 수 있습니다.
  • 키워드 (선택 사항)는 사용할 키워드 조합의 정수 값을 설정합니다.
Trace API 직접 사용

Application Insights 추적 API를 직접 호출할 수 있습니다. 로깅 어댑터는 이 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));
}

자세한 내용은 ILogger 로그에서는 어떤 Application Insights 원격 분석 유형을 생성하나요? Application Insights의 어디에서 ILogger 로그를 볼 수 있나요?를 참조하세요.

로깅 범위

비고

다음 지침은 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");
}

다른 형식이 범위로 사용되는 경우 Application Insights 원격 분석의 속성 Scope 아래에 저장됩니다. 다음 예제에서 TraceTelemetry에는 범위를 포함하는 Scope라는 속성이 있습니다.

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

로그 찾기

디버그 모드에서 앱을 실행하거나 라이브로 배포합니다.

Application Insights 포털의 앱 개요 창에서 다음을 수행할 수 있는 트랜잭션 검색 을 선택합니다.

  • 로그 추적 또는 특정 속성이 있는 항목에 대해 필터링합니다.
  • 특정 항목을 자세히 검사합니다.
  • 동일한 사용자 요청과 관련된 다른 시스템 로그 데이터를 찾습니다(작업 ID가 같음).
  • 페이지의 구성을 즐겨찾기로 저장합니다.

비고

애플리케이션이 대량의 데이터를 보내고 ASP.NET 버전 2.0.0-beta3 이상에 Application Insights SDK를 사용하는 경우 적응 샘플링 기능이 작동하여 원격 분석의 일부만 보낼 수 있습니다. 샘플링에 대해 자세히 알아봅니다.

Azure Monitor 로그에서 탐색

ILogger 로그는 추적 원격 분석으로 표시됩니다(Application Insights의 테이블 traces 및 Log Analytics의 테이블 AppTraces).

예시

Azure Portal에서 Application Insights로 이동하여 다음을 실행합니다.

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

분산 추적

최신 클라우드 및 마이크로 서비스 아키텍처를 사용하면 가용성과 처리량을 늘리면서 비용을 절감하는 간단하고 독립적으로 배포 가능한 서비스를 사용할 수 있습니다. 그러나 전체 시스템을 추론하고 디버그하기가 더 어려워졌습니다. 분산 추적은 클라우드 및 마이크로 서비스 아키텍처에 대한 호출 스택과 같은 성능 프로파일러를 제공하여 이 문제를 해결합니다.

Azure Monitor는 분산 추적 데이터를 사용하는 두 가지 환경을 제공합니다. 즉, 단일 트랜잭션/요청에 대한 트랜잭션 진단 보기와 시스템이 상호 작용하는 방식을 보여 주는 애플리케이션 맵 보기입니다.

Application Insights는 각 구성 요소를 개별적으로 모니터링하고 분산 원격 분석 상관 관계를 사용하여 오류 또는 성능 저하를 담당하는 구성 요소를 검색할 수 있습니다. 이 문서에서는 Application Insights에서 사용하는 다양한 언어 및 플랫폼에 대한 데이터 모델, 컨텍스트 전파 기술, 프로토콜 및 상관 관계 전술 구현에 대해 설명합니다.

자동 계측 또는 SDK를 통해 Application Insights를 사용하여 분산 추적 활성화

.NET, .NET Core, Java, Node.js및 JavaScript용 Application Insights 에이전트 및 SDK는 모두 기본적으로 분산 추적을 지원합니다.

적절한 Application Insights SDK를 설치하고 구성하면 SDK 종속성 자동 수집기에서 인기 있는 프레임워크, 라이브러리 및 기술에 대한 추적 정보가 자동으로 수집됩니다. 지원되는 기술의 전체 목록은 종속성 자동 데이터 정렬 설명서에서 확인할 수 있습니다.

TelemetryClient에서 TrackDependency를 호출하여 모든 기술을 수동으로 추적할 수도 있습니다.

원격 분석 상관 관계에 대한 데이터 모델

Application Insights는 분산 원격 분석 상관 관계에 대한 데이터 모델을 정의합니다. 원격 분석을 논리 작업과 연결하기 위해 모든 원격 분석 항목에는 라는 컨텍스트 필드가 있습니다 operation_Id. 분산 추적의 모든 원격 분석 항목은 이 식별자를 공유합니다. 따라서 단일 계층에서 원격 분석이 손실되더라도 다른 구성 요소에서 보고한 원격 분석을 연결할 수 있습니다.

분산 논리 작업은 일반적으로 구성 요소 중 하나에서 처리되는 요청인 더 작은 작업 집합으로 구성됩니다. 요청 원격 분석은 이러한 작업을 정의합니다. 모든 요청 원격 분석 항목에는 고유하고 전역적으로 식별하는 자체 id 항목이 있습니다. 또한 요청과 연결된 모든 원격 분석 항목(예: 추적 및 예외)은 요청 operation_parentId값으로 설정 id 해야 합니다.

종속성 원격 분석은 다른 구성 요소에 대한 HTTP 호출과 같이 나가는 모든 작업을 나타냅니다. 또한 전역적으로 고유한 자체 id 도 정의합니다. 이 종속성 호출을 통해 시작된 요청 원격 분석은 이 idoperation_parentId로 사용합니다.

operation_Id, operation_parentId, request.iddependency.id를 사용하여 분산 논리 작업의 뷰를 빌드할 수 있습니다. 이러한 필드는 원격 분석 호출의 인과 관계 순서도 정의합니다.

마이크로 서비스 환경에서 구성 요소의 추적은 다른 스토리지 항목으로 이동됩니다. 모든 구성 요소는 Application Insights에서 자체 연결 문자열을 가질 수 있습니다. 논리 작업에 대한 원격 분석을 가져오기 위해 Application Insights는 모든 스토리지 항목의 데이터를 쿼리합니다.

스토리지 항목 수가 많으면 다음에 찾을 위치에 대한 힌트가 필요합니다. Application Insights 데이터 모델은 이 문제를 해결하기 위해 두 개의 필드, request.sourcedependency.target, 정의합니다. 첫 번째 필드는 종속성 요청을 시작한 구성 요소를 식별합니다. 두 번째 필드는 종속성 호출의 응답을 반환한 구성 요소를 식별합니다.

여러 서로 다른 인스턴스에서 쿼리하는 방법에 대한 자세한 내용은 Azure Monitor의 Log Analytics 작업 영역, 애플리케이션 및 리소스에서 데이터 쿼리를 참조하세요.

Example

예를 살펴보겠습니다. 주가라는 애플리케이션은 Stock이라는 외부 API를 사용하여 주식의 현재 시장 가격을 표시합니다. 주식 가격 애플리케이션에는 클라이언트 웹 브라우저에서 사용하여 여는 Stock 페이지라는 페이지가 있습니다 GET /Home/Stock. 애플리케이션은 HTTP 호출 GET /api/stock/value을 사용하여 Stock API를 쿼리합니다.

쿼리를 실행하여 결과 원격 분석을 분석할 수 있습니다.

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

결과에서 모든 원격 분석 항목은 루트 operation_Id를 공유합니다. 페이지에서 Ajax 호출이 이루어지면 종속성 원격 분석에 새 고유 ID(qJSXU)가 할당되고 pageView의 ID가 사용됩니다 operation_ParentId. 그런 다음 서버 요청은 Ajax ID를 .로 operation_ParentId사용합니다.

항목 유형 이름 아이디 operation_ParentId operation_Id
pageView 재고 페이지 STYz STYz
의존성 GET /Home/Stock qJSXU STYz STYz
request GET Home/Stock KqKwlrSt9PA= qJSXU STYz
의존성 GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

외부 서비스에 대한 호출 GET /api/stock/value 을 수행할 때 필드를 적절하게 설정할 수 있도록 해당 서버의 ID를 dependency.target 알아야 합니다. 외부 서비스가 모니터링을 target 지원하지 않는 경우 서비스의 호스트 이름으로 설정됩니다. 예제는 stock-prices-api.com입니다. 그러나 서비스가 미리 정의된 HTTP 헤더 target 를 반환하여 자신을 식별하는 경우 Application Insights가 해당 서비스의 원격 분석을 쿼리하여 분산 추적을 빌드할 수 있도록 하는 서비스 ID를 포함합니다.

W3C TraceContext를 사용하는 상관 관계 헤더

Application Insights는 다음을 정의하는 W3C 추적 컨텍스트로 전환됩니다.

  • traceparent: 호출의 전역적으로 고유한 작업 ID 및 고유 식별자를 전달합니다.
  • tracestate: 시스템별 추적 컨텍스트를 전달합니다.

최신 버전의 Application Insights SDK는 Trace-Context 프로토콜을 지원하지만 옵트인해야 할 수도 있습니다. (Application Insights SDK에서 지원하는 이전 상관 관계 프로토콜과의 이전 버전과의 호환성이 유지됩니다.)

Request-Id라고도 하는 상관 관계 HTTP 프로토콜은 더 이상 사용되지 않습니다. 이 프로토콜은 두 개의 헤더를 정의합니다.

  • Request-Id: 호출의 전역적으로 고유한 ID를 전달합니다.
  • Correlation-Context: 분산 추적 속성의 이름-값 쌍 컬렉션을 전달합니다.

Application Insights는 상관 관계 HTTP 프로토콜에 대한 확장 도 정의합니다. Request-Context 이름-값 쌍을 사용하여 직접 호출자나 피호출자가 사용하는 속성 목록을 전달합니다. Application Insights SDK는 이 헤더를 사용하여 dependency.target 필드 및 request.source 필드를 설정합니다.

W3C 추적 컨텍스트 및 Application Insights 데이터 모델은 다음과 같은 방식으로 매핑됩니다.

Application Insights (애플리케이션 인사이트) W3C TraceContext
IdRequestDependency parent-id
Operation_Id trace-id
Operation_ParentId 이 스팬의 부모 스팬의 parent-id입니다. 루트 범위인 경우 이 필드는 비어 있어야 합니다.

자세한 내용은 Application Insights 원격 분석 데이터 모델을 참조하세요.

W3C 분산 추적 지원 사용

W3C TraceContext 기반 분산 추적은 모든 최신 .NET Framework/.NET Core SDK에서 레거시 Request-Id 프로토콜과의 하위 호환성과 함께 기본적으로 활성화되어 있습니다.

텔레메트리 상관 관계

상관 관계는 앱을 온보딩할 때 기본적으로 처리됩니다. 특별한 작업은 필요하지 않습니다.

.NET 런타임은 활동DiagnosticSource의 도움으로 분산을 지원합니다.

Application Insights .NET SDK는 DiagnosticSourceActivity을 사용하여 원격 분석을 수집하고 상관시킵니다.

추적 로그 문제 해결

일반적인 질문에 대한 답변을 찾습니다.


확장하여 문제 해결 항목 보기
지연된 원격 분석, 오버로드된 네트워크 및 비효율적인 전송의 원인은 무엇인가요?

System.Diagnostics.Tracing에는 Autoflush 기능이 있습니다. 이 기능을 사용하면 SDK가 바람직하지 않은 모든 원격 분석 항목과 플러시되며 지연된 원격 분석, 오버로드된 네트워크 및 비효율적인 전송과 같은 로깅 어댑터 문제가 발생할 수 있습니다.

Java의 경우 이 작업을 어떻게 수행하나요?

권장되는 Java 코드리스 계측에서는 로그가 기본으로 수집됩니다. Java 3.0 에이전트를 사용합니다.

Application Insights Java 에이전트는 Log4j, Logback 및 java.util.logging에서 로그를 기본으로 수집합니다.

프로젝트 상황에 맞는 메뉴에 Application Insights 옵션이 없는 이유는 무엇인가요?
  • 개발자 분석 도구가 개발 머신에 설치되어 있는지 확인합니다. Visual Studio에서 도구>확장 및 업데이트로 이동하여 개발자 분석 도구를 찾습니다. 설치된 탭에 없는 경우 온라인 탭을 열고 설치합니다.
  • 이 프로젝트 유형은 Developer Analytics Tools에서 지원하지 않는 프로젝트 유형일 수 있습니다. 수동 설치를 사용합니다.
구성 도구에 로그 어댑터 옵션이 없는 이유는 무엇인가요?
  • 먼저 로깅 프레임워크를 설치합니다.
  • System.Diagnostics.Trace를 사용하는 경우 web.config에서 구성했는지 확인하십시오.
  • 최신 버전의 Application Insights가 있는지 확인합니다. Visual Studio에서 도구>확장 및 업데이트 로 이동하여 업데이트 탭을 엽니다. 개발자 분석 도구 가 있는 경우 이를 선택하여 업데이트합니다.
"계측 키를 비울 수 없음" 오류 메시지가 표시되는 이유는 무엇인가요?

Application Insights를 설치하지 않고 로깅 어댑터 NuGet 패키지를 설치했을 것입니다. 솔루션 탐색기에서ApplicationInsights.config마우스 오른쪽 단추 로 클릭하고 Application Insights 업데이트를 선택합니다. Azure에 로그인하고 Application Insights 리소스를 만들거나 기존 리소스를 다시 사용하라는 메시지가 표시됩니다. 문제를 해결해야 합니다.

모든 이벤트 및 요청이 파이프라인을 통과하는 데 시간이 걸릴 수 있습니다.

얼마나 많은 데이터가 보존되는가?

유지되는 데이터의 양에 영향을 주는 요인은 몇 가지입니다. 자세한 내용은 고객 이벤트 메트릭 페이지의 제한 섹션을 참조하세요.

예상한 로그 항목이 표시되지 않는 이유는 무엇인가요?

아마도 애플리케이션은 방대한 양의 데이터를 보내고 ASP.NET 버전 2.0.0-beta3 이상에 Application Insights SDK를 사용하고 있을 것입니다. 이 경우 적응 샘플링 기능이 작동하여 원격 분석의 일부만 보낼 수 있습니다. 샘플링에 대해 자세히 알아봅니다.

종속성

자동으로 추적되는 종속성

.NET 및 .NET Core용 Application Insights SDK는 종속성을 자동으로 수집하는 원격 분석 모듈인 DependencyTrackingTelemetryModule과 함께 제공됩니다. 이 모듈 DependencyTrackingTelemetryModule은(는) Microsoft.ApplicationInsights.DependencyCollector NuGet 패키지로 제공되며 Microsoft.ApplicationInsights.Web NuGet 패키지 또는 Microsoft.ApplicationInsights.AspNetCore NuGet 패키지를 사용할 때 자동으로 제공됩니다.

현재 DependencyTrackingTelemetryModule은 다음 종속성을 자동으로 추적합니다.

종속성 세부 정보
HTTP/HTTPS 로컬 또는 원격 HTTP/HTTPS 호출
WCF 호출 HTTP 기반 바인딩을 사용하는 경우에만 자동으로 추적됩니다.
SQL SqlClient를 사용한 호출입니다. SQL 쿼리 캡처에 대한 자세한 내용은 전체 SQL 쿼리를 가져오기 위한 고급 SQL 추적 섹션을 참조하세요.
Azure Blob Storage, Table Storage 또는 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의 종속성 추적을 참조하세요.

콘솔 앱에서 자동 종속성 추적 설정

.NET 콘솔 앱의 종속성을 자동으로 추적하려면 NuGet 패키지 Microsoft.ApplicationInsights.DependencyCollector을 설치하고 DependencyTrackingTelemetryModule를 초기화합니다.

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

비고

.NET Core 콘솔 앱의 경우 TelemetryConfiguration.Active는 더 이상 사용되지 않습니다.

수동으로 종속성 추적

자동으로 수집되지 않는 종속성의 다음 예에서는 수동 추적이 필요합니다.

  • Azure Cosmos DB는 HTTP/HTTPS를 사용하는 경우에만 자동으로 추적됩니다. TCP 모드는 2.22.0-Beta1 이전 버전의 SDK 용 Application Insights에서 자동으로 캡처되지 않습니다.
  • Redis

SDK에서 자동으로 수집하지 않는 종속성의 경우 표준 자동 컬렉션 모듈에서 사용되는 TrackDependency API를 사용하여 수동으로 추적할 수 있습니다.

예시

사용자가 직접 작성하지 않은 어셈블리로 코드를 빌드하는 경우 모든 호출의 시간을 측정할 수 있습니다. 이 시나리오를 사용하면 응답 시간에 어떤 기여를 하는지 확인할 수 있습니다.

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

또는 TelemetryClientStartOperation에 표시된 대로 종속성을 수동으로 추적하는 데 사용할 수 있는 확장 메서드 StopOperation을 제공합니다.

표준 종속성 추적 모듈 사용 안 함

자세한 내용은 원격 분석 모듈을 참조하세요.


전체 SQL 쿼리를 가져오기 위한 고급 SQL 추적

SQL 호출의 경우 서버 및 데이터베이스의 이름은 항상 수집되고 수집된 DependencyTelemetry의 이름으로 저장됩니다. 데이터라고 하는 다른 필드에는 전체 SQL 쿼리 텍스트가 포함될 수 있습니다.

비고

Azure Functions는 SQL 텍스트 컬렉션을 사용하도록 설정하기 위해 별도의 설정이 필요합니다. 자세한 내용은 SQL 쿼리 컬렉션 사용을 참조하세요.

ASP.NET 애플리케이션의 경우, 계측 엔진을 사용하거나 System.Data.SqlClient 라이브러리 대신 Microsoft.Data.SqlClient NuGet 패키지를 사용해야 하는 바이트 코드 계측을 통해 전체 SQL 쿼리 텍스트가 수집됩니다. 전체 SQL 쿼리 컬렉션을 사용하도록 설정하는 플랫폼별 단계는 다음 표에 설명되어 있습니다.

Platform 전체 SQL 쿼리를 가져오는 데 필요한 단계
Azure App Service의 Web Apps 웹앱 제어판에서 Application Insights 창을 열고 .NET에서 SQL 명령을 사용하도록 설정합니다.
IIS 서버(Azure Virtual Machines, 온-프레미스 등) Microsoft.Data.SqlClient NuGet 패키지를 사용하거나 Application Insights 에이전트 PowerShell 모듈을 사용하여 계측 엔진을 설치하고 IIS를 다시 시작합니다.
Azure Cloud Services StatusMonitor를 설치하기 위한 시작 작업을 추가합니다.
애플리케이션은 ASP.NET 또는 ASP.NET Core 애플리케이션에 대한 NuGet 패키지를 설치하여 빌드 시에 ApplicationInsights SDK로 온보딩됩니다.
IIS Express Microsoft.Data.SqlClient NuGet 패키지를 사용합니다.
Azure App Service의 WebJobs Microsoft.Data.SqlClient NuGet 패키지를 사용합니다.

앞의 플랫폼별 단계 외에도 다음 코드로 파일을 수정하여 ApplicationInsights.config.

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

앞의 경우 계측 엔진이 올바르게 설치되었는지 유효성을 검사하는 올바른 방법은 수집된 DependencyTelemetry의 SDK 버전이 rddp인지 유효성을 검사하는 것입니다. rdddsd 또는 rddf을(를) 사용하면 종속성이 DiagnosticSource 또는 EventSource 콜백을 통해 수집되므로 전체 SQL 쿼리가 캡처되지 않습니다.

Exceptions

웹 애플리케이션의 예외를 보고할 때 Application Insights를 사용할 수 있습니다. 실패한 요청을 클라이언트와 서버의 예외 및 기타 이벤트와 상호 연결하여 원인을 신속하게 진단할 수 있습니다. 이 섹션에서는 예외 보고를 설정하고, 예외를 명시적으로 보고하고, 오류를 진단하는 방법을 알아봅니다.

예외 보고 설정

서버 또는 클라이언트에서 발생하는 예외를 보고하도록 Application Insights를 설정할 수 있습니다. 애플리케이션이 종속된 플랫폼에 따라 적절한 확장 또는 SDK가 필요합니다.

서버 쪽 애플리케이션에서 예외를 보고하려면 다음 시나리오를 고려하세요.

중요합니다

이 섹션은 코드 예제 관점에서 .NET Framework 앱에 초점을 맞췄습니다. .NET Framework에 사용되는 일부 메서드는 .NET Core SDK에서 사용되지 않습니다.

오류 및 예외 진단

Application Insights는 애플리케이션 성능 관리 환경과 함께 큐레이팅되어 모니터링된 애플리케이션에서 실패를 진단하는 데 유용합니다.

자세한 지침은 Application Insights를 사용하여 오류, 성능 및 트랜잭션 조사를 참조하세요.

사용자 지정 추적 및 로그 데이터

진단 데이터 특성을 사용자 프로그램으로 불러오려면, 사용자 고유의 원격 분석 전송에 코드를 삽입합니다. 사용자 지정 원격 분석 또는 로그 데이터는 요청, 페이지 보기 및 기타 자동으로 수집된 데이터와 함께 진단 검색에 표시됩니다.

Microsoft.VisualStudio.ApplicationInsights.TelemetryClient을 사용하면 다음과 같은 여러 API를 활용할 수 있습니다.

  • TelemetryClient.TrackEvent는 일반적으로 사용 패턴 모니터링에 활용되지만, 여기에서 보내는 데이터는 진단 검색의 사용자 지정 이벤트 에도 표시됩니다. 이벤트의 이름을 지정하고, 진단 검색을 필터링할 수 있는 문자열 속성 및 숫자 메트릭을 전달할 수 있습니다.
  • TelemetryClient.TrackTrace를 사용하여 POST 정보와 같은 긴 데이터를 보낼 수 있습니다.
  • TelemetryClient.TrackException는 스택 추적과 같은 예외 세부 정보를 Application Insights로 보냅니다.

이러한 이벤트를 보려면 왼쪽 메뉴에서 검색을 엽니다. 드롭다운 메뉴 이벤트 유형을 선택한 다음, 사용자 지정 이벤트, 추적 또는 예외를 선택합니다.

검색 화면을 보여주는 스크린샷.

비고

앱에서 많은 양의 원격 분석을 생성하는 경우 적응 샘플링 모듈은 대표적인 이벤트 부분만 전송하여 포털로 전송되는 볼륨을 자동으로 줄입니다. 동일한 작업의 일부인 이벤트는 그룹으로 선택되거나 선택 취소되므로 관련 이벤트 간에 이동할 수 있습니다. 자세한 내용은 Application Insights의 샘플링을 참조하세요.

POST 데이터 요청 참조

요청 세부 정보에는 POST 호출에서 앱으로 전송된 데이터가 포함되지 않습니다. 이 데이터에 대한 보고를 받으려면 다음을 수행합니다.

기본적으로 앱에서 오류를 일으키는 모든 예외가 포털에 표시되지는 않습니다. 웹 페이지에서 JavaScript SDK를 사용하는 경우 브라우저 예외가 표시됩니다. 그러나 대부분의 서버 쪽 예외는 IIS에 의해 가로채므로 캡처하고 보고하는 코드를 추가해야 합니다.

당신은 할 수 있어요:

  • 예외를 명시적으로 기록 합니다.
  • 예외를 자동으로 캡처 합니다. 프레임워크 유형에 따라 추가할 항목이 다릅니다.
명시적으로 예외 보고

보고하는 가장 간단한 방법은 예외 처리기에 trackException()에 대한 호출을 삽입하는 것입니다.

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

속성 및 측정 매개 변수는 선택적이지만 추가 정보를 필터링 및 추가하는 데 유용합니다. 예를 들어 여러 게임을 실행할 수 있는 앱이 있는 경우 특정 게임과 관련된 모든 예외 보고서를 찾을 수 있습니다. 각 사전에 원하는 만큼 항목을 추가할 수 있습니다.

브라우저 예외

대부분의 브라우저 예외가 보고됩니다.

웹 페이지에 콘텐츠 배달 네트워크 또는 다른 도메인의 스크립트 파일이 포함되는 경우 스크립트 태그에 crossorigin="anonymous" 특성이 있고 서버에서 CORS 헤더를 전송하는지 확인하세요. 이 동작을 사용하면 이러한 리소스에서 처리되지 않은 JavaScript 예외에 대한 스택 추적 및 세부 정보를 가져올 수 있습니다.

원격 분석 클라이언트 재사용

비고

TelemetryClient를 한 번 인스턴스화하고 애플리케이션의 수명 동안 다시 사용하는 것이 좋습니다.

적절한 .NET SDK인 .NET의 DI(종속성 주입)를 사용하고 DI에 대해 Application Insights를 올바르게 구성하는 경우, TelemetryClient를 생성자 매개 변수로 요구할 수 있습니다.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

앞의 예제에서 TelemetryClientExampleController 클래스에 삽입됩니다.

웹 양식

웹 양식의 경우 HTTP 모듈은 CustomErrors(으)로 구성된 리디렉션이 없는 경우 예외를 수집할 수 있습니다. 하지만 활성 리디렉션이 있다면 다음 줄을 Application_Error 함수에 추가합니다.

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

앞의 예제에서 _telemetryClientTelemetryClient형식의 클래스 범위 변수입니다.

MVC

Application Insights 웹 SDK 버전 2.6(beta 3 및 이후 버전)부터 Application Insights는 MVC 5+ 컨트롤러 메서드에서 발생하는 처리되지 않은 예외를 자동으로 수집합니다. 이전에 이러한 예외를 추적하기 위해 사용자 지정 처리기를 추가한 경우 예외를 이중 추적하지 않도록 제거할 수 있습니다.

예외가 발생할 때 예외 필터에서 오류를 올바르게 처리할 수 없는 경우 활용할 수 있는 몇 가지 시나리오가 있습니다.

  • 컨트롤러 생성자에서
  • 메시지 처리기에서
  • 라우팅 중
  • 응답 콘텐츠를 직렬화하는 중
  • 애플리케이션 시작 중
  • 백그라운드 작업에서

애플리케이션에 의해 처리된 모든 예외는 수동으로 추적되어야 합니다. 일반적으로 컨트롤러에서 발생한 처리되지 않은 예외로 인해 500 "내부 서버 오류" 응답이 발생합니다. 이러한 응답이 처리된 예외(또는 예외 없음)의 결과로 수동으로 생성된 경우 ResultCode 500을 사용하여 해당하는 요청 원격 분석에서 추적됩니다. 그러나 Application Insights SDK는 해당하는 예외를 추적할 수 없습니다.

이전 버전 지원

Application Insights 웹 SDK 2.5(및 이전 버전)의 MVC 4(및 이전 버전)를 사용하는 경우 예외를 추적하기 위해 다음 예제를 참조합니다.


확장하여 이전 버전에 대한 지침 보기

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

AiHandleErrorAttributeGlobal.asax.cs에서 글로벌 필터로 등록합니다.

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

샘플

MVC 4, MVC 5

AiHandleErrorAttributeFilterConfig.cs에서 글로벌 필터로 등록합니다.

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

샘플

인터넷 응용 프로그램 인터페이스

Application Insights 웹 SDK 버전 2.6(beta 3 및 이후 버전)부터 Application Insights는 Web API 2+의 컨트롤러 메서드에서 자동으로 throw된 처리되지 않은 예외를 수집합니다. 다음 예제에 설명된 대로 이전에 이러한 예외를 추적하기 위해 사용자 지정 처리기를 추가한 경우 예외를 이중 추적하지 않도록 제거할 수 있습니다.

예외 필터가 처리할 수 없는 몇 가지 경우가 있습니다. 다음은 그 예입니다.

  • 컨트롤러 생성자에서 throw된 예외
  • 메시지 처리기에서 throw된 예외
  • 라우팅 중에 throw된 예외
  • 응답 콘텐츠를 직렬화하는 동안 throw된 예외
  • 애플리케이션 시작 중에 throw된 예외
  • 배경 작업에서 throw된 예외

애플리케이션에 의해 처리된 모든 예외는 수동으로 추적되어야 합니다. 일반적으로 컨트롤러에서 발생한 처리되지 않은 예외로 인해 500 "내부 서버 오류" 응답이 발생합니다. 이러한 응답이 처리된 예외(또는 예외 없음)의 결과로 수동으로 생성된 경우 ResultCode 500을 사용하여 해당하는 요청 원격 분석에서 추적됩니다. 그러나 Application Insights SDK는 해당 예외를 추적할 수 없습니다.

이전 버전 지원

Application Insights 웹 SDK 2.5(및 이전 버전)의 Web API 1(및 이전 버전)을 사용하는 경우 예외를 추적하기 위해 다음 예제를 참조합니다.


확장하여 이전 버전에 대한 지침 보기

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

샘플

Web 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의 사용자 지정 구현으로 바꿉니다. 이 예외 처리기는 프레임 워크에서 보낼 응답 메시지를 선택할 수 있는 때에만 호출됩니다. 인스턴스에 대한 연결이 끊어지면 호출되지 않습니다.
  • 모든 경우에 호출되지 않는 Web API 1.x 컨트롤러에 대한 이전 섹션에 설명된 대로 예외 필터를 사용합니다.

WCF

Attribute를 확장하고 IErrorHandlerIServiceBehavior를 구현하는 클래스를 추가합니다.

    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 예외가 모두 포함됩니다.

메트릭 탐색기 탭을 열고 새 차트를 추가합니다. 성능 카운터에서 예외 속도를 선택합니다.

.NET Framework는 간격의 예외 수를 계산하고 간격의 길이로 나누어 속도를 계산합니다.

이 수는 Application Insights 포털 집계 TrackException 보고서에서 계산한 예외 수와 다릅니다. 샘플링 간격이 다르며, SDK에서 처리된 예외 및 처리되지 않은 예외 둘 다에 대한 TrackException 보고서를 보내지 않습니다.

사용자 지정 메트릭 컬렉션

Azure Monitor Application Insights .NET 및 .NET Core SDK에는 사용자 지정 메트릭을 수집하는 두 가지 방법이 있습니다.

  • 사전 집계가 없는 TrackMetric() 메서드입니다.
  • 사전 집계가 있는 GetMetric() 메서드입니다.

집계를 사용하는 것이 좋으므로 TrackMetric()더 이상 사용자 지정 메트릭을 수집하는 기본 방법이 아닙니다. 이 문서에서는 GetMetric() 메서드를 사용하는 방법과 그 작동 원리에 대해 설명합니다.


사전 집계 및 사전 집계가 아닌 API에 대한 자세한 내용을 알아보려면 확장합니다.

TrackMetric() 메서드는 메트릭을 나타내는 원시 원격 분석 데이터를 보냅니다. 각 값에 대해 단일 원격 분석 데이터를 보내는 것은 비효율적입니다. TrackMetric()은 모든 TrackMetric(item)이 원격 분석 이니셜라이저와 프로세서의 전체 SDK 파이프라인을 거치므로 성능 측면에서도 비효율적입니다.

TrackMetric()과 달리 GetMetric()은 로컬 사전 집계를 처리한 다음, 1분의 고정 간격으로 집계된 요약 메트릭만 제출합니다. 1분마다 모니터링하는 스토리지 및 네트워크 트래픽 비용만으로 초 또는 밀리초 수준에서 일부 사용자 지정 메트릭을 면밀하게 모니터링할 수 있습니다. 또한 이 동작을 통해 집계된 메트릭에 대해 전송되어야 하는 총 원격 분석 항목 수가 크게 감소하기 때문에 제한 발생 위험이 크게 줄어듭니다.

Application Insights에서 TrackMetric()GetMetric()을 통해 수집된 사용자 지정 메트릭은 샘플링 대상이 아닙니다. 중요한 메트릭을 샘플링하면 해당 메트릭을 중심으로 작성된 경고가 불안정해지는 시나리오가 발생할 수 있습니다. 사용자 지정 메트릭을 샘플링하지 않으면 경고 임계값 위반 시 경고가 발생함을 확신할 수 있습니다. 사용자 지정 메트릭이 샘플링되지 않으므로 몇 가지 잠재적인 문제가 있습니다.

메트릭에서 1초마다 또는 훨씬 더 세분화된 간격으로 추세를 추적하면 다음과 같은 결과를 얻을 수 있습니다.

  • 데이터 스토리지 비용 증가. Azure Monitor로 보내는 데이터 양과 관련된 비용이 있습니다. 더 많은 데이터를 보낼수록 전체 모니터링 비용이 증가합니다.
  • 네트워크 트래픽 또는 성능 오버헤드가 증가했습니다. 일부 시나리오에서는 이 오버헤드로 인해 금전적 비용과 애플리케이션 성능 비용이 모두 발생할 수 있습니다.
  • 수집 제한의 위험. 앱이 짧은 시간 간격으로 높은 비율의 원격 분석을 전송할 때 Azure Monitor는 데이터 요소를 삭제("제한")합니다.

제한은 누락된 경고로 이어질 수 있으므로 문제가 될 수 있습니다. 경고를 트리거하는 조건은 로컬에서 발생한 다음 너무 많은 데이터가 전송되어 수집 엔드포인트에서 삭제될 수 있습니다. 고유한 로컬 집계 논리를 구현하지 않는 한 .NET 및 .NET Core에는 TrackMetric()을(를) 사용하지 않는 것이 좋습니다. 지정된 기간 동안 이벤트가 발생하는 모든 인스턴스를 추적하려는 경우 TrackEvent()가 더 적합할 수 있습니다. 사용자 지정 메트릭과 달리 사용자 지정 이벤트는 샘플링 대상입니다. 자체 로컬 사전 집계를 작성하지 않아도 TrackMetric()을 계속 사용할 수 있습니다. 그렇지만 그렇게 하는 경우 문제에 대해 알고 있어야 합니다.

요약하자면 GetMetric()은 사전 집계를 수행하기 때문에 권장되는 방법입니다. 모든 Track() 호출의 값을 누적하고 1분마다 요약/집계를 보냅니다. GetMetric() 메서드는 모든 관련 정보를 수집하는 동안 더 적은 데이터 요소를 보냄으로써 비용 및 성능 오버헤드를 상당히 줄일 수 있습니다.

GetMetric 시작

이 예에서는 기본 .NET Core 3.1 작업자 서비스 애플리케이션을 사용합니다. 이러한 예제와 함께 사용되는 테스트 환경을 복제하려면 .NET Core 작업자 서비스 애플리케이션에서 1-6단계를 수행합니다. 이러한 단계는 기본 작업자 서비스 프로젝트 템플릿에 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개의 고유 메트릭 측정의 집계값을 나타냅니다. 같은 값을 반복해서 보냈기 때문에 동일한 최댓값(stDev) 및 최솟값(0)을 가지며 값이 max인 표준 편차(min)가 있습니다. value 속성은 집계된 모든 개별 값의 합계를 나타냅니다.

비고

GetMetric 메서드는 마지막 값(예: gauge) 추적이나 히스토그램 또는 분포 추적을 지원하지 않습니다.

로그(분석) 환경에서 Application Insights 리소스를 검사하는 경우 이 개별 원격 분석 항목은 다음 스크린샷과 같이 표시됩니다.

Log Analytics 쿼리 보기를 보여 주는 스크린샷.

비고

원시 원격 측정 항목에는 일단 수집된 명시적 합계 속성/필드가 포함되어 있지 않아 사용자를 위해 하나 만듭니다. 이 경우 valuevalueSum 속성이 모두 동일한 작업을 나타냅니다.

Portal의 메트릭 섹션에서 사용자 지정 메트릭 원격 분석에 로그 기반 및 사용자 지정 메트릭으로 액세스할 수도 있습니다. 다음 스크린샷은 로그 기반 메트릭의 예입니다.

메트릭 탐색기 보기를 보여 주는 스크린샷.

높은 처리량 사용을 위한 캐시 메트릭 참조

메트릭 값은 경우에 따라 자주 관찰될 수 있습니다. 예를 들어 초당 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() 호출이 발생했습니다.

다차원 메트릭

이전 섹션의 예는 0차원 메트릭을 보여줍니다. 메트릭은 다차원일 수도 있습니다. 현재 최대 10개의 차원을 지원합니다.

다음은 1차원 메트릭을 만드는 방법의 예입니다.

//...

        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로 전송됩니다. 각 항목은 3개의 폼 팩터 중 하나의 집계를 나타냅니다. 이전과 마찬가지로 로그(분석) 보기에서 더 자세히 조사할 수 있습니다.

다차원 메트릭의 Log Analytics 보기를 보여 주는 스크린샷.

메트릭 탐색기에서 다음을 수행합니다.

사용자 지정 메트릭을 보여 주는 스크린샷.

새 사용자 지정 차원으로 메트릭을 분할하거나 메트릭 보기로 사용자 지정 차원을 볼 수 없습니다.

분할 지원을 보여 주는 스크린샷.

기본적으로 메트릭 탐색기 내의 다차원 메트릭은 Application Insights 리소스에서 설정되지 않습니다.

다차원 메트릭 사용

Application Insights 리소스에 대해 다차원 메트릭을 사용하려면 사용량 및 예상 비용>사용자 지정 메트릭>사용자 지정 메트릭 차원의 경고를 사용하도록 설정>확인을 선택합니다. 자세한 내용은 사용자 지정 메트릭 차원 및 사전 집계를 참조하세요.

변경하고 새 다차원 원격 분석을 보낸 후 분할 적용을 선택할 수 있습니다.

비고

포털에서 기능이 켜진 후에 새로 전송된 메트릭에만 차원이 저장됩니다.

분할 적용을 보여 주는 스크린샷.

FormFactor 차원에 대한 메트릭 집계를 봅니다.

폼 팩터를 보여 주는 스크린샷.

4개 이상의 차원이 있는 경우 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");
차원 및 시계열 제한

원격 분석 하위 시스템이 실수로 리소스를 다 사용하지 않도록 메트릭당 최대 데이터 계열 수를 제어할 수 있습니다. 기본 한도는 메트릭당 데이터 계열 총 1,000개 이하이며 차원당 값 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 does not 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);
}

사용자 지정 작업 추적

Application Insights SDK는 들어오는 HTTP 요청과 종속 서비스에 대한 호출(예:HTTP 요청 및 SQL 쿼리)을 자동으로 추적합니다. 요청 및 종속성의 추적과 상관 관계를 사용하면 애플리케이션을 결합하는 모든 마이크로 서비스에서 전체 애플리케이션의 응답성 및 안정성을 파악할 수 있습니다.

일반적으로는 지원할 수 없는 애플리케이션 패턴의 클래스가 있습니다. 이러한 패턴의 적절한 모니터링에는 수동 코드 계측이 필요합니다. 이 섹션에서는 사용자 지정 큐 처리 및 장기 실행 백그라운드 작업 실행과 같은 수동 계측이 필요할 수 있는 몇 가지 패턴에 대해 설명합니다.

이 섹션에서는 Application Insights SDK를 사용하여 사용자 지정 작업을 추적하는 방법에 대한 지침을 제공합니다.

개요

작업은 애플리케이션에서 실행하는 활동의 논리적 부분입니다. 여기에는 이름, 시작 시간, 기간, 결과 및 실행 컨텍스트(예: 사용자 이름, 속성 및 결과)가 있습니다. 작업 B에서 작업 A를 시작한 경우 작업 B는 A의 부모로 설정됩니다. 작업에는 하나의 부모만 있을 수 있지만 많은 자식 작업이 있을 수 있습니다. 작업 및 원격 분석 상관 관계에 대한 자세한 내용은 Application Insights 원격 분석 상관 관계를 참조하세요.

Application Insights .NET SDK에서 작업은 OperationTelemetry 추상 클래스 및 해당하는RequestTelemetryDependencyTelemetry 하위 항목으로 설명됩니다.

들어오는 작업 추적

Application Insights 웹 SDK는 IIS 파이프라인과 모든 ASP.NET Core 애플리케이션에서 실행되는 ASP.NET 애플리케이션에 대한 HTTP 요청을 자동으로 수집합니다. 다른 플랫폼과 프레임워크에 대해서 커뮤니티 지원 솔루션이 있습니다. 애플리케이션에서 표준 또는 커뮤니티 지원 솔루션으로 지원되지 않으면 수동으로 계측할 수 있습니다.

사용자 지정 추적이 필요한 또 다른 예로 큐에서 항목을 받는 작업자가 있습니다. 일부 큐의 경우 이 큐에 메시지를 추가하는 호출이 종속성으로 추적됩니다. 메시지 처리를 설명하는 상위 수준 항목은 자동으로 수집되지 않습니다.

이러한 작업을 추적할 수 있는 방법을 살펴보겠습니다.

상위 수준에서 작업은 RequestTelemetry를 만들고 알려진 속성을 설정하는 것입니다. 작업이 완료되면 원격 분석을 추적합니다. 다음 예제에서는 이 작업을 보여 줍니다.

Owin 자체 호스팅 앱의 HTTP 요청

이 예제에서 추적 컨텍스트는 상관 관계에 대한 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 헤더를 선언하지만, 여기서는 간소화하기 위해 생략했습니다.

큐 계측

HTTP 요청과 함께 상관 관계 정보를 전달하는 상관 관계용 HTTP 프로토콜W3C 추적 컨텍스트도 있지만 모든 큐 프로토콜은 동일한 세부 정보가 큐 메시지와 함께 전달되는 방식을 정의해야 합니다. AMQP와 같은 일부 큐 프로토콜은 더 많은 메타데이터를 전달할 수 있습니다. Azure Storage 큐 등의 다른 프로토콜은 컨텍스트를 메시지 페이로드로 인코딩해야 합니다.

비고

구성 요소 간 추적은 아직 큐에서 지원되지 않습니다.

HTTP에서 생산자와 소비자가 다양한 Application Insights 리소스에 원격 분석을 보내는 경우 트랜잭션 진단 환경 및 애플리케이션 맵에 트랜잭션과 맵이 엔드투엔드로 표시됩니다. 큐의 경우 이 기능은 아직 지원되지 않습니다.

Service Bus 큐

추적 정보는 Azure Service Bus 메시징을 통한 분산 추적 및 상관 관계를 참조하세요.

Azure Storage 큐

다음 예제에서는 Azure Storage 큐 작업을 추적하고 생산자, 소비자 및 Azure Storage 간의 원격 분석 상관 관계를 지정하는 방법을 보여 줍니다.

Storage 큐에는 HTTP API가 있습니다. 큐에 대한 모든 호출은 HTTP 요청에 대한 Application Insights 종속성 수집기에서 추적됩니다. 기본적으로 ASP.NET 및 ASP.NET Core 애플리케이션에서 구성됩니다. 다른 종류의 애플리케이션을 사용하는 경우 콘솔 애플리케이션 설명서를 참조하세요.

또한 Application Insights 작업 ID와 Storage 요청 ID 사이의 상관 관계를 지정할 수도 있습니다. Storage 요청 클라이언트와 서버 요청 ID를 설정하고 가져 오는 방법에 대한 자세한 내용은 Azure Storage 모니터링, 진단 및 문제 해결을 참조하세요.

Storage 큐는 HTTP API를 지원하므로 큐를 통한 모든 작업은 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를 직접 사용합니다.

  • Application Insights 작업을 시작하는 대신 새 Activity를 만듭니다(및 시작합니다). 작업 이름을 제외한 속성은 할당할 필요가 없습니다 .
  • yourActivity.Id 대신 메시지 페이로드에 operation.Telemetry.Id를 직렬화합니다. 또한 Activity.Current.Id을 사용할 수 있습니다.

마찬가지로 다른 큐 작업도 계측할 수 있습니다. 피크 작업은 큐에서 제거 작업과 비슷한 방식으로 계측해야 합니다. 큐 관리 작업 계측은 필요하지 않습니다. Application Insights는 HTTP와 같은 작업을 추적하며, 이는 대부분의 경우에 충분합니다.

메시지 삭제를 계측할 때는 작업(상관 관계) 식별자를 설정해야 합니다. 또는 Activity API를 사용할 수 있습니다. 그러면 Application Insights SDK에서 사용자를 대신하여 이 작업을 수행하므로 원격 분석 항목에서 작업 식별자를 설정할 필요가 없습니다.

  • 큐에서 항목을 가져온 후 새 Activity를 만듭니다.
  • Activity.SetParentId(message.ParentId)를 사용하여 소비자와 생산자 로그의 상관 관계를 지정합니다.
  • Activity를 시작합니다.
  • Start/StopOperation 도우미를 사용하여 큐에서 제거, 처리 및 삭제 작업을 추적합니다. 동일한 비동기 제어 흐름(실행 컨텍스트)에서 수행합니다. 이런 방식으로 상관 관계가 제대로 지정됩니다.
  • Activity를 중지합니다.
  • Start/StopOperation을 사용하거나 수동으로 Track 원격 분석을 호출합니다.
종속성 유형

Application Insights는 종속성 유형을 사용하여 UI 환경을 사용자 지정합니다. 큐의 경우 DependencyTelemetry을 개선하는 다음 유형의 를 인식합니다.

  • Azure Storage 큐에 대한 Azure queue
  • 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.StartOperationDependencyTelemetry를 만들고 상관 컨텍스트를 채웁니다. 작업을 예약한 들어오는 요청으로 만들어진 부모 작업이 있다고 가정해 보겠습니다. 들어오는 요청과 동일한 비동기 제어 흐름에서 BackgroundTask가 시작되는 한 해당 부모 작업과 상관 관계가 지정됩니다. BackgroundTask 및 모든 중첩된 원격 분석 항목은 요청이 종료된 후에도 원인이 된 요청과의 상관 관계가 자동으로 지정됩니다.

연결된 작업(Activity)이 없는 백그라운드 스레드에서 작업이 시작되면 BackgroundTask에는 부모가 없습니다. 그러나 중첩된 작업이 있을 수 있습니다. 이 작업에서 보고되는 모든 원격 분석 항목과 DependencyTelemetry에서 만들어진 BackgroundTask 사이의 상관 관계가 지정됩니다.

나가는 종속성 추적

사용자 고유의 종속성 종류 또는 Application Insights에서 지원하지 않는 작업을 추적할 수 있습니다.

Service Bus 큐의 Enqueue 메서드 또는 Azure Storage 큐는 이러한 사용자 지정 추적의 예제로 사용할 수 있습니다.

사용자 지정 종속성 추적을 위한 일반적인 방법은 다음과 같습니다.

  • 상관 관계 및 일부 다른 속성(예: 시작, 타임스탬프, 기간)에 필요한 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을 호출하고 동일한 async 메서드에서 작업을 처리하여 병렬로 실행 중인 작업을 격리해야 합니다. 작업이 동기이면(또는 비동기가 아님) 프로세스를 래핑하고 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의 카운터

Application Insights는 성능 카운터 및 이벤트 카운터를 지원합니다. 이 가이드에서는 두 가지 모두에 대해 간략하게 설명하며, 그 목적, 구성, .NET 애플리케이션에서의 사용법에 대해서도 설명합니다.

개요

  • 성능 카운터는 Windows 운영 체제에 기본 제공되어 있으며 CPU 사용량, 메모리 사용량, 디스크 작업과 같은 미리 정의된 메트릭을 제공합니다. 이러한 카운터는 최소 설정으로 표준 성능 메트릭을 모니터링하는 데 이상적입니다. 이러한 기능은 Windows 기반 애플리케이션에서 리소스 사용률을 추적하거나 시스템 수준의 병목 현상을 해결하는 데 도움이 되지만 사용자 지정 애플리케이션별 메트릭은 지원하지 않습니다.

  • 이벤트 카운터는 Windows, Linux, macOS를 포함한 여러 플랫폼에서 작동합니다. 개발자는 이를 통해 가볍고 사용자 지정이 가능한 애플리케이션별 메트릭을 정의하고 모니터링할 수 있어 성능 카운터보다 더 많은 유연성을 제공합니다. 이벤트 카운터는 시스템 메트릭이 부족하거나 플랫폼 간 애플리케이션에서 자세한 원격 분석이 필요할 때 유용합니다. 이러한 기능을 구현하고 구성하려면 명시적인 구현과 구성이 필요하므로 설정에 더 많은 활동이 필요합니다.

성능 계수기

Windows는 프로세서, 메모리, 디스크 사용 통계를 수집하는 데 사용되는 것과 같은 다양한 성능 카운터를 제공합니다. 고유한 성능 카운터를 정의할 수도 있습니다.

사용자의 애플리케이션은 온-프레미스 호스트 또는 관리자 액세스 권한이 있는 가상 머신의 IIS(인터넷 정보 서버)에서 실행되는 경우 성능 카운터 컬렉션을 지원합니다. Azure Web Apps로 실행되는 애플리케이션은 성능 카운터에 직접 액세스할 수 없지만 Application Insights는 사용 가능한 카운터의 하위 집합을 수집합니다.

팁 (조언)

다른 메트릭과 마찬가지로 카운터가 지정된 한도를 벗어나면 경고하도록 경고를 설정할 수 있습니다. 경고를 설정하려면 경고 창을 열고 경고 추가를 선택합니다.

필수 조건

성능 모니터 사용자 그룹에 추가하여 성능 카운터를 모니터링할 수 있는 앱 풀 서비스 계정 권한을 부여합니다.

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

카운터 보기

메트릭 창에는 기본 성능 카운터 세트가 표시됩니다.

ASP.NET 웹 애플리케이션의 기본 카운터:

  • % 프로세스\프로세서 시간 (Processor Time)
  • % 프로세스\프로세서 시간 정규화됨
  • 메모리\사용 가능한 바이트
  • ASP.NET Requests/Sec
  • .NET CLR(공용 언어 런타임) 예외 발생 횟수/초
  • ASP.NET 애플리케이션 요청 실행 시간
  • 프로세스\개인 바이트 (Process\Private Bytes)
  • 프로세스\입출력 데이터 바이트/초
  • ASP.NET 애플리케이션\애플리케이션 대기열의 요청
  • 프로세서(_Total)\% 프로세서 시간

카운터 추가

원하는 성능 카운터가 메트릭 목록에 포함되지 않은 경우 추가할 수 있습니다.

옵션 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 웹 애플리케이션 또는 .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에서 실행되는 애플리케이션 및 Azure App Service의 Windows 컨테이너에 대한 성능 카운터

Azure Web Apps에 배포된 ASP.NET 및 ASP.NET Core 애플리케이션은 모두 특수한 샌드박스 환경에서 실행됩니다. Azure App Service에 배포된 애플리케이션은 Windows 컨테이너를 활용하거나 샌드박스 환경에서 호스트할 수 있습니다. 애플리케이션이 Windows 컨테이너에 배포된 경우 모든 표준 성능 카운터를 컨테이너 이미지에서 사용할 수 있습니다.

샌드박스 환경에서는 시스템 성능 카운터에 대한 직접 액세스를 허용하지 않습니다. 그러나 제한된 카운터 하위 집합은 환경 변수로 노출되는 성능 카운터에 설명된 대로 환경 변수로 노출됩니다. 이 환경에서는 카운터의 하위 집합만 사용할 수 있습니다. 전체 목록은 환경 변수로 노출된 성능 카운터를 참조하세요.

ASP.NETASP.NET Core용 Application Insights SDK는 코드가 웹앱 또는 비 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에도 앱이 실행되는 호스트 서버 인스턴스의 ID를 나타내는 cloud_RoleInstance 열이 있습니다. 예를 들어, 서로 다른 컴퓨터에서 앱의 성능을 비교하려면:

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

성능 카운터 FAQ

FAQ(질문과 대답)를 검토하려면 성능 카운터 FAQ를 참조하세요.

이벤트 카운터

EventCounter는 카운터 또는 통계를 게시하고 사용하는 .NET/.NET Core 메커니즘입니다. EventCounters는 모든 OS 플랫폼(Windows, Linux 및 macOS)에서 지원됩니다. Windows 시스템에서만 지원되는 PerformanceCounters 에 해당하는 플랫폼 간이라고 생각할 수 있습니다.

사용자는 자신의 요구 사항을 충족하기 위해 사용자 지정 이벤트 카운터를 게시할 수 있지만 .NET은 기본적으로 이러한 카운터 집합을 게시합니다. 이 문서에서는 Azure Application Insights에서 이벤트 카운터(시스템 정의 또는 사용자 정의)를 수집하고 확인하는 데 필요한 단계를 안내합니다.

팁 (조언)

다른 메트릭과 마찬가지로 카운터가 지정된 한도를 벗어나면 경고하도록 경고를 설정할 수 있습니다. 경고를 설정하려면 경고 창을 열고 경고 추가를 선택합니다.

Application Insights를 사용하여 EventCounters 수집

Application Insights는 새로 릴리스된 NuGet 패키지 EventCounters의 일부인 EventCounterCollectionModule을 사용한 수집을 지원합니다. EventCounterCollectionModuleAspNetCore 또는 WorkerService를 사용하는 경우 자동으로 사용하도록 설정됩니다. EventCounterCollectionModule은 구성 불가능한 수집 빈도(60초)로 카운터를 수집합니다. EventCounters를 수집하는 데 필요한 특별 권한은 없습니다. ASP.NET Core 애플리케이션의 경우 Microsoft.ApplicationInsights.AspNetCore 패키지도 추가하려고 합니다.

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

수집된 기본 카운터

AspNetCore SDK 또는 WorkerService SDK의 2.15.0 버전을 사용하여 시작하는 경우 기본적으로 카운터가 수집되지 않습니다. 모듈 자체를 사용할 수 있으므로 사용자가 원하는 카운터를 추가하여 수집합니다.

.NET 런타임에 게시된 잘 알려진 카운터 목록을 가져오려면 사용 가능한 카운터 문서를 참조하세요.

수집할 카운터 사용자 지정

다음 예에서는 카운터를 추가/제거하는 방법을 보여 줍니다. AddApplicationInsightsTelemetry() 또는 AddApplicationInsightsWorkerService()를 사용하여 Application Insights 원격 분석 수집을 사용하도록 설정한 후 애플리케이션 서비스 구성의 일부로 이 사용자 지정을 수행합니다. 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 수집 모듈을 사용하지 않도록 설정

EventCounterCollectionModuleApplicationInsightsServiceOptions를 사용하여 사용하지 않도록 설정할 수 있습니다.

다음 예제에서는 ASP.NET Core SDK를 사용합니다.

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 AnalyticscustomMetrics 테이블에서 이벤트 카운터 보고서를 검색하고 표시할 수 있습니다.

예를 들어 다음 쿼리를 실행하여 수집된 카운터 및 쿼리에 사용할 수 있는 카운터를 확인합니다.

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

다른 원격 분석과 마찬가지로 customMetrics에도 앱이 실행되는 호스트 서버 인스턴스의 ID를 나타내는 cloud_RoleInstance 열이 있습니다. 이전 쿼리는 인스턴스별 카운터 값을 보여 주며, 이를 사용하여 다양한 서버 인스턴스의 성능을 비교할 수 있습니다.

이벤트 카운터 FAQ

FAQ(질문과 대답)를 검토하려면 이벤트 카운터 FAQ를 참조하세요.

원격 분석 데이터 필터링 및 보강

이 부분에서는

원격 분석 데이터 필터링 및 전처리

SDK에서 전송되기 전에 원격 분석을 필터링, 수정 또는 보강하는 코드를 작성할 수 있습니다. 처리에는 HTTP 요청 수집 및 종속성 수집과 같은 표준 원격 분석 모듈에서 전송되는 데이터가 포함됩니다.

  • 필터링은 SDK에서 전송되기 전에 원격 분석을 수정하거나 걸러낼 수 있도록 구현할 수 있습니다 ITelemetryProcessor. 예를 들어 로봇의 요청을 제외하여 원격 분석의 양을 줄일 수 있습니다. 샘플링과 달리 전송 또는 삭제되는 항목을 완전히 제어할 수 있지만 집계된 로그에 따라 모든 메트릭에 영향을 줍니다. 항목을 삭제하는 방법에 따라 관련 항목 간을 탐색하는 기능도 손실될 수 있습니다.

  • 속성을 추가하거나 수정하려면 앱에서 보내는 모든 원격 분석에 대해 ITelemetryInitializer를 구현하십시오. 예를 들어 포털에서 데이터를 필터링할 계산 값 또는 버전 번호를 추가할 수 있습니다.

  • 샘플링 은 통계에 영향을 주지 않고 원격 분석의 볼륨을 줄입니다. 관련 데이터 요소를 함께 유지하므로 문제를 진단할 때 데이터 요소를 탐색할 수 있습니다. 포털 내에서 샘플링을 보완하기 위해 총 개수를 곱합니다.

비고

SDK API 는 사용자 지정 이벤트 및 메트릭을 보내는 데 사용됩니다.

Filtering

이 기술을 사용하면 원격 분석 스트림에서 포함되거나 제외되는 항목을 직접 제어할 수 있습니다. 필터링을 사용하여 원격 분석 항목이 Application Insights로 전송되지 않도록 삭제할 수 있습니다. 샘플링과 함께 또는 별도로 필터링을 사용할 수 있습니다.

원격 분석을 필터링하려면 원격 분석 프로세서를 작성하고 등록합니다 TelemetryConfiguration. 모든 원격 분석은 프로세서를 통과합니다. 스트림에서 삭제하거나 체인의 다음 프로세서에 제공하도록 선택할 수 있습니다. HTTP 요청 수집기 및 종속성 수집기와 같은 표준 모듈의 원격 분석 및 직접 추적한 원격 분석이 포함됩니다. 예를 들어 로봇의 요청 또는 성공적인 종속성 호출에 대한 원격 분석을 필터링할 수 있습니다.

경고

프로세서를 사용하여 SDK에서 보낸 원격 분석을 필터링하면 포털에 표시되는 통계가 왜곡되어 관련 항목을 따르기 어려울 수 있습니다.

대신 샘플링을 사용하는 것이 좋습니다.

ITelemetryProcessor 및 ITelemetryInitializer

원격 분석 프로세서와 원격 분석 이니셜라이저의 차이점은 무엇인가요?

  • 그들로 할 수 있는 작업에 일부 겹침이 있습니다. 둘 다 원격 분석의 속성을 추가하거나 수정하는 데 사용할 수 있지만, 해당 용도로 이니셜라이저를 사용하는 것이 좋습니다.
  • 원격 분석 이니셜라이저는 항상 원격 분석 프로세서 전에 실행됩니다.
  • 원격 분석 이니셜라이저를 두 번 이상 호출할 수 있습니다. 규칙에 따라 이미 설정된 속성은 설정하지 않습니다.
  • 원격 분석 프로세서를 사용하면 원격 분석 항목을 완전히 바꾸거나 삭제할 수 있습니다.
  • 등록된 모든 원격 분석 이니셜라이저는 모든 원격 분석 항목에 대해 호출됩니다. 원격 분석 프로세서의 경우 SDK는 첫 번째 원격 분석 프로세서 호출을 보장합니다. 나머지 프로세서가 호출되는지 여부는 이전 원격 분석 프로세서에 의해 결정됩니다.
  • 원격 분석 이니셜라이저를 사용하여 더 많은 속성으로 원격 분석을 보강하거나 기존 속성을 재정의합니다. 원격 분석 프로세서를 사용하여 원격 분석을 필터링합니다.

속성 추가/수정

원격 분석 이니셜라이저를 사용하여 추가 정보로 원격 분석을 보강하거나 표준 원격 분석 모듈에서 설정한 원격 분석 속성을 재정의합니다.

예를 들어 웹 패키지에 대한 Application Insights는 HTTP 요청에 대한 원격 분석을 수집합니다. 기본적으로 응답 코드 >가 =400인 모든 요청에 실패로 플래그를 지정합니다. 대신 400을 성공으로 처리하려는 경우 성공 속성을 설정하는 원격 분석 이니셜라이저를 제공할 수 있습니다.

원격 분석 이니셜라이저를 제공하는 경우 Track*() 메서드를 호출할 때마다 호출됩니다. 이 이니셜라이저에는 표준 원격 분석 모듈에서 호출하는 Track() 메서드가 포함됩니다. 규칙에 따라 이러한 모듈은 이니셜라이저에 의해 이미 설정된 속성을 설정하지 않습니다. 원격 분석 이니셜라이저는 원격 분석 프로세서를 호출하기 전에 호출되므로 이니셜라이저에서 수행하는 모든 보강이 프로세서에 표시됩니다.

원격 분석 이니셜라이저

추가 정보로 원격 분석을 보강하거나 표준 원격 분석 모듈에서 설정한 원격 분석 속성을 재정의하려면 원격 분석 이니셜라이저를 사용합니다.

원격 분석 이니셜라이저는 원격 분석의 모든 항목과 함께 전송되는 컨텍스트 속성을 설정합니다. 고유한 이니셜라이저를 작성하여 컨텍스트 속성을 설정할 수 있습니다.

표준 이니셜라이저는 웹 또는 Windows Server NuGet 패키지에서 모두 설정합니다.

이니셜라이저 Description
AccountIdTelemetryInitializer AccountId 속성을 설정합니다.
AuthenticatedUserIdTelemetryInitializer JavaScript SDK에서 설정한 AuthenticatedUserId 속성을 설정합니다.
AzureRoleEnvironmentTelemetryInitializer Azure 런타임 환경에서 추출된 정보를 사용하여 모든 원격 분석 항목에 대해 RoleName 컨텍스트에 대한 RoleInstanceDevice 속성을 업데이트합니다.
BuildInfoConfigComponentVersionTelemetryInitializer MS Build에서 생성된 Version 파일에서 추출된 값으로 모든 원격 분석 항목에 대한 Component 컨텍스트의 BuildInfo.config 속성을 업데이트합니다.
ClientIpHeaderTelemetryInitializer 요청의 Ip HTTP 헤더 기반의 모든 원격 분석 항목의 Location 컨텍스트의 X-Forwarded-For 속성을 업데이트합니다.
DeviceTelemetryInitializer 모든 원격 분석 항목에 대한 Device 컨텍스트의 다음 속성을 업데이트합니다.

Type이(가) PC(으)로 설정됩니다.
Id은(는) 웹 애플리케이션이 실행되고 있는 컴퓨터의 도메인 이름으로 설정됩니다.
OemName은(는) WMI를 사용하여 Win32_ComputerSystem.Manufacturer 필드에서 추출된 값으로 설정됩니다.
Model은(는) WMI를 사용하여 Win32_ComputerSystem.Model 필드에서 추출된 값으로 설정됩니다.
NetworkType은(는) NetworkInterface 속성에서 추출된 값으로 설정됩니다.
Language은(는) CurrentCulture 속성의 이름으로 설정됩니다.
DomainNameRoleInstanceTelemetryInitializer 웹 애플리케이션이 실행되는 컴퓨터의 도메인 이름을 사용하여 모든 원격 분석 항목에 대해 RoleInstance 컨텍스트의 Device 속성을 업데이트합니다.
OperationNameTelemetryInitializer NameRequestTelemetry 속성과 HTTP 메서드를 기준으로 한 모든 원격 분석 항목 Name 컨텍스트의 Operation 속성, ASP.NET MVC 컨트롤러의 이름 및 요청을 처리하기 위해 호출된 작업을 업데이트합니다.
OperationIdTelemetryInitializer 또는 OperationCorrelationTelemetryInitializer 자동으로 생성된 Operation.Id을(를) 사용하여 요청을 처리하는 동안 추적된 모든 원격 분석 항목의 RequestTelemetry.Id 컨텍스트 속성을 업데이트합니다.
SessionTelemetryInitializer 사용자의 브라우저에서 실행되는 Id JavaScript 계측 코드에 의해 제공된 Session 쿠키의 추출된 값을 사용하여 모든 원격 분석 항목에 대한ai_session 컨텍스트의 ApplicationInsights 속성을 업데이트합니다.
SyntheticTelemetryInitializer 또는 SyntheticUserAgentTelemetryInitializer 가용성 테스트 또는 검색 엔진 봇과 같은 가상 원본의 요청을 처리할 때 추적되는 모든 원격 분석 항목의 User, Session, 및 Operation 컨텍스트 속성을 업데이트합니다. 기본적으로 메트릭 탐색기는 가상 원격 분석을 표시하지 않습니다.

<Filters> 는 요청의 식별 속성을 설정합니다.
UserTelemetryInitializer 사용자의 브라우저에서 실행되는 Application insights JavaScript 계측 코드에 의해 제공된 Id 쿠키의 추출된 값을 사용하여 모든 원격 분석 항목에 대한 AcquisitionDate 컨텍스트의 Userai_user 속성을 업데이트합니다.
WebTestTelemetryInitializer 가용성 테스트에서 생성되는 HTTP 요청의 사용자 ID, 세션 ID, 가상 원본 속성을 설정합니다.

<Filters> 는 요청의 식별 속성을 설정합니다.

비고

Azure Service Fabric에서 실행되는 .NET 애플리케이션에 대해 Microsoft.ApplicationInsights.ServiceFabric NuGet 패키지를 포함할 수 있습니다. 이 패키지에는 Service Fabric 속성을 원격 분석 항목에 추가하는 FabricTelemetryInitializer 속성이 포함되어 있습니다. 자세한 내용은 이 NuGet 패키지에 의해 추가된 속성에 대한 GitHub 페이지를 참조하세요.

ITelemetryInitializer 추가

이 블로그 에서는 종속성에 일반 ping을 자동으로 전송하여 종속성 문제를 진단하는 프로젝트에 대해 설명합니다.

  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. 이니셜라이저 로드

옵션 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 문제 해결
  • 정규화된 형식 이름 및 어셈블리 이름이 올바른지 확인합니다.
  • applicationinsights.config 파일이 출력 디렉터리에 있으며 최근 변경 내용이 포함되어 있는지 확인합니다.

예제 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에 이니셜라이저 로드

ApplicationInsights.config 파일에서 다음을 수행합니다.

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

ASP.NET Web Apps의 대체 방법은 코드에서 이니셜라이저를 인스턴스화하는 것입니다. 다음 예제에서는 Global.aspx.cs 파일의 코드를 보여줍니다.

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

    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers.Add(new 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에서 포털에 보내기 직전에 필터링하고 수정할 수 있습니다.

  1. 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;
        }
    }
    
  2. 프로세서를 추가합니다.

    ApplicationInsights.config다음 코드 조각을 삽입합니다.

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

    클래스에 퍼블릭 명명된 속성을 제공하여 .config 파일에서 문자열 값을 전달할 수 있습니다.

    경고

    .config 파일의 형식 이름 및 속성 이름이 코드의 클래스 및 속성 이름과 정확히 일치하도록 주의하십시오. .config 파일이 존재하지 않는 형식 또는 속성을 참조하는 경우, SDK는 어떤 알림 없이 원격 분석을 보내지 못할 수 있습니다.

    또는 코드에서 필터를 초기화할 수 있습니다. Global.asax.cs의 AppStart와 같은 적합한 초기화 클래스에서 체인에 프로세서를 삽입합니다.

    비고

    다음 코드 샘플은 사용되지 않지만 후손을 위해 여기에서 사용할 수 있습니다. 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>
    

예제 필터

합성 요청

봇 및 웹 테스트를 필터링합니다. 메트릭 탐색기는 가상 원본을 필터링하는 옵션을 제공하지만 이 옵션은 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 애플리케이션에 대한 샘플링을 구성하는 방법을 알아보려면 Application Insights의 샘플링을 참조하세요.

HTTP를 통해 데이터 보강

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

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

SDK 구성 요소 관리

이 부분에서는

ASP.NET, ASP.NET Core 및 작업자 서비스에 대한 Application Insights SDK를 사용자 지정하여 기본 구성을 변경할 수 있습니다.

Application Insights .NET SDK는 다양한 NuGet 패키지로 구성됩니다. 코어 패키지 Application Insights에 원격 분석을 보내는 경우에 API를 제공합니다. 추가 패키지는 원격 분석 모듈이니셜라이저를 제공하여 애플리케이션과 해당 컨텍스트에서 원격 분석을 자동으로 추적합니다. 구성 파일을 조정하면 원격 분석 모듈과 이니셜라이저를 사용하거나 사용하지 않도록 설정할 수 있습니다. 일부 매개 변수에 대한 매개 변수를 설정할 수도 있습니다.

구성 파일의 이름은 ApplicationInsights.config 또는 ApplicationInsights.xml입니다. 이름은 애플리케이션의 유형에 따라 달라집니다. 대부분의 SDK 버전은 설치할 때 프로젝트에 자동으로 추가됩니다.

기본적으로 추가>Application Insights 원격 분석을 지원하는 Visual Studio 템플릿 프로젝트에서 자동화된 환경을 사용하는 경우 ApplicationInsights.config 파일이 프로젝트 루트 폴더에 만들어집니다. 컴파일한 후 bin 폴더에 복사됩니다. 또한 IIS 서버의 Application Insights 에이전트에 의해 웹앱에 추가됩니다.

중요합니다

Azure 웹 사이트의 확장 또는 AzureVM 및 Azure 가상 머신 확장 집합에 대한 확장이 사용되는 경우 구성 파일은 무시됩니다.

웹 페이지에서 SDK를 제어할 동급의 파일은 없습니다.

원격 분석 채널

원격 분석 채널은 Application Insights SDK의 필수적인 부분입니다. 이것은 Application Insights 서비스에 대한 원격 분석의 버퍼링 및 전송을 관리합니다. SDK의 .NET 및 .NET Core 버전에는 InMemoryChannelServerTelemetryChannel의 두 가지 기본 제공 원격 분석 채널이 있습니다. 이 섹션에서는 각 채널에 대해 설명하고 채널 동작을 사용자 지정하는 방법을 보여 줍니다.

비고

FAQ(질문과 대답)를 검토하려면 원격 분석 채널 FAQ를 참조하세요.

원격 분석 채널이란?

원격 분석 채널은 원격 분석 항목을 버퍼링하고, 이를 Application Insights 서비스로 전송해서 쿼리 및 분석을 위해 저장합니다. 원격 분석 채널은 Microsoft.ApplicationInsights.ITelemetryChannel 인터페이스를 구현하는 클래스입니다.

원격 분석 채널의 Send(ITelemetry item) 메서드는 모든 원격 분석 이니셜라이저 및 원격 분석 프로세서가 호출된 후에 호출됩니다. 따라서 원격 분석 프로세서에서 삭제한 항목은 채널에 도달하지 않습니다. Send() 메서드는 보통 백 엔드에 항목들을 즉시 보내지 않습니다. 이 메서드는 일반적으로 메모리에서 항목들을 버퍼링하고 효율적인 전송을 위해 항목들을 배치로 보냅니다.

버퍼링된 원격 분석을 즉시 보내는 것이 중요한 경우가 아니면 Flush()을(를) 호출하지 마세요. 애플리케이션 종료, 예외 처리와 같은 시나리오 또는 백그라운드 작업 또는 명령줄 도구와 같은 수명이 짧은 프로세스를 사용하는 경우에만 사용합니다. 웹 애플리케이션 또는 장기 실행 서비스에서 SDK는 원격 분석 전송을 자동으로 처리합니다. 불필요하게 Flush()을(를) 호출하면 성능 문제가 발생할 수 있습니다.

또한 라이브 메트릭 스트림에는 원격 분석의 라이브 스트리밍을 지원하는 사용자 지정 채널이 있습니다. 이 채널은 일반 원격 분석 채널과 독립적이며, 이 문서는 그것에 적용되지 않습니다.

기본 제공 원격 분석 채널

Application Insights .NET 및 .NET Core Sdk는 두 개의 기본 제공 채널과 함께 제공됩니다.

  • InMemoryChannel: 전송될 때까지 메모리의 항목을 버퍼링하는 간단한 채널입니다. 항목들은 메모리에서 버퍼링되고, 30초마다 또는 500개 항목이 버퍼링될 때마다 플러시됩니다. 이 채널은 실패 후 원격 분석을 다시 보내려고 시도하지 않으므로 최소한의 안정성 보장을 제공합니다. 또한 이 채널은 항목을 디스크에 보관하지 않습니다. 따라서 애플리케이션이 종료되면 정상 종료든 비정상 종료든 상관없이 보내지 않은 항목은 영구적으로 손실됩니다. 이 채널은 메모리 내 원격 분석 항목을 동기적으로 강제 플러시하는 데 사용할 수 있는 Flush() 메서드를 구현합니다. 이 채널은 동기 플러시가 이상적인 단기 실행 애플리케이션에 적합합니다.

    이 채널은 더 큰 Microsoft.ApplicationInsights NuGet 패키지의 일부이며, 아무것도 구성되지 않은 경우 SDK에서 사용하는 기본 채널입니다.

  • ServerTelemetryChannel: 재시도 정책과 로컬 디스크에 데이터를 저장하는 기능이 있는 고급 채널입니다. 일시적인 오류가 발생하는 경우, 이 채널은 원격 분석 전송을 다시 시도합니다. 또한 이 채널은 로컬 디스크 스토리지를 사용하여 네트워크 중단 또는 대용량 원격 분석에서 디스크에 항목을 유지합니다. 이러한 다시 시도 메커니즘과 로컬 디스크 스토리지로 인해 이 채널은 보다 안정적인 것으로 간주됩니다. 모든 프로덕션 시나리오에 권장됩니다. 공식 설명서에 따라 구성된 ASP.NET 및 ASP.NET Core 애플리케이션에서 이 채널이 기본값입니다. 이 채널은 장기 실행 프로세스를 포함하는 서버 시나리오에 최적화되어 있습니다. 이 채널에서 구현하는 Flush() 메서드는 동기화되지 않습니다.

    이 채널은 Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel NuGet 패키지로 제공 되며, Microsoft.ApplicationInsights.Web 또는 Microsoft.ApplicationInsights.AspNetCore NuGet 패키지를 사용하는 경우 자동으로 획득됩니다.

원격 분석 채널 구성

원격 분석 채널을 활성 원격 분석 구성으로 설정하여 구성합니다. ASP.NET 애플리케이션의 경우 구성에는 원격 분석 채널 인스턴스를 TelemetryConfiguration.Active(으)로 설정하거나 ApplicationInsights.config을(를) 수정해서 설정하는 작업이 포함됩니다. ASP.NET Core 애플리케이션의 경우 구성에는 종속성 주입 컨테이너에 채널을 추가하는 작업이 포함됩니다.

다음 섹션에서는 StorageFolder다양한 애플리케이션 유형에서 채널 설정을 구성하는 예를 보여 줍니다. StorageFolder은 구성 가능한 설정 중 하나일 뿐입니다. 구성 설정의 전체 목록은 이 문서의 뒷부분에 있는 채널에서 구성 가능한 설정 섹션을 참조하세요.

옵션 1: 코드의 구성

다음 코드는 사용자 지정 위치로 설정된 ServerTelemetryChannelStorageFolder 인스턴스를 설정합니다. 애플리케이션의 시작 부분에 이 코드를 추가합니다(보통 Global.aspx.cs의 Application_Start() 메서드).

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>

콘솔 애플리케이션에 대한 코드의 구성

콘솔 앱의 경우, 코드는 .NET 및 .NET Core 모두에 대해 동일합니다.

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

ServerTelemetryChannel의 작업 세부 정보

ServerTelemetryChannel는 도착 항목을 메모리 내 버퍼에 저장합니다. 항목은 30초마다 한 번씩 또는 500개 항목이 버퍼링될 때 직렬화, 압축 및 Transmission 인스턴스에 저장됩니다. 단일 Transmission 인스턴스는 최대 500개 항목을 포함하며, 단일 HTTPS 호출을 통해 Application Insights 서비스에 전송되는 원격 분석의 배치(Batch)를 나타냅니다.

기본값으로 최대 10개의 Transmission 인스턴스를 병렬로 전송할 수 있습니다. 원격 분석이 더 빠른 속도로 도착하거나, 네트워크 또는 Application Insights 백 엔드가 느려지는 경우, Transmission 인스턴스는 메모리에 저장됩니다. 이 메모리 내 Transmission 버퍼의 기본 용량은 5MB입니다. 메모리 내 용량을 초과하면 Transmission 인스턴스가 최대 50MB까지 로컬 디스크에 저장됩니다.

Transmission 인스턴스는 네트워크 문제가 있는 경우에도 로컬 디스크에 저장됩니다. 로컬 디스크에 저장되는 항목만 애플리케이션 작동 중단에도 유지됩니다. 이 항목은 애플리케이션이 다시 시작될 때마다 전송됩니다. 네트워크 문제가 지속되면 ServerTelemetryChannel이(가) 원격 분석을 보내기 위해 다시 시도하기 전에 10초에서 1시간 사이의 지수 백오프 논리를 사용합니다.

채널의 구성 가능한 설정

각 채널의 구성 가능한 설정에 대한 전체 목록은 다음을 참조하세요.

ServerTelemetryChannel에 가장 일반적으로 사용되는 설정은 다음과 같습니다.

  • MaxTransmissionBufferCapacity: 메모리의 버퍼 전송을 위해 채널에서 사용하는 최대 메모리 양(바이트)입니다. 이 용량에 도달하면 새 항목이 로컬 디스크에 직접 저장됩니다. 기본값은 5MB입니다. 더 높은 값을 설정하면 디스크 사용량이 줄어들지만 애플리케이션이 충돌할 경우 메모리의 항목이 손실된다는 점을 기억하세요.

  • MaxTransmissionSenderCapacity: Application Insights로 동시에 전송되는 최대 Transmission 인스턴스 수입니다. 기본값은 10입니다. 이 설정은 더 높은 수로 구성할 수 있으며, 이는 원격 분석을 대량으로 생성할 때 권장됩니다. 대용량은 일반적으로 부하 테스트 중 또는 샘플링을 해제할 때 발생합니다.

  • StorageFolder: 필요에 따라 디스크에 항목을 저장하기 위해 채널에서 사용하는 폴더입니다. 다른 경로를 명시적으로 지정하지 않으면 Windows 에서는 %LOCALAPPDATA% or %TEMP%가 사용됩니다. Windows 이외의 환경에서는 기본적으로 %TMPDIR%, /var/tmp/ 또는 /tmp/와 같은 위치가 순서대로 사용됩니다.

어떤 채널을 사용해야 하나요?

ServerTelemetryChannel은(는) 장기 실행 애플리케이션을 비롯한 대부분의 프로덕션 시나리오에 권장됩니다. 원격 분석 데이터 플러싱에 대한 자세한 내용은 Flush() 사용 방법을 참조하세요.

Flush()를 사용하는 경우

Flush() 메서드는 버퍼링된 원격 분석을 즉시 보냅니다. 그러나 특정 시나리오에서만 사용해야 합니다.

다음과 같은 경우 Flush()를 사용합니다.

  • 애플리케이션이 종료되려고 하며 종료하기 전에 원격 분석 데이터가 전송되었는지 확인하려고 합니다.
  • 예외 처리기에 있으며 원격 분석 데이터가 제공되도록 보장해야 합니다.
  • 백그라운드 작업 또는 신속하게 종료되는 CLI 도구와 같은 수명이 짧은 프로세스를 작성하고 있습니다.

웹 서비스와 같은 장기 실행 애플리케이션에서는 Flush()을(를) 사용하지 않습니다. SDK는 버퍼링 및 전송을 자동으로 관리합니다. 불필요하게 Flush()을(를) 호출하면 성능 문제가 발생할 수 있으며, 특히 동기적으로 플러시되지 않는 ServerTelemetryChannel 사용 시 모든 데이터가 전송되도록 보장하지는 않습니다.

원격 분석 모듈

Application Insights는 사용자가 수동으로 추적할 필요 없이 특정 워크로드에 대한 원격 분석 데이터를 자동으로 수집합니다.

다음 자동 수집 모듈은 기본적으로 사용하도록 설정되어 있습니다. 자동 수집 모듈을 사용하지 않도록 설정하거나 해당 기본 동작을 변경하도록 구성할 수 있습니다.

각 원격 분석 모듈은 특정 형식의 데이터를 수집하고 코어 API를 사용하여 데이터를 전송합니다. 모듈은 다른 NuGet 패키지에 의해 설치되며 이는 .config 파일에 필요한 줄을 추가합니다.

Area Description
요청 추적 들어오는 웹 요청에 대한 요청 원격 분석(응답 시간, 결과 코드)을 수집합니다.

모듈:Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.Web
종속성 추적 나가는 종속성(HTTP 호출, SQL 호출)에 대한 원격 분석을 수집합니다. IIS에서 작업하려면 Application Insights 에이전트를 설치합니다. TrackDependency API를 사용하여 사용자 지정 종속성 추적을 작성할 수도 있습니다. App ServiceVM 및 Virtual Machine Scale Sets 모니터링을 통해 자동 계측을 지원합니다.

모듈:Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule
NuGet:Microsoft.ApplicationInsights.DependencyCollector
성능 카운터 Windows 성능 카운터(IIS 설치에서 CPU, 메모리, 네트워크 부하)를 수집합니다. 어떤 카운터(사용자 지정 카운터 포함)를 지정합니다. 자세한 내용은 시스템 성능 카운터 수집을 참조하세요.

모듈:Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule
NuGet:Microsoft.ApplicationInsights.PerfCounterCollector
이벤트 카운터 .NET EventCounters를 수집합니다. Windows 성능 카운터 대신 ASP.NET Core 및 플랫폼 간에 권장됩니다.

모듈:EventCounterCollectionModule (SDK ≥ 2.8.0)
라이브 메트릭(QuickPulse) 라이브 메트릭 창에 대한 원격 분석을 수집합니다.

모듈:QuickPulseTelemetryModule
하트비트(App Service) App Service 환경에 대한 하트비트 및 사용자 지정 메트릭을 보냅니다.

모듈:AppServicesHeartbeatTelemetryModule
하트비트(VM 및 Virtual Machine Scale Sets) Azure VM 환경에 대한 하트비트 및 사용자 지정 메트릭을 보냅니다.

모듈:AzureInstanceMetadataTelemetryModule
진단 원격 분석 Application Insights 계측 코드에서 오류를 보고합니다(예: 누락된 카운터, ITelemetryInitializer 예외). 진단 검색에 추적 원격 분석이 나타납니다.

모듈:Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule
NuGet:Microsoft.ApplicationInsights

메모: 이 패키지만 설치하면 ApplicationInsights.config 파일이 자동으로 만들어지지 않습니다.
개발자 모드(디버거 연결됨) 디버거가 연결될 때 즉시 항목을 보내도록 TelemetryChannel을(를) 강제합니다. 대기 시간을 줄이지만 CPU/네트워크 오버헤드가 증가합니다.

모듈: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 파일이 자동으로 만들어지지 않습니다.

원격 분석 모듈 구성

TelemetryModules에서 섹션을 사용하여 모듈을 구성, 추가 또는 제거합니다. 다음 예제는 다음과 같습니다.

  • 구성 DependencyTrackingTelemetryModule (W3C 헤더 삽입 사용).
  • 구성 EventCounterCollectionModule (기본값 지우기 및 단일 카운터 추가).
  • PerformanceCollectorModule을(를) 제거하여 perf-counter 컬렉션을 사용하지 않도록 설정합니다.
<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 패키지에 따라 달라집니다.

원격 분석 사용 안 함

각 모듈에 대해 구성 파일에 노드가 있습니다. 모듈을 사용하지 않으려면 노드를 삭제하거나 주석으로 처리합니다.

연결 문자열

이 설정은 데이터가 표시되는 Application Insights 리소스를 결정합니다. 일반적으로 각 애플리케이션에 대해 별도의 연결 문자열을 사용하여 별도의 리소스를 만듭니다.

코드 샘플은 Application Insights의 연결 문자열을 참조하세요.

예를 들어 애플리케이션의 결과를 다른 리소스로 전송하기 위해 연결 문자열을 동적으로 설정하려면 구성 파일에서 연결 문자열을 생략하고 대신 코드로 설정할 수 있습니다.

표준 원격 분석 모듈을 포함하여 TelemetryClient의 모든 인스턴스에 대한 연결 문자열을 설정하려면 ASP.NET 서비스의 global.aspx.cs 같은 초기화 메서드에서 이 단계를 수행합니다.

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights;

    protected void Application_Start()
    {
        TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
        configuration.ConnectionString = "InstrumentationKey=00000000-0000-0000-0000-000000000000";
        var telemetryClient = new TelemetryClient(configuration);

특정 이벤트 집합을 다른 리소스로 보내려는 경우 특정 원격 분석 클라이언트에 대한 키를 설정할 수 있습니다.


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

새 연결 문자열을 얻으려면 Application Insights 포털에서 새 리소스를 만듭니다.

애플리케이션 ID 공급자

비고

ASP.NET 경우 이 공급자는 SDK v2.6.0*부터 사용할 수 있습니다.

이 공급자의 목적은 연결 문자열을 기반으로 애플리케이션 ID를 조회하는 것입니다. 애플리케이션 ID는 RequestTelemetryDependencyTelemetry에 포함되며 포털에서 상관 관계를 확인하는 데 사용됩니다.

이 기능은 TelemetryConfiguration.ApplicationIdProvider을(를) 설정하여 사용할 수 있습니다.

인터페이스: IApplicationIdProvider

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

Microsoft.ApplicationInsights SDK에서 ApplicationInsightsApplicationIdProviderDictionaryApplicationIdProvider라는 두 가지 구현을 제공합니다.

ApplicationInsightsApplicationIdProvider

이 래퍼는 프로필 API용입니다. 요청을 제한하고 결과를 캐시합니다. 이 공급자는 Microsoft.ApplicationInsights.DependencyCollector 또는 Microsoft.ApplicationInsights.Web을 설치할 때 자동으로 포함됩니다.

클래스는 ProfileQueryEndpoint(이)라는 선택적 속성을 노출 합니다. 기본적으로 https://dc.services.visualstudio.com/api/profiles/{0}/appId로 설정됩니다.

프록시를 구성해야 하는 경우 기본 주소를 프록시하고 경로에 /api/profiles/{0}/appId이(가) 포함되도록 하는 것이 좋습니다. 런타임 시 {0}은(는) 각 요청에 대한 계측 키로 바뀝니다.

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

DictionaryApplicationIdProvider

이 정적 공급자는 구성된 계측 키/애플리케이션 ID 쌍을 사용합니다.

이 클래스에는 계측 키/애플리케이션 ID 쌍의 Defined에 해당하는 Dictionary<string,string> 속성이 있습니다.

이 클래스에는 선택적 속성 Next이(가) 있으며, 구성에 없는 연결 문자열이 요청될 때 사용할 다른 공급자를 구성하는 데 사용할 수 있습니다.

ApplicationInsights.config를 통한 예제 구성

<ApplicationInsights>
    ...
    <ApplicationIdProvider Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.DictionaryApplicationIdProvider, Microsoft.ApplicationInsights">
        <Defined>
            <Type key="InstrumentationKey_1" value="ApplicationId_1"/>
            <Type key="InstrumentationKey_2" value="ApplicationId_2"/>
        </Defined>
        <Next Type="Microsoft.ApplicationInsights.Extensibility.Implementation.ApplicationId.ApplicationInsightsApplicationIdProvider, Microsoft.ApplicationInsights" />
    </ApplicationIdProvider>
    ...
</ApplicationInsights>

코드를 통한 구성 예제

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

스냅샷 컬렉션 구성

ASP.NET 및 ASP.NET Core 애플리케이션에 대한 스냅샷 컬렉션을 구성하는 방법을 알아보려면 Azure Service Fabric, Cloud Services 및 Virtual Machines에서 .NET 앱에 대한 스냅샷 디버거 사용을 참조하세요.

클라이언트쪽 모니터링을 추가 합니다.

이전 섹션에서는 서버 쪽 모니터링을 자동 및 수동으로 구성하는 방법에 대한 지침을 제공했습니다. 클라이언트 쪽 모니터링을 추가하려면 클라이언트 쪽 JavaScript SDK를 사용합니다. 페이지 HTML의 닫는 태그 앞에 JavaScript(웹) SDK 로더 스크립트를 추가하여 웹 페이지의 클라이언트 측 트랜잭션을 모니터링할 수 있습니다.

각 HTML 페이지의 헤더에 JavaScript(웹) SDK 로더 스크립트를 수동으로 추가할 수 있지만 대신 기본 페이지에 JavaScript(웹) SDK 로더 스크립트를 추가하는 것이 좋습니다. 해당 작업은 JavaScript(웹) SDK 로더 스크립트를 사이트의 모든 페이지에 삽입합니다.

이 문서에서 템플릿 기반 ASP.NET MVC 앱의 경우 _Layout.cshtml 파일을 편집해야 합니다. 이 파일은 보기>공유에서 찾을 수 있습니다. 클라이언트 쪽 모니터링을 추가하려면 _Layout.cshtml을 열고 클라이언트 쪽 JavaScript SDK 구성에 대한 문서의 JavaScript(웹) SDK 로더 스크립트 기반 설정 지침을 따릅니다.

사용자 지정 이벤트 및 메트릭에 대한 핵심 API

애플리케이션에 몇 줄의 코드를 삽입하여 사용자가 이 코드로 무엇을 하고 있는지 알아보거나 문제를 진단하는 데 도움을 줍니다. 장치 및 데스크톱 앱, 웹 클라이언트 및 웹 서버에서 원격 분석을 보낼 수 있습니다. Application Insights 핵심 원격 분석 API를 사용하여 사용자 지정 이벤트 및 메트릭 및 고유한 버전의 표준 원격 분석을 보냅니다. 이 API는 표준 Application Insights 데이터 수집기에서 사용하는 것과 동일한 API입니다.

API 요약

핵심 API는 (.NET만 해당) 같은 GetMetric 몇 가지 변형을 제외하고 모든 플랫폼에서 균일합니다.

메서드 사용 대상
TrackPageView 페이지, 화면, 창 또는 양식
TrackEvent 사용자 작업 및 기타 이벤트. 사용자 동작을 추적하거나 성능을 모니터링하는 데 사용됩니다.
GetMetric 중앙에서 설정된 집계를 사용하는 영(0) 및 다차원 메트릭, C#에만 적용됩니다.
TrackMetric 큐 길이와 같은 성능 측정은 특정 이벤트와 관련이 없습니다.
TrackException 진단을 위한 예외 로깅. 다른 이벤트와 관련하여 발생하는 위치를 추적하고 스택 추적을 검사합니다.
TrackRequest 성능 분석을 위해 서버 요청의 빈도 및 기간을 로깅합니다.
TrackTrace 리소스 진단 로그 메시지입니다. 타사 로그를 캡처할 수도 있습니다.
TrackDependency 앱이 의존하는 외부 구성 요소에 대한 호출 기간 및 빈도 로깅

이러한 원격 분석 호출의 대부분 에 속성 및 메트릭을 연결할 수 있습니다.

필수 조건

Application Insights SDK에 대한 참조가 아직 없는 경우:

  1. Application Insights SDK를 프로젝트에 추가합니다.

  2. 디바이스 또는 웹 서버 코드에 다음을 포함합니다.

    using Microsoft.ApplicationInsights;
    

TelemetryClient 인스턴스 가져오기

다음의 인스턴스 TelemetryClient를 가져옵니다.

비고

Azure Functions v2+ 또는 Azure WebJobs v3+를 사용하는 경우 Azure Functions 모니터링을 참조하세요.

비고

ASP.NET Core 앱 및 .NET/.NET Core 앱용 비 HTTP/작업자의 경우 해당 설명서에 설명된 대로 종속성 주입 컨테이너에서 인스턴스 TelemetryClient 를 가져옵니다.

private TelemetryClient telemetry = new TelemetryClient();

이 메서드가 사용되지 않는다는 메시지가 표시되는 경우 자세한 내용은 microsoft/ApplicationInsights-dotnet#1152 를 참조하세요.

들어오는 HTTP 요청은 자동으로 캡처됩니다. 앱의 다른 모듈을 위해 TelemetryClient 인스턴스를 더 많이 생성할 수도 있습니다. 예를 들어 미들웨어 클래스에 비즈니스 논리 이벤트를 보고하는 인스턴스가 하나 TelemetryClient 있을 수 있습니다. UserIdDeviceId와 같은 속성을 설정하여 기계를 식별할 수 있습니다. 이 정보는 인스턴스가 보내는 모든 이벤트에 연결됩니다.

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

비고

TelemetryClient는 스레드 안전성을 가지고 있습니다.

TrackEvent

Application Insights에서 사용자 지정 이벤트는메트릭 탐색기 에서 집계된 수로 표시하고 진단 검색 에서 개별 항목으로 표시할 수 있는 데이터 요소입니다. (MVC 또는 다른 프레임워크 "이벤트"와는 관련이 없습니다.)

코드에 TrackEvent 호출을 삽입하여 다양한 이벤트를 카운트합니다. 예를 들어 사용자가 특정 기능을 선택하는 빈도를 추적할 수 있습니다. 또는 특정 목표를 얼마나 자주 달성하거나 특정 유형의 실수를 하는지 알고 싶을 수 있습니다.

예를 들어 게임 앱에서 사용자가 게임에서 이길 때마다 이벤트를 보냅니다.

telemetry.TrackEvent("WinGame");

Log Analytics의 사용자 지정 이벤트

원격 분석은 customEvents 테이블에서 Application Insights 로그 탭 또는 사용 환경에서 사용할 수 있습니다. 이벤트는 trackEvent(..) 또는 클릭 분석 자동 수집 플러그인에서 올 수 있습니다.

샘플링이 작동 중인 경우 속성은 itemCount 보다 1큰 값을 표시합니다. 예를 들어 itemCount==10 10개 호출 trackEvent()중 샘플링 프로세스는 그 중 하나만 전송됨을 의미합니다. 올바른 사용자 지정 이벤트 수를 얻으려면 .와 같은 customEvents | summarize sum(itemCount)코드를 사용합니다.

비고

itemCount의 최소값은 1입니다. 레코드 자체는 항목을 나타냅니다.

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에 메트릭을 보내려면 API를 TrackMetric(..) 사용할 수 있습니다. 메트릭을 보내는 방법에는 두 가지가 있습니다.

  • 단일 값입니다. 애플리케이션에서 측정을 수행할 때마다 해당 값을 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 테이블에서 원격 분석을 사용할 수 있습니다. 각 행은 앱에서 trackMetric(..)을(를) 호출한 것을 나타냅니다.

  • valueSum: 측정값의 합계입니다. 평균 값을 얻으려면 으로 valueCount나눕니다.
  • valueCount: 이 trackMetric(..) 호출에 집계된 측정값 수입니다.

비고

valueCount의 최소값은 1입니다. 레코드 자체는 항목을 나타냅니다.

페이지 보기

디바이스 또는 웹 페이지 앱에서 페이지 보기 원격 분석은 각 화면 또는 페이지가 로드될 때 기본적으로 전송됩니다. 그러나 기본값을 변경하여 페이지 보기를 더 많거나 다른 시간에 추적할 수 있습니다. 예를 들어 탭이나 창을 표시하는 앱에서 사용자가 새 창을 열 때마다 페이지를 추적할 수 있습니다.

사용자 및 세션 데이터는 페이지 보기와 함께 속성으로 전송되므로 페이지 보기 원격 분석이 있을 때 사용자 및 세션 차트가 활성 상태로 표시됩니다.

사용자 지정 페이지 보기

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

추적요청

서버 SDK는 HTTP 요청을 기록하는 데 사용합니다 TrackRequest .

웹 서비스 모듈이 실행되지 않는 컨텍스트에서 요청을 시뮬레이션하려는 경우 직접 호출할 수도 있습니다.

요청 원격 분석을 보내는 권장 방법은 요청이 작업 컨텍스트로 작용하는 경우입니다.

작업 컨텍스트

원격 분석 항목을 작업 컨텍스트와 연결하여 상호 연결할 수 있습니다. 표준 요청 추적 모듈은 HTTP 요청이 처리되는 동안 전송되는 예외 및 기타 이벤트에 대해 수행합니다. 검색분석에서 작업 ID를 사용하여 요청과 연결된 이벤트를 쉽게 찾을 수 있습니다.

원격 분석을 수동으로 추적하는 경우 원격 분석 상관 관계를 확인하는 가장 쉬운 방법은 다음 패턴을 사용하는 것입니다.

// 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 경우 해당 기간은 시작과 중지 사이의 시간 제한 간격으로 설정됩니다.

작업 범위 내에서 보고된 원격 분석 항목은 이러한 작업의 자식이 됩니다. 작업 컨텍스트를 중첩할 수 있습니다.

검색에서 작업 컨텍스트는 관련 항목 목록을 만드는 데 사용됩니다.

관련 항목 목록을 보여 주는 스크린샷

사용자 지정 작업 추적에 대한 자세한 내용은 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는 많은 예외를 자동으로 catch하므로 항상 명시적으로 호출 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

"이동 경로 흔적"을 Application Insights에 보내면 TrackTrace를 사용하여 문제를 진단하는 데 도움이 됩니다. 진단 데이터의 청크를 보내고 진단 검색에서 검사할 수 있습니다.

.NET 로그 어댑터에서 이 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(확장) 메서드를 사용할 수 있으므로, 다음 예제와 같이 사용자 지정 타이머를 만들 필요가 없습니다. 자세한 내용은 Application Insights .NET SDK를 사용하여 사용자 지정 작업 추적에서 나가는 종속성 추적에 대한 섹션을 참조하세요.

var success = false;
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
    success = dependency.Call();
}
catch(Exception ex)
{
    success = false;
    telemetry.TrackException(ex);
    throw new Exception("Operation went wrong", ex);
}
finally
{
    timer.Stop();
    telemetry.TrackDependency("DependencyType", "myDependency", "myCall", startTime, timer.Elapsed, success);
}

서버 SDK에는 특정 종속성 호출(예: 데이터베이스 및 REST API)을 자동으로 검색하고 추적하는 종속성 모듈 이 포함되어 있습니다. 모듈이 작동하려면 서버에 에이전트를 설치해야 합니다.

자동화된 추적이 포착하지 못하는 호출을 추적하려면 이 호출을 사용합니다.

C#에서 표준 종속성 추적 모듈을 해제하려면 ApplicationInsights.config 편집하고 참조를 삭제합니다 DependencyCollector.DependencyTrackingTelemetryModule.

Log Analytics의 종속성

Application Insights Analytics에서 호출이 trackDependencydependencies 테이블에 표시됩니다.

샘플링이 작동 중인 경우 속성은 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 구성 검토: 파일에서 web.config하면 Application Insights로 계측된 .NET 애플리케이션의 성능이 저하될 수 있습니다. autoflush를 사용하도록 설정하면 메서드를 System.Diagnostics.Trace.Trace* 호출할 때마다 개별 원격 분석 항목이 수집 서비스에 별도의 고유 웹 요청으로 전송됩니다. 이로 인해 웹 서버에서 네트워크 및 스토리지가 소모될 수 있습니다. 향상된 성능을 위해 자동 플러시를 사용하지 않도록 설정하고 보다 효과적인 원격 분석 데이터 전송을 위해 설계된 ServerTelemetryChannel을 활용하는 것이 좋습니다.

이 함수는 서버 원격 분석 채널에 대해 비동기적입니다.

인증된 사용자

웹앱에서 사용자는 기본적으로 쿠키로 식별됩니다 . 사용자가 다른 컴퓨터 또는 브라우저에서 앱에 액세스하거나 쿠키를 삭제하는 경우 두 번 이상 계산될 수 있습니다.

사용자가 앱에 로그인하는 경우 브라우저 코드에서 인증된 사용자 ID를 설정하여 보다 정확한 개수를 얻을 수 있습니다. 사용자의 실제 로그인 이름을 사용할 필요는 없습니다. 이 ID는 해당 사용자에게 고유한 ID여야 합니다. 공백이나 문자를 포함해서는 안 됩니다 ,;=|.

또한 사용자 ID는 세션 쿠키에서 설정되고 서버로 전송됩니다. 서버 SDK가 설치된 경우 인증된 사용자 ID는 클라이언트 및 서버 원격 분석의 컨텍스트 속성의 일부로 전송됩니다. 그런 다음 필터링하고 검색할 수 있습니다.

앱이 사용자를 계정으로 그룹화하면 계정에 대한 식별자를 전달할 수도 있습니다. 동일한 문자 제한이 적용됩니다.

메트릭 탐색기에서 사용자, 인증된 계정사용자 계정을 계산하는 차트를 만들 수 있습니다.

특정 사용자 이름 및 계정을 사용하여 클라이언트 데이터 요소를 검색 할 수도 있습니다.

비고

.NET Core SDK의 ApplicationInsightsServiceOptions 클래스에 있는 EnableAuthenticationTrackingJavaScript 속성은 Application Insights JavaScript SDK에서 보낸 각 추적에 대한 인증 ID로 사용자 이름을 삽입하는 데 필요한 JavaScript 구성을 간소화합니다.

이 속성을 설정 true하면 ASP.NET Core의 사용자 이름이 클라이언트 쪽 원격 분석과 함께 인쇄됩니다. 따라서 ASP.NET Core용 SDK에서 이미 삽입되어 있으므로 수동으로 추가할 appInsights.setAuthenticatedUserContext 필요가 없습니다. 또한 인증 ID는 JavaScript API 참조에 설명된 대로 .NET Core의 SDK가 서버 쪽 원격 분석을 식별하고 사용하는 서버로 전송됩니다.

SPA 웹앱과 같은 ASP.NET Core MVC와 동일한 방식으로 작동하지 않는 JavaScript 애플리케이션의 경우 수동으로 추가 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에서 사용자 지정 메트릭 및 속성은 각 원격 분석 레코드의 customMeasurementscustomDimensions 특성에 표시됩니다.

예를 들어 요청 원격 분석에 "game"이라는 속성을 추가하는 경우 이 쿼리는 "game"의 다양한 값 발생 수를 계산하고 사용자 지정 메트릭 "점수"의 평균을 표시합니다.

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

다음 사항을 확인합니다.

  • JSON에서 customDimensions 값을 추출할 때 동적 형식이 있으므로 이를 customMeasurements 또는 tostring로 캐스팅해야 합니다.
  • 샘플링 가능성을 고려하려면 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");

개별 원격 분석 호출이 자신의 속성 사전에 있는 기본값을 재정의할 수 있습니다.

표준 컬렉션 모듈의 데이터를 포함하여, 모든 원격 분석에 속성을 추가하려면, 를 구현하십시오.

원격 분석 사용 안 함

원격 분석의 수집 및 전송을 동적으로 중지하고 시작 하려면 다음을 수행합니다.

using  Microsoft.ApplicationInsights.Extensibility;

TelemetryConfiguration.Active.DisableTelemetry = true;

개발자 모드

디버깅하는 동안 즉시 결과를 볼 수 있도록 파이프라인을 통해 원격 분석을 신속하게 처리하도록 하는 것이 유용합니다. 또한 원격 분석 문제를 추적하는 데 도움이 되는 다른 메시지도 받습니다. 앱 속도가 느려질 수 있으므로 프로덕션 환경에서 해제합니다.

TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true;

선택한 사용자 지정 원격 분석에 대한 계측 키 설정

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

동적 연결 문자열

개발, 테스트 및 프로덕션 환경에서 원격 분석을 혼합하지 않도록 하려면 환경에 따라 별도의 Application Insights 리소스를 만들고 키를 변경할 수 있습니다.

구성 파일에서 계측 키를 가져오는 대신 코드에서 설정할 수 있습니다. ASP.NET 서비스와 같이 global.aspx.cs 초기화 메서드에서 키를 설정합니다.

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: 원격 분석이 표시되는 Azure의 Application Insights 리소스입니다. 일반적으로 ApplicationInsights.config에서 가져옵니다.
  • 위치: 디바이스의 지리적 위치입니다.
  • 작업: 웹앱에서 현재 HTTP 요청입니다. 다른 앱 유형에서는 이벤트를 그룹화하도록 이 값을 설정할 수 있습니다.
    • ID: 진단 검색에서 이벤트를 검사할 때 관련 항목을 찾을 수 있도록 서로 다른 이벤트의 상관 관계를 지정하는 생성된 값입니다.
    • 이름: 일반적으로 HTTP 요청의 URL인 식별자입니다.
    • SyntheticSource: null이 아니거나 비어 있지 않은 경우 요청의 원본이 로봇 또는 웹 테스트로 식별되었음을 나타내는 문자열입니다. 기본적으로 메트릭 탐색기의 계산에서 제외됩니다.
  • 세션: 사용자의 세션입니다. ID는 생성된 값으로 설정되며, 사용자가 잠시 동안 활성화되지 않은 경우 변경됩니다.
  • 사용자: 사용자 정보입니다.

Limits

애플리케이션별(즉, 계측 키별) 메트릭 및 이벤트의 수에 몇 가지 제한이 있습니다. 선택하는 가격 책정 계층에 따라 제한됩니다.

Resource 기본 제한 최대 한도 비고
일당 총 데이터 100GB 지원에 문의 데이터를 줄이기 위해 한도를 설정할 수 있습니다. 더 많은 데이터가 필요한 경우 포털에서 최대 1,000GB로 한도를 늘릴 수 있습니다. 1,000GB보다 큰 용량이 필요한 경우 AIDataCap@microsoft.com으로 이메일을 보내세요.
Throttling 32,000 이벤트/초 지원에 문의 제한은 분을 기준으로 측정됩니다.
데이터 보존 로그 30~730일 730일 이 리소스는 로그용입니다.
데이터 보존 메트릭 90일 90일 이 리소스는 메트릭 탐색기용입니다.
가용성 다단계 테스트 자세한 결과 보존 90일 90일 이 리소스는 각 단계의 자세한 결과를 제공합니다.
최대 원격 분석 항목 크기 64KB 64KB
일괄 처리당 최대 원격 분석 항목 수 64,000 64,000
속성 및 메트릭 이름 길이 150 150 형식 스키마를 참조하세요.
속성 값 문자열 길이 8,192 8,192 형식 스키마를 참조하세요.
추적 및 예외 메시지 길이 32,768 32,768 형식 스키마를 참조하세요.
Application Insights 리소스당 가용성 테스트 100 100
리소스 그룹당 가용성 테스트 수 800 800 Azure Resource Manager 참조
가용성 테스트 테스트당 최대 리디렉션 10 10
가용성 테스트 최소 테스트 빈도 300초 5분 미만의 사용자 지정 테스트 빈도에는 사용자 지정 TrackAvailability 구현이 필요합니다.
.NET Profiler스냅샷 디버거 데이터 보존 2주 지원에 문의 최대 보존 기간 제한은 6개월입니다.
하루에 전송되는 .NET Profiler 데이터 제한 없음 제한 없음
하루에 전송되는 스냅샷 디버거 데이터 모니터링되는 앱별로 하루에 스냅샷 30개 제한 없음 구성을 통해 애플리케이션별로 수집되는 스냅샷 수를 수정할 수 있습니다.

가격 책정 및 할당량에 대한 자세한 내용은 Application Insights 요금 청구를 참조하세요.

데이터 속도 제한에 도달하지 않도록 하려면 샘플링을 사용합니다.

데이터 보존 기간을 확인하려면 데이터 보존 및 개인 정보를 참조하세요.

샘플 애플리케이션

.NET Core 콘솔 애플리케이션: .NET Core(2.0 이상) 또는 .NET Framework(4.7.2 이상)로 작성된 콘솔 애플리케이션을 사용하는 경우 이 샘플을 사용합니다.

ASP.NET Core에서 HostedServices를 사용한 백그라운드 작업: ASP.NET Core 환경에서 공식 지침에 따라 백그라운드 작업을 만들 때 이 샘플을 사용하십시오.

.NET Core 작업자 서비스: 공식 지침에 따라 .NET 작업자 서비스 애플리케이션이 있는 경우 이 샘플을 사용합니다.

Troubleshooting

전용 문제 해결 문서를 참조하세요.

Visual Studio 2019에는 알려진 문제가 있습니다. .NET Framework 기반 앱에서 계측 키나 연결 문자열을 사용자 비밀에 저장할 때 문제가 발생합니다. 이 버그를 해결하려면 궁극적으로 키를 Applicationinsights.config 파일로 하드 코딩해야 합니다. 이 문서는 사용자 비밀을 사용하지 않고 이 문제를 완전히 방지하도록 설계되었습니다.

애플리케이션 호스트와 수집 서비스 간의 연결 테스트

Application Insights SDK 및 에이전트는 수집 엔드포인트에 대한 REST 호출로 수집하기 위해 원격 분석을 보냅니다. PowerShell 또는 curl 명령의 원시 REST 클라이언트를 사용하여 웹 서버 또는 애플리케이션 호스트 컴퓨터에서 수집 서비스 엔드포인트로의 연결을 테스트할 수 있습니다. Azure Monitor Application Insights에서 누락된 애플리케이션 원격 분석 문제 해결을 참조하세요.

오픈 소스 SDK

코드를 읽고 기여합니다.

최신 업데이트 및 버그 수정에 대해서는 릴리스 정보를 참조하세요.

릴리스 노트

버전 2.12 이상: ASP.NET, ASP.NET Core 및 로깅 어댑터를 포함한 .NET SDK(소프트웨어 개발 키트)

서비스 업데이트에는 주요 Application Insights 개선 사항도 요약되어 있습니다.

다음 단계

참조 문서