< Summary

Information
Class: IceRpc.Logger.LoggerInterceptor
Assembly: IceRpc.Logger
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Logger/LoggerInterceptor.cs
Tag: 1856_27024993493
Line coverage
100%
Covered lines: 31
Uncovered lines: 0
Coverable lines: 31
Total lines: 101
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage
100%
Covered methods: 2
Fully covered methods: 2
Total methods: 2
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
InvokeAsync()100%22100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Logger/LoggerInterceptor.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>An interceptor that writes a log entry to an <see cref="ILogger" /> for each invocation.</summary>
 10/// <seealso cref="LoggerPipelineExtensions"/>
 11/// <seealso cref="LoggerInvokerBuilderExtensions"/>
 12public class LoggerInterceptor : IInvoker
 13{
 14    private readonly ILogger _logger;
 15    private readonly IInvoker _next;
 16
 17    /// <summary>Constructs a logger interceptor.</summary>
 18    /// <param name="next">The next invoker in the invocation pipeline.</param>
 19    /// <param name="logger">The logger to log to.</param>
 420    public LoggerInterceptor(IInvoker next, ILogger logger)
 421    {
 422        _next = next;
 423        _logger = logger;
 424    }
 25
 26    /// <inheritdoc/>
 27    public async Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken)
 528    {
 29        try
 530        {
 531            IncomingResponse response = await _next.InvokeAsync(request, cancellationToken).ConfigureAwait(false);
 32
 333            if (response.StatusCode == StatusCode.Ok)
 234            {
 235                _logger.LogInvoke(
 236                    request.ServiceAddress,
 237                    request.Operation,
 238                    response.ConnectionContext.TransportConnectionInformation.LocalNetworkAddress,
 239                    response.ConnectionContext.TransportConnectionInformation.RemoteNetworkAddress);
 240            }
 41            else
 142            {
 143                _logger.LogInvokeError(
 144                    request.ServiceAddress,
 145                    request.Operation,
 146                    response.StatusCode,
 147                    response.ErrorMessage!,
 148                    response.ConnectionContext.TransportConnectionInformation.LocalNetworkAddress,
 149                    response.ConnectionContext.TransportConnectionInformation.RemoteNetworkAddress);
 150            }
 351            return response;
 52        }
 253        catch (Exception exception)
 254        {
 255            _logger.LogInvokeException(exception, request.ServiceAddress, request.Operation);
 256            throw;
 57        }
 358    }
 59}
 60
 61/// <summary>Provides extension methods for <see cref="ILogger" />. They are used by <see cref="LoggerInterceptor"/>.
 62/// </summary>
 63internal static partial class LoggerInterceptorLoggerExtensions
 64{
 65    [LoggerMessage(
 66        EventId = (int)LoggerInterceptorEventId.Invoke,
 67        EventName = nameof(LoggerInterceptorEventId.Invoke),
 68        Level = LogLevel.Information,
 69        Message = "Sent request {Operation} to {ServiceAddress} over {LocalNetworkAddress}<->{RemoteNetworkAddress} and 
 70    internal static partial void LogInvoke(
 71        this ILogger logger,
 72        ServiceAddress serviceAddress,
 73        string operation,
 74        EndPoint? localNetworkAddress,
 75        EndPoint? remoteNetworkAddress);
 76
 77    [LoggerMessage(
 78        EventId = (int)LoggerInterceptorEventId.InvokeError,
 79        EventName = nameof(LoggerInterceptorEventId.InvokeError),
 80        Level = LogLevel.Information,
 81        Message = "Sent request {Operation} to {ServiceAddress} over {LocalNetworkAddress}<->{RemoteNetworkAddress} and 
 82    internal static partial void LogInvokeError(
 83        this ILogger logger,
 84        ServiceAddress serviceAddress,
 85        string operation,
 86        StatusCode statusCode,
 87        string errorMessage,
 88        EndPoint? localNetworkAddress,
 89        EndPoint? remoteNetworkAddress);
 90
 91    [LoggerMessage(
 92        EventId = (int)LoggerInterceptorEventId.InvokeException,
 93        EventName = nameof(LoggerInterceptorEventId.InvokeException),
 94        Level = LogLevel.Information,
 95        Message = "Failed to send request {Operation} to {ServiceAddress}")]
 96    internal static partial void LogInvokeException(
 97        this ILogger logger,
 98        Exception exception,
 99        ServiceAddress serviceAddress,
 100        string operation);
 101}