Application Insights를 사용하여 웹앱에서 예외 진단Diagnose exceptions in your web apps with Application Insights

라이브 웹앱의 예외는 Application Insights에서 보고됩니다.Exceptions in your live web app are reported by Application Insights. 클라이언트와 서버에서 실패한 요청을 예외 및 다른 이벤트와 상호 연결하여 원인을 신속하게 진단할 수 있습니다.You can correlate failed requests with exceptions and other events at both the client and server, so that you can quickly diagnose the causes.

예외 보고 설정Set up exception reporting

Visual Studio를 사용하여 예외 진단Diagnosing exceptions using Visual Studio

디버깅에 도움이 되도록 Visual Studio에서 앱 솔루션을 엽니다.Open the app solution in Visual Studio to help with debugging.

F5 키를 사용하여 서버 또는 개발 컴퓨터에서 앱을 실행합니다.Run the app, either on your server or on your development machine by using F5.

Visual Studio에서 Application Insights Search 창을 열고 앱에서 이벤트를 표시하도록 설정합니다.Open the Application Insights Search window in Visual Studio, and set it to display events from your app. 디버깅하는 동안 Application Insights 단추를 클릭하여 이를 수행할 수 있습니다.While you're debugging, you can do this just by clicking the Application Insights button.

프로젝트를 마우스 오른쪽 단추로 클릭하고 Application Insights 및 열기를 선택합니다.

예외를 표시하도록 보고서를 필터링 할 수 있습니다.Notice that you can filter the report to show just exceptions.

보여주는 예외가 없다? 예외 캡처를참조하십시오.No exceptions showing? See Capture exceptions.

예외 보고서를 클릭하여 해당 스택 추적을 표시합니다.Click an exception report to show its stack trace. 스택 추적에서 라인 참조를 클릭하여 관련 코드 파일을 엽니다.Click a line reference in the stack trace, to open the relevant code file.

코드를 보면 CodeLens가 예외에 대한 데이터를 표시합니다.In the code, notice that CodeLens shows data about the exceptions:

CodeLens 예외 알림.

Azure 포털을 사용하여 오류 진단Diagnosing failures using the Azure portal

Application Insights는 APM 환경과 함께 제공되어 모니터링된 애플리케이션에서 실패를 진단하는 데 도움이 됩니다.Application Insights comes with a curated APM experience to help you diagnose failures in your monitored applications. 시작하려면 조사 섹션에 있는 Application Insights 리소스 메뉴에서 오류 옵션을 클릭합니다.To start, click on the Failures option in the Application Insights resource menu located in the Investigate section. 사용자의 요청, 실패하는 횟수 및 사용자가 영향을 받는 횟수에 대한 오류 속도 추세를 표시하는 전체 화면 보기에 표시됩니다.You should see a full-screen view that shows you the failure rate trends for your requests, how many of them are failing, and how many users are impacted. 오른쪽에는 상위 3개 응답 코드, 상위 3개 예외 유형 및 실패한 상위 3개 종속성 유형을 포함하여 선택한 실패 작업과 관련된 가장 유용한 배포판이 표시됩니다.On the right, you'll see some of the most useful distributions specific to the selected failing operation, including top three response codes, top three exception types, and top three failing dependency types.

오류 심사 보기(작업 탭)

그런 다음 한 번의 클릭으로 이러한 각 작업 하위 집합에 대한 대표 샘플을 검토할 수 있습니다.In a single click, you can then review representative samples for each of these subsets of operations. 특히 예외를 진단하기 위해 다음과 같은 종단 간 트랜잭션 세부 정보 탭으로 표시될 특정 예외의 개수를 클릭할 수 있습니다.In particular, to diagnose exceptions, you can click on the count of a particular exception to be presented with the End-to-end transaction details tab, such as this one:

종단 간 트랜잭션 세부 정보 탭

또는 특정 실패한 작업의 예외를 보는 대신 맨 위에 있는 예외 탭으로 전환하여 예외의 전체 보기에서 시작할 수 있습니다.Alternatively, instead of looking at exceptions of a specific failing operation, you can start from the overall view of exceptions, by switching to the Exceptions tab at the top. 여기서 모니터링한 앱에 대해 수집된 모든 예외를 확인할 수 있습니다.Here you can see all the exceptions collected for your monitored app.

보여주는 예외가 없다? 예외 캡처를참조하십시오.No exceptions showing? See Capture exceptions.

사용자 지정 추적 및 로그 데이터Custom tracing and log data

진단 데이터 특성을 사용자 프로그램으로 불러오려면, 사용자 고유의 원격 분석 전송에 코드를 삽입합니다.To get diagnostic data specific to your app, you can insert code to send your own telemetry data. 이 요청, 페이지 보기 및 기타 자동으로 수집된 데이터와 함께 진단 검색에 표시됩니다.This displayed in diagnostic search alongside the request, page view, and other automatically collected data.

여러 옵션이 있습니다.You have several options:

  • TrackEvent() 는 일반적으로 사용 패턴 모니터링을 위해 사용되지만 진단 검색의 사용자 지정 이벤트에서도 전송하는 데이터를 표시합니다.TrackEvent() is typically used for monitoring usage patterns, but the data it sends also appears under Custom Events in diagnostic search. 이벤트의 이름을 지정하고, 진단 검색을 필터링할 수 있는 문자열 속성 및 숫자 메트릭 수를 수행할 수있습니다.Events are named, and can carry string properties and numeric metrics on which you can filter your diagnostic searches.
  • TrackTrace() 를 사용하여 POST 정보와 같은 긴데이터를 보낼 수 있습니다.TrackTrace() lets you send longer data such as POST information.
  • TrackException() 은 스택 추적을 보냅니다.TrackException() sends stack traces. 예외에 대해 자세히 알아보세요.More about exceptions.
  • 사용자가 이미 Log4Net 또는 NLog와 같은 로깅 프레임워크를 사용하는 경우, 요청과 예외 데이터와 함께 진단 검색 안에서 이러한 로그를 캡처하고 볼 수 있습니다.If you already use a logging framework like Log4Net or NLog, you can capture those logs and see them in diagnostic search alongside request and exception data.

이러한 이벤트를 보려면 왼쪽 메뉴에서 검색을 열고 드롭다운 메뉴 이벤트 유형을선택한 다음 사용자 지정 이벤트, 추적 또는 예외를 선택합니다.To see these events, open Search from the left menu, select the drop-down menu Event types, and then choose Custom Event, Trace, or Exception.

드릴스루

참고

앱에서 다양한 원격 분석을 생성하는 경우 적응 샘플링 모듈은 이벤트의 대표적인 분수만 전송하여 포털에 전송되는 볼륨을 자동으로 줄입니다.If your app generates a lot of telemetry, the adaptive sampling module will automatically reduce the volume that is sent to the portal by sending only a representative fraction of events. 동일한 작업에 속하는 이벤트를 그룹으로 선택하거나 선택 취소되므로 관련된 이벤트를 탐색할 수 있습니다.Events that are part of the same operation will be selected or deselected as a group, so that you can navigate between related events. 샘플링에 대해 자세히 알아보세요.Learn about sampling.

요청 게시 데이터를 참조하는 방법How to see request POST data

요청 세부 정보에는 POST 호출에서 앱으로 전송된 데이터가 포함되지 않습니다.Request details don't include the data sent to your app in a POST call. 이 데이터에 대한 보고를 받으려면 다음을 수행합니다.To have this data reported:

  • 애플리케이션 프로젝트에 SDK를 설치합니다.Install the SDK in your application project.
  • 애플리케이션에 코드를 삽입하여 Microsoft.ApplicationInsights.TrackTrace()를 호출합니다.Insert code in your application to call Microsoft.ApplicationInsights.TrackTrace(). 메시지 매개 변수의 POST 데이터를 보냅니다.Send the POST data in the message parameter. 허용되는 크기에 제한이 있으므로 꼭 필요한 데이터만 보내야 합니다.There is a limit to the permitted size, so you should try to send just the essential data.
  • 실패한 요청을 조사할 때 연결된 추적을 찾습니다.When you investigate a failed request, find the associated traces.

처음에는 앱에서 실패를 유발하는 예외가 포털에 전부 표시되지 않을 것입니다.At first, you won't see in the portal all the exceptions that cause failures in your app. 웹 페이지에서 JavaScript SDK를 사용 중이라면 브라우저 예외가 보일 것입니다.You'll see any browser exceptions (if you're using the JavaScript SDK in your web pages). 하지만 대부분 서버 예외는 IIS에서 catch하며 서버 예외를 보려면 약간의 코드를 작성해야 합니다.But most server exceptions are caught by IIS and you have to write a bit of code to see them.

다음을 수행할 수 있습니다.You can:

  • 예외를 명시적으로 기록 합니다.Log exceptions explicitly by inserting code in exception handlers to report the exceptions.
  • 예외를 자동으로 캡처 합니다.Capture exceptions automatically by configuring your ASP.NET framework. 프레임워크 유형에 따라 추가할 항목이 다릅니다.The necessary additions are different for different types of framework.

예외를 명시적으로 보고Reporting exceptions explicitly

가장 간단한 방법은 예외 처리기에 TrackException()에 대한 호출을 삽입하는 것입니다.The simplest way is to insert a call to TrackException() in an exception handler.

    try
    { ...
    }
    catch (ex)
    {
      appInsights.trackException(ex, "handler loc",
        {Game: currentGame.Name,
         State: currentGame.State.ToString()});
    }
    var telemetry = new TelemetryClient();
    ...
    try
    { ...
    }
    catch (Exception ex)
    {
       // Set up some properties:
       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);
    }
    Dim telemetry = New TelemetryClient
    ...
    Try
      ...
    Catch ex as Exception
      ' Set up some properties:
      Dim properties = New Dictionary (Of String, String)
      properties.Add("Game", currentGame.Name)

      Dim measurements = New Dictionary (Of String, Double)
      measurements.Add("Users", currentGame.Users.Count)

      ' Send the exception telemetry:
      telemetry.TrackException(ex, properties, measurements)
    End Try

속성 및 측정 매개 변수는 선택적이지만 추가 정보를 필터링 및 추가하는 데 유용합니다.The properties and measurements parameters are optional, but are useful for filtering and adding extra information. 예를 들어 여러 게임을 실행할 수 있는 앱이 있는 경우 특정 게임과 관련된 모든 예외 보고서를 찾을 수 있습니다.For example, if you have an app that can run several games, you could find all the exception reports related to a particular game. 각 사전에 원하는 만큼 항목을 추가할 수 있습니다.You can add as many items as you like to each dictionary.

브라우저 예외Browser exceptions

대부분의 브라우저 예외가 보고됩니다.Most browser exceptions are reported.

웹 페이지에 콘텐츠 전송 네트워크 또는 기타 도메인의 스크립트 파일이 포함된 crossorigin="anonymous"경우 스크립트 태그에 특성이 있는지 확인하고 서버에서 CORS 헤더를보냅니다.If your web page includes script files from content delivery networks or other domains, ensure your script tag has the attribute crossorigin="anonymous", and that the server sends CORS headers. 이러한 리소스에서 처리되지 않은 JavaScript 예외에 대한 스택 추적 및 세부 정보를 가져올 수 있을 것입니다.This will allow you to get a stack trace and detail for unhandled JavaScript exceptions from these resources.

원격 분석 클라이언트 재사용Reuse your telemetry client

참고

원격 분석 클라이언트는 한 번 인스턴스화하고 응용 프로그램의 수명 동안 다시 사용하는 것이 좋습니다.TelemetryClient is recommended to be instantiated once and re-used throughout the life of an application.

다음은 원격 분석 클라이언트를 올바르게 사용하는 예입니다.Below is an example using TelemetryClient correctly.

public class GoodController : ApiController
{
    // OK
    private static readonly TelemetryClient telemetryClient;

    static GoodController()
    {
        telemetryClient = new TelemetryClient();
    }
}

웹 양식Web forms

웹 양식의 경우 CustomErrors를 사용하여 구성된 리디렉션이 없으면 HTTP 모듈에서 예외를 수집할 수 있습니다.For web forms, the HTTP Module will be able to collect the exceptions when there are no redirects configured with CustomErrors.

