-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathRequestTracerMiddleware.cs
93 lines (84 loc) · 3.46 KB
/
RequestTracerMiddleware.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using FireplaceApi.Application.Extensions;
using FireplaceApi.Application.Tools;
using FireplaceApi.Domain.Extensions;
using FireplaceApi.Domain.Operators;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using System.Threading.Tasks;
namespace FireplaceApi.Application.Middlewares;
public class RequestTracerMiddleware
{
private readonly ILogger<RequestTracerMiddleware> _logger;
private readonly RequestDelegate _next;
public RequestTracerMiddleware(ILogger<RequestTracerMiddleware> logger, RequestDelegate next)
{
_logger = logger;
_next = next;
}
public async Task InvokeAsync(HttpContext context, RequestTraceOperator requestTraceOperator)
{
var sw = Stopwatch.StartNew();
var requestInfoMessage = context.CreateRequestInfoMessage();
_logger.LogAppInformation(requestInfoMessage, title: "REQUEST");
await _next(context);
var action = context.FindActionName();
await StoreRequestTrace(context, sw, requestTraceOperator);
_logger.LogAppInformation($"action: {action ?? "null"} | {requestInfoMessage}", sw: sw, title: "REQUEST_DURATION");
}
private async Task StoreRequestTrace(HttpContext context, Stopwatch sw,
RequestTraceOperator requestTraceOperator)
{
var method = context.Request.Method;
var action = context.FindActionName();
var url = context.Request.GetDisplayUrl();
var ip = context.GetInputHeaderDto()?.IpAddress;
var userAgent = context.Request.Headers.UserAgent.ToString();
var userId = context.GetRequestingUser()?.Id;
var statusCode = context.Response.StatusCode;
var errorType = context.GetError()?.Type;
var errorField = context.GetError()?.Field;
var duration = sw.Finish();
var requestTrace = await requestTraceOperator.CreateRequestTraceAsync(method,
url, ip, userAgent, userId, statusCode, duration, action, errorType, errorField);
}
}
public static class RequestTracerMiddlewareExtensions
{
public static IApplicationBuilder UseRequestTracerMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestTracerMiddleware>();
}
public static string CreateRequestInfoMessage(this HttpContext context)
{
var ip = context.GetInputHeaderDto()?.IpAddress;
var request = context.Request;
var method = request.Method;
var url = $"{request.Scheme}://{request.Host}{request.Path}";
var requestInfoMessage = $"{ip} {method} {url}";
return requestInfoMessage;
}
public static string FindActionName(this HttpContext context)
{
string actionName = null;
if (context.Items.TryGetValue(Constants.ActionNameKey, out var actionNameObject))
{
actionName = (string)actionNameObject;
return actionName;
}
var routeData = context.GetRouteData();
if (routeData.Values.TryGetValue("action", out actionNameObject))
actionName = (string)actionNameObject;
else
{
var requestPath = context.Request.Path.ToString();
if (requestPath.StartsWith(Constants.GraphQLBaseRoute))
actionName = "GraphQL";
}
context.Items.Add(Constants.ActionNameKey, actionName);
return actionName;
}
}