< Summary

Information
Class: IceRpc.Logger.LoggerMiddleware
Assembly: IceRpc.Logger
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Logger/LoggerMiddleware.cs
Tag: 275_13775359185
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 86
Line coverage: 100%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage
100%
Covered methods: 3
Total methods: 3
Method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
DispatchAsync(...)50%22100%
PerformDispatchAsync()100%11100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Logger/LoggerMiddleware.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Extensions.DependencyInjection;
 4using Microsoft.Extensions.Logging;
 5using System.Net;
 6
 7namespace IceRpc.Logger;
 8
 9/// <summary>A middleware that writes a log entry to an <see cref="ILogger" /> for each dispatch.</summary>
 10/// <seealso cref="LoggerRouterExtensions"/>
 11/// <seealso cref="LoggerDispatcherBuilderExtensions"/>
 12public class LoggerMiddleware : IDispatcher
 13{
 14    private readonly IDispatcher _next;
 15    private readonly ILogger _logger;
 16
 17    /// <summary>Constructs a logger middleware.</summary>
 18    /// <param name="next">The next dispatcher in the dispatch pipeline.</param>
 19    /// <param name="logger">The logger to log to.</param>
 220    public LoggerMiddleware(IDispatcher next, ILogger logger)
 221    {
 222        _next = next;
 223        _logger = logger;
 224    }
 25
 26    /// <inheritdoc/>
 27    public ValueTask<OutgoingResponse> DispatchAsync(IncomingRequest request, CancellationToken cancellationToken)
 228    {
 229        return _logger.IsEnabled(LogLevel.Information) ?
 230            PerformDispatchAsync() :
 231            _next.DispatchAsync(request, cancellationToken);
 32
 33        async ValueTask<OutgoingResponse> PerformDispatchAsync()
 234        {
 35            try
 236            {
 237                OutgoingResponse response = await _next.DispatchAsync(request, cancellationToken).ConfigureAwait(false);
 38
 139                _logger.LogDispatch(
 140                    request.Path,
 141                    request.Operation,
 142                    request.ConnectionContext.TransportConnectionInformation.LocalNetworkAddress,
 143                    request.ConnectionContext.TransportConnectionInformation.RemoteNetworkAddress,
 144                    response.StatusCode);
 145                return response;
 46            }
 147            catch (Exception exception)
 148            {
 149                _logger.LogDispatchException(
 150                    exception,
 151                    request.Path,
 152                    request.Operation);
 153                throw;
 54            }
 155        }
 256    }
 57}
 58
 59/// <summary>Provides extension methods for <see cref="ILogger" />. They are used by <see cref="LoggerMiddleware" />.
 60/// </summary>
 61internal static partial class LoggerMiddlewareLoggerExtensions
 62{
 63    [LoggerMessage(
 64        EventId = (int)LoggerMiddlewareEventId.Dispatch,
 65        EventName = nameof(LoggerMiddlewareEventId.Dispatch),
 66        Level = LogLevel.Information,
 67        Message = "Dispatch of {Operation} to {Path} over {LocalNetworkAddress}<->{RemoteNetworkAddress} returned a resp
 68    internal static partial void LogDispatch(
 69        this ILogger logger,
 70        string path,
 71        string operation,
 72        EndPoint? localNetworkAddress,
 73        EndPoint? remoteNetworkAddress,
 74        StatusCode statusCode);
 75
 76    [LoggerMessage(
 77        EventId = (int)LoggerMiddlewareEventId.DispatchException,
 78        EventName = nameof(LoggerMiddlewareEventId.DispatchException),
 79        Level = LogLevel.Information,
 80        Message = "Failed to dispatch {Operation} to {Path}")]
 81    internal static partial void LogDispatchException(
 82        this ILogger logger,
 83        Exception exception,
 84        string path,
 85        string operation);
 86}