public void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Request.Path.StartsWithSegments("/api") ||
                context.HttpContext.Request.Path.StartsWithSegments("/internalapi") ||
                context.HttpContext.Request.Path.StartsWithSegments("/publicapi"))
            {
                _layer = "Api";
            }
            else
            {
                _layer = "Mvc";
            }

            var request  = context.HttpContext.Request;
            var activity = $"{request.Path}-{request.Method}";

            var dict = new Dictionary <string, object>();

            foreach (var key in context.RouteData.Values?.Keys)
            {
                dict.Add($"RouteData-{key}", (string)context.RouteData.Values[key]);
            }

            var details = EnvyWebHelper.GetWebFlogDetail(_product, _layer, activity,
                                                         context.HttpContext, dict);

            _tracker = new EnvyPerformanceTracker(details);
        }
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception ex)
            {
                bool isWebApi = context.Request.Path.StartsWithSegments("/api") ||
                                context.Request.Path.StartsWithSegments("/internalapi") ||
                                context.Request.Path.StartsWithSegments("/publicapi");

                if (isWebApi)
                {
                    context.Response.StatusCode  = 500;
                    context.Response.ContentType = "application/json";

                    EnvyWebHelper.LogWebError("Core", "Api", ex, context);

                    var errorId      = Activity.Current?.Id ?? context.TraceIdentifier;
                    var jsonResponse = JsonConvert.SerializeObject(new EnvyErrorResponse
                    {
                        ErrorId = errorId,
                        Message = "Some kind of error happened in the API"
                    });
                    await context.Response.WriteAsync(jsonResponse, Encoding.UTF8);
                }
                else
                {
                    EnvyWebHelper.LogWebError(_product, _layer, ex, context);

                    PathString originalPath = context.Request.Path;
                    if (_options.ExceptionHandlingPath.HasValue)
                    {
                        context.Request.Path = _options.ExceptionHandlingPath;
                    }

                    context.Response.Clear();
                    var exceptionHandlerFeature = new ExceptionHandlerFeature()
                    {
                        Error = ex,
                        Path  = originalPath.Value,
                    };

                    context.Features.Set <IExceptionHandlerFeature>(exceptionHandlerFeature);
                    context.Features.Set <IExceptionHandlerPathFeature>(exceptionHandlerFeature);
                    context.Response.StatusCode = 500;
                    context.Response.OnStarting(_clearCacheHeadersDelegate, context.Response);

                    await _options.ExceptionHandler(context);

                    return;
                }
            }
        }