示例#1
0
        private static object OnBeginGetResponse <TContext>(object requestObj, Configuration <TContext, WebRequest, WebResponse> config) where TContext : ICorrelationContext <TContext>
        {
            var request = requestObj as HttpWebRequest;

            if (request != null)
            {
                if (config.EndpointFilter.Validate(request.RequestUri))
                {
                    var ctx = ContextResolver.GetContext <TContext>();
                    if (ctx != null)
                    {
                        foreach (var injector in config.ContextInjectors)
                        {
                            injector.UpdateRequest(ctx, request);
                        }

                        try
                        {
                            config.RequestNotifier?.OnBeforeRequest(ctx.GetChildRequestContext(request.GetChildRequestId()), request);
                        }
                        catch (Exception)
                        {
                            //ignored
                        }
                    }
                }
            }

            return(requestObj);
        }
        private Task assertEmptyContext(IDictionary <string, object> environment)
        {
            var ctx = ContextResolver.GetContext <CorrelationContext>();

            Assert.NotNull(ctx);
            return(Task.FromResult(1));
        }
示例#3
0
        private static void validateHeader(HttpRequestMessage request)
        {
            IEnumerable <string> actualHeader;

            Assert.True(request.Headers.TryGetValues(CorrelationHeaderInfo.CorrelationIdHeaderName, out actualHeader));
            Assert.Equal(1, actualHeader.Count());
            Assert.Equal(ContextResolver.GetContext <CorrelationContext>().CorrelationId, actualHeader.First());
        }
 public static void LogIncomingRequest(HttpContext context, TimeSpan elapsed)
 {
     Log.Write("incoming_request", new
     {
         context.Request,
         context.Response,
         Elapsed = elapsed,
         Context = ContextResolver.GetContext <CorrelationContext>()
     });
 }
示例#5
0
        public void ContextResolverSetClear()
        {
            var ctx = new TestContext {
                CorrelationId = "1", OtherId = "2"
            };

            ContextResolver.SetContext(ctx);
            ContextResolver.ClearContext();
            Assert.Null(ContextResolver.GetContext <TestContext>());
        }
        public void Initialize(ITelemetry telemetry)
        {
            //add request id to every event
            var ctx = ContextResolver.GetContext <CorrelationContext>();

            if (ctx != null)
            {
                telemetry.Context.Operation.Id       = ctx.CorrelationId;
                telemetry.Context.Operation.ParentId = ctx.RequestId;
            }
        }
示例#7
0
        public void PutStringGetObject()
        {
            var guid = Guid.NewGuid().ToString();

            ContextResolver.SetContext(guid);

            var got = ContextResolver.GetContext <object>();

            Assert.NotNull(got);
            Assert.Equal(guid, got.ToString());
        }
示例#8
0
        public void ContextResolverSetGet()
        {
            var ctx = new TestContext {
                CorrelationId = "1", OtherId = "2"
            };

            ContextResolver.SetContext(ctx);
            var gotCtx = ContextResolver.GetContext <TestContext>();

            TestContextHelper.AssertAreEqual(ctx, gotCtx);
        }
        public static void LogOutgoigRequest(HttpResponseMessage response, TimeSpan elapsed)
        {
            var baseRequestContext = ContextResolver.GetContext <CorrelationContext>();
            var childRequestId     = response.RequestMessage.GetChildRequestId();

            Log.Write("outgoing_request", new
            {
                Request  = response.RequestMessage,
                Response = response,
                Elapsed  = elapsed,
                Context  = baseRequestContext.GetChildRequestContext(childRequestId)
            });
        }
