Kivételek diagnosztizálása webalkalmazásokban az Application Insights használatával
Figyelemfelhívás
Javasoljuk az Azure Monitor OpenTelemetry Distro használatát az új alkalmazások vagy ügyfelek számára az Azure Monitor Application Insights használatához. Az Azure Monitor OpenTelemetry Distro az Application Insights SDK-hoz hasonló funkciókat és élményt nyújt. Az Application Insights SDK-ból a .NET, a Node.js és a Python áttelepítési útmutatóival migrálható, de még dolgozunk néhány további funkció hozzáadásán a visszamenőleges kompatibilitás érdekében.
A webalkalmazások kivételei az Application Insights használatával jelenthetők. A sikertelen kéréseket a kivételekkel és az egyéb eseményekkel korrelálhatja az ügyfélen és a kiszolgálón, így gyorsan diagnosztizálhatja az okokat. Ebből a cikkből megtudhatja, hogyan állíthat be kivételjelentéseket, hogyan jelentheti ki explicit módon a kivételeket, diagnosztizálhatja a hibákat és egyebeket.
Kivételjelentés beállítása
Beállíthatja az Application Insightst a kiszolgálón vagy az ügyfélen előforduló kivételek jelentésére. Attól függően, hogy az alkalmazás melyik platformtól függ, szüksége lesz a megfelelő bővítményre vagy SDK-ra.
Kiszolgálóoldal
Ha a kiszolgálóoldali alkalmazás kivételeit szeretné jelenteni, vegye figyelembe a következő forgatókönyveket:
- Adja hozzá az Azure-webalkalmazásokhoz készült Application Insights-bővítményt .
- Adja hozzá az Azure Virtual Machines és az Azure Virtual Machine Scale Sets IIS által üzemeltetett alkalmazások alkalmazásmonitorozási bővítményét .
- Telepítse az Application Insights SDK-t az alkalmazás kódjába, futtassa az Application Insights Agent for IIS-webkiszolgálókat, vagy engedélyezze a Java-webalkalmazásokhoz készült Java-ügynököt .
Ügyféloldal
A JavaScript SDK lehetővé teszi a webböngészőkben előforduló kivételek ügyféloldali jelentéskészítését. A kivételjelentések ügyfélen való beállításához tekintse meg az Application Insights weblapokhoz készült jelentéseit.
Alkalmazás-keretrendszerek
Egyes alkalmazás-keretrendszerek esetén további konfigurációra van szükség. Vegye figyelembe a következő technológiákat:
Fontos
Ez a cikk kifejezetten a példakódok szempontjából .NET-keretrendszer alkalmazásokat ismerteti. A .NET Core SDK-ban a .NET-keretrendszer működő módszerek némelyike elavult. További információkért tekintse meg a .NET Core SDK dokumentációját , amikor alkalmazásokat készít a .NET Core használatával.
Kivételek diagnosztizálása a Visual Studióval
Nyissa meg az alkalmazásmegoldást a Visual Studióban. Futtassa az alkalmazást a kiszolgálón vagy a fejlesztőgépen az F5 használatával. Hozza létre újra a kivételt.
Nyissa meg az Application Insights Search telemetriai ablakát a Visual Studióban. A hibakeresés során válassza az Application Insights legördülő menüt.
Válasszon ki egy kivételjelentést a verem nyomkövetésének megjelenítéséhez. A megfelelő kódfájl megnyitásához válasszon egy sorhivatkozást a verem nyomkövetésében.
Ha a CodeLens engedélyezve van, a kivételek adatait fogja látni:
Hibák diagnosztizálása az Azure Portal használatával
Az Application Insights egy válogatott alkalmazásteljesítmény-kezelési felülettel rendelkezik, amely segít diagnosztizálni a megfigyelt alkalmazások hibáit. A kezdéshez a bal oldali Application Insights-erőforrásmenü Vizsgálat területén válassza a Hibák lehetőséget.
Látni fogja a kérések sikertelenségi arányának trendjeit, hogy hány sikertelen, és hány felhasználót érint. Az Általános nézet a kiválasztott sikertelen műveletre jellemző legkedveltebb disztribúciókat jeleníti meg. Az első három válaszkód, az első három kivételtípus és az első három sikertelen függőségtípus jelenik meg.
A műveletek egyes részhalmazainak reprezentatív mintáinak áttekintéséhez válassza a megfelelő hivatkozást. A kivételek diagnosztizálásához például kiválaszthatja, hogy hány kivétel jelenjen meg a teljes körű tranzakció részletei lapon.
Másik lehetőségként ahelyett, hogy egy adott sikertelen művelet kivételeit tekintené meg, a kivételek általános nézetéből kiindulva a felül található Kivételek lapra válthat. Itt láthatja a figyelt alkalmazáshoz összegyűjtött összes kivételt.
Egyéni nyomkövetési és naplóadatok
Az alkalmazásra vonatkozó diagnosztikai adatok lekéréséhez beszúrhat kódot a saját telemetriai adatok küldéséhez. Az egyéni telemetriai vagy naplóadatok a kérés, az oldalnézet és az egyéb automatikusan gyűjtött adatok mellett megjelennek a diagnosztikai keresésben.
Microsoft.VisualStudio.ApplicationInsights.TelemetryClientA használatával számos API érhető el:
- TelemetryClient.TrackEventáltalában a használati minták monitorozására használják, de az általa küldött adatok az egyéni események alatt is megjelennek a diagnosztikai keresésben. Az események elnevezése sztringtulajdonságokat és numerikus metrikákat tartalmazhat, amelyek alapján szűrheti a diagnosztikai kereséseket.
- TelemetryClient.TrackTrace lehetővé teszi hosszabb adatok, például POST-adatok küldését.
- TelemetryClient.TrackException kivételadatokat, például veremköveteket küld az Application Insightsnak.
Az események megtekintéséhez a bal oldali menüben nyissa meg a Keresés elemet. Válassza ki a legördülő menü eseménytípusait, majd válassza az Egyéni esemény, nyomkövetés vagy kivétel lehetőséget.
Feljegyzés
Ha az alkalmazás sok telemetriát hoz létre, az adaptív mintavételezési modul automatikusan csökkenti a portálra küldött kötetet úgy, hogy csak az események egy reprezentatív részét küldi el. Az ugyanahhoz a művelethez tartozó események csoportként lesznek kiválasztva vagy törölve, hogy navigálni lehessen a kapcsolódó események között. További információ: Mintavételezés az Application Insightsban.
Kérelem POST-adatainak megtekintése
A kérés részletei nem tartalmazzák az alkalmazásnak post-hívásban küldött adatokat. Az adatok jelentése:
- Telepítse az SDK-t az alkalmazásprojektben.
- Kód beszúrása az alkalmazásba a Microsoft.ApplicationInsights.TrackTrace() meghívásához. Küldje el a POST-adatokat az üzenetparaméterben. A megengedett méret korlátozott, ezért csak a lényeges adatokat kell elküldenie.
- Sikertelen kérés vizsgálatakor keresse meg a kapcsolódó nyomkövetéseket.
Kivételek és kapcsolódó diagnosztikai adatok rögzítése
Először nem fogja látni a portálon az összes olyan kivételt, amely hibákat okoz az alkalmazásban. Ha a JavaScript SDK-t használja a weblapokon, minden böngészőkivételt látni fog. A legtöbb kiszolgálói kivételt azonban az IIS elkapja, és meg kell írnia egy kis kódot, hogy láthassa őket.
A következőket teheti:
- A kivételeket explicit módon naplózza, ha kódot szúr be a kivételkezelőkbe a kivételek jelentéséhez.
- A kivételek automatikus rögzítése a ASP.NET-keretrendszer konfigurálásával. A szükséges kiegészítések különböző típusú keretrendszerekhez eltérőek.
Jelentéskivételek explicit módon
A jelentés legegyszerűbb módja, ha beszúr egy hívást trackException()
egy kivételkezelőbe.
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
A tulajdonságok és a mérési paraméterek nem kötelezőek, de hasznosak a szűréshez és a további információk hozzáadásához. Ha például van egy alkalmazás, amely több játékot is futtathat, megtalálhatja az adott játékhoz kapcsolódó kivételjelentéseket. Tetszőleges számú elemet adhat hozzá az egyes szótárakhoz.
Böngészőkivételek
A legtöbb böngésző-kivételt a rendszer jelenti.
Ha a weblap tartalomkézbesítési hálózatokból vagy más tartományokból származó szkriptfájlokat tartalmaz, győződjön meg arról, hogy a szkriptcímke rendelkezik az attribútummalcrossorigin="anonymous"
, és hogy a kiszolgáló CORS-fejléceket küld. Ez a viselkedés lehetővé teszi, hogy lekérje a verem nyomkövetését és részleteit az ilyen erőforrásokból származó nem kezelt JavaScript-kivételekhez.
A telemetriai ügyfél újbóli használata
Feljegyzés
Javasoljuk, hogy példányosítsd az TelemetryClient
egyszer, és használd újra az alkalmazás teljes élettartama alatt.
A függőséginjektálás (DI) a .NET-ben, a megfelelő .NET SDK-ban és az Application Insights di-hez való helyes konfigurálásával konstruktorparaméterként megkövetelhető TelemetryClient .
public class ExampleController : ApiController
{
private readonly TelemetryClient _telemetryClient;
public ExampleController(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
}
Az előző példában a TelemetryClient
beszúrt érték be lesz szúrva az ExampleController
osztályba.
Webes űrlapok
Webes űrlapok esetén a HTTP-modul összegyűjti a kivételeket, ha nincsenek konfigurálva CustomErrors
átirányítások. Ha azonban aktív átirányításokkal rendelkezik, adja hozzá a következő sorokat a függvényhez a Application_Error
Global.asax.cs.
void Application_Error(object sender, EventArgs e)
{
if (HttpContext.Current.IsCustomErrorEnabled &&
Server.GetLastError () != null)
{
_telemetryClient.TrackException(Server.GetLastError());
}
}
Az előző példában a _telemetryClient
típus osztályhatókörű változója TelemetryClient.
MVC
Az Application Insights Web SDK 2.6-os verziójától kezdve (3. bétaverzió és újabb verziók) az Application Insights automatikusan összegyűjti az MVC 5+ vezérlők metódusaiba beszedett kezeletlen kivételeket. Ha korábban hozzáadott egy egyéni kezelőt az ilyen kivételek nyomon követéséhez, eltávolíthatja, hogy megakadályozza a kivételek kettős nyomon követését.
Több olyan eset is van, amikor egy kivételszűrő nem tudja megfelelően kezelni a kivételekkel kapcsolatos hibákat:
- Vezérlőkonstruktorokból
- Üzenetkezelőktől
- Útválasztás során
- Választartalmak szerializálása során
- Az alkalmazás indításakor
- Háttérfeladatokban
Az alkalmazás által kezelt kivételeket továbbra is manuálisan kell nyomon követni. A vezérlőkből származó kezeletlen kivételek általában 500 "belső kiszolgálói hiba" választ eredményeznek. Ha az ilyen válasz manuálisan, egy kezelt kivétel eredményeként jön létre, vagy egyáltalán nincs kivétel, akkor a rendszer a megfelelő 500-as ResultCode
kérelemtelemetria alapján követi nyomon. Az Application Insights SDK azonban nem tudja nyomon követni a megfelelő kivételt.
Korábbi verziók támogatása
Ha az Application Insights Web SDK 2.5 -ös (és korábbi) MVC 4-et (és korábbit) használja, a kivételek nyomon követéséhez tekintse meg az alábbi példákat.
Ha a CustomErrors konfigurációja igenOff
, a HTTP-modul számára kivételeket lehet gyűjteni. Ha RemoteOnly
azonban ez (alapértelmezett) vagy On
, a kivétel törlődik, és nem érhető el az Application Insights számára az automatikus adatgyűjtéshez. Ezt a viselkedést a System.Web.Mvc.HandleErrorAttribute osztály felülbírálásával és a felülbírált osztály alkalmazásával javíthatja, ahogyan az itt látható különböző MVC-verziók esetében is látható (lásd a GitHub forrását):
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
Cserélje le a HandleError attribútumot az új attribútumra a vezérlőkben:
namespace MVC2App.Controllers
{
[AiHandleError]
public class HomeController : Controller
{
// Omitted for brevity
}
}
MVC 3
Regisztráljon AiHandleErrorAttribute
globális szűrőként a Global.asax.cs:
public class MyMvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AiHandleErrorAttribute());
}
}
MVC 4, MVC 5
Regisztráljon AiHandleErrorAttribute
globális szűrőként a FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// Default replaced with the override to track unhandled exceptions
filters.Add(new AiHandleErrorAttribute());
}
}
Webes API
Az Application Insights Web SDK 2.6-os verziójától kezdve (3. bétaverzió és újabb verziók) az Application Insights a Web API 2+-hoz automatikusan gyűjti a vezérlő metódusaiba beszedett kezeletlen kivételeket. Ha korábban hozzáadott egy egyéni kezelőt az ilyen kivételek nyomon követéséhez, az alábbi példákban leírtak szerint eltávolíthatja, hogy megakadályozza a kivételek kettős nyomon követését.
A kivételszűrők számos esetben nem kezelhetők. Példa:
- A vezérlőkonstruktorokban történt kivételek.
- Az üzenetkezelőkben történt kivételek.
- Az útválasztás során történt kivételek.
- A választartalmak szerializálása során történt kivételek.
- Az alkalmazás indításakor kidobott kivétel.
- A háttérfeladatokban történt kivételek.
Az alkalmazás által kezelt kivételeket továbbra is manuálisan kell nyomon követni. A vezérlőkből származó kezeletlen kivételek általában 500 "belső kiszolgálói hiba" választ eredményeznek. Ha egy ilyen válasz manuálisan, egy kezelt kivétel eredményeként jön létre, vagy egyáltalán nincs kivétel, akkor a rendszer egy 500-as ResultCode
megfelelő kérelemtelemetria alapján követi nyomon. Az Application Insights SDK azonban nem tudja nyomon követni a megfelelő kivételt.
Korábbi verziók támogatása
Ha az Application Insights Web SDK 2.5(és korábbi) 1. (és korábbi) Webes API-t használja, a kivételek nyomon követéséhez tekintse meg az alábbi példákat.
Webes API 1.x
Felülbírálás 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);
}
}
}
Ezt a felülírt attribútumot hozzáadhatja adott vezérlőkhöz, vagy felveheti az osztály globális szűrőkonfigurációjába 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());
}
}
}
Webes API 2.x
A következő implementáció IExceptionLogger
hozzáadása:
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);
}
}
}
Adja hozzá ezt a kódrészletet a következő szolgáltatásokhoz 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());
}
}
}
Alternatív megoldásként a következőkre van lehetősége:
- Cserélje le az egyetlen
ExceptionHandler
példányt egy egyéni implementációraIExceptionHandler
. Ezt a kivételkezelőt csak akkor hívja meg a rendszer, ha a keretrendszer továbbra is meg tudja választani, hogy melyik válaszüzenetet küldje el, például a kapcsolat megszakadásakor nem. - Használjon kivételszűrőket a Web API 1.x vezérlők előző szakaszában leírtak szerint, amelyeket nem minden esetben hívunk meg.
WCF
Adjon hozzá egy olyan osztályt, amely kiterjeszti Attribute
és megvalósítja IErrorHandler
a elemet.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)
{
}
}
}
Adja hozzá az attribútumot a szolgáltatás implementációihoz:
namespace WcfService4
{
[AiLogException]
public class Service1 : IService1
{
// Omitted for brevity
}
}
Kivételteljesítmény-számlálók
Ha telepítette az Azure Monitor Application Insights-ügynököt a kiszolgálón, lekérheti a .NET által mért kivételek arányának diagramját. Mind a kezelt, mind a kezeletlen .NET-kivételeket tartalmazza a rendszer.
Nyisson meg egy metrikakezelő lapot, és adjon hozzá egy új diagramot. A Teljesítményszámlálók területen válassza a Kivételi arány lehetőséget.
A .NET-keretrendszer úgy számítja ki a mértéket, hogy megszámolja a kivételek számát egy intervallumban, és elosztja az intervallum hosszával.
Ez a szám eltér az Application Insights portál által kiszámított kivételek számától, amely a jelentéseket számolja TrackException
. A mintavételezési időközök eltérőek, és az SDK nem küld TrackException
jelentéseket az összes kezelt és kezeletlen kivételről.