Esempio n. 1
0
        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());
                }
            });
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        public static Trace ExtractIncomingTrace(IncomingWebRequestContext incomingRequest)
        {
            Trace trace;
            ZipkinHttpTraceExtractor zkExtractor = new ZipkinHttpTraceExtractor();

            if (!zkExtractor.TryExtract(incomingRequest.Headers, out trace))
            {
                trace = Trace.Create();
            }
            return(trace);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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]);
        }
Esempio n. 10
0
        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());
                }
            });
        }
Esempio n. 11
0
        public void TryParseFailsWithoutRequiredHeaders(string encodedTraceId, string encodedSpanId)
        {
            Trace trace;

            Assert.False(ZipkinHttpTraceExtractor.TryParseTrace(encodedTraceId, encodedSpanId, encodedParentSpanId: "0000000000000000", sampledStr: "1", flagsStr: "0", trace: out trace));
        }