public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // Read the Request-Id header so we can assign it to the activity.
            string parentOperationId = context.HttpContext.Request.Headers["Request-Id"];


            OpenActivityOptions options = default;

            // Set the parent id.
            if (!string.IsNullOrEmpty(parentOperationId))
            {
                options.SyntheticParentId = parentOperationId;
            }
            else
            {
                options.IsSyntheticRootId = true;
            }

            // Process cross-context properties (aka baggage).
            string correlationContext = context.HttpContext.Request.Headers["Correlation-Context"];

            if (!string.IsNullOrEmpty(correlationContext))
            {
                options.Properties = ParseCorrelationContext(correlationContext)?.ToArray();
            }

            var request = context.HttpContext.Request;

            using (var activity = logger.Default.OpenActivity(Semantic("Request", ("Path", request.Path),
                                                                       ("Query", request.QueryString), ("Method", request.Method)), options))
            {
                try
                {
                    await next();

                    var response = context.HttpContext.Response;

                    if (response.StatusCode >= (int)HttpStatusCode.OK && response.StatusCode <= 299)
                    {
                        // Success.
                        activity.SetOutcome(LogLevel.Info, Semantic("Success", ("StatusCode", response.StatusCode)));
                    }
                    else
                    {
                        // Failure.
                        activity.SetOutcome(LogLevel.Warning, Semantic("Failure", ("StatusCode", response.StatusCode)));
                    }
                }
                catch (Exception e)
                {
                    activity.SetException(e);
                }
            }
        }
Exemplo n.º 2
0
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // Read the Request-Id header so we can assign it to the activity.
            string parentOperationId = context.HttpContext.Request.Headers["Request-Id"];


            OpenActivityOptions options = default;

            // Set the parent id.
            if (!string.IsNullOrEmpty(parentOperationId))
            {
                options.SyntheticParentId = parentOperationId;
            }
            else
            {
                options.IsSyntheticRootId = true;
            }

            // Process cross-context properties (aka baggage).
            string correlationContext = context.HttpContext.Request.Headers["Correlation-Context"];

            if (!string.IsNullOrEmpty(correlationContext))
            {
                var properties = new List <LoggingProperty>();
                foreach (var pair in correlationContext.Split(',', StringSplitOptions.RemoveEmptyEntries))
                {
                    var posOfEqual = pair.IndexOf('=');
                    if (posOfEqual <= 0)
                    {
                        continue;
                    }

                    var propertyName  = pair.Substring(0, posOfEqual);
                    var propertyValue = pair.Substring(posOfEqual + 1);
                    properties.Add(new LoggingProperty(propertyName, propertyValue)
                    {
                        IsBaggage = true
                    });
                }

                options.Properties = properties.ToArray();
            }

            var request = context.HttpContext.Request;

            using (var activity = logger.Default.OpenActivity(Semantic("Request", ("Path", request.Path),
                                                                       ("Query", request.QueryString), ("Method", request.Method)), options))
            {
                try
                {
                    await next();

                    var response = context.HttpContext.Response;

                    if (response.StatusCode >= (int)HttpStatusCode.OK && response.StatusCode <= 299)
                    {
                        // Success.
                        activity.SetOutcome(LogLevel.Info, Semantic("Success", ("StatusCode", response.StatusCode)));
                    }
                    else
                    {
                        // Failure.
                        activity.SetOutcome(LogLevel.Warning, Semantic("Failure", ("StatusCode", response.StatusCode)));
                    }
                }
                catch (Exception e)
                {
                    activity.SetException(e);
                }
            }
        }