Diagnosticare eccezioni nelle app Web con Application InsightsDiagnose exceptions in your web apps with Application Insights

Le eccezioni nell'applicazione Web attiva vengono segnalate da Application Insights.Exceptions in your live web app are reported by Application Insights. È possibile correlare le richieste non riuscite con le eccezioni e altri eventi nel client e nel server, in modo da poter diagnosticare rapidamente le cause.You can correlate failed requests with exceptions and other events at both the client and server, so that you can quickly diagnose the causes.

Configurare la creazione di report sulle eccezioniSet up exception reporting

Diagnosticare le eccezioni con Visual StudioDiagnosing exceptions using Visual Studio

Aprire la soluzione dell'app in Visual Studio per facilitare il debug.Open the app solution in Visual Studio to help with debugging.

Eseguire l'app nel server o nel computer di sviluppo usando F5.Run the app, either on your server or on your development machine by using F5.

Aprire la finestra di ricerca di Application Insights in Visual Studio e impostare la visualizzazione degli eventi dall'app.Open the Application Insights Search window in Visual Studio, and set it to display events from your app. A questo scopo, durante il debug è sufficiente fare clic sul pulsante Application Insights.While you're debugging, you can do this just by clicking the Application Insights button.

Fare clic con il pulsante destro del mouse sul progetto e scegliere Application Insights, Apri.

Si noti che è possibile filtrare il report per visualizzare solo le eccezioni.Notice that you can filter the report to show just exceptions.

Se non vengono visualizzate eccezioni, vedere la sezione Acquisizione delle eccezioni.No exceptions showing? See Capture exceptions.

Fare clic su un report di eccezione per visualizzarne l'analisi dello stack.Click an exception report to show its stack trace. Fare clic su un riferimento di riga nell'analisi dello stack per aprire il relativo file.Click a line reference in the stack trace, to open the relevant code file.

Nel codice, si noti che CodeLens mostra i dati relativi alle eccezioni:In the code, notice that CodeLens shows data about the exceptions:

Notifica CodeLens di eccezioni.

Diagnosi degli errori con il portale di AzureDiagnosing failures using the Azure portal

Application Insights viene fornito con un'esperienza APM (Application Performance Monitoring) dedicata per semplificare la diagnosi degli errori nelle applicazioni monitorate.Application Insights comes with a curated APM experience to help you diagnose failures in your monitored applications. Per iniziare, scegliere l'opzione Failures (Errori) dal menu delle risorse di Application Insights, che si trova nella sezione Investigate (Analisi dei problemi).To start, click on the Failures option in the Application Insights resource menu located in the Investigate section. Apparirà una visualizzazione a schermo intero che mostra le tendenze in termini di frequenza degli errori per le richieste, indicando quante non sono riuscite e quanti sono gli utenti interessati.You should see a full-screen view that shows you the failure rate trends for your requests, how many of them are failing, and how many users are impacted. A destra verranno visualizzate alcune delle distribuzioni più utili specifiche dell'operazione non riuscita selezionata, tra cui i primi tre codici di risposta, i primi tre tipi di eccezione e i primi tre tipi di dipendenza non riusciti.On the right you'll see some of the most useful distributions specific to the selected failing operation, including top 3 response codes, top 3 exception types, and top 3 failing depedency types.

Visualizzazione di valutazione degli errori (scheda delle operazioni)

Con un solo clic è quindi possibile esaminare i campioni rappresentativi per ognuno di questi subset di operazioni.In a single click you can then review representative samples for each of these subsets of operations. In particolare, per diagnosticare le eccezioni, è possibile fare clic sul conteggio di un'eccezione specifica per visualizzarne le informazioni in un pannello dei dettagli dell'eccezione come questo:In particular, to diagnose exceptions, you can click on the count of a particular exception to be presented with an Exceptions details blade, such as this one:

Pannello dei dettagli dell'eccezione

In alternativa, invece di esaminare le eccezioni di un'operazione non riuscita specifica, è possibile iniziare dalla visualizzazione complessiva delle eccezioni, passando alla scheda Exceptions (Eccezioni):Alternatively, instead of looking at exceptions of a specific failing operation, you can start from the overall view of exceptions, by switching to the Exceptions tab:

Visualizzazione di valutazione degli errori (scheda delle eccezioni)

Qui è possibile visualizzare tutte le eccezioni raccolte per l'app monitorata.Here you can see all the exceptions collected for your monitored app.

Se non vengono visualizzate eccezioni, vedere la sezione Acquisizione delle eccezioni.No exceptions showing? See Capture exceptions.

Dati di traccia e di log personalizzatiCustom tracing and log data

Per ottenere dati di diagnostica specifici per l'app, è possibile inserire codice per l'invio di dati di telemetria personalizzati.To get diagnostic data specific to your app, you can insert code to send your own telemetry data. Questi dati vengono visualizzati nella ricerca diagnostica insieme alla richiesta, alla visualizzazione di pagina e ad altri dati raccolti automaticamente.This displayed in diagnostic search alongside the request, page view and other automatically-collected data.

Sono disponibili diverse opzioni:You have several options:

  • TrackEvent() viene usato in genere per il monitoraggio dei modelli di utilizzo, ma i dati inviati vengono visualizzati anche in Eventi personalizzati nella ricerca diagnostica.TrackEvent() is typically used for monitoring usage patterns, but the data it sends also appears under Custom Events in diagnostic search. Gli eventi sono denominati e possono includere proprietà di stringa e metriche numeriche, in base alle quali è possibile filtrare le ricerche diagnostiche.Events are named, and can carry string properties and numeric metrics on which you can filter your diagnostic searches.
  • TrackTrace() permette di inviare dati più lunghi, ad esempio informazioni POST.TrackTrace() lets you send longer data such as POST information.
  • TrackException() invia analisi dello stack.TrackException() sends stack traces. Altre informazioni sulle eccezioni.More about exceptions.
  • Se si usa già un framework di registrazione come Log4Net o NLog, è possibile acquisire tali log e visualizzarli nella ricerca diagnostica insieme ai dati relativi alle richieste e alle eccezioni.If you already use a logging framework like Log4Net or NLog, you can capture those logs and see them in diagnostic search alongside request and exception data.

Per visualizzare questi eventi, aprire Cerca, quindi Filtro e infine scegliere Evento personalizzato, Traccia o Eccezione.To see these events, open Search, open Filter, and then choose Custom Event, Trace, or Exception.

Eseguire il drill-through

Nota

Se l’app genera molti dati di telemetria, il modulo di campionamento adattivo riduce automaticamente il volume che viene inviato al portale inviando solo una frazione rappresentativa di eventi.If your app generates a lot of telemetry, the adaptive sampling module will automatically reduce the volume that is sent to the portal by sending only a representative fraction of events. Gli eventi che fanno parte della stessa operazione verranno selezionati o deselezionati come gruppo, per rendere possibile lo spostamento tra eventi correlati.Events that are part of the same operation will be selected or deselected as a group, so that you can navigate between related events. Informazioni sul campionamento.Learn about sampling.

Come visualizzare i dati POST di una richiestaHow to see request POST data

I dettagli della richiesta non includono i dati inviati all'app in una chiamata POST.Request details don't include the data sent to your app in a POST call. Per poter ottenere questi dati:To have this data reported:

  • Installare l'SDK nel progetto dell'applicazione.Install the SDK in your application project.
  • Inserire il codice nell'applicazione per chiamare Microsoft.ApplicationInsights.TrackTrace().Insert code in your application to call Microsoft.ApplicationInsights.TrackTrace(). Inviare i dati POST nel parametro del messaggio.Send the POST data in the message parameter. Esiste un limite per le dimensioni consentite, quindi è consigliabile provare a inviare solo i dati essenziali.There is a limit to the permitted size, so you should try to send just the essential data.
  • Quando si esamina una richiesta non riuscita, trovare le tracce associate.When you investigate a failed request, find the associated traces.

Eseguire il drill-through

Acquisizione delle eccezioni e dei relativi dati di diagnosticaCapturing exceptions and related diagnostic data

Inizialmente, nel portale non verranno visualizzate tutte le eccezioni che causano errori nell'app.At first, you won't see in the portal all the exceptions that cause failures in your app. Verranno visualizzate tutte le eccezioni del browser (se si usa JavaScript SDK nelle pagine Web).You'll see any browser exceptions (if you're using the JavaScript SDK in your web pages). La maggior parte delle eccezioni del server viene rilevata da IIS, ma è necessario scrivere qualche riga di codice per visualizzarle.But most server exceptions are caught by IIS and you have to write a bit of code to see them.

È possibile:You can:

  • Registrare le eccezioni in modo esplicito inserendo il codice nei gestori di eccezioni per segnalare le eccezioni.Log exceptions explicitly by inserting code in exception handlers to report the exceptions.
  • Acquisire automaticamente le eccezioni configurando il framework di ASP.NET.Capture exceptions automatically by configuring your ASP.NET framework. Gli elementi da aggiungere variano a seconda dei diversi tipi di framework.The necessary additions are different for different types of framework.

Segnalazione di eccezioni in modo esplicitoReporting exceptions explicitly

Il modo più semplice consiste nell'inserire una chiamata a TrackException() in un gestore di eccezioni.The simplest way is to insert a call to TrackException() in an exception handler.

JavaScriptJavaScript

try
{ ...
}
catch (ex)
{
  appInsights.trackException(ex, "handler loc",
    {Game: currentGame.Name,
     State: currentGame.State.ToString()});
}

C#C#

var telemetry = new TelemetryClient();
...
try
{ ...
}
catch (Exception ex)
{
   // Set up some properties:
   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);
}

VBVB

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

I parametri delle proprietà e delle misurazioni sono facoltativi, ma sono utili per filtrare e aggiungere altre informazioni.The properties and measurements parameters are optional, but are useful for filtering and adding extra information. Ad esempio, per un'app in grado di eseguire diversi giochi, è possibile trovare tutti i report di eccezione correlati a un gioco specifico.For example, if you have an app that can run several games, you could find all the exception reports related to a particular game. È possibile aggiungere qualsiasi numero di elementi a ogni dizionario.You can add as many items as you like to each dictionary.

Eccezioni del browserBrowser exceptions

Viene segnalata la maggior parte delle eccezioni del browser.Most browser exceptions are reported.

Se la pagina Web include file di script provenienti da reti per la distribuzione di contenuti o da altri domini, verificare che il tag dello script contenga l'attributo crossorigin="anonymous"e che il server invii intestazioni CORS.If your web page includes script files from content delivery networks or other domains, ensure your script tag has the attribute crossorigin="anonymous", and that the server sends CORS headers. Ciò consentirà di ottenere un'analisi dello stack e i dettagli per le eccezioni JavaScript non gestite da queste risorse.This will allow you to get a stack trace and detail for unhandled JavaScript exceptions from these resources.

Web FormWeb forms

Per Web Form, il modulo HTTP potrà raccogliere le eccezioni quando non sono configurati reindirizzamenti con CustomErrors.For web forms, the HTTP Module will be able to collect the exceptions when there are no redirects configured with CustomErrors.

Se però sono presenti reindirizzamenti attivi, aggiungere le righe seguenti alla funzione Application_Error in Global.asax.cs.But if you have active redirects, add the following lines to the Application_Error function in Global.asax.cs. Aggiungere un file Global.asax se non ne esiste già uno.(Add a Global.asax file if you don't already have one.)

C#C#

void Application_Error(object sender, EventArgs e)
{
  if (HttpContext.Current.IsCustomErrorEnabled && Server.GetLastError  () != null)
  {
     var ai = new TelemetryClient(); // or re-use an existing instance

     ai.TrackException(Server.GetLastError());
  }
}

MVCMVC

Se la configurazione di CustomErrors è Off, le eccezioni potranno essere raccolte dal modulo HTTP.If the CustomErrors configuration is Off, then exceptions will be available for the HTTP Module to collect. Se tuttavia è RemoteOnly (impostazione predefinita) o On, l'eccezione verrà cancellata e non potrà essere raccolta automaticamente da Application Insights.However, if it is RemoteOnly (default), or On, then the exception will be cleared and not available for Application Insights to automatically collect. È possibile risolvere questo problema eseguendo l'override della classe System.Web.Mvc.HandleErrorAttribute e applicando la classe di cui è stato eseguito l'override, come illustrato per le diverse versioni MVC riportate di seguito (origine github):You can fix that by overriding the System.Web.Mvc.HandleErrorAttribute class, and applying the overridden class as shown for the different MVC versions below (github source):

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 2MVC 2

Sostituire l'attributo HandleError con il nuovo attributo nei controller.Replace the HandleError attribute with your new attribute in your controllers.

namespace MVC2App.Controllers
{
   [AiHandleError]
   public class HomeController : Controller
   {
...

EsempioSample

MVC 3MVC 3

Registrare AiHandleErrorAttribute come filtro globale in Global.asax.cs:Register AiHandleErrorAttribute as a global filter in Global.asax.cs:

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

EsempioSample

MVC 4, MVC5MVC 4, MVC5

Registrare AiHandleErrorAttribute come filtro globale in FilterConfig.cs:Register AiHandleErrorAttribute as a global 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());
  }
}

EsempioSample

API Web 1.xWeb API 1.x

Eseguire l'override di System.Web.Http.Filters.ExceptionFilterAttribute:Override 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);
    }
  }
}

Sarà possibile aggiungere questo attributo di cui è stato eseguito l'override ai controller specifici o alla configurazione del filtro globale nella classe WebApiConfig:You could add this overridden attribute to specific controllers, or add it to the global filter configuration in the WebApiConfig class:

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

EsempioSample

Alcuni casi non possono essere gestiti dai filtri eccezioni.There are a number of cases that the exception filters cannot handle. ad esempio:For example:

  • Eccezioni generate dai costruttori dei controller.Exceptions thrown from controller constructors.
  • Eccezioni generate dai gestori di messaggi.Exceptions thrown from message handlers.
  • Eccezioni generate durante il routing.Exceptions thrown during routing.
  • Eccezioni generate durante la serializzazione del contenuto della risposta.Exceptions thrown during response content serialization.

API Web 2.xWeb API 2.x

Aggiungere un'implementazione di IExceptionLogger:Add an implementation of 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);
    }
  }
}

Aggiungere il codice seguente ai servizi in WebApiConfig:Add this to the 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());
    }
  }

}}

EsempioSample

In alternativa, è possibile:As alternatives, you could:

  1. Sostituire ExceptionHandler con un'implementazione personalizzata di IExceptionHandler.Replace the only ExceptionHandler with a custom implementation of IExceptionHandler. Questo elemento viene chiamato solo quando il framework può ancora scegliere il messaggio di risposta da inviare, non quando la connessione viene interrotta.This is only called when the framework is still able to choose which response message to send (not when the connection is aborted for instance)
  2. Come descritto nella sezione relativa ai controller Web API 1.x precedente, i filtri eccezioni non vengono chiamati in tutti i casi.Exception Filters (as described in the section on Web API 1.x controllers above) - not called in all cases.

WCFWCF

Aggiungere una classe che estenda Attribute e implementi IErrorHandler e IServiceBehavior.Add a class that extends Attribute and implements IErrorHandler and 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)
    {
    }
  }
}

Aggiungere l'attributo alle implementazioni del servizio:Add the attribute to the service implementations:

namespace WcfService4
{
    [AiLogException]
    public class Service1 : IService1
    {
     ...

EsempioSample

Contatori delle prestazioni delle eccezioniException performance counters

L'installazione dell'Agente di Application Insights nel server permette di ottenere un grafico della frequenza delle eccezioni, misurata da .NET.If you have installed the Application Insights Agent on your server, you can get a chart of the exceptions rate, measured by .NET. Il grafico include le eccezioni .NET gestite e non gestite.This includes both handled and unhandled .NET exceptions.

Aprire un pannello Esplora metrica, aggiungere un nuovo grafico e selezionare Frequenza eccezione, elencata sotto a Contatori delle prestazioni.Open a Metric Explorer blade, add a new chart, and select Exception rate, listed under Performance Counters.

.NET framework calcola la frequenza contando il numero delle eccezioni in un intervallo e dividendolo per la lunghezza dell'intervallo.The .NET framework calculates the rate by counting the number of exceptions in an interval and dividing by the length of the interval.

Questo conteggio è diverso dal conteggio delle eccezioni calcolato dal portale di Application Insights, che conteggia i report TrackException.This is different from the 'Exceptions' count calculated by the Application Insights portal counting TrackException reports. Gli intervalli di campionamento sono diversi e il SDK non invia report di TrackException per tutte le eccezioni gestite e non gestite.The sampling intervals are different, and the SDK doesn't send TrackException reports for all handled and unhandled exceptions.

VideoVideo

Passaggi successiviNext steps