namespace Dpz.Core.Service.Mediator.Common.Behaviors;

/// <summary>
/// Mediator 性能管道:统计消息耗时并标记慢请求。
/// </summary>
/// <typeparam name="TMessage">消息类型。</typeparam>
/// <typeparam name="TResponse">响应类型。</typeparam>
public sealed class MediatorPerformanceBehavior<TMessage, TResponse>(
    ILogger<MediatorPerformanceBehavior<TMessage, TResponse>> logger
) : IPipelineBehavior<TMessage, TResponse>
    where TMessage : IMessage
{
    private const int SlowRequestThresholdMs = 800;

    /// <summary>
    /// 执行性能统计管道逻辑。
    /// </summary>
    public async ValueTask<TResponse> Handle(
        TMessage message,
        MessageHandlerDelegate<TMessage, TResponse> next,
        CancellationToken cancellationToken
    )
    {
        var stopwatch = Stopwatch.StartNew();
        var response = await next(message, cancellationToken);
        stopwatch.Stop();

        var elapsedMs = stopwatch.ElapsedMilliseconds;
        var messageName = typeof(TMessage).Name;

        if (elapsedMs >= SlowRequestThresholdMs)
        {
            logger.LogWarning(
                "[Mediator] Slow message detected: {MessageName}, elapsed={ElapsedMs}ms",
                messageName,
                elapsedMs
            );
            return response;
        }

        // logger.LogInformation(
        //     "[Mediator] Message cost: {MessageName}, elapsed={ElapsedMs}ms",
        //     messageName,
        //     elapsedMs
        // );
        return response;
    }
}
评论加载中...