コード例 #1
0
        private static void DoProcess(object obj)
        {
            var threadIndex = (int)obj;

            KickOffEvent.Wait();

            for (int i = 0; i < 10000; i++)
            {
                var result = Task.Run(async() =>
                {
                    var rootSpan = new StartClientTrace("root_" + threadIndex, isDebug: true);

                    var cur = TraceContextPropagation.CurrentSpan;
                    rootSpan.Span.Should().Be(cur);

                    await CompleteOnThreadPool();
                    await CompleteWithinSpawnedTask();
                    await CompleteWithCustomThread();

                    rootSpan.Dispose();

                    cur = TraceContextPropagation.CurrentSpan;
                    cur.Should().BeNull();

                    return(true);
                }).Result;

                if (!result)
                {
                    break;
                }
            }

            Console.WriteLine("Thread {0} done", threadIndex);
        }
コード例 #2
0
        /// <summary>
        /// 服务追踪
        /// </summary>
        /// <param name="nodeClientContainer"></param>
        /// <param name="info"></param>
        /// <returns></returns>
        public async override Task <ServiceCallResult> CallAsync(INodeClientContainer nodeClientContainer, ServiceCallInfo info)
        {
            string name;

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

            var crossProcessBag = new Dictionary <string, string>();

            if (ServiceContext.Current == null)
            {
                using (var trace = new StartClientTrace(name))
                {
                    TraceContextPropagation.PropagateTraceIdOnto(crossProcessBag);
                    return(await CallNext(nodeClientContainer, info, crossProcessBag, trace));
                }
            }
            else
            {
                using (var trace = new LocalTrace(name))
                {
                    TraceContextPropagation.PropagateTraceIdOnto(crossProcessBag);
                    return(await CallNext(nodeClientContainer, info, crossProcessBag, trace));
                }
            }
        }
        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);
        }
コード例 #4
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();
        }
        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);
        }
コード例 #6
0
        public void Basic_Trace_config()
        {
            using (var parent = new StartClientTrace("name"))
                using (var trace = new LocalTrace("name"))
                {
                    trace.Span.Should().NotBeNull();
                    trace.Span.Name.Should().Be("name");

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

                    TraceContextPropagation.CurrentSpan.Should().Be(trace.Span);
                }

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

            TraceContextPropagation.CurrentSpan.Should().BeNull();
        }
コード例 #7
0
        public async Task PushPop_pop_on_task()
        {
            var span = new StartClientTrace("span4", isDebug: true);

            // TraceContextPropagation.IsWithinTrace.Should().BeTrue();
            var current = TraceContextPropagation.CurrentSpan;

            current.Should().Be(span.Span);

            await CompleteWithinSpawnedTask();

            span.Dispose();

            // TraceContextPropagation.IsWithinTrace.Should().BeFalse();
            current = TraceContextPropagation.CurrentSpan;
            current.Should().BeNull();
        }
コード例 #8
0
        public async Task PushPop_no_thread_switch()
        {
            var span = new StartClientTrace("span1", isDebug: true);

            // TraceContextPropagation.IsWithinTrace.Should().BeTrue();
            var current = TraceContextPropagation.CurrentSpan;

            current.Should().Be(span.Span);

            await ImmediateRet();

            span.Dispose();

            // TraceContextPropagation.IsWithinTrace.Should().BeFalse();
            current = TraceContextPropagation.CurrentSpan;
            current.Should().BeNull();
        }
コード例 #9
0
        public void Basic_Trace_config()
        {
            using (var trace = new StartClientTrace("name"))
            {
                trace.Span.Should().NotBeNull();
                trace.Span.Name.Should().Be("name");

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

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

                TraceContextPropagation.CurrentSpan.Should().Be(trace.Span);
            }

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

            TraceContextPropagation.CurrentSpan.Should().BeNull();
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: zihotki/zipkin.net
        static void Main(string[] args)
        {
            new Zipkin.ZipkinBootstrapper("api-sample", IPAddress.Loopback, 1234)
            .ZipkinAt("localhost")
            .WithSampleRate(1.0)                     // means log everything
            .Start();


            using (var roottrace = new StartClientTrace("client-op"))             // Starts a root trace + span
            {
                var crossProcessBag = new Dictionary <string, object>();
                TraceContextPropagation.PropagateTraceIdOnto(crossProcessBag);

                Thread.Sleep(20);

                roottrace.TimeAnnotateWith("custom");

                using (new StartServerTrace("server-op", crossProcessBag).SetLocalComponentName("fake-server"))
                {
                    using (new LocalTrace("op1").AnnotateWith(PredefinedTag.SqlQuery, "select * from  ..."))
                    {
                        Thread.Sleep(70);
                    }

                    using (var trace = new LocalTrace("op2"))
                    {
                        Thread.Sleep(90);

                        trace.AnnotateWith(PredefinedTag.Error, "error message");                         // mark it with an error
                    }

                    using (new LocalTrace("op3").TimeAnnotateWith(PredefinedTag.ServerSend))
                    {
                        Thread.Sleep(90);
                    }
                }
            }

            Thread.Sleep(1000);
        }