하지만 활성 리디렉션이 있다면 Global.asax.cs의 Application_Error 함수에 다음 줄을 추가합니다But if you have active redirects, add the following lines to the Application_Error function in Global.asax.cs. (아직 없는 경우 Global.asax 파일 추가).(Add a Global.asax file if you don't already have one.)

    void Application_Error(object sender, EventArgs e)
    {
      if (HttpContext.Current.IsCustomErrorEnabled && Server.GetLastError () != null)
      {
         var ai = new TelemetryClient(); // or re-use an existing instance

         ai.TrackException(Server.GetLastError());
      }
    }

MVCMVC

Application Insights 웹 SDK 버전 2.6(beta3 및 이후 버전)부터 Application Insights는 MVC 5 + 컨트롤러 메서드에서 자동으로 throw된 처리되지 않은 예외를 수집합니다.Starting with Application Insights Web SDK version 2.6 (beta3 and later), Application Insights collects unhandled exceptions thrown in the MVC 5+ controllers methods automatically. (다음 예제에 설명된 대로) 이전에 사용자 지정 처리기를 추가하여 이러한 예외를 추적한 경우 예외의 이중 추적을 방지하기 위해 제거할 수 있습니다.If you have previously added a custom handler to track such exceptions (as described in following examples), you may remove it to prevent double tracking of exceptions.

예외 필터에서 처리할 수 없는 다양한 경우가 있습니다.There are a number of cases that the exception filters cannot handle. 예를 들어:For example:

  • 컨트롤러 생성자에서 throw된 예외Exceptions thrown from controller constructors.
  • 메시지 처리기에서 throw된 예외Exceptions thrown from message handlers.
  • 라우팅 중에 throw된 예외Exceptions thrown during routing.
  • 응답 콘텐츠를 직렬화하는 동안 throw된 예외Exceptions thrown during response content serialization.
  • 애플리케이션 시작 중에 throw된 예외Exception thrown during application start-up.
  • 배경 작업에서 throw된 예외Exception thrown in background tasks.

애플리케이션에 의해 처리된 모든 예외는 수동으로 추적되어야 합니다.All exceptions handled by application still need to be tracked manually. 일반적으로 컨트롤러에서 발생한 처리되지 않은 예외로 인해 500 "내부 서버 오류" 응답이 발생합니다.Unhandled exceptions originating from controllers typically result in 500 "Internal Server Error" response. 이러한 응답이 처리된 예외(또는 예외 없음)의 결과로 수동으로 생성된 경우 ResultCode 500을 사용하여 해당하는 요청 원격 분석에서 추적됩니다. 그러나 Application Insights SDK는 해당하는 예외를 추적할 수 없습니다.If such response is manually constructed as a result of handled exception (or no exception at all) it is tracked in corresponding request telemetry with ResultCode 500, however Application Insights SDK is unable to track corresponding exception.

이전 버전 지원Prior versions support

Application Insights 웹 SDK 2.5(및 이전 버전)의 MVC 4(및 이전 버전)를 사용하는 경우 예외를 추적하기 위해 다음 예제를 참조합니다.If you use MVC 4 (and prior) of Application Insights Web SDK 2.5 (and prior), refer to the following examples to track exceptions.

CustomErrorsOff로 구성되어 있으면 HTTP 모듈에서 예외를 수집할 수 있습니다.If the CustomErrors configuration is Off, then exceptions will be available for the HTTP Module to collect. 그러나 RemoteOnly(기본값) 또는 On으로 설정되어 있으면 예외가 지워지고 Application Insights에서 자동으로 수집할 수 없습니다.However, if it is RemoteOnly (default), or On, then the exception will be cleared and not available for Application Insights to automatically collect. System.Web.Mvc.HandleErrorAttribute 클래스를 재정의하고, 재정의된 클래스를 아래와 같이 다른 MVC 버전에 적용하여 이 문제를 해결할 수 있습니다(GitHub 자료).You can fix that by overriding the System.Web.Mvc.HandleErrorAttribute class, and applying the overridden class as shown for the different MVC versions below (GitHub source):

    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)
            {
                //If customError is Off, then AI HTTPModule will report the exception
                if (filterContext.HttpContext.IsCustomErrorEnabled)
                {   //or reuse instance (recommended!). see note above
                    var ai = new TelemetryClient();
                    ai.TrackException(filterContext.Exception);
                }
            }
            base.OnException(filterContext);
        }
      }
    }

MVC 2MVC 2

