diff --git a/AsbCloudApp/Data/RequestLogDto.cs b/AsbCloudApp/Data/RequestLogDto.cs index 28b3ff79..eb3231c0 100644 --- a/AsbCloudApp/Data/RequestLogDto.cs +++ b/AsbCloudApp/Data/RequestLogDto.cs @@ -2,6 +2,7 @@ namespace AsbCloudApp.Data { +#nullable enable /// /// DTO журнала запросов /// @@ -10,7 +11,7 @@ namespace AsbCloudApp.Data /// /// логин пользователя /// - public string UserLogin { get; set; } + public string UserLogin { get; set; } = string.Empty; /// /// Id пользователя @@ -20,22 +21,22 @@ namespace AsbCloudApp.Data /// /// IP адрес пользователя /// - public string UserIp { get; set; } + public string? UserIp { get; set; } /// /// метод запроса (GET, POST,..) /// - public string RequestMethod { get; set; } + public string RequestMethod { get; set; } = null!; /// /// url /// - public string RequestPath { get; set; } + public string? RequestPath { get; set; } /// /// Referer /// - public string Referer { get; set; } + public string Referer { get; set; } = string.Empty; /// /// продолжительность выполнения @@ -47,19 +48,20 @@ namespace AsbCloudApp.Data /// public int Status { get; set; } - /// - /// сообщение об ошибке, если она произошла - /// - public string ExceptionMessage { get; set; } - /// /// метка времени запроса /// public DateTime Date { get; set; } + /// + /// сообщение об ошибке, если она произошла + /// + public string? ExceptionMessage { get; set; } = null!; + /// /// стек вызовов /// - public string ExceptionStack { get; set; } + public string? ExceptionStack { get; set; } = null!; } +#nullable disable } \ No newline at end of file diff --git a/AsbCloudApp/Data/RequestLogUserDto.cs b/AsbCloudApp/Data/RequestLogUserDto.cs index 1aed73d0..bd39eaef 100644 --- a/AsbCloudApp/Data/RequestLogUserDto.cs +++ b/AsbCloudApp/Data/RequestLogUserDto.cs @@ -2,6 +2,7 @@ namespace AsbCloudApp.Data { +#nullable enable /// /// DTO статистики запросов по пользователю /// @@ -15,12 +16,12 @@ namespace AsbCloudApp.Data /// /// логин /// - public string Login { get; set; } + public string Login { get; set; } = string.Empty; /// /// IP адрес пользователя /// - public string Ip { get; set; } + public string? Ip { get; set; } /// /// время выполнения запроса @@ -45,6 +46,7 @@ namespace AsbCloudApp.Data /// /// DTO пользователя /// - public UserDto User { get; set; } + public UserDto User { get; set; } = null!; } +#nullable disable } diff --git a/AsbCloudApp/Services/IRequestTracker.cs b/AsbCloudApp/Services/IRequestTracker.cs index 48e09afd..3a4c0fe3 100644 --- a/AsbCloudApp/Services/IRequestTracker.cs +++ b/AsbCloudApp/Services/IRequestTracker.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace AsbCloudApp.Services { - // TODO: make this nullable +#nullable enable /// /// Отслеживание и сбор статистики по запросам @@ -29,34 +29,35 @@ namespace AsbCloudApp.Services /// /// /// - IEnumerable GetAll(int take = -1); + IEnumerable GetAll(int? take); /// /// запросы которые выполнялись быстро /// /// /// - IEnumerable GetFast(int take = -1); + IEnumerable GetFast(int? take); /// /// запросы, которые выполнялись медленно /// /// /// - IEnumerable GetSlow(int take = -1); + IEnumerable GetSlow(int? take); /// /// запросы, которые завершились ошибкой /// /// /// - IEnumerable GetError(int take = -1); + IEnumerable GetError(int? take); /// /// Статистика посещений пользователей /// /// /// - IEnumerable GetUsersStat(int take = -1); + IEnumerable GetUsersStat(int? take); } +#nullable disable } diff --git a/AsbCloudInfrastructure/Services/RequestTrackerService.cs b/AsbCloudInfrastructure/Services/RequestTrackerService.cs index 454cea5e..1c37304e 100644 --- a/AsbCloudInfrastructure/Services/RequestTrackerService.cs +++ b/AsbCloudInfrastructure/Services/RequestTrackerService.cs @@ -7,6 +7,7 @@ using System.Linq; namespace AsbCloudInfrastructure.Services { +#nullable enable public class RequestTrackerService : IRequerstTrackerService { const int fastRequestsCount = 1000; @@ -16,28 +17,28 @@ namespace AsbCloudInfrastructure.Services const int fastLimitMs = 500; static readonly char[] stackTraceSeparators = "\r\n".ToCharArray(); - private readonly ConcurrentQueue fastRequests = new ConcurrentQueue(); - private readonly ConcurrentQueue slowRequests = new ConcurrentQueue(); - private readonly ConcurrentQueue errorRequests = new ConcurrentQueue(); + private readonly ConcurrentQueue fastRequests = new (); + private readonly ConcurrentQueue slowRequests = new (); + private readonly ConcurrentQueue errorRequests = new (); private readonly ConcurrentDictionary users = new ConcurrentDictionary(); - private static IEnumerable Get(IEnumerable list, int take = -1) + private static IEnumerable Get(IEnumerable list, int? take) { IEnumerable orderedlist = list.OrderByDescending(r => r.Date); if (take > 0) - orderedlist = orderedlist.Take(take); + orderedlist = orderedlist.Take(take.Value); return orderedlist; } - public IEnumerable GetUsersStat(int take = -1) + public IEnumerable GetUsersStat(int? take) { IEnumerable result = users.Values.OrderByDescending(u => u.LastDate); if (take > 0) - result = result.Take(take); + result = result.Take(take.Value); return result; } - public IEnumerable GetAll(int take = -1) + public IEnumerable GetAll(int? take) { var result = fastRequests .Union(slowRequests) @@ -46,13 +47,13 @@ namespace AsbCloudInfrastructure.Services return Get(result, take); } - public IEnumerable GetFast(int take = -1) + public IEnumerable GetFast(int? take) => Get(fastRequests, take); - public IEnumerable GetSlow(int take = -1) + public IEnumerable GetSlow(int? take) => Get(slowRequests, take); - public IEnumerable GetError(int take = -1) + public IEnumerable GetError(int? take) => Get(errorRequests, take); public void RegisterRequest(RequestLogDto requestLog) @@ -103,14 +104,13 @@ namespace AsbCloudInfrastructure.Services { if (!string.IsNullOrEmpty(requestLog.UserLogin)) { - var key = $"{requestLog?.UserId}>{requestLog?.UserIp}"; + var key = $"{requestLog.UserId}>{requestLog.UserIp}"; if (!users.ContainsKey(key)) users[key] = new RequestLogUserDto { UserId = requestLog.UserId, Ip = requestLog.UserIp, Login = requestLog.UserLogin, - //User = userService.Get(requestLog.UserId), }; users[key].ElapsedMs += requestLog.ElapsedMilliseconds; users[key].LastDate = requestLog.Date; @@ -128,4 +128,5 @@ namespace AsbCloudInfrastructure.Services } } } +#nullable disable } diff --git a/AsbCloudWebApi/Controllers/RequestTrackerController.cs b/AsbCloudWebApi/Controllers/RequestTrackerController.cs index 33bfb0c7..a645b257 100644 --- a/AsbCloudWebApi/Controllers/RequestTrackerController.cs +++ b/AsbCloudWebApi/Controllers/RequestTrackerController.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; namespace AsbCloudWebApi.Controllers { +#nullable enable /// /// Мониторинг запросов, ошибок, пользователей /// @@ -87,4 +88,5 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } } +#nullable disable } diff --git a/AsbCloudWebApi/Middlewares/RequerstTrackerMiddleware.cs b/AsbCloudWebApi/Middlewares/RequerstTrackerMiddleware.cs index 551b4d03..7b337f46 100644 --- a/AsbCloudWebApi/Middlewares/RequerstTrackerMiddleware.cs +++ b/AsbCloudWebApi/Middlewares/RequerstTrackerMiddleware.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; namespace AsbCloudWebApi.Middlewares { +#nullable enable public class RequerstTrackerMiddleware { private readonly RequestDelegate next; @@ -18,8 +19,8 @@ namespace AsbCloudWebApi.Middlewares var service = context.RequestServices.GetRequiredService(); var requestLog = new AsbCloudApp.Data.RequestLogDto { - UserLogin = context.User?.Identity.Name, - UserIp = context.Connection.RemoteIpAddress.ToString(), + UserLogin = context.User.Identity?.Name ?? string.Empty, + UserIp = context.Connection?.RemoteIpAddress?.ToString(), RequestMethod = context.Request.Method, RequestPath = context.Request.Path.Value, Referer = context.Request.Headers["Referer"].ToString(), @@ -32,7 +33,7 @@ namespace AsbCloudWebApi.Middlewares var sw = System.Diagnostics.Stopwatch.StartNew(); try { - await next?.Invoke(context); + await next.Invoke(context); sw.Stop(); requestLog.ElapsedMilliseconds = sw.ElapsedMilliseconds; requestLog.Status = context.Response.StatusCode; @@ -43,10 +44,10 @@ namespace AsbCloudWebApi.Middlewares sw.Stop(); requestLog.ElapsedMilliseconds = sw.ElapsedMilliseconds; requestLog.Status = context.Response.StatusCode; - // TODO: Add request params and body size. service.RegisterRequestError(requestLog, ex); throw; } } } +#nullable disable }