Wir verwenden Owin auf Azure für einen REST-Service und müssen Application Insights direkt melden. Wir möchten Ausnahmen und Anforderungen protokollieren. Im Moment haben wir diese:Wie Verknüpfen von Ausnahmen zu Anforderungen in Application Insights auf Azure?
using AppFunc = Func<IDictionary<string, object>, Task>;
public class InsightsReportMiddleware
{
readonly AppFunc next;
readonly TelemetryClient telemetryClient;
public InsightsReportMiddleware(AppFunc next, TelemetryClient telemetryClient)
{
if (next == null)
{
throw new ArgumentNullException("next");
}
this.telemetryClient = telemetryClient;
this.next = next;
}
public async Task Invoke(IDictionary<string, object> environment)
{
var sw = new Stopwatch();
sw.Start();
await next(environment);
sw.Stop();
var ctx = new OwinContext(environment);
var rt = new RequestTelemetry(
name: ctx.Request.Path.ToString(),
timestamp: DateTimeOffset.Now,
duration: sw.Elapsed,
responseCode: ctx.Response.StatusCode.ToString(),
success: 200 == ctx.Response.StatusCode
);
rt.Url = ctx.Request.Uri;
rt.HttpMethod = ctx.Request.Method;
telemetryClient.TrackRequest(rt);
}
}
public class InsightsExceptionLogger : ExceptionLogger
{
readonly TelemetryClient telemetryClient;
public InsightsExceptionLogger(TelemetryClient telemetryClient)
{
this.telemetryClient = telemetryClient;
}
public override Task LogAsync(ExceptionLoggerContext context, System.Threading.CancellationToken cancellationToken)
{
telemetryClient.TrackException(context.Exception);
return Task.FromResult<object>(null);
}
public override void Log(ExceptionLoggerContext context)
{
telemetryClient.TrackException(context.Exception);
}
}
Sie registriert sind, auf unsere Anwendung wie folgt:
static void ConfigureInsights(IAppBuilder app, HttpConfiguration config)
{
var rtClient = new TelemetryClient();
app.Use<InsightsReportMiddleware>(rtClient);
config.Services.Add(typeof (IExceptionLogger), new InsightsExceptionLogger(rtClient));
}
Dies funktioniert, außer Ausnahmen und Anfragen sind nicht verbunden. Beide werden protokolliert, aber wenn auf eine fehlgeschlagene Anfrage geklickt wird, wird "Keine verwandten Ausnahmen gefunden" angezeigt. Umgekehrt können wir beim Öffnen einer Ausnahmeeigenschaft "Anforderungen, die von dieser Ausnahme betroffen sind: 0" lesen. Was ist der richtige Weg, das zu tun?
"OperationIdTelemetryInitializer, die die ITelemetry.Context.Operation.Id mit der RequestTelemetry.Id aus der Umgebung extrahiert" haben Sie eine Idee, wie in OWIN?Die AspNet-Implementierung führt schließlich 'httpContextAccessor.HttpContext.RequestServices.GetService()' durch. Wie kann es von einem globalen Singleton auf einen lokalen Bereichskontext zugreifen? Wie kann dies gleichzeitige asynchrone Anforderungen unterstützen? –
trethaller