예제 #1
0
        public async Task Invoke_Trace()
        {
            var accessor = new HttpContextAccessor {
                HttpContext = new DefaultHttpContext()
            };
            var context    = CreateHttpContext();
            var tracerMock = CreateIManagedTracerMock(context);

            var delegateMock = new Mock <RequestDelegate>();

            delegateMock.Setup(d => d(context)).Returns(Task.CompletedTask);

            Func <TraceHeaderContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer(accessor));

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory, accessor);
            await middleware.Invoke(context, _traceHeaderContext);

            Assert.Equal(tracerMock.Object, ContextTracerManager.GetCurrentTracer(accessor));

            Assert.True(context.Response.Headers.ContainsKey(TraceHeaderContext.TraceHeader));
            Assert.Equal(_traceHeaderContext.ToString(), context.Response.Headers[TraceHeaderContext.TraceHeader]);

            delegateMock.VerifyAll();
            tracerMock.VerifyAll();
        }
        public async Task SetAndGetInDifferentAsyncContexts()
        {
            var mockedManagedTracer = new Mock <IManagedTracer>(MockBehavior.Strict).Object;

            async Task setTracer()
            {
                ContextTracerManager.SetCurrentTracer(mockedManagedTracer);
                await Task.Yield();
            }

            async Task <IManagedTracer> getTracer()
            {
                var tracer = ContextTracerManager.GetCurrentTracer();
                await Task.Yield();

                return(tracer);
            }

            await setTracer();

            var actualManagedTracer = await getTracer();

            // The "intuitive" thing would be to
            // Assert.Equal(mockedManagedTracer, actualManagedTracer);
            // but, we have implemented the ContextTraceManager using AsyncLocal
            // and since in this test we have set the mocked tracer in an independent
            // async context from the one we are then obtaining the tracer, the tracer set
            // on the first async context is not propagated to the second async context where
            // we are trying to obtain it.
            Assert.Equal(NullManagedTracer.Instance, actualManagedTracer);
        }
        public void FromGoogleTrace()
        {
            var oldTracer = ContextTracerManager.GetCurrentTracer();

            try
            {
                string traceId = "dummy_trace_id";
                ulong  spanId  = 0x12D687;
                // The spanId set on the log entry should confirm to x16
                // format so that the backend can really associate the log entry
                // to the span.
                string expectedSpanId = "000000000012d687";

                ContextTracerManager.SetCurrentTracer(MockTracer(traceId, spanId));

                var traceContext = TraceContextForLogEntry.FromGoogleTrace();

                Assert.Equal(traceId, traceContext.TraceId);
                Assert.Equal(expectedSpanId, traceContext.SpanId);
            }
            finally
            {
                ContextTracerManager.SetCurrentTracer(oldTracer);
            }
        }
예제 #4
0
        public async Task Invoke_Trace()
        {
            var context    = CreateHttpContext();
            var tracerMock = CreateIManagedTracerMock(context);

            var delegateMock = new Mock <RequestDelegate>();

            delegateMock.Setup(d => d(context)).Returns(Task.CompletedTask);

            Func <TraceHeaderContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory, new DefaultCloudTraceNameProvider());
            await middleware.Invoke(context, _traceHeaderContext);

            // Since the current tracer is AsyncLocal<>, it will be back to the default after awaiting the middleware invoke
            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            Assert.True(context.Response.Headers.ContainsKey(TraceHeaderContext.TraceHeader));
            Assert.Equal(_traceHeaderContext.ToString(), context.Response.Headers[TraceHeaderContext.TraceHeader]);

            delegateMock.VerifyAll();
            tracerMock.VerifyAll();
        }
        public async Task Invoke_Trace()
        {
            var accessor = new HttpContextAccessor {
                HttpContext = new DefaultHttpContext()
            };
            var context    = CreateHttpContext();
            var tracerMock = CreateIManagedTracerMock(context);

            var delegateMock = new Mock <RequestDelegate>();

            delegateMock.Setup(d => d(context)).Returns(Task.CompletedTask);

            var tracerFactoryMock = new Mock <IManagedTracerFactory>();

            tracerFactoryMock.Setup(f => f.CreateTracer(_traceHeaderContext)).Returns(tracerMock.Object);

            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer(accessor));

            var middleware = new CloudTraceMiddleware(delegateMock.Object, tracerFactoryMock.Object, accessor);
            await middleware.Invoke(context, _traceHeaderContext);

            Assert.Equal(tracerMock.Object, ContextTracerManager.GetCurrentTracer(accessor));

            delegateMock.VerifyAll();
            tracerMock.VerifyAll();
        }
        public void Set()
        {
            var mockedManagedTracer = new Mock <IManagedTracer>(MockBehavior.Strict).Object;

            ContextTracerManager.SetCurrentTracer(mockedManagedTracer);

            Assert.Equal(mockedManagedTracer, ContextTracerManager.GetCurrentTracer());
        }
예제 #7
0
        public void CreateManagedTracer()
        {
            var    mockProvider = new Mock <IServiceProvider>();
            var    mockTracer   = new Mock <IManagedTracer>();
            string traceId      = Guid.NewGuid().ToString("N");

            mockTracer.Setup(p => p.GetCurrentTraceId()).Returns(traceId);
            ContextTracerManager.SetCurrentTracer(mockTracer.Object);
            var tracer = ManagedTracer.CreateDelegatingTracer(() => ContextTracerManager.GetCurrentTracer());

            Assert.IsType <DelegatingTracer>(tracer);
            Assert.Equal(traceId, tracer.GetCurrentTraceId());
            mockTracer.Verify();
        }
        public void FromGoogleTrace_NoTrace()
        {
            var oldTracer = ContextTracerManager.GetCurrentTracer();

            try
            {
                ContextTracerManager.SetCurrentTracer(MockTracer());

                Assert.Null(TraceContextForLogEntry.FromGoogleTrace());
            }
            finally
            {
                ContextTracerManager.SetCurrentTracer(oldTracer);
            }
        }
        public async Task Invoke_NoTrace()
        {
            var context      = new DefaultHttpContext();
            var delegateMock = new Mock <RequestDelegate>();
            var tracerMock   = new Mock <IManagedTracer>();

            Func <ITraceContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory, new DefaultCloudTraceNameProvider());
            await middleware.Invoke(context, _traceContext, TraceDecisionPredicate.Default, CustomTraceContextPropagator);

            // Since the current tracer is AsyncLocal<>, it will be back to the default after awaiting the middleware invoke
            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            AssertNoTraceContext(context.Response);

            delegateMock.Verify(d => d(context), Times.Once());
            tracerMock.Verify(t => t.StartSpan(It.IsAny <string>(), null), Times.Never());
        }
예제 #10
0
        public async Task Invoke_NoTrace()
        {
            var context      = new DefaultHttpContext();
            var delegateMock = new Mock <RequestDelegate>();
            var tracerMock   = new Mock <IManagedTracer>();

            Func <TraceHeaderContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory);
            await middleware.Invoke(context, _traceHeaderContext);

            // Since the current tracer is AsyncLocal<>, it will be back to the default after awaiting the middleware invoke
            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            Assert.False(context.Response.Headers.ContainsKey(TraceHeaderContext.TraceHeader));

            delegateMock.Verify(d => d(context), Times.Once());
            tracerMock.Verify(t => t.StartSpan(It.IsAny <string>(), null), Times.Never());
        }
예제 #11
0
        public async Task Invoke_NoTrace()
        {
            var accessor = new HttpContextAccessor {
                HttpContext = new DefaultHttpContext()
            };
            var context      = new DefaultHttpContext();
            var delegateMock = new Mock <RequestDelegate>();
            var tracerMock   = new Mock <IManagedTracer>();

            Func <TraceHeaderContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory, accessor);
            await middleware.Invoke(context, _traceHeaderContext);

            Assert.Equal(tracerMock.Object, ContextTracerManager.GetCurrentTracer(accessor));
            Assert.False(context.Response.Headers.ContainsKey(TraceHeaderContext.TraceHeader));

            delegateMock.Verify(d => d(context), Times.Once());
            tracerMock.Verify(t => t.StartSpan(It.IsAny <string>(), null), Times.Never());
        }
        public void FromGoogleTrace_NoSpan()
        {
            var oldTracer = ContextTracerManager.GetCurrentTracer();

            try
            {
                string traceId = "dummy_trace_id";

                ContextTracerManager.SetCurrentTracer(MockTracer(traceId));

                var traceContext = TraceContextForLogEntry.FromGoogleTrace();

                Assert.Equal(traceId, traceContext.TraceId);
                Assert.Null(traceContext.SpanId);
            }
            finally
            {
                ContextTracerManager.SetCurrentTracer(oldTracer);
            }
        }
        public async Task Invoke_NoTrace()
        {
            var accessor = new HttpContextAccessor {
                HttpContext = new DefaultHttpContext()
            };
            var context      = new DefaultHttpContext();
            var delegateMock = new Mock <RequestDelegate>();
            var tracerMock   = new Mock <IManagedTracer>();

            var tracerFactoryMock = new Mock <IManagedTracerFactory>();

            tracerFactoryMock.Setup(f => f.CreateTracer(_traceHeaderContext)).Returns(tracerMock.Object);

            var middleware = new CloudTraceMiddleware(delegateMock.Object, tracerFactoryMock.Object, accessor);
            await middleware.Invoke(context, _traceHeaderContext);

            Assert.Equal(tracerMock.Object, ContextTracerManager.GetCurrentTracer(accessor));

            delegateMock.Verify(d => d(context), Times.Once());
            tracerMock.Verify(t => t.StartSpan(It.IsAny <string>(), null), Times.Never());
            tracerMock.Verify(t => t.EndSpan(), Times.Never());
        }
        public async Task SetAndGetInNestedAsyncContexts()
        {
            var mockedManagedTracer = new Mock <IManagedTracer>(MockBehavior.Strict).Object;

            async Task <IManagedTracer> getTracer()
            {
                var tracer = ContextTracerManager.GetCurrentTracer();
                await Task.Yield();

                return(tracer);
            }

            async Task <IManagedTracer> setTracerAndGet()
            {
                ContextTracerManager.SetCurrentTracer(mockedManagedTracer);
                await Task.Yield();

                return(await getTracer());
            }

            var actualManagedTracer = await setTracerAndGet();

            Assert.Equal(mockedManagedTracer, actualManagedTracer);
        }
        public async Task Invoke_Trace()
        {
            var context    = CreateHttpContext();
            var tracerMock = CreateIManagedTracerMock(context);

            var delegateMock = new Mock <RequestDelegate>();

            delegateMock.Setup(d => d(context)).Returns(Task.CompletedTask);

            Func <ITraceContext, IManagedTracer> fakeFactory = f => tracerMock.Object;

            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            var middleware = new CloudTraceMiddleware(delegateMock.Object, fakeFactory, new DefaultCloudTraceNameProvider());
            await middleware.Invoke(context, _traceContext, TraceDecisionPredicate.Default, CustomTraceContextPropagator);

            // Since the current tracer is AsyncLocal<>, it will be back to the default after awaiting the middleware invoke
            Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());

            AssertCustomTraceContext(context.Response);

            delegateMock.VerifyAll();
            tracerMock.VerifyAll();
        }
 public void Unset_NullManagedTracer()
 {
     Assert.Equal(NullManagedTracer.Instance, ContextTracerManager.GetCurrentTracer());
 }