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
risposta
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();
}
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 –
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. –
@AlexMarshall hai un contenitore DI nel tuo webjob? – Thomas
È 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:
controllare questo? http://stackoverflow.com/questions/31798640/monitoring-azure-webjobs – Igorek