예제 #1
0
        public void CreateScope_ExpectCorrelationContextPresent()
        {
            // arrange
            var httpContext = new DefaultHttpContext();

            var correlationId      = CorrelationId.FromString("123");
            var correlationContext = new RequestCorrelationContext(correlationId, HttpHeaders.CorrelationId);

            _factory
            .Setup(f => f.CreateContext(It.IsAny <HttpContext>()))
            .Returns(correlationContext);

            // act
            var container = new CorrelationContextContainer(_factory.Object);

            using var scope = container.CreateScope(httpContext);

            // assert
            // -> container content
            Assert.Equal(correlationContext, container.CorrelationContext);
            Assert.Equal(correlationId, container.CorrelationContext.CorrelationId);

            // -> scope content
            Assert.Equal(correlationContext, scope.CorrelationContext);
            Assert.Equal(correlationId, scope.CorrelationContext.CorrelationId);
        }
예제 #2
0
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDefaultCorrelator(options =>
                {
                    options.ReadFrom.Clear();
                    options.ReadFrom.Add("X-Correlation-Id");

                    options.Factory = (_) => CorrelationId.FromString("le_correlation");
                    options.Emit    = PropagationSettings.PropagateAs("X-Correlation-Id");
                    options.ReplaceTraceIdentifier = false;
                    options.LoggingScope           = LoggingScopeSettings.IncludeLoggingScope("Correlation");
                });
            }
        public void CreateContext_WhenGeneratingCorrelation_ExpectGeneratedCorrelationContext()
        {
            // arrange
            var correlationId = "123";
            var httpContext   = new DefaultHttpContext();

            _baseOptions.Factory = _ => CorrelationId.FromString(correlationId);

            // act
            var factory            = new CorrelationContextFactory(new OptionsWrapper <CorrelatorOptions>(_baseOptions), _logger);
            var correlationContext = factory.CreateContext(httpContext);

            // assert
            Assert.IsType <GeneratedCorrelationContext>(correlationContext);
            Assert.Equal(correlationId, correlationContext.CorrelationId.Value);
        }
예제 #4
0
        public async Task Emits_WhenKeepingIncomingHeaderButCorrelationIdGenerated_ExpectCorrelationIdEmittedWithPredefinedHeader()
        {
            // arrange
            var headerName = "X-Incoming-Request-Id";

            var options = CreateEmitOptions(PropagationSettings.KeepIncomingHeaderName(headerName));

            var httpContext        = new DefaultHttpContext();
            var correlationContext = new GeneratedCorrelationContext(CorrelationId.FromString("123"));

            // act
            var emitter = new CorrelationEmitter(options, _logger);
            await emitter
            .Emit(httpContext, correlationContext)
            .ConfigureAwait(false);

            // assert
            Assert.Contains(headerName, httpContext.Response.Headers);
            Assert.Equal("123", httpContext.Response.Headers[headerName].ToString());
        }
        public void Ctor_ExpectStringValueAndStructure()
        {
            // arrange
            var correlationKey = "CorrelationKey";
            var correlationId  = CorrelationId.FromString("correlation_id");

            // act
            var state = new CorrelatedLoggerState("CorrelationKey", correlationId);

            // assert
            Assert.Equal("CorrelationKey:correlation_id", state.ToString());

            Assert.IsAssignableFrom <IEnumerable <KeyValuePair <string, object> > >(state);

            var stateArray = state.ToArray();

            Assert.Single(stateArray);
            Assert.Equal(correlationKey, stateArray[0].Key);
            Assert.Equal(correlationId, stateArray[0].Value);
        }
예제 #6
0
        public CorrelationContext CreateContext(HttpContext httpContext)
        {
            if (!TryGetCorrelationHeader(httpContext.Request.Headers, out var headerName, out var headerValue))
            {
                _logger.NoCorrelationHeaderReceived();
                return(HandleEmptyValue(httpContext));
            }

            if (_validator != null)
            {
                var validationResult = _validator.Validate(headerValue);
                if (!validationResult.IsValid)
                {
                    _logger.InvalidCorrelationValue(headerName, validationResult.Reason);
                    return(new InvalidCorrelationContext(headerName, validationResult));
                }
            }

            _logger.CorrelationIdReceived(headerName, headerValue !);
            return(new RequestCorrelationContext(CorrelationId.FromString(headerValue), headerName));
        }
예제 #7
0
        public async Task Emits_WhenNoEmit_ExpectNoCorrelationIdEmitted()
        {
            // arrange
            var incomingHeader = HttpHeaders.AspNetRequestId;

            var options = CreateEmitOptions(PropagationSettings.NoPropagation);

            var httpContext        = new DefaultHttpContext();
            var correlationContext = new RequestCorrelationContext(
                CorrelationId.FromString("123"),
                incomingHeader);

            // act
            var emitter = new CorrelationEmitter(options, _logger);
            await emitter
            .Emit(httpContext, correlationContext)
            .ConfigureAwait(false);

            // assert
            Assert.DoesNotContain(incomingHeader, httpContext.Response.Headers);
        }
예제 #8
0
        public async Task Emits_WhenEmmitingUsingCustomHeader_ExpectCorrelationIdEmittedWithPredefinedHeader()
        {
            // arrange
            var incomingHeader = HttpHeaders.AspNetRequestId;
            var outgoingHeader = "X-Le-Custom-Request-Id";

            var options = CreateEmitOptions(PropagationSettings.PropagateAs(outgoingHeader));

            var httpContext        = new DefaultHttpContext();
            var correlationContext = new RequestCorrelationContext(
                CorrelationId.FromString("123"),
                incomingHeader);

            // act
            var emitter = new CorrelationEmitter(options, _logger);
            await emitter
            .Emit(httpContext, correlationContext)
            .ConfigureAwait(false);

            // assert
            Assert.Contains(outgoingHeader, httpContext.Response.Headers);
            Assert.Equal("123", httpContext.Response.Headers[outgoingHeader]);
        }