예제 #1
0
        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);
        }