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