Application Insights ile web uygulamalarında özel durumları tanılama

Not

Aşağıdaki belgeler Application Insights klasik API'sine dayanır. Application Insights için uzun vadeli plan, OpenTelemetry kullanarak veri toplamaktır. Daha fazla bilgi için bkz . .NET, Node.js, Python ve Java uygulamaları için Azure İzleyici OpenTelemetry'yi etkinleştirme ve OpenTelemetry Yol Haritamız. Geçiş kılavuzu .NET, Node.js ve Python için kullanılabilir.

Web uygulamalarında özel durumlar Application Insights ile bildirilebilir. Başarısız istekleri özel durumlarla ve hem istemci hem de sunucudaki diğer olaylarla ilişkilendirerek nedenlerini hızla tanılayabilirsiniz. Bu makalede özel durum raporlamayı ayarlamayı, özel durumları açıkça bildirmeyi, hataları tanılamayı ve daha fazlasını öğreneceksiniz.

Özel durum raporlamayı ayarlama

Sunucuda veya istemcide oluşan özel durumları raporlamak için Application Insights'ı ayarlayabilirsiniz. Uygulamanızın bağımlı olduğu platforma bağlı olarak, uygun uzantıya veya SDK'ya ihtiyacınız olacaktır.

Sunucu tarafı

Sunucu tarafı uygulamanızdan bildirilen özel durumlar için aşağıdaki senaryoları göz önünde bulundurun:

İstemci tarafı

JavaScript SDK'sı, web tarayıcılarında oluşan özel durumların istemci tarafında bildirilebilmesini sağlar. İstemcide özel durum raporlamayı ayarlamak için bkz . Web sayfaları için Application Insights.

Uygulama çerçeveleri

Bazı uygulama çerçeveleri ile daha fazla yapılandırma gerekir. Aşağıdaki teknolojileri göz önünde bulundurun:

Önemli

Bu makale özellikle kod örneği açısından .NET Framework uygulamalarına odaklanmıştır. .NET Framework için çalışan yöntemlerden bazıları .NET Core SDK'sında eskidir. Daha fazla bilgi için .NET Core ile uygulama oluştururken .NET Core SDK belgelerine bakın.

Visual Studio kullanarak özel durumları tanılama

Visual Studio'da uygulama çözümünü açın. F5 kullanarak uygulamayı sunucunuzda veya geliştirme makinenizde çalıştırın. Özel durumu yeniden oluşturun.

Visual Studio'da Application Insights Arama telemetri penceresini açın. Hata ayıklama sırasında Application Insights açılan kutusunu seçin.

Yığın izlemesini göstermek için bir özel durum raporu seçin. İlgili kod dosyasını açmak için yığın izlemesinde bir satır başvurusu seçin.

CodeLens etkinse, özel durumlar hakkındaki verileri görürsünüz:

Özel durumların CodeLens bildirimini gösteren ekran görüntüsü.

Azure portalını kullanarak hataları tanılama

Application Insights, izlenen uygulamalarınızdaki hataları tanılamanıza yardımcı olmak için seçilmiş bir Uygulama Performansı Yönetimi deneyimiyle birlikte gelir. Başlamak için, soldaki Application Insights kaynak menüsündeki Araştır'ın altında Hatalar seçeneğini belirleyin.

İsteklerinizin hata oranı eğilimlerini, bunların kaç tanesinin başarısız olduğunu ve kaç kullanıcının etkilendiğini görürsünüz. Genel görünümü, seçilen başarısız işleme özgü en kullanışlı dağıtımlardan bazılarını gösterir. İlk üç yanıt kodunu, ilk üç özel durum türünü ve başarısız olan ilk üç bağımlılık türünü görürsünüz.

İşlemler sekmesinde hata önceliklendirme görünümünü gösteren ekran görüntüsü.