HandleError 특성을 컨트롤러의 새 특성으로 바꿉니다.Replace the HandleError attribute with your new attribute in your controllers.

    namespace MVC2App.Controllers
    {
        [AiHandleError]
        public class HomeController : Controller
        {
    ...

예제Sample

MVC 3MVC 3

Global.asax.cs에서 AiHandleErrorAttribute 를 글로벌 필터로 등록합니다.Register AiHandleErrorAttribute as a global filter in Global.asax.cs:

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

예제Sample

MVC 4, MVC5MVC 4, MVC5

FilterConfig.cs에서 AiHandleErrorAttribute를 글로벌 필터로 등록합니다.Register AiHandleErrorAttribute as a global filter in FilterConfig.cs:

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

예제Sample

Web APIWeb API

Application Insights 웹 SDK 버전 2.6(beta3 및 이후 버전)부터 Application Insights는 WebAPI 2+의 컨트롤러 메서드에서 자동으로 throw된 처리되지 않은 예외를 수집합니다.Starting with Application Insights Web SDK version 2.6 (beta3 and later), Application Insights collects unhandled exceptions thrown in the controller methods automatically for WebAPI 2+. (다음 예제에 설명된 대로) 이전에 사용자 지정 처리기를 추가하여 이러한 예외를 추적한 경우 예외의 이중 추적을 방지하기 위해 제거할 수 있습니다.If you have previously added a custom handler to track such exceptions (as described in following examples), you may remove it to prevent double tracking of exceptions.

예외 필터에서 처리할 수 없는 다양한 경우가 있습니다.There are a number of cases that the exception filters cannot handle. 예를 들어:For example:

  • 컨트롤러 생성자에서 throw된 예외Exceptions thrown from controller constructors.
  • 메시지 처리기에서 throw된 예외Exceptions thrown from message handlers.
  • 라우팅 중에 throw된 예외Exceptions thrown during routing.
  • 응답 콘텐츠를 직렬화하는 동안 throw된 예외Exceptions thrown during response content serialization.
  • 애플리케이션 시작 중에 throw된 예외Exception thrown during application start-up.
  • 배경 작업에서 throw된 예외Exception thrown in background tasks.

애플리케이션에 의해 처리된 모든 예외는 수동으로 추적되어야 합니다.All exceptions handled by application still need to be tracked manually. 일반적으로 컨트롤러에서 발생한 처리되지 않은 예외로 인해 500 "내부 서버 오류" 응답이 발생합니다.Unhandled exceptions originating from controllers typically result in 500 "Internal Server Error" response. 이러한 응답이 처리된 예외(또는 예외 없음)의 결과로 수동으로 생성된 경우 ResultCode 500을 사용하여 해당하는 요청 원격 분석에서 추적됩니다. 그러나 Application Insights SDK는 해당하는 예외를 추적할 수 없습니다.If such response is manually constructed as a result of handled exception (or no exception at all) it is tracked in a corresponding request telemetry with ResultCode 500, however Application Insights SDK is unable to track corresponding exception.

이전 버전 지원Prior versions support

Application Insights 웹 SDK 2.5(및 이전 버전)의 WebAPI 1(및 이전 버전)을 사용하는 경우 예외를 추적하기 위해 다음 예제를 참조합니다.If you use WebAPI 1 (and prior) of Application Insights Web SDK 2.5 (and prior), refer to the following examples to track exceptions.

Web API 1.xWeb API 1.x

System.Web.Http.Filters.ExceptionFilterAttribute를 재정의합니다.Override System.Web.Http.Filters.ExceptionFilterAttribute:

    using System.Web.Http.Filters;
    using Microsoft.ApplicationInsights;

    namespace WebAPI.App_Start
    {
      public class AiExceptionFilterAttribute : ExceptionFilterAttribute
      {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext != null && actionExecutedContext.Exception != null)
            {  //or reuse instance (recommended!). see note above
                var ai = new TelemetryClient();
                ai.TrackException(actionExecutedContext.Exception);
            }
            base.OnException(actionExecutedContext);
        }
      }
    }

재정의된 특성을 특정 컨트롤러에 추가하거나 WebApiConfig 클래스에서 글로벌 필터 구성에 추가할 수 있습니다.You could add this overridden attribute to specific controllers, or add it to the global filter configuration in the WebApiConfig class:

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

예제Sample

Web API 2.xWeb API 2.x

IExceptionLogger를 추가로 구현합니다.Add an implementation of 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에서 서비스에 추가합니다.Add this to the services in WebApiConfig:

    using System.Web.Http;
    using System.Web.Http.ExceptionHandling;
    using ProductsAppPureWebAPI.App_Start;

    namespace WebApi2WithMVC
    {
      public static class WebApiConfig
      {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Services.Add(typeof(IExceptionLogger), new AiExceptionLogger());
        }
      }
     }

예제Sample

또는 다음 방법을 사용해도 됩니다.As alternatives, you could:

  1. 유일한 ExceptionHandler를 IExceptionHandler의 사용자 지정 구현으로 바꿉니다.Replace the only ExceptionHandler with a custom implementation of IExceptionHandler. 이 특성은 프레임 워크에서 보낼 응답 메시지를 선택할 수 있는 때에만 호출됩니다. 인스턴스에 대한 연결이 끊어지면 호출되지 않습니다.This is only called when the framework is still able to choose which response message to send (not when the connection is aborted for instance)
  2. 위의 Web API 1.x 컨트롤러 섹션에서 설명한 것처럼 예외 필터는 어떤 경우에도 호출되지 않습니다.Exception Filters (as described in the section on Web API 1.x controllers above) - not called in all cases.

WCFWCF

특성을 확장하고 IErrorHandler 및 IServiceBehavior를 구현하는 클래스를 추가합니다.Add a class that extends Attribute and implements IErrorHandler and IServiceBehavior.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel.Description;
    using System.ServiceModel.Dispatcher;
    using System.Web;
    using Microsoft.ApplicationInsights;

    namespace WcfService4.ErrorHandling
    {
      public class AiLogExceptionAttribute : Attribute, IErrorHandler, IServiceBehavior
      {
        public void AddBindingParameters(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase,
            System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
            System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            foreach (ChannelDispatcher disp in serviceHostBase.ChannelDispatchers)
            {
                disp.ErrorHandlers.Add(this);
            }
        }

        public void Validate(ServiceDescription serviceDescription,
            System.ServiceModel.ServiceHostBase serviceHostBase)
        {
        }

        bool IErrorHandler.HandleError(Exception error)
        {//or reuse instance (recommended!). see note above
            var ai = new TelemetryClient();

            ai.TrackException(error);
            return false;
        }

        void IErrorHandler.ProvideFault(Exception error,
            System.ServiceModel.Channels.MessageVersion version,
            ref System.ServiceModel.Channels.Message fault)
        {
        }
      }
    }

Add the attribute to the service implementations:

    namespace WcfService4
    {
        [AiLogException]
        public class Service1 : IService1
        {
         ...

예제Sample

예외 성능 카운터Exception performance counters

서버에 Application Insights 에이전트를 설치한 경우 .NET에서 측정된 예외 속도 차트를 확인할 수 있습니다.If you have installed the Application Insights Agent on your server, you can get a chart of the exceptions rate, measured by .NET. 여기에는 처리된 .NET 예외와 처리되지 않은 .NET 예외가 모두 포함됩니다.This includes both handled and unhandled .NET exceptions.

메트릭 탐색기 탭을 열고 새 차트를 추가하고 성능 카운터 아래에 나열된 예외 비율을선택합니다.Open a Metric Explorer tab, add a new chart, and select Exception rate, listed under Performance Counters.

.NET Framework는 간격의 예외 수를 계산하고 간격의 길이로 나누어 속도를 계산합니다.The .NET framework calculates the rate by counting the number of exceptions in an interval and dividing by the length of the interval.

TrackException 보고서를 계산하여 Application Insights 포털에서 계산되는 ‘예외’ 개수와는 다릅니다.This is different from the 'Exceptions' count calculated by the Application Insights portal counting TrackException reports. 샘플링 간격이 다르며, SDK에서 처리된 예외 및 처리되지 않은 예외 둘 다에 대한 TrackException 보고서를 보내지 않습니다.The sampling intervals are different, and the SDK doesn't send TrackException reports for all handled and unhandled exceptions.

다음 단계Next steps