示例#10
0
        public async Task ContextResolverSetGetAsyncTask()
        {
            var ctx = new TestContext {
                CorrelationId = "1", OtherId = "2"
            };

            ContextResolver.SetContext(ctx);

            var t = Task.Run(() => ContextResolver.GetContext <TestContext>());
            await t.ConfigureAwait(false);

            TestContextHelper.AssertAreEqual(ctx, t.Result);
        }
        private static void validateRequest(HttpRequestMessage request)
        {
            var ctx = ContextResolver.GetContext <CorrelationContext>();
            IEnumerable <string> correlationIdHeader;

            Assert.True(request.Headers.TryGetValues(CorrelationHeaderInfo.CorrelationIdHeaderName, out correlationIdHeader));
            Assert.Equal(1, correlationIdHeader.Count());
            Assert.Equal(ctx.CorrelationId, correlationIdHeader.First());

            IEnumerable <string> requestIdHeader;

            Assert.True(request.Headers.TryGetValues(CorrelationHeaderInfo.RequestIdHeaderName, out requestIdHeader));
            Assert.Equal(1, requestIdHeader.Count());
            Assert.Equal(request.GetChildRequestId(), requestIdHeader.First());
        }
        protected override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                CancellationToken cancellationToken)
        {
            var ctx = ContextResolver.GetContext <TContext>();

            if (ctx != null)
            {
                foreach (var injector in contextInjectors)
                {
                    injector.UpdateRequest(ctx, request);
                }
            }

            return(base.SendAsync(request, cancellationToken));
        }
        /// <summary>
        /// Gets the property identifier from the @context
        /// or as concatenation of class and property name.
        /// </summary>
        public string GetPropertyId(PropertyInfo property, Uri classId)
        {
            var context = _contextResolver.GetContext(property.ReflectedType);

            if (context != null)
            {
                var mappedTerm = ContextHelpers.GetExpandedIri(context, property.GetJsonPropertyName());

                if (mappedTerm != null)
                {
                    return(mappedTerm);
                }
            }

            return(GetFallbackPropertyId(property, property.GetJsonPropertyName(), classId));
        }
示例#14
0
        public static void LogOutgoingRequest(this ILogger logger, HttpResponseMessage response, TimeSpan elapsed)
        {
            var baseRequestContext = ContextResolver.GetContext <CorrelationContext>();
            var childRequestId     = response.RequestMessage.GetChildRequestId();

            using (logger.BeginScope(baseRequestContext.GetChildRequestContext(childRequestId)))
            {
                logger.LogInformation(
                    new EventId(0, "outgoing_request"),
                    "outgoing request {method}, {url}, {status} {elapsed}",
                    response.RequestMessage.Method.ToString(),
                    response.RequestMessage.RequestUri.AbsoluteUri,
                    response.StatusCode,
                    elapsed.TotalMilliseconds);
            }
        }
示例#15
0
        public void ContextResolverSetOtherThread()
        {
            var ctx = new TestContext {
                CorrelationId = "1", OtherId = "2"
            };

            ContextResolver.SetContext(ctx);

            TestContext gotCtx = null;
            var         t      = new Thread(() =>
            {
                gotCtx = ContextResolver.GetContext <TestContext>();
            });

            t.Start();
            t.Join();

            TestContextHelper.AssertAreEqual(ctx, gotCtx);
        }
示例#16
0
        /// <summary>
        /// Allows to execute a given <paramref name="func" /> within an ensured <paramref name="ctx" /> including
        /// disposing the <paramref name="ctx" /> if none was given.
        /// </summary>
        /// <typeparam name="TResult">The result type of the <paramref name="func" />.</typeparam>
        /// <param name="func">The function to execute including an EF context.</param>
        /// <param name="ctx">The context or <c>null</c> if a new should be created.</param>
        /// <returns>The result of the <paramref name="func" />.</returns>
        protected async Task <TResult> ExecuteContextWrappedAsync <TResult>(Func <TContext, Task <TResult> > func, TContext ctx = null)
        {
            if (func == null)
            {
                var ex = new ArgumentNullException("func");
                Logger.LogException("BU-EX-08", ex);
                throw ex;
            }
            var dispose = false;

            if (ctx == null)
            {
                ctx = ContextResolver.GetContext(typeof(TContext)) as TContext;
                if (ctx == null)
                {
                    throw new InvalidOperationException("Can not resolve database context.");
                }
                dispose = true;
            }
            var result = default(TResult);

            try
            {
                result = await func(ctx);
            }
            catch (AggregateException aex)
            {
                Logger.LogException("BU-EX-001", aex);
                if (aex.InnerExceptions.Count > 0)
                {
                    // Loses the proper stack trace. Oops. For workarounds, see
                    // See http://bradwilson.typepad.com/blog/2008/04/small-decisions.html
                    Logger.LogException("BU-EX-002", aex.InnerExceptions[0]);
                }
            }
            if (dispose)
            {
                ctx.Dispose();
            }
            return(result);
        }
示例#17
0
        public void OnNext(KeyValuePair <string, object> value)
        {
            if (value.Value == null)
            {
                return;
            }

            if (value.Key == "System.Net.Http.Request")
            {
                var requestInfo = value.Value.GetType().GetProperty("Request");
                var request     = (HttpRequestMessage)requestInfo?.GetValue(value.Value, null);

                if (request != null)
                {
                    var ctx = ContextResolver.GetContext <TContext>();
                    if (endpointFilter.Validate(request.RequestUri))
                    {
                        foreach (var injector in contextInjectors)
                        {
                            injector.UpdateRequest(ctx, request);
                        }
                        requestNotifier.OnBeforeRequest(ctx, request);
                    }
                }
            }
            else if (value.Key == "System.Net.Http.Response")
            {
                var responseInfo = value.Value.GetType().GetProperty("Response");
                var response     = (HttpResponseMessage)responseInfo?.GetValue(value.Value, null);
                if (response != null)
                {
                    if (endpointFilter.Validate(response.RequestMessage.RequestUri))
                    {
                        requestNotifier.OnAfterResponse(ContextResolver.GetContext <TContext>(), response);
                    }
                }
            }
        }
