Application Analizler ile web uygulamalarına özel durumları tanılama

Web uygulamalarına özel durumlar Application Analizler. Başarısız istekleri hem istemci hem de sunucu üzerinde özel durumlarla ve diğer olaylarla arasında ilişkide bulundurabilirsiniz, böylece nedenlerini hızla tanılarsınız. Bu makalede özel durum raporlamayı ayarlamayı, özel durumları açıkça bildirmeyi, hataları tanılamayı ve daha fazlasını yapmayı öğrenirsiniz.

Özel durum raporlamayı ayarlama

Sunucuda veya istemcide Analizler özel durumları rapor etmek için Application Analizler'i kurabilirsiniz. Uygulamanıza bağlı olan platforma bağlı olarak, uygun uzantıya veya SDK'ya ihtiyacınız vardır.

Sunucu tarafı

Sunucu tarafı uygulamanıza özel durumlar bildiriliyorsa aşağıdaki senaryoları göz önünde bulundurabilirsiniz:

İstemci tarafı

JavaScript SDK'sı, web tarayıcılarında oluşan özel durumları istemci tarafı raporlama özelliği sağlar. İstemcide özel durum raporlamayı ayarlamak için bkz. Web Analizler uygulama raporları.

Uygulama çerçeveleri

Bazı uygulama çerçeveleri için biraz daha fazla yapılandırma gerektiğinde aşağıdaki teknolojileri göz önünde bulundurabilirsiniz:

Önemli

Bu makale, özel olarak kod .NET Framework bir bakış açısıyla uygulamalara odaklanmaktadır. İş için kullanılan yöntemlerden bazıları .NET Framework içinde artık .NET Core SDK. Daha fazla bilgi için .NET Core ile .NET Core SDK belgelerine bakın.

Visual Studio kullanarak özel durumları tanılama

Uygulama çözümünü Visual Studio. F5 kullanarak uygulamayı sunucunuzda veya geliştirme makineniz üzerinde çalıştırın. Özel durumu yeniden oluşturun.

Application Analizler Search telemetri penceresini Visual Studio. Hata ayıklama sırasında Uygulama Uygulama Analizler seçin.

Projeye sağ tıklayın ve Uygulama Uygulaması' Analizler Aç'ı 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 etkinleştirildiyse, özel durumlar hakkında veriler görüyorsunuz:

Özel durumlar için CodeLens bildirimi.

Azure portal kullanarak hataları tanılama

Uygulama Analizler, izlenen uygulamalarınıza hataları tanılamanıza yardımcı olmak için bir özel Uygulama Performansı Yönetimi (APM) deneyimiyle birlikte gelir. Başlamak için Araştır bölümünde yer alan Uygulama Yönetimi kaynak Analizler Hatalar seçeneğini belirleyin. İstekleriniz için hata oranı eğilimlerini, bunların kaç tane başarısız olduğunu ve kaç kullanıcının etkilen olduğunu görüyorsunuz. Genel görünümde, seçilen başarısız işleme özgü en yararlı dağıtımlardan bazıları (ilk üç yanıt kodu, ilk üç özel durum türü ve ilk üç başarısız bağımlılık türü de dahil) görüntülenir.

Hataların triyadüz görünümü (işlemler sekmesi)

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

End-to-end işlem ayrıntıları sekmesi

Alternatif olarak, başarısız olan belirli bir işlemle ilgili özel durumlara bakmadan, en üstte Ö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örüntüebilirsiniz.

Özel izleme ve günlük verileri

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

kullanarak Microsoft.VisualStudio.ApplicationInsights.TelemetryClient çeşitli API'ler kullanılabilir:

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

Detaylandırma

Not

Uygulamanız çok sayıda telemetri oluşturuyorsa, uyarlamalı örnekleme modülü olayların yalnızca bir temsilci fraksiyonunu göndererek portala gönderilen hacmi otomatik olarak azaltır. İlgili olaylar arasında gezinmek için, aynı işlem kapsamındaki olaylar grup olarak seçilir veya seçimi kaldırılır. Daha fazla bilgi için bkz. Application Analizler.

İstek POST verilerini görme

İstek ayrıntıları, bir POST çağrısında uygulamanıza gönderilen verileri içermez. Bu verilerin bildirilene sahip olmak için:

İlk başta, portalda uygulamanıza hatalara neden olan tüm özel durumları görmüyorsanız. Tarayıcı özel durumlarını (web sayfalarınıza JavaScript SDK'sını kullanıyorsanız) bakabilirsiniz. Ancak çoğu sunucu özel durumu IIS tarafından yakalanıyor ve bunları görmek için biraz kod yazmanız gerekiyor.

Seçenekleriniz şunlardır:

  • Özel durumları rapor etmek için özel durum işleyicilere kod ekerek özel durumları açıkça günlüğe ekleyin.
  • Uygulama çerçevenizi yapılandırarak özel durumları otomatik ASP.NET yakalama. Gerekli eklemeler farklı çerçeve türleri için farklıdır.

Özel durumları açıkça raporlama

En basit yol, özel durum işleyicisinde çağrısı trackException() 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 yararlıdır. Örneğin, birkaç oyun çalıştıracak 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 raporlandı.

Web sayfanız içerik teslim ağlarından veya diğer etki alanlarından betik dosyaları içerirse, betik etiketinizin özniteliğine sahip olduğundan ve sunucunun CORS üst crossorigin="anonymous" bilgilerini gönderdiğinden emin olun. Bu, bu kaynaklardan iş almayan JavaScript özel durumları için yığın izlemesi ve ayrıntısı alasiniz.

Telemetri istemcinizi yeniden kullanma

Not

TelemetryClientbir kez örneği ve bir uygulamanın ömrü boyunca yeniden kullanılması önerilir.

.NET'teBağımlılık Ekleme (DI) ile, uygun .NET SDK'sı ve DI için Uygulama Analizler'i doğru yapılandırarak, oluşturucu parametresi olarak TelemetryClient parametresini gerekli bulabilirsiniz.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

Yukarıdaki örnekte, TelemetryClient sınıfına ExampleController içine yer vetir.

Web formları

Web formları için HTTP Modülü, ile yapılandırılmış yeniden yönlendirmeler olduğunda özel durumları CustomErrors toplayabilirsiniz. Ancak, etkin yeniden yönlendirmeleri olduğunda Application_Error Global.asax.cs'de işlevine 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, türünde _telemetryClient bir sınıf kapsamlı değişkendir. TelemetryClient

MVC

Application Analizler Web SDK'sı sürüm 2.6 (beta3 ve sonrası) ile başlayarak, Application Analizler MVC 5+ denetleyici yöntemlerinde otomatik olarak iş almayan özel durumları toplar. Bu tür özel durumları izlemek için daha önce özel bir işleyici eklediysanız, özel durumların çift izlemesini önlemek için bu işleyiciyi kaldırsanız.

Özel durumlar oluşturulduğunda bir özel durum filtresinin hataları düzgün işleyememesi durumunda bazı senaryolar oluşur:

  • 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şlenmemiş özel durumlar genellikle 500 "Iç sunucu hatası" yanıtı ile sonuçlanır. bu tür bir yanıt işlenmiş özel durumun sonucu olarak el ile oluşturulursa (veya hiç özel durum yoksa), 500 ile ilgili istek telemetrisi içinde izlenir ResultCode , ancak Application Insights SDK karşılık gelen özel durumu izleyemiyor.

Önceki sürümler desteği

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

CustomErrors yapılandırması Ise Off , http modülünün toplaması için özel durumlar kullanılabilir olacaktır. ancak, RemoteOnly (varsayılan) veya ise, On özel durum temizlenir ve Application Insights otomatik olarak toplanacaktır. System. Web. Mvc. handleerrorattribute sınıfınıgeçersiz kılarak ve geçersiz kılınan sınıfı aşağıdaki farklı Mvc sürümleri için gösterildiği gibi uygulayarak (GitHub kaynak) bu hatayı çözebilirsiniz:

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 2

HandleError özniteliğini denetleyicilerinizdeki yeni öznitelikle değiştirin.

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

Örnek

MVC 3

AiHandleErrorAttribute Global. asax. cs dosyasında genel filtre olarak Kaydet:

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

Örnek

MVC 4, MVC5

AiHandleErrorAttribute Filterconfig. cs dosyasında genel filtre olarak Kaydet:

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

Application Insights Web SDK 2,6 (beta3 ve üzeri) sürümünden başlayarak, Application Insights, denetleyici yöntemlerinde otomatik olarak oluşturulan işlenmeyen özel durumları, WebAPI 2 + için otomatik olarak toplar. Bu tür özel durumları izlemek için daha önce özel bir işleyici eklediyseniz (aşağıdaki örneklerde açıklandığı gibi), özel durumların çift izlemesini engellemek için bunu kaldırabilirsiniz.

Özel durum filtrelerinden işleyememesi gereken birkaç durum vardır. Örnek:

  • 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 oluşturulan özel durum.
  • 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şlenmemiş özel durumlar genellikle 500 "Iç sunucu hatası" yanıtı ile sonuçlanır. bu tür bir yanıt işlenmiş özel durumun sonucu olarak el ile oluşturulursa (veya hiç özel durum yoksa), 500 ile ilgili bir istek telemetriyle izlenir ResultCode , ancak Application Insights SDK karşılık gelen özel durumu izleyemiyor.

Önceki sürümler desteği

Application Insights Web SDK 2,5 (ve öncesi) için WebAPI 1 (ve öncesi) 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ı içindeki genel filtre yapılandırmasına ekleyebilirsiniz 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());
        }
    }
}

Örnek

Web API 2. x

Uygulamasının bir uygulamasını ekleyin 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);
        }
    }
}

Bunu WebApiConfig içindeki hizmetlere 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

Alternatifler olarak şunları yapabilirsiniz:

  1. Tek ExceptionHandler öğesini bir ıexceptionhandler özel uygulamasıyla değiştirin. Bu yalnızca çerçeve hangi yanıt iletisini gönderileceğini seçebilmeye devam ediyorsa çağrılır (örneğin, bağlantı iptal edildiğinde)
  2. Özel durum filtreleri (yukarıdaki Web API 1. x denetleyicilerinin bölümünde açıklandığı gibi)-tüm durumlarda çağrılmaz.

WCF

Özniteliğini genişleten ve IErrorHandler ve IServiceProvider 'ı uygulayan 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ği hizmet uygulamalarına ekleyin:

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

Örnek

Özel durum performans sayaçları

sunucunuza Azure izleyici Application Insights aracısını yüklediyseniz , .net tarafından ölçülen özel durum hızının bir grafiğini alabilirsiniz. Bu hem işlenmiş hem de işlenmemiş .NET özel durumlarını içerir.

Ölçüm Gezgini sekmesini açın, yeni bir grafik ekleyin ve performans sayaçları altında listelenen özel durum oranı' nı seçin.

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

bu, Application Insights portal sayımı trackexception raporları tarafından hesaplanan ' Exceptions ' sayımından farklıdır. Örnekleme aralıkları farklıdır ve SDK, işlenmiş ve işlenmemiş özel durumlar için TrackException raporları göndermez.

Sonraki adımlar