Bu işlem alt kümelerinin her birine ait temsili örnekleri gözden geçirmek için ilgili bağlantıyı seçin. Örneğin, özel durumları tanılamak için uçtan uca işlem ayrıntıları sekmesiyle sunulacak belirli bir özel durumun sayısını seçebilirsiniz.

Uçtan uca işlem ayrıntıları sekmesini gösteren ekran görüntüsü.

Alternatif olarak, belirli bir başarısız işlemin özel durumlarına bakmak yerine, üstteki Özel Durumlar sekmesine geçerek özel durumların Genel görünümünden başlayabilirsiniz. Burada izlenen uygulamanız için toplanan tüm özel durumları görebilirsiniz.

Özel izleme ve günlük verileri

Uygulamanıza özgü tanılama verilerini almak için kendi telemetri verilerinizi göndermek için kod ekleyebilirsiniz. Özel telemetri veya günlük verileriniz, tanılama aramasında istek, sayfa görünümü ve otomatik olarak toplanan diğer veriler ile birlikte görüntülenir.

Microsoft.VisualStudio.ApplicationInsights.TelemetryClientkullanarak kullanabileceğiniz çeşitli API'ler vardır:

Bu olayları görmek için soldaki menüde Ara'yı açın. Olay türleri açılan menüsünü seçin ve ardından Özel Olay, İzleme veya Özel Durum'u seçin.

Arama ekranını gösteren ekran görüntüsü.

Not

Uygulamanız çok fazla telemetri oluşturuyorsa uyarlamalı örnekleme modülü, olayların yalnızca temsili bir bölümünü göndererek portala gönderilen hacmi otomatik olarak azaltır. Aynı işlemin parçası olan olaylar, ilgili olaylar arasında gezinebilmeniz için grup olarak seçilir veya seçimi kaldırılır. Daha fazla bilgi için bkz . Application Insights'ta Örnekleme.

bkz. POST verilerini isteme

İstek ayrıntıları, POST çağrısında uygulamanıza gönderilen verileri içermez. Bu verilerin bildirilmiş olması için:

  • SDK'yi uygulama projenize yükleyin.
  • Microsoft.ApplicationInsights.TrackTrace() çağrısı yapmak için uygulamanıza kod ekleyin. POST verilerini ileti parametresinde gönderin. İzin verilen boyutun bir sınırı vardır, bu nedenle yalnızca temel verileri göndermeyi denemelisiniz.
  • Başarısız bir isteği araştırdığınızda ilişkili izlemeleri bulun.

Özel durumları ve ilgili tanılama verilerini yakalama

İlk olarak portalda uygulamanızda hatalara neden olan tüm özel durumları görmezsiniz. Web sayfalarınızda JavaScript SDK'sını kullanıyorsanız tüm tarayıcı özel durumlarını görürsünüz. Ancak çoğu sunucu özel durumu IIS tarafından yakalanıyor ve bunları görmek için biraz kod yazmanız gerekiyor.

Şunları yapabilirsiniz:

  • Özel durumları bildirmek için özel durum işleyicilerine kod ekleyerek özel durumları açıkça günlüğe kaydetme.
  • ASP.NET çerçevenizi yapılandırarak özel durumları otomatik olarak yakalayın. Farklı çerçeve türleri için gerekli eklemeler farklıdır.

Özel durumları açıkça raporla

Raporlamanın en basit yolu, özel durum işleyicisine trackException() çağrısı eklemektir.

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

Özellikler ve ölçüm parametreleri isteğe bağlıdır, ancak filtreleme ve ek bilgi ekleme için kullanışlıdır. Örneğin, birkaç oyun çalıştırabilen bir uygulamanız varsa, belirli bir oyunla ilgili tüm özel durum raporlarını bulabilirsiniz. Her sözlüğe istediğiniz kadar öğe ekleyebilirsiniz.

Tarayıcı özel durumları

Çoğu tarayıcı özel durumu bildirilir.