示例#18
0
        private static object OnEndGetResponse <TContext>(object context, object returnValue, object thisObj, object asyncResult, Configuration <TContext, WebRequest, WebResponse> config) where TContext : ICorrelationContext <TContext>
        {
            var response = returnValue as WebResponse;
            var request  = thisObj as WebRequest;

            if (request != null && response != null)
            {
                if (config.EndpointFilter.Validate(request.RequestUri))
                {
                    var ctx = ContextResolver.GetContext <TContext>();
                    try
                    {
                        config.RequestNotifier?.OnAfterResponse(
                            ctx.GetChildRequestContext(request.GetChildRequestId()), response);
                    }
                    catch (Exception)
                    {
                        //ignored
                    }
                }
            }
            return(returnValue);
        }
示例#19
0
        public async Task Invoke(HttpContext context)
        {
            var ctx = ContextResolver.GetContext <CorrelationContext>();
            var relatedActivityId = new Guid(ctx.CorrelationId);

            try
            {
                EventSource.SetCurrentThreadActivityId(relatedActivityId);
                MyEventSource.Log.RequestStart(
                    context.Request.Method,
                    context.Request.Path.Value,
                    ctx.CorrelationId,
                    ctx.RequestId);
                await this.next(context).ConfigureAwait(false);

                EventSource.SetCurrentThreadActivityId(relatedActivityId);
                MyEventSource.Log.RequestStop(context.Response.StatusCode.ToString());
            }
            catch (Exception ex)
            {
                EventSource.SetCurrentThreadActivityId(relatedActivityId);
                MyEventSource.Log.RequestStop(ex.ToString());
            }
        }
示例#20
0
        /// <summary>
        /// Allows to execute a given <paramref name="func" /> within an ensured <paramref name="ctx" /> including
        /// disposing the <paramref name="ctx" /> if none was given.
        /// </summary>
        /// <param name="func">The function to execute including an EF context.</param>
        /// <param name="ctx">The context or <c>null</c> if a new should be created.</param>
        /// <returns>The awaitable task.</returns>
        protected async Task ExecuteContextWrappedAsync(Func <TContext, Task> func, TContext ctx = null)
        {
            if (func == null)
            {
                var ex = new ArgumentNullException("func");
                Logger.LogException("BU-EX-07", ex);
                throw ex;
            }
            var dispose = false;

            if (ctx == null)
            {
                ctx = ContextResolver.GetContext(typeof(TContext)) as TContext;
                if (ctx == null)
                {
                    throw new InvalidOperationException("Can not resolve database context.");
                }
                dispose = true;
            }
            try
            {
                await func(ctx);
            }
            catch (AggregateException aex)
            {
                Logger.LogException("BU-EX-003", aex);
                if (aex.InnerExceptions.Count > 0)
                {
                    Logger.LogException("BU-EX-004", aex.InnerExceptions[0]);
                }
            }
            if (dispose)
            {
                ctx.Dispose();
            }
        }
        public void Log <TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func <TState, Exception, string> formatter)
        {
            var document = new Dictionary <string, object>
            {
                ["Message"]      = formatter(state, exception),
                ["LogLevel"]     = logLevel,
                ["Exception"]    = exception,
                ["EventId"]      = eventId,
                ["Timestamp"]    = DateTime.UtcNow,
                ["CategoryName"] = categoryName
            };

            if (scope?.State != null)
            {
                document["Context"] = scope?.State;
            }
            else
            {
                var ctx = ContextResolver.GetContext <CorrelationContext>();
                if (ctx != null)
                {
                    document["Context"] = ctx;
                }
            }
            var formattedState = state as FormattedLogValues;

            if (formattedState != null)
            {
                for (int i = 0; i < formattedState.Count - 1; i++)
                {
                    document.Add(formattedState[i].Key, formattedState[i].Value);
                }
            }

            client.Index(document, idx => idx.Index(IndexName));
        }
示例#22
0
 public void ContextResolverEmpty()
 {
     Assert.Null(ContextResolver.GetContext <TestContext>());
 }