namespace Indotalent.ConfigBackEnd.Behaviours; using Indotalent.ConfigBackEnd.Interfaces; using MediatR; using Microsoft.Extensions.Logging; using System.Diagnostics; public class PerformanceBehaviour : IPipelineBehavior where TRequest : IRequest { private readonly Stopwatch _timer; private readonly ILogger _logger; private readonly ICurrentUserService _currentUserService; public PerformanceBehaviour( ILogger logger, ICurrentUserService currentUserService) { _timer = new Stopwatch(); _logger = logger; _currentUserService = currentUserService; } public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) { _timer.Start(); var response = await next(); _timer.Stop(); var elapsedMilliseconds = _timer.ElapsedMilliseconds; if (elapsedMilliseconds > 500) { var requestName = typeof(TRequest).Name; var userId = _currentUserService.UserId ?? string.Empty; var userName = _currentUserService.UserName ?? string.Empty; _logger.LogWarning("Long Running Request: {Name} ({ElapsedMilliseconds} milliseconds) {@UserId} {@UserName} {@Request}", requestName, elapsedMilliseconds, userId, userName, request); } return response; } }