private ITrace GetServerTraceFromRequestOrStartClientTrace(IOwinContext context)
        {
            ITrace trace;
            string traceName = context.Request.Method + " " + context.Request.Uri;

            if (context.Request.Headers.ContainsKey(traceIdB3Header))
            {
                IDictionary <string, string> zipkinContext = new Dictionary <string, string>();
                string[] headerValues;
                if (context.Request.Headers.TryGetValue(traceIdB3Header, out headerValues))
                {
                    zipkinContext.Add("_zipkin_traceid", headerValues.First());
                }
                if (context.Request.Headers.TryGetValue(spanIdB3Header, out headerValues))
                {
                    zipkinContext.Add("_zipkin_spanid", headerValues.First());
                }

                trace = new StartServerTrace(traceName, zipkinContext);
            }
            else
            {
                trace = new StartClientTrace(traceName);
            }

            trace.TimeAnnotateWith(PredefinedTag.ServerRecv);
            trace.AnnotateWith(PredefinedTag.HttpMethod, context.Request.Method);
            trace.AnnotateWith(PredefinedTag.HttpHost, context.Request.Host.ToString());
            trace.AnnotateWith(PredefinedTag.HttpPath, context.Request.Path.ToString());

            return(trace);
        }
        private ITrace GetServerTraceFromRequestOrStartClientTrace(NancyContext context)
        {
            ITrace trace;
            string traceName = context.Request.Method + " " + context.Request.Url;

            if (context.Request.Headers[traceIdB3Header].Any())
            {
                IDictionary <string, string> zipkinContext = new Dictionary <string, string>();
                IEnumerable <string>         headerValues  = context.Request.Headers[traceIdB3Header];
                if (headerValues.Any())
                {
                    zipkinContext.Add("_zipkin_traceid", headerValues.First());
                }

                headerValues = context.Request.Headers[spanIdB3Header];
                if (headerValues.Any())
                {
                    zipkinContext.Add("_zipkin_spanid", headerValues.First());
                }

                trace = new StartServerTrace(traceName, zipkinContext);
            }
            else
            {
                trace = new StartClientTrace(traceName);
            }

            trace.TimeAnnotateWith(PredefinedTag.ServerRecv);
            trace.AnnotateWith(PredefinedTag.HttpMethod, context.Request.Method);
            trace.AnnotateWith(PredefinedTag.HttpHost, context.Request.UserHostAddress);
            trace.AnnotateWith(PredefinedTag.HttpPath, context.Request.Path.ToString());

            return(trace);
        }
コード例 #3
0
        public void Basic_Trace_config()
        {
            using (var parentTrace = new StartClientTrace("parent"))
            {
                var dict = new Dictionary <string, object>();
                TraceContextPropagation.PropagateTraceIdOnto(dict);

                using (var trace = new StartServerTrace("name", dict))
                {
                    trace.Span.Should().NotBeNull();
                    trace.Span.Name.Should().Be("name");
                    trace.Span.TraceId.Should().Be(parentTrace.Span.TraceId);
                    trace.Span.ParentId.Should().Be(parentTrace.Span.Id);

                    trace.Span.Annotations[0].Value.Should().Be("sr");

                    _recorder.Recorded.Should().HaveCount(0);

                    TraceContextPropagation.CurrentSpan.Should().Be(trace.Span);
                }
            }
            _recorder.Recorded.Should().HaveCount(2);

            TraceContextPropagation.CurrentSpan.Should().BeNull();
        }
コード例 #4
0
ファイル: ZipkinProcessor.cs プロジェクト: mengtest/XNode
        /// <summary>
        /// 服务追踪
        /// </summary>
        /// <param name="context">服务上下文,每次服务调用共享一个实例</param>
        /// <returns></returns>
        public override async Task <ServiceProcessResult> ProcessAsync(ServiceContext context)
        {
            if (context.Attachments == null || !context.Attachments.ContainsKey(Constants.CrossProcessBagKey))
            {
                return(await CallNext(context));
            }

            string name;

            if (!string.IsNullOrEmpty(context.Route.ServiceName) && !string.IsNullOrEmpty(context.Route.ActionName))
            {
                name = $"{context.Route.ServiceName}.{context.Route.ActionName}({context.Route.ServiceId.ToString()}.{context.Route.ActionId.ToString()})";
            }
            else
            {
                name = $"{context.Route.ServiceId.ToString()}.{context.Route.ActionId.ToString()}";
            }

            var crossProcessBag = (Dictionary <string, string>) await Serializer.DeserializeAsync(typeof(Dictionary <string, string>), context.Attachments[Constants.CrossProcessBagKey]);

            using (var trace = new StartServerTrace(name, crossProcessBag))
            {
                try
                {
                    return(await CallNext(context));
                }
                catch (Exception ex)
                {
                    trace.AnnotateWith(PredefinedTag.Error, ex.Message);
                    throw ex;
                }
            }
        }