public async Task Invoke(HttpContext context) { if (_zipkinConfig.Bypass != null && _zipkinConfig.Bypass(context.Request)) { await _next(context); return; } var traceClient = context.RequestServices.GetRequiredService <IZipkinTracer>(); var traceInfo = ReadTraceInfo(context); string headerSpanName = context.Request.Headers[TraceInfo.SpanNameHeaderName]; var spanName = !string.IsNullOrEmpty(headerSpanName) ? headerSpanName : $"{context.Request.Method} {context.Request.Path}"; var span = await traceClient.StartServerTrace(new Uri(context.Request.GetEncodedUrl()), spanName, traceInfo); context.Response.OnCompleted( response => { var httpResponse = response as HttpResponse; if (httpResponse != null) { traceClient.EndServerTrace(span, httpResponse.StatusCode, IsErrorStatusCode(httpResponse.StatusCode) ? ((HttpStatusCode)httpResponse.StatusCode).ToString() : null); } return(Task.CompletedTask); }, context.Response); await _next(context); }