Kivételek diagnosztizálása webalkalmazásokban az Alkalmazás Elemzések
Feljegyzés
Az alábbi dokumentáció az Alkalmazás Elemzések klasszikus API-ra támaszkodik. Az Alkalmazás Elemzések hosszú távú terve az Adatok gyűjtése Az OpenTelemetria használatával. További információ: Az Azure Monitor OpenTelemetria engedélyezése .NET-, Node.js-, Python- és Java-alkalmazásokhoz.
A webalkalmazások kivételei az Alkalmazás Elemzések is jelenthetik. 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 alkalmazás Elemzések 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 Elemzések-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 Alkalmazás Elemzések SDK-t az alkalmazáskódba, futtassa az Application Elemzések 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. Az ügyfél kivételjelentésének beállításához tekintse meg a weblapok alkalmazás Elemzések című témakört.
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 Elemzések Search telemetriai ablakát a Visual Studióban. Hibakeresés közben válassza az Alkalmazás Elemzések legördülő listában.
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 alkalmazás Elemzések 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 Alkalmazás Elemzések erőforrás menüjében válassza a Hibák lehetőséget a Vizsgálat csoportban.
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.TrackExceptionkivételadatokat küld, például veremköveteket az Alkalmazás Elemzések.
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 alkalmazás Elemzések.
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.Application meghívásához Elemzések. TrackTrace(). 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 alkalmazás Elemzések a DI-hez való helyes konfigurálásával konstruktorparaméterként megkövetelhetiTelemetryClient.
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 Elemzések Web SDK 2.6-os verziójától kezdve (3. bétaverzió és újabb verziók) az Alkalmazás Elemzések 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 alkalmazás Elemzések SDK azonban nem tudja nyomon követni a megfelelő kivételt.
Korábbi verziók támogatása
Ha az Application Elemzések Web SDK 2.5 (és korábbi) MVC 4 (és korábbi) verziójával 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 alkalmazás Elemzések automatikus gyűjtéséhez. 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 Elemzések Web SDK 2.6-os verziójától kezdve (3. bétaverzió és újabb verziók) az Alkalmazás Elemzések a Web API 2+ esetében 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 alkalmazás Elemzések SDK azonban nem tudja nyomon követni a megfelelő kivételt.
Korábbi verziók támogatása
Ha az Application Elemzések 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-alkalmazás Elemzések-ügynököt a kiszolgálóra, 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 alkalmazás Elemzések portál TrackException
által kiszámított kivételek számától. 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.
Következő lépések
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: