using System.Diagnostics; using Microsoft.Extensions.Logging; namespace BackOffice.BFF.Application.Common.Behaviours; 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; _logger.LogWarning("Long Running Request: {Name} ({ElapsedMilliseconds} milliseconds) {@UserId} {@Request}", requestName, elapsedMilliseconds, userId, request); } return response; } }