Diagnostika výjimek ve webových aplikacích s Přehledy

Výjimky ve webových aplikacích je možné hlásit pomocí služby Application Přehledy. Neúspěšné požadavky můžete korelovat s výjimkami a jinými událostmi na klientovi i serveru, abyste mohli rychle diagnostikovat příčiny. V tomto článku se dozvíte, jak nastavit generování sestav výjimek, explicitně hlásit výjimky, diagnostikovat selhání a další.

Nastavení generování sestav výjimek

Můžete nastavit aplikační Přehledy hlásit výjimky, ke kterým dochází na serveru nebo v klientovi. V závislosti na platformě, na které aplikace závisí, budete potřebovat příslušné rozšíření nebo sadu SDK.

Na straně serveru

Pokud chcete, aby aplikace na straně serveru hlásila výjimky, zvažte následující scénáře:

Na straně klienta

Sada JavaScript SDK poskytuje možnost hlášení výjimek, ke kterým dochází ve webových prohlížečích, na straně klienta. Pokud chcete nastavit generování sestav výjimek v klientovi, podívejte se na Přehledy pro webové stránky.

Aplikační architektury

U některých aplikačních architektur je potřeba trochu více konfigurace, zvažte následující technologie:

Důležité

Tento článek se konkrétně zaměřuje na .NET Framework z pohledu příkladu kódu. Některé metody, které pracují s .NET Framework, jsou v .NET Core SDK. Další informace najdete v dokumentaci .NET Core SDK vytváření aplikací pomocí .NET Core.

Diagnostika výjimek pomocí Visual Studio

Otevřete řešení aplikace v Visual Studio. Spusťte aplikaci na serveru nebo na vývojovém počítači pomocí klávesy F5. Znovu vytvořte výjimku.

V okně telemetrie Přehledy vyhledávání aplikací otevřete Visual Studio. Během ladění vyberte rozevírací seznam Přehledy aplikace.

Klikněte pravým tlačítkem na projekt a zvolte Application Přehledy, Open (Otevřít).

Výběrem sestavy výjimek zobrazíte její trasování zásobníku. Pokud chcete otevřít příslušný soubor kódu, vyberte odkaz na řádek v trasování zásobníku.

Pokud je povolená funkce CodeLens, zobrazí se data o výjimce:

Oznámení o výjimce CodeLens

Diagnostika selhání pomocí Azure Portal

Aplikace Přehledy součástí kurátorovaného prostředí APM (Application Performance Management), které vám pomůže diagnostikovat chyby v monitorovaných aplikacích. Začněte výběrem možnosti Selhání v nabídce Přehledy prostředků, která se nachází v části Prozkoumat. Zobrazí se trendy míry selhání vašich požadavků, počet neúspěšných požadavků a počet ovlivněných uživatelů. V celkovém zobrazení uvidíte některé z nejužitečnějších distribucí specifických pro vybranou neúspěšnou operaci, včetně tří nejčastějších kódů odpovědí, tří nejčastějších typů výjimek a tří typů závislostí s nejvyšším selháním.

Zobrazení hodnocení chyb (karta Operace)

Pokud si chcete zkontrolovat reprezentativní vzorky pro každou z těchto podmnožiny operací, vyberte odpovídající odkaz. Pokud chcete například diagnostikovat výjimky, můžete vybrat počet konkrétních výjimek, které se zobrazí na kartě Podrobnosti o koncové transakci:

Karta s podrobnostmi o koncové transakci

Alternativně můžete místo toho, abyste se podívali na výjimky konkrétní neúspěšné operace, začít z celkového zobrazení výjimek přepnutím na kartu Výjimky v horní části. Tady vidíte všechny výjimky shromážděné pro monitorovanou aplikaci.

Vlastní trasování a data protokolu

Pokud chcete získat diagnostická data specifická pro vaši aplikaci, můžete vložit kód pro odesílání vlastních telemetrických dat. Vaše vlastní telemetrická data nebo data protokolů se zobrazují v diagnostickém vyhledávání společně s požadavkem, zobrazením stránky a dalšími automaticky shromážděná data.

Pomocí Microsoft.VisualStudio.ApplicationInsights.TelemetryClient máte k dispozici několik rozhraní API:

Pokud chcete tyto události zobrazit, otevřete v levé nabídce Vyhledávání, vyberte rozevírací nabídku Typy událostí a pak zvolte Vlastní událost , Trasování nebo Výjimka.

Podrobná analýza

Poznámka

Pokud vaše aplikace generuje mnoho telemetrických dat, sníží modul adaptivního vzorkování automaticky objem dat odesílaných na portál tím, že budou odesílány pouze reprezentativní vzorky událostí. Události, které jsou součástí stejné operace, budou vybrány nebo zrušeny jako skupina, abyste mohli procházet mezi souvisejícími událostmi. Další informace najdete v tématu Vzorkování v aplikaci Přehledy.

Jak zobrazit požadavek na data POST

Podrobnosti požadavku nezahrnují data odeslaná do vaší aplikace ve volání POST. Pokud chcete tato data ohlásit:

  • Nainstalujte sadu SDK do projektu aplikace.
  • Do aplikace vložte kód pro volání Microsoft.ApplicationInsights.TrackTrace(). Odešlete data POST v parametru message. Povolená velikost má limit, takže byste se měli pokusit odeslat jenom nezbytná data.
  • Při zkoumání neúspěšné žádosti vyhledejte přidružená trasování.

Na portálu se na první pohled neuvidíte všechny výjimky, které v aplikaci způsobují chyby. Zobrazí se všechny výjimky prohlížeče (pokud na webových stránkách používáte sadu JavaScript SDK). Většinu výjimek serveru ale zachytila služba IIS a musíte napsat kód, abyste je viděli.

Další možnosti:

  • Protokolování výjimek explicitně vložením kódu do obslužných rutin výjimek pro hlášení výjimek.
  • Automatické zachytávání výjimek konfigurací ASP.NET rozhraní. Potřebná přidání se liší pro různé typy architektury.

Výslovné hlášení výjimek

Nejjednodušším způsobem je vložit volání do obslužné trackException() rutiny výjimky.

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

Parametry vlastností a měření jsou volitelné, ale jsou užitečné pro filtrování a přidávání dalších informací. Pokud máte například aplikaci, která může spouštět několik her, můžete najít všechny sestavy výjimek související s určitou hrou. Do každého slovníku můžete přidat tolik položek, kolik chcete.

Výjimky prohlížečů

Hlásí se většina výjimek prohlížeče.

Pokud vaše webová stránka obsahuje soubory skriptů ze sítí pro doručování obsahu nebo jiných domén, ujistěte se, že vaše značka skriptu má atribut a že server odesílá hlavičky crossorigin="anonymous" CORS. To vám umožní získat trasování zásobníku a podrobnosti pro neošetřené výjimky JavaScriptu z těchto prostředků.

Opakované použití telemetrie klienta

Poznámka

Instance se doporučuje vytvořit jednou a znovu použít po celou dobu TelemetryClient životnosti aplikace.

Pomocí injektáže závislostí (DI)v rozhraní .NET můžete jako parametr konstruktoru vyžadovat příslušnou sadu .NET SDK a Přehledy konfiguraci funkce Application Přehledy pro injektáž TelemetryClient závislostí.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

V předchozím příkladu je TelemetryClient do třídy injektován ExampleController .

Webové formuláře

U webových formulářů bude modul HTTP moct shromažďovat výjimky, pokud nejsou nakonfigurovaná žádná přesměrování s CustomErrors . Pokud však máte aktivní přesměrování, přidejte do funkce v Application_Error souboru Global.asax.cs následující řádky.

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

V předchozím příkladu je proměnná typu _telemetryClient vymezená třídou TelemetryClient .

MVC

Počínaje sadou Application Přehledy Web SDK verze 2.6 (beta3 a novější) application Přehledy automaticky shromažďuje neošetřené výjimky vyvolané metodami kontrolerů MVC 5+. Pokud jste dříve přidali vlastní obslužnou rutinu pro sledování takových výjimek, můžete ji odebrat, abyste zabránili dvojímu sledování výjimek.

Existuje několik scénářů, kdy filtr výjimek nedokáže správně zpracovat chyby, když jsou vyvolány výjimky:

  • Z konstruktorů kontroleru.
  • Z obslužných rutin zpráv.
  • Během směrování.
  • Během serializace obsahu odpovědi.
  • Během spuštění aplikace.
  • V úlohách na pozadí.

Všechny výjimky zpracované aplikací je stále potřeba sledovat ručně. Neošetřené výjimky pocházející z kontrolerů obvykle mají za následek odpověď 500 Vnitřní chyba serveru. Pokud je taková odpověď vytvořena ručně v důsledku zpracované výjimky (nebo vůbec žádné výjimky), je sledována v odpovídající telemetrii požadavků s hodnotou 500, ale sada Application Přehledy SDK nemůže sledovat odpovídající ResultCode výjimku.

Podpora předchozích verzí

Pokud používáte MVC 4 (a starší) sady Application Přehledy Web SDK 2.5 (a starší), postupujte podle následujících příkladů ke sledování výjimek.

Pokud je konfigurace CustomErrors nastavená na , budou pro modul HTTP k dispozici Off výjimky, které bude možné shromažďovat. Pokud je to ale (výchozí) nebo , výjimka se vyčištěná a nebude dostupná pro automatické shromažďování RemoteOnly On Přehledy aplikace. Tento problém můžete vyřešit přepsáním třídy System.Web.Mvc.HandleErrorAttributea použitím přepsané třídy, jak je znázorněno pro různé verze MVC níže (GitHub zdroj):

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

Nahraďte atribut HandleError novým atributem v kontrolerů.

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

Ukázka

MVC 3

Zaregistrujte AiHandleErrorAttribute se jako globální filtr v Souboru Global.asax.cs:

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

Ukázka

MVC 4, MVC5

Zaregistrujte AiHandleErrorAttribute se jako globální filtr v souboru FilterConfig.cs:

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

Ukázka

Webové rozhraní API

Počínaje sadou Application Přehledy Web SDK verze 2.6 (beta3 a novější) application Přehledy automaticky shromažďuje neošetřené výjimky vyvolané metodami kontroleru pro WebAPI 2+. Pokud jste dříve přidali vlastní obslužnou rutinu pro sledování takových výjimek (jak je popsáno v následujících příkladech), můžete ji odebrat, abyste zabránili dvojímu sledování výjimek.

Existuje řada případů, které filtry výjimek nemohou zpracovat. Příklad:

  • Výjimky vyvolané konstruktory kontrolerů
  • Výjimky vyvolané obslužnými rutinami zpráv
  • Výjimky vyvolané během směrování
  • Výjimky vyvolané během serializace obsahu odpovědi
  • Výjimky vyvolané během spouštění aplikace
  • Výjimky vyvolané úlohami na pozadí

Všechny výjimky zpracované aplikací je stále potřeba sledovat ručně. Neošetřené výjimky pocházející z kontrolerů obvykle mají za následek odpověď 500 Vnitřní chyba serveru. Pokud je taková odpověď vytvořena ručně v důsledku zpracované výjimky (nebo vůbec žádné výjimky), je sledována v odpovídající telemetrii požadavků s hodnotou 500, ale sada Application Přehledy SDK nemůže sledovat odpovídající ResultCode výjimku.

Podpora předchozích verzí

Pokud používáte Rozhraní WebAPI 1 (a starší) sady Application Přehledy Web SDK 2.5 (a starší), postupujte podle následujících příkladů ke sledování výjimek.

Webové rozhraní API 1.x

System.Web.Http.Filters.ExceptionFilterAttributePřepsat:

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

Tento přepsané atributy můžete přidat do konkrétních kontrolerů nebo ho přidat do konfigurace globálního filtru ve WebApiConfig třídě :

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

Ukázka

Webové rozhraní API 2.x

Přidejte implementaci 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);
        }
    }
}

Přidejte tento kód do služeb v 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());
        }
    }
}

Ukázka

Jako alternativu můžete:

  1. Nahraďte jediný ExceptionHandler vlastní implementací třídy IExceptionHandler. Tato zpráva se volá pouze v případě, že je rozhraní stále schopné zvolit, která zpráva odpovědi se má odeslat (například ne při přerušení připojení).
  2. Filtry výjimek (jak je popsáno v části o kontrolerů webového rozhraní API 1.x výše) – ve všech případech se nevolána.

WCF

Přidejte třídu, která rozšiřuje Attribute a implementuje IErrorHandler a 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)
        {
        }
      }
    }

Přidejte atribut do implementací služby:

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

Ukázka

Čítače výkonu výjimek

Pokud jste na server nainstalovali Azure Monitor Application Přehledy Agent, můžete získat graf míry výjimek měřený podle .NET. To zahrnuje zpracované i neošetřené výjimky rozhraní .NET.

Otevřete kartu Průzkumník metrik, přidejte nový graf a vyberte Míru výjimek uvedenou v části Čítače výkonu.

Rozhraní .NET Framework vypočítá rychlost počítáním počtu výjimek v intervalu a vydělením délkou intervalu.

To se liší od počtu výjimek vypočítaného sestavou výjimky TrackException Přehledy aplikací na portálu. Intervaly vzorkování se liší a sada SDK neodesíleje sestavy TrackException pro všechny zpracované a neošetřené výjimky.

Další kroky