Web sayfanızda içerik teslim ağlarından veya diğer etki alanlarından betik dosyaları varsa, betik etiketinizin özniteliğine crossorigin="anonymous" sahip olduğundan ve sunucunun CORS üst bilgileri gönderdiğinden emin olun. Bu davranış, bu kaynaklardan bir yığın izlemesi ve işlenmeyen JavaScript özel durumları için ayrıntı almanıza olanak sağlar.

Telemetri istemcinizi yeniden kullanma

Not

Bir kez örneği TelemetryClient oluşturmanızı ve bir uygulamanın ömrü boyunca yeniden kullanmanızı öneririz.

.NET'te Bağımlılık Ekleme (DI), uygun .NET SDK'sı ve DI için Application Insights'ı doğru yapılandırarak, oluşturucu parametresini gerektirebilirsinizTelemetryClient.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

Yukarıdaki örnekte sınıfına TelemetryClient ExampleController eklenir.

Web formları

Web formları için HTTP Modülü ile CustomErrorsyapılandırılmış hiçbir yeniden yönlendirme olmadığında özel durumları toplayabilir. Ancak, etkin yeniden yönlendirmeleriniz olduğunda, Global.asax.cs işlevine Application_Error aşağıdaki satırları ekleyin.

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

Yukarıdaki örnekte, _telemetryClient türünde TelemetryClientsınıf kapsamlı bir değişkendir.

MVC

Application Insights Web SDK'sı sürüm 2.6 (beta 3 ve üzeri) ile başlayarak, Application Insights MVC 5+ denetleyici yöntemlerinde oluşan işlenmeyen özel durumları otomatik olarak toplar. Daha önce bu tür özel durumları izlemek için bir özel işleyici eklediyseniz, özel durumların çift izlenmesini önlemek için bunu kaldırabilirsiniz.

Özel durum filtresinin özel durumlar oluştuğunda hataları doğru şekilde işleyememesinde çeşitli senaryolar vardır:

  • Denetleyici oluşturucularından
  • İleti işleyicilerinden
  • Yönlendirme sırasında
  • Yanıt içeriği serileştirme sırasında
  • Uygulama başlatma sırasında
  • Arka plan görevlerinde

Uygulama tarafından işlenen tüm özel durumların yine de el ile izlenmesi gerekir. Denetleyicilerden kaynaklanan işlenmeyen özel durumlar genellikle 500 "İç Sunucu Hatası" yanıtıyla sonuçlanır. Bu tür bir yanıt, işlenen bir özel durumun sonucu olarak el ile oluşturulursa veya hiç özel durum yoksa, 500 ile ResultCode ilgili istek telemetrisinde izlenir. Ancak, Application Insights SDK'sı ilgili özel durumu izleyemiyor.

Önceki sürümler desteği

Application Insights Web SDK 2.5(ve öncesi) MVC 4 (ve öncesi) kullanıyorsanız, özel durumları izlemek için aşağıdaki örneklere bakın.

CustomErrors yapılandırması iseOff, HTTP Modülünün toplayabileceği özel durumlar kullanılabilir. Ancak , (varsayılan) veya Onise RemoteOnly , özel durum temizlenir ve Application Insights tarafından otomatik olarak toplanamaz. System.Web.Mvc.HandleErrorAttribute sınıfını geçersiz kılıp geçersiz kılınan sınıfı burada farklı MVC sürümleri için gösterildiği gibi uygulayarak bu davranışı düzeltebilirsiniz (GitHub kaynağına bakın):

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 özniteliğini denetleyicilerinizdeki yeni özniteliğinizle değiştirin:

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

Örnek

MVC 3

Global.asax.cs genel filtre olarak kaydolunAiHandleErrorAttribute:

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

Örnek

MVC 4, MVC 5

FilterConfig.cs genel filtre olarak kaydolunAiHandleErrorAttribute:

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

Örnek

Web API'si

Application Insights Web SDK'sı sürüm 2.6 (beta 3 ve üzeri) ile başlayarak Application Insights, Web API 2+ için denetleyici yöntemlerinde otomatik olarak oluşan işlenmeyen özel durumları toplar. Aşağıdaki örneklerde açıklandığı gibi, bu tür özel durumları izlemek için daha önce bir özel işleyici eklediyseniz, özel durumların çift izlenmesini önlemek için bunu kaldırabilirsiniz.

Özel durum filtrelerinin işleyebildiği birkaç durum vardır. Örneğin:

  • Denetleyici oluşturucularından gelen özel durumlar.
  • İleti işleyicilerinden oluşturulan özel durumlar.
  • Yönlendirme sırasında oluşturulan özel durumlar.
  • Yanıt içeriği serileştirmesi sırasında oluşturulan özel durumlar.
  • Uygulama başlatma sırasında özel durum oluştu.
  • Arka plan görevlerinde oluşturulan özel durum.

Uygulama tarafından işlenen tüm özel durumların yine de el ile izlenmesi gerekir. Denetleyicilerden kaynaklanan işlenmeyen özel durumlar genellikle 500 "İç Sunucu Hatası" yanıtıyla sonuçlanır. Böyle bir yanıt, işlenen bir özel durumun sonucu olarak el ile oluşturulursa veya hiçbir özel durum yoksa, 500 ile ResultCode ilgili bir istek telemetrisinde izlenir. Ancak Application Insights SDK'sı ilgili özel durumu izleyemiyor.

Önceki sürümler desteği

Application Insights Web SDK 2.5'in (ve önceki sürümlerinin) Web API 1'ini (ve önceki sürümlerini) kullanıyorsanız, özel durumları izlemek için aşağıdaki örneklere bakın.

Web API 1.x

Geçersiz kıl 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);
    }
    }
}

Geçersiz kılınan bu özniteliği belirli denetleyicilere ekleyebilir veya sınıfındaki genel filtre yapılandırmasına WebApiConfig ekleyebilirsiniz:

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

Örnek

Web API 2.x

uygulamasını IExceptionLoggerekleyin:

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

Bu kod parçacığını içindeki WebApiConfighizmetlere ekleyin:

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

Örnek

Alternatif olarak şunları da kullanabilirsiniz:

  • Tek ExceptionHandler örneği özel uygulamasıyla IExceptionHandlerdeğiştirin. Bu özel durum işleyicisi yalnızca çerçevenin hangi yanıt iletisini göndereceğini seçebilmesi durumunda çağrılır, örneğin bağlantı durdurulduğunda değil.
  • Her durumda çağrılmayan Web API 1.x denetleyicilerinin önceki bölümünde açıklandığı gibi özel durum filtrelerini kullanın.

WCF

ve IServiceBehavior'yi genişleten Attribute ve uygulayan IErrorHandler bir sınıf ekleyin.

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

Özniteliğini hizmet uygulamalarına ekleyin:

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

Örnek

Özel durum performans sayaçları

Sunucunuza Azure İzleyici Application Insights Aracısı'nı yüklediyseniz, .NET tarafından ölçülen özel durum oranının bir grafiğini alabilirsiniz. hem işlenen hem de işlenmeyen .NET özel durumları dahil edilir.

Bir ölçüm gezgini sekmesi açın, yeni bir grafik ekleyin. Performans Sayaçları'nın altında Özel durum oranı'yı seçin.

.NET Framework, bir aralıktaki özel durum sayısını sayarak ve aralığın uzunluğuna bölerek oranı hesaplar.

Bu sayı, Application Insights portalı sayım TrackException raporları tarafından hesaplanan Özel durum sayısı'ndan farklıdır. Örnekleme aralıkları farklıdır ve SDK tüm işlenen ve işlenmeyen özel durumlar için rapor göndermez TrackException .

Sonraki adımlar