Uitzonderingen in web-apps diagnosticeren met Application Insights

Uitzonderingen in webtoepassingen kunnen worden gerapporteerd met Application Insights. U kunt mislukte aanvragen correleren met uitzonderingen en andere gebeurtenissen op zowel de client als de server, zodat u snel de oorzaken kunt diagnosticeren. In dit artikel leert u hoe u uitzonderingsrapportage in kunt stellen, expliciet uitzonderingen kunt rapporteren, fouten kunt diagnosticeren en meer.

Uitzonderingsrapportage instellen

U kunt Toepassingsbeheer instellen Insights om uitzonderingen te rapporteren die optreden op de server of op de client. Afhankelijk van het platform dat u gebruikt, hebt u de juiste extensie of SDK nodig.

Serverzijde

Houd rekening met de volgende scenario's als er uitzonderingen worden gerapporteerd vanuit uw toepassing aan de serverzijde:

Clientzijde

De JavaScript SDK biedt de mogelijkheid om aan de clientzijde te rapporteren over uitzonderingen die in webbrowsers optreden. Zie Application Insights voor webpagina's voor het instellen van uitzonderingsrapportage op de client.

Toepassingskaders

Bij sommige toepassings frameworks is er iets meer configuratie vereist. Houd rekening met de volgende technologieën:

Belangrijk

Dit artikel is specifiek gericht op het .NET Framework apps vanuit het perspectief van codevoorbeelden. Sommige methoden die voor uw .NET Framework zijn verouderd in de .NET Core SDK. Zie voor meer informatie .NET Core SDK bij het bouwen van apps met .NET Core.

Uitzonderingen diagnosticeren met Visual Studio

Open de app-oplossing in Visual Studio. Voer de app uit op uw server of op uw ontwikkelmachine met behulp van F5. Maak de uitzondering opnieuw.

Open het venster Application Insights Search telemetry in Visual Studio. Selecteer tijdens het debuggen de vervolgkeuze Insights Application Insights.

Klik met de rechtermuisknop op het project en kies Insights, Openen.

Selecteer een uitzonderingsrapport om de stack-trace weer te geven. Als u het relevante codebestand wilt openen, selecteert u een regelverwijzing in de stack-trace.

Als CodeLens is ingeschakeld, ziet u gegevens over de uitzonderingen:

CodeLens-melding van uitzonderingen.

Fouten diagnosticeren met behulp van Azure Portal

Application Insights wordt geleverd met een gecureerde APM-ervaring (Application Performance Management) om u te helpen bij het diagnosticeren van fouten in uw bewaakte toepassingen. Selecteer om te beginnen de optie Fouten in het resourcemenu Insights toepassingsresource in de sectie Onderzoeken. U ziet de trends in het aantal fouten voor uw aanvragen, het aantal mislukte aanvragen en het aantal gebruikers dat wordt beïnvloed. Als algemene weergave ziet u enkele van de nuttigste distributies die specifiek zijn voor de geselecteerde mislukte bewerking, waaronder de drie belangrijkste responscodes, de drie meest voorkomende uitzonderingstypen en de drie meest mislukte afhankelijkheidstypen.

Uitvalweergave fouten (tabblad Bewerkingen)

Als u representatieve voorbeelden wilt bekijken voor elk van deze subsets van bewerkingen, selecteert u de bijbehorende koppeling. Als u bijvoorbeeld uitzonderingen wilt diagnosticeren, kunt u het aantal van een bepaalde uitzondering selecteren op het tabblad End-to-end-transactiedetails:

Tabblad End-to-end-transactiedetails

In plaats van te kijken naar uitzonderingen van een specifieke mislukte bewerking, kunt u ook beginnen vanuit de algemene weergave van uitzonderingen door over te schakelen naar het tabblad Uitzonderingen bovenaan. Hier ziet u alle uitzonderingen die zijn verzameld voor uw bewaakte app.

Aangepaste tracering en logboekgegevens

Als u diagnostische gegevens wilt ontvangen die specifiek zijn voor uw app, kunt u code invoegen om uw eigen telemetriegegevens te verzenden. Uw aangepaste telemetrie- of logboekgegevens worden weergegeven in diagnostische zoekopdrachten naast de aanvraag, paginaweergave en andere automatisch verzamelde gegevens.

Met behulp Microsoft.VisualStudio.ApplicationInsights.TelemetryClient van de hebt u verschillende API's beschikbaar:

Als u deze gebeurtenissen wilt bekijken, opent u Zoeken in het menu links, selecteert u de vervolgkeuzelijst Gebeurtenistypen en kiest u vervolgens Aangepaste gebeurtenis, Trace of Uitzondering.

Analyseren

Notitie

Als uw app veel telemetriegegevens genereert, beperkt de adaptieve steekproefmodule automatisch het volume dat naar de portal wordt verzonden door alleen een representatieve fractie van de gebeurtenissen te sturen. Gebeurtenissen die deel uitmaken van dezelfde bewerking, worden geselecteerd of gedeselected als een groep, zodat u tussen gerelateerde gebeurtenissen kunt navigeren. Zie Sampling in Application Insights voor meer Insights.

Post-aanvraaggegevens bekijken

Aanvraagdetails bevatten niet de gegevens die naar uw app worden verzonden in een POST-aanroep. Als u deze gegevens wilt gerapporteerd:

  • Installeer de SDK in uw toepassingsproject.
  • Voeg code in uw toepassing in om Microsoft.ApplicationInsights.TrackTrace() aan te roepen. Verzend de POST-gegevens in de berichtparameter. Er is een limiet voor de toegestane grootte, dus u moet proberen alleen de essentiële gegevens te verzenden.
  • Wanneer u een mislukte aanvraag onderzoekt, gaat u naar de bijbehorende traceringen.

In eerste instantie ziet u in de portal niet alle uitzonderingen die fouten in uw app veroorzaken. U ziet browser-uitzonderingen (als u de JavaScript SDK op uw webpagina's gebruikt). Maar de meeste server-uitzonderingen worden door IIS afgeslagen en u moet een beetje code schrijven om ze te zien.

U kunt:

  • Registreer expliciet uitzonderingen door code in uitzonderings-handlers in te voegen om de uitzonderingen te rapporteren.
  • Leg uitzonderingen automatisch vast door uw ASP.NET te configureren. De benodigde toevoegingen zijn verschillend voor verschillende typen frameworks.

Expliciete rapportage-uitzonderingen

De eenvoudigste manier is om een aanroep van in een trackException() uitzonderings-handler in te voegen.

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

De parameters voor eigenschappen en metingen zijn optioneel, maar zijn handig voor het filteren en toevoegen van extra informatie. Als u bijvoorbeeld een app hebt waarmee verschillende games kunnen worden uitgevoerd, kunt u alle uitzonderingsrapporten vinden die betrekking hebben op een bepaald spel. U kunt aan elke woordenlijst zoveel items toevoegen als u wilt.

Browseruitzonderingen

De meeste browser-uitzonderingen worden gerapporteerd.

Als uw webpagina scriptbestanden van netwerken voor contentlevering of andere domeinen bevat, moet u ervoor zorgen dat uw scripttag het kenmerk heeft en dat de crossorigin="anonymous" server CORS-headers verzendt. Hiermee kunt u een stack-trace en details voor onverhandelde JavaScript-uitzonderingen van deze resources krijgen.

Uw telemetrieclient opnieuw gebruiken

Notitie

Het TelemetryClient wordt aanbevolen om één keer te instantieren en gedurende de levensduur van een toepassing opnieuw te gebruiken.

Met afhankelijkheidsinjectie (DI) in .NET,de juiste .NET SDK en het correct configureren van Application Insights voor afhankelijkheidsinjectie, kunt u de als TelemetryClient constructorparameter vereisen.

public class ExampleController : ApiController
{
    private readonly TelemetryClient _telemetryClient;

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

In het voorgaande voorbeeld wordt de TelemetryClient geïnjecteerd in de klasse ExampleController .

Webformulieren

Voor webformulieren kan de HTTP-module de uitzonderingen verzamelen wanneer er geen omleidingen zijn geconfigureerd met CustomErrors . Wanneer u echter actieve omleidingen hebt, voegt u de volgende regels toe aan de Application_Error functie in Global.asax.cs.

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

In het voorgaande voorbeeld is de _telemetryClient een variabele met klassebereik van het type TelemetryClient .

MVC

Vanaf Application Insights Web SDK versie 2.6 (bèta3 en hoger) verzamelt Application Insights automatisch onverwerkte uitzonderingen die zijn opgeslagen in de MVC 5+-controllers. Als u eerder een aangepaste handler hebt toegevoegd om dergelijke uitzonderingen bij te houden, kunt u deze verwijderen om dubbele tracering van uitzonderingen te voorkomen.

Er zijn een aantal scenario's waarin een uitzonderingsfilter fouten niet correct kan verwerken wanneer er uitzonderingen worden opgeworpen:

  • Van controller-constructors.
  • Vanuit bericht-handlers.
  • Tijdens de routering.
  • Tijdens serialisatie van antwoordinhoud.
  • Tijdens het starten van de toepassing.
  • In achtergrondtaken.

Alle uitzonderingen die door de toepassing worden verwerkt, moeten nog steeds handmatig worden bij te houden. Onverwerkersde uitzonderingen die afkomstig zijn van controllers resulteren doorgaans in 500 interne serverfout. Als een dergelijke reactie handmatig wordt samengesteld als gevolg van een verwerkte uitzondering (of helemaal geen uitzondering), wordt deze bij de bijbehorende aanvraag-telemetrie bij te houden met ResultCode 500, maar application Insights SDK kan de bijbehorende uitzondering niet bijhouden.

Ondersteuning voor eerdere versies

Als u MVC 4 (en eerder) van Application Insights Web SDK 2.5 (en eerder) gebruikt, raadpleegt u de volgende voorbeelden om uitzonderingen bij te houden.

Als de customErrors-configuratie Off is, zijn er uitzonderingen beschikbaar voor de HTTP-module om te verzamelen. Als dit echter (standaard) of is, wordt de uitzondering geweed en is deze niet beschikbaar voor RemoteOnly application Insights automatisch kan worden On verzameld. U kunt dit oplossen door de klasse System.Web.Mvc.HandleErrorAttributete overschrijven en de overschreven klasse toe te passen zoals weergegeven voor de verschillende MVC-versies hieronder (GitHub bron):

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

Vervang het kenmerk HandleError door uw nieuwe kenmerk in uw controllers.

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

Voorbeeld

MVC 3

Registreer AiHandleErrorAttribute u als een globaal filter in Global.asax.cs:

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

Voorbeeld

MVC 4, MVC5

Registreer AiHandleErrorAttribute u als een globaal filter in FilterConfig.cs:

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

Voorbeeld

Web-API

Vanaf Application Insights Web SDK versie 2.6 (bèta3 en hoger) verzamelt Application Insights automatisch onverhandelde uitzonderingen die in de controllermethoden zijn opgeslagen voor WebAPI 2+. Als u eerder een aangepaste handler hebt toegevoegd om dergelijke uitzonderingen bij te houden (zoals beschreven in de volgende voorbeelden), kunt u deze verwijderen om dubbele tracering van uitzonderingen te voorkomen.

Er zijn een aantal gevallen dat de uitzonderingsfilters niet kunnen verwerken. Bijvoorbeeld:

  • Uitzonderingen die zijn opgetreden in controller-constructors.
  • Uitzonderingen die zijn opgetreden in berichtenhandlers.
  • Uitzonderingen die zijn opgetreden tijdens routering.
  • Uitzonde ringen die zijn opgetreden tijdens de serialisatie van de gegevens.
  • Uitzondering die zijn opgetreden tijdens het opstarten van de toepassing.
  • Uitzondering die zijn opgetreden in achtergrondtaken.

Alle uitzonderingen die door de toepassing worden verwerkt, moeten nog steeds handmatig worden bij te houden. Onverwerkersde uitzonderingen die afkomstig zijn van controllers resulteren doorgaans in 500 interne serverfout. Als een dergelijk antwoord handmatig wordt samengesteld als gevolg van een verwerkte uitzondering (of helemaal geen uitzondering), wordt het bij te houden in een bijbehorende aanvraag-telemetrie met ResultCode 500, maar application Insights SDK kan de bijbehorende uitzondering niet bijhouden.

Ondersteuning voor eerdere versies

Als u WebAPI 1 (en eerder) van Application Insights Web SDK 2.5 (en eerder) gebruikt, raadpleegt u de volgende voorbeelden om uitzonderingen bij te houden.

Web-API 1.x

System.Web.Http.Filters.ExceptionFilterAttributeOverschrijven:

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

U kunt dit overschrijven kenmerk toevoegen aan specifieke controllers of toevoegen aan de globale filterconfiguratie in de WebApiConfig klasse :

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

Voorbeeld

Web-API 2.x

Voeg een implementatie van IExceptionLogger toe:

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

Voeg deze toe aan de services in 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());
        }
    }
}

Voorbeeld

Als alternatief kunt u het volgende doen:

  1. Vervang de enige ExceptionHandler door een aangepaste implementatie van IExceptionHandler. Dit wordt alleen aangeroepen wanneer het framework nog steeds kan kiezen welk antwoordbericht moet worden verzenden (niet wanneer de verbinding bijvoorbeeld wordt afgebroken)
  2. Uitzonderingsfilters (zoals beschreven in de sectie over web-API 1.x-controllers hierboven) - niet in alle gevallen aangeroepen.

WCF

Voeg een klasse toe die Attribute uitbreidt en IErrorHandler en IServiceBehavior implementeert.

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

Voeg het kenmerk toe aan de service-implementaties:

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

Voorbeeld

Prestatiemeters voor uitzonderingen

Als u de Azure Monitor Application Insights Agent op uw server hebt geïnstalleerd, kunt u een grafiek van de uitzonderingenfrequentie krijgen, gemeten door .NET. Dit omvat zowel verwerkte als niet-verwerkte .NET-uitzonderingen.

Open een tabblad Metric Explorer, voeg een nieuwe grafiek toe en selecteer Uitzonderingsfrequentie, vermeld onder Prestatiemeters.

Het .NET Framework berekent de snelheid door het aantal uitzonderingen in een interval te tellen en te delen door de lengte van het interval.

Dit wijrekent af van het aantal uitzonderingen dat wordt berekend door de Application Insights portal die TrackException-rapporten telt. De steekproefintervallen zijn verschillend en de SDK verzendt geen TrackException-rapporten voor alle verwerkte en onverhandelde uitzonderingen.

Volgende stappen