Diagnostika výjimek ve webových aplikacích pomocí Application Insights

Poznámka:

Následující dokumentace spoléhá na klasické rozhraní API Application Insights. Dlouhodobým plánem application Insights je shromažďovat data pomocí OpenTelemetry. Další informace najdete v tématu Povolení OpenTelemetry služby Azure Monitor pro aplikace .NET, Node.js, Python a Java a náš plán OpenTelemetry. Pokyny k migraci jsou k dispozici pro .NET, Node.js a Python.

Výjimky ve webových aplikacích je možné hlásit pomocí Application Insights. Neúspěšné žádosti můžete korelovat s výjimkami a dalšími událostmi na klientovi i na 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

Application Insights můžete nastavit tak, aby hlásila výjimky, ke kterým dochází na serveru nebo klientovi. V závislosti na platformě, na které je vaše aplikace závislá, budete potřebovat příslušné rozšíření nebo sadu SDK.

Na straně serveru

Pokud chcete mít výjimky hlášené z aplikace na straně serveru, zvažte následující scénáře:

Na straně klienta

Sada JavaScript SDK poskytuje možnost generování sestav výjimek na straně klienta, ke kterým dochází ve webových prohlížečích. Pokud chcete nastavit generování sestav výjimek v klientovi, přečtěte si téma Application Insights pro webové stránky.

Aplikační architektury

U některých aplikačních architektur se vyžaduje další konfigurace. Zvažte následující technologie:

Důležité

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

Diagnostika výjimek pomocí sady Visual Studio

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

Otevřete okno telemetrie Application Insights Search v sadě Visual Studio. Při ladění vyberte rozevírací seznam Application Insights .

Vyberte sestavu výjimek, aby se zobrazilo 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á služba CodeLens, zobrazí se data o výjimkách:

Snímek obrazovky s oznámením CodeLens o výjimkách

Diagnostika selhání pomocí webu Azure Portal

Application Insights nabízí kurátorované prostředí správy výkonu aplikací, které vám pomůže diagnostikovat selhání v monitorovaných aplikacích. Začněte tak, že v nabídce prostředků Application Insights na levé straně v části Prozkoumat vyberete možnost Selhání .

Uvidíte trendy míry selhání vašich požadavků, kolik z nich selhává a kolik uživatelů se to týká. Celkové zobrazení ukazuje některé z nejužitečnějších distribucí specifických pro vybranou neúspěšnou operaci. Zobrazí se tři nejlepší kódy odpovědí, tři nejlepší typy výjimek a tři nejlepší typy závislostí, které selhávají.

Snímek obrazovky znázorňující zobrazení pro třídění selhání na kartě Operace

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

Snímek obrazovky znázorňující kartu Podrobnosti o celé transakci

Alternativně můžete místo zobrazení výjimek 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 uvidíte všechny výjimky shromážděné pro vaši 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 protokolu se zobrazují v diagnostickém vyhledávání společně s požadavkem, zobrazením stránky a dalšími automaticky shromážděnými daty.

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

  • TelemetryClient.TrackEvent se obvykle používá pro monitorování vzorů využití, ale data, která odesílá, se zobrazují také v části Vlastní události v diagnostickém vyhledávání. Události jsou pojmenované a mohou obsahovat vlastnosti řetězců a číselné metriky, na kterých můžete filtrovat diagnostická hledání.
  • TelemetryClient.TrackTrace umožňuje odesílat delší data, například informace POST.
  • TelemetryClient.TrackException odesílá podrobnosti o výjimce, jako jsou trasování zásobníku do Application Insights.

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

Snímek obrazovky znázorňující obrazovku Hledat

Poznámka:

Pokud vaše aplikace generuje velké množství telemetrie, modul adaptivního vzorkování automaticky sníží objem odesílaný na portál tím, že odešle jenom reprezentativní zlomek událostí. Události, které jsou součástí stejné operace, budou vybrány nebo zrušeny jako skupina, abyste mohli přecházet mezi souvisejícími událostmi. Další informace najdete v tématu Vzorkování v Application Insights.

Zobrazit data POST požadavku

Podrobnosti žádosti nezahrnují data odesílaná do vaší aplikace do volání POST. Chcete-li tato data hlásit:

  • Nainstalujte sadu SDK do projektu aplikace.
  • Vložte do aplikace kód pro volání Microsoft.ApplicationInsights.TrackTrace(). Odešle data POST v parametru zprávy. Povolená velikost je omezena, takže byste se měli pokusit odeslat jenom důležitá data.
  • Když prošetříte neúspěšný požadavek, vyhledejte přidružené trasování.

Zachycení výjimek a souvisejících diagnostických dat

Zpočátku se na portálu nezobrazí všechny výjimky, které způsobují selhání ve vaší aplikaci. Pokud na webových stránkách používáte javascriptovou sadu SDK , zobrazí se všechny výjimky prohlížeče. Ale většina výjimek serveru je zachycena službou IIS a musíte napsat trochu kódu, abyste je viděli.

Můžete provádět následující akce:

  • Explicitně zaznamujte výjimky vložením kódu do obslužných rutin výjimek, které oznamují výjimky.
  • Zachytávání výjimek automaticky konfigurací architektury ASP.NET Nezbytné doplňky se liší pro různé typy rozhraní.

Explicitní výjimky sestav

Nejjednodušší způsob, jak vytvořit sestavu, je vložit volání do trackException() obslužné 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 konkrétní hrou. Do každého slovníku můžete přidat libovolný počet položek.

Výjimky prohlížečů

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

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

Opakované použití klienta telemetrie

Poznámka:

Doporučujeme vytvořit instanci jednou a opakovaně ji používat po celou dobu životnosti TelemetryClient aplikace.

Pomocí injektáže závislostí (DI) v .NET, příslušné sadě .NET SDK a správné konfiguraci Application Insights pro DI můžete vyžadovat jako parametr konstruktoru TelemetryClient .

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

V předchozím příkladu se TelemetryClient vloží do ExampleController třídy.

Webové formuláře

U webových formulářů bude modul HTTP moct shromažďovat výjimky, pokud nejsou nakonfigurované CustomErrorsžádné přesměrování . Pokud ale máte aktivní přesměrování, přidejte do Application_Error funkce v 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 _telemetryClient je proměnná TelemetryClienttypu s oborem třídy .

MVC

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

Existuje několik scénářů, kdy filtr výjimek nemůže správně zpracovat chyby při vyvolání výjimek:

  • 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
  • Úkoly na pozadí

Všechny výjimky zpracovávané aplikací je stále potřeba sledovat ručně. Neošetřené výjimky pocházející z kontrolerů obvykle vedou k odpovědi 500 Vnitřní chyba serveru. Pokud je taková odpověď ručně vytvořena v důsledku zpracovávané výjimky nebo vůbec žádné výjimky, sleduje se v odpovídající telemetrii požadavku s ResultCode 500. Sada Application Insights SDK ale nemůže sledovat odpovídající výjimku.

Podpora předchozích verzí

Pokud používáte MVC 4 (a starší) sady Application Insights Web SDK 2.5 (a předchozí), projděte si následující příklady pro sledování výjimek.

Pokud je Offkonfigurace CustomErrors , budou výjimky k dispozici pro modul HTTP ke shromažďování. Pokud je RemoteOnly ale (výchozí) nebo On, výjimka se vymaže a nebude dostupná pro Application Insights, aby ji automaticky shromažďovala. Toto chování můžete opravit přepsáním třídy System.Web.Mvc.HandleErrorAttribute a použitím přepsáné třídy, jak je znázorněno pro různé verze MVC zde (viz zdroj GitHubu):

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

Nahraďte atribut HandleError novým atributem v řadičích:

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

Ukázka

MVC 3

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

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

Ukázka

MVC 4, MVC 5

Registrace AiHandleErrorAttribute jako globálního filtru v 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 Insights Web SDK verze 2.6 (beta 3 a novější), Application Insights shromažďuje neošetřené výjimky vyvolané metodami kontroleru automaticky pro webové rozhraní API 2 nebo novější. 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 dvojitému sledování výjimek.

Existuje několik případů, kdy filtry výjimek nemůžou 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
  • Při spuštění aplikace došlo k výjimce.
  • Výjimky vyvolané úlohami na pozadí

Všechny výjimky zpracovávané aplikací je stále potřeba sledovat ručně. Neošetřené výjimky pocházející z kontrolerů obvykle vedou k odpovědi 500 Vnitřní chyba serveru. Pokud je taková odpověď ručně vytvořena v důsledku zpracovávané výjimky nebo vůbec žádné výjimky, sleduje se v odpovídající telemetrii požadavku s ResultCode 500. Sada Application Insights SDK ale nemůže sledovat odpovídající výjimku.

Podpora předchozích verzí

Pokud používáte webové rozhraní API 1 (a starší) sady Application Insights Web SDK 2.5 (a starší), projděte si následující příklady sledování výjimek.

Webové rozhraní API 1.x

Přepsání 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);
    }
    }
}

Tento přepsaný atribut můžete přidat do konkrétních kontrolerů nebo ho přidat do konfigurace globálního WebApiConfig filtru ve 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 fragment kódu 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 alternativy můžete:

  • Nahraďte jedinou ExceptionHandler instanci vlastní implementací IExceptionHandler. Tato obslužná rutina výjimky je volána pouze v případě, že architektura stále dokáže zvolit, která zpráva odpovědi se má odeslat, a ne při přerušení připojení, například.
  • Použijte filtry výjimek, jak je popsáno v předchozí části kontrolerů webového rozhraní API 1.x, které nejsou volány ve všech případech.

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 svůj server nainstalovali agenta Application Insights pro Azure Monitor, můžete získat graf míry výjimek měřených rozhraním .NET. Zahrnuté jsou i nezpracované výjimky .NET.

Otevřete kartu Průzkumníka metrik a přidejte nový graf. V části Čítače výkonu vyberte Rychlost výjimek.

Rozhraní .NET Framework vypočítá rychlost počítá počet výjimek v intervalu a vydělí délkou intervalu.

Tento počet se liší od počtu výjimek počítaných sestavami portálu TrackException Application Insights. Intervaly vzorkování se liší a sada SDK neodesílá TrackException sestavy pro všechny zpracovávané a neošetřené výjimky.

Další kroky