public static void UseMyTracingMiddlewareOfAspNetCore( this MicropartOfCallChainAsZipkinBuilder micropartOfCallChainAsZipkinBuilder, IApplicationBuilder app) { var extractor = new ZipkinHttpTraceExtractor(); app.Use(async(context, next) => { var request = context.Request; var httpRequestFilter = app.ApplicationServices.GetService <IMicroserviceFilterManager <HttpRequestFilter, HttpRequest> >(); if (httpRequestFilter.ShouldBeFiltered(request)) { return; } if (!extractor.TryExtract(request.Headers, (c, key) => c[key], out var trace)) { trace = Trace.Create(); } Trace.Current = trace; using (var serverTrace = new ServerTrace(AppInfoProvider.Service.Name, $"{request.Path}/{request.Method}")) { trace.Record(Annotations.Tag("http.host", request.Host.ToString())); trace.Record(Annotations.Tag("http.uri", UriHelper.GetDisplayUrl(request))); trace.Record(Annotations.Tag("http.path", request.Path)); await serverTrace.TracedActionAsync(next()); } }); }
public void ParsingErrorAreLoggedAndDoesntThrow() { Trace trace; Assert.False(ZipkinHttpTraceExtractor.TryParseTrace("44FmalformedTraceId", "00000000000000FA", null, null, null, out trace)); _mockLogger.Verify(logger => logger.LogWarning(It.Is <string>(s => s.Contains("Couldn't parse trace context. Trace is ignored"))), Times.Once()); }
public static Trace ExtractIncomingTrace(IncomingWebRequestContext incomingRequest) { Trace trace; ZipkinHttpTraceExtractor zkExtractor = new ZipkinHttpTraceExtractor(); if (!zkExtractor.TryExtract(incomingRequest.Headers, out trace)) { trace = Trace.Create(); } return(trace); }
public void Supports128BitsTraceId() { var traceIdHigh = 1L; var traceId = 2L; var encodedTraceId = NumberUtils.EncodeLongToLowerHexString(traceIdHigh) + NumberUtils.EncodeLongToLowerHexString(traceId); Trace parsedTrace; Assert.True(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId, "0000000000000000", "0000000000000000", null, "", out parsedTrace)); Assert.AreEqual(traceIdHigh, parsedTrace.CurrentSpan.TraceIdHigh); Assert.AreEqual(traceId, parsedTrace.CurrentSpan.TraceId); }
public void ShouldParseTraceWithoutFlags(string encodedParentSpanId) { Trace trace; Assert.True(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId: "0000000000000001", encodedSpanId: "00000000000000FA", encodedParentSpanId: encodedParentSpanId, sampledStr: null, flagsStr: null, trace: out trace)); Assert.AreEqual(1, trace.CurrentSpan.TraceId); Assert.AreEqual(250, trace.CurrentSpan.SpanId); Assert.AreEqual(SpanFlags.None, trace.CurrentSpan.Flags); var expectedParentSpanId = (encodedParentSpanId == null) ? (long?)null : 0L; Assert.AreEqual(expectedParentSpanId, trace.CurrentSpan.ParentSpanId); }
public void ShouldParseTraceWithoutFlags(string encodedParentSpanId) { Trace trace; Assert.True(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId: "0000000000000001", encodedSpanId: "00000000000000FA", encodedParentSpanId: encodedParentSpanId, sampledStr: null, flagsStr: null, trace: out trace)); Assert.AreEqual(1L, trace.CurrentSpan.TraceId); Assert.AreEqual(SpanState.NoTraceIdHigh, trace.CurrentSpan.TraceIdHigh); Assert.AreEqual(250, trace.CurrentSpan.SpanId); Assert.IsNull(trace.CurrentSpan.Sampled); Assert.IsFalse(trace.CurrentSpan.Debug); var expectedParentSpanId = (encodedParentSpanId == null) ? (long?)null : 0L; Assert.AreEqual(expectedParentSpanId, trace.CurrentSpan.ParentSpanId); }
private static void CheckSetHeadersThenGetTrace_NVC(long?parentSpanId) { var spanState = new SpanState(2, 1, parentSpanId, 2, isSampled: null, isDebug: false); var originalTrace = Trace.CreateFromId(spanState); var headers = new NameValueCollection(); var zipkinHttpTraceInjector = new ZipkinHttpTraceInjector(); zipkinHttpTraceInjector.Inject(originalTrace, headers); Trace deserializedTrace; var extractor = new ZipkinHttpTraceExtractor(); Assert.True(extractor.TryExtract(headers, out deserializedTrace)); Assert.AreEqual(originalTrace, deserializedTrace); }
private static void CheckSetHeadersThenGetTrace_Dict(long?parentSpanId) { var spanState = new SpanState(2, 1, parentSpanId, 2, SpanFlags.None); var originalTrace = Trace.CreateFromId(spanState); var headers = new Dictionary <string, string>(); var zipkinHttpTraceInjector = new ZipkinHttpTraceInjector(); zipkinHttpTraceInjector.Inject(originalTrace, headers); Trace deserializedTrace; var extractor = new ZipkinHttpTraceExtractor(); Assert.True(extractor.TryExtract(headers, out deserializedTrace)); Assert.AreEqual(originalTrace, deserializedTrace); }
public void GetTraceThenSetHeadersEqualsOriginal(string encodedTraceId, string encodedSpanId, string encodedParentSpanId, string flagsStr, string sampledStr, int expectedHeadersCount) { Trace parsedTrace; Assert.True(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId, encodedSpanId, encodedParentSpanId, sampledStr, flagsStr, out parsedTrace)); var recreatedHeaders = new NameValueCollection(); var injector = new ZipkinHttpTraceInjector(); injector.Inject(parsedTrace, recreatedHeaders); Assert.AreEqual(expectedHeadersCount, recreatedHeaders.Count); Assert.AreEqual(encodedTraceId, recreatedHeaders[ZipkinHttpHeaders.TraceId]); Assert.AreEqual(encodedParentSpanId, recreatedHeaders[ZipkinHttpHeaders.ParentSpanId]); Assert.AreEqual(encodedSpanId, recreatedHeaders[ZipkinHttpHeaders.SpanId]); Assert.AreEqual(flagsStr, recreatedHeaders[ZipkinHttpHeaders.Flags]); }
public static void UseTracing(this IApplicationBuilder app, string serviceName) { var extractor = new ZipkinHttpTraceExtractor(); app.Use(async(context, next) => { Trace trace; var request = context.Request; if (!extractor.TryExtract(request.Headers, (c, key) => c[key], out trace)) { trace = Trace.Create(); } Trace.Current = trace; using (var serverTrace = new ServerTrace(serviceName, request.Method)) { trace.Record(Annotations.Tag("http.host", request.Host.ToString())); trace.Record(Annotations.Tag("http.uri", UriHelper.GetDisplayUrl(request))); trace.Record(Annotations.Tag("http.path", request.Path)); await serverTrace.TracedActionAsync(next()); } }); }
public void TryParseFailsWithoutRequiredHeaders(string encodedTraceId, string encodedSpanId) { Trace trace; Assert.False(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId, encodedSpanId, encodedParentSpanId: "0000000000000000", sampledStr: "1", flagsStr: "0", trace: out trace)); }