2016-03-10 15 views
9

Attualmente in Azure quando un WebJob genera un'eccezione, l'eccezione viene rilevata e gestita dallo JobHost (in qualche modo) e quindi registra l'eccezione nel dashboard disponibile tramite il blade del Web. App in cui è ospitato il webjob. C'è un modo per intercettare la gestione degli errori o sovrascriverli in modo da poter collegare l'istanza di Application Insights?Come intercettare un errore/eccezione di WebJob di Azure

+0

controllare questo? http://stackoverflow.com/questions/31798640/monitoring-azure-webjobs – Igorek

risposta

2

Dai un'occhiata ad alcuni documenti blu here. È possibile allegare un gestore per i movimentazione AppDomain eccezioni sconosciute (preso dal link qui sopra):

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

// ... 

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    ExceptionTelemetry excTelemetry = new ExceptionTelemetry((Exception)e.ExceptionObject); 
    excTelemetry.SeverityLevel = SeverityLevel.Critical; 
    excTelemetry.HandledAt = ExceptionHandledAt.Unhandled; 

    telemetryClient.TrackException(excTelemetry); 

    telemetryClient.Flush(); 
} 
+0

In realtà ho trovato qualcosa di simile nei documenti per Raygun. Il problema con questo approccio è che non posso garantire che le metriche o le proprietà extra che ho accumulato durante il processo vengano registrate a meno che non crei una gestione delle eccezioni molto caotica per ogni possibile istruzione di lancio. Se sto andando in questo tipo di logica, potrei anche solo strumentare i metodi di lavoro direttamente –

+0

hmmm ... Attualmente sto pensando a qualche dizionario per memorizzare coppie chiave/valore che possono essere immagazzinate in una proprietà globale che può essere usato per memorizzare le informazioni da trasmettere ad AI. –

+0

@AlexMarshall hai un contenitore DI nel tuo webjob? – Thomas

6

È possibile utilizzare il Azure WebJobs SDK Extensions: c'è un ErrorTrigger in modo che è possibile utilizzare per intercettare le eccezioni non gestite:

public class UnhandledErrorTrigger : IDisposable 
{ 
    private readonly TelemetryClient _telemetryClient; 

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

    public void UnHandledException([ErrorTrigger("0:01:00", 1)] TraceFilter filter, TextWriter log) 
    { 
     foreach (var traceEvent in filter.Events) 
     { 
      _telemetryClient.TrackException(traceEvent.Exception); 
     } 

     // log the last detailed errors to the Dashboard 
     log.WriteLine(filter.GetDetailedMessage(1)); 
    } 

    public void Dispose() 
    { 
     _telemetryClient.Flush(); 
    } 
} 

Per registrare le estensioni di errore, contattare config.UseCore() nel codice di avvio:

private static void Main() 
{ 
    var config = new JobHostConfiguration(); 
    config.UseCore(); 

    ... 
    new JobHost(config).RunAndBlock(); 
} 

Quindi, se siete utilizzando un contenitore IoC, è possibile iniettare facilmente il tuo TelemetryClient. Per configurare un attivatore lavoro per la webjob si può guardare a questo post: