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); }
/// <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); }
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); }
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(); }
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(); }
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(); }
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(); }
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); }