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:
- Přidejte rozšíření Application Insights pro webové aplikace Azure.
- Přidejte rozšíření monitorování aplikací pro virtuální počítače Azure a aplikace hostované službou IIS služby Azure Virtual Machine Scale Sets.
- Nainstalujte sadu Application Insights SDK do kódu aplikace, spusťte agenta Application Insights pro webové servery SLUŽBY IIS nebo povolte agenta Java pro webové aplikace v Javě.
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:
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í.
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.
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.
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 Off
konfigurace 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
}
}
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());
}
}
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());
}
}
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());
}
}
}
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());
}
}
}
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
}
}
Čí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.