< Summary

Information
Class: IceRpc.Logger.LoggerInterceptor
Assembly: IceRpc.Logger
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Logger/LoggerInterceptor.cs
Tag: 275_13775359185
Line coverage
100%
Covered lines: 20
Uncovered lines: 0
Coverable lines: 20
Total lines: 76
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
100%
Covered methods: 2
Total methods: 2
Method coverage: 100%

Metrics

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

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>
 320    public LoggerInterceptor(IInvoker next, ILogger logger)
 321    {
 322        _next = next;
 323        _logger = logger;
 324    }
 25
 26    /// <inheritdoc/>
 27    public async Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken)
 428    {
 29        try
 430        {
 431            IncomingResponse response = await _next.InvokeAsync(request, cancellationToken).ConfigureAwait(false);
 32
 233            _logger.LogInvoke(
 234                request.ServiceAddress,
 235                request.Operation,
 236                response.StatusCode,
 237                response.ConnectionContext.TransportConnectionInformation.LocalNetworkAddress,
 238                response.ConnectionContext.TransportConnectionInformation.RemoteNetworkAddress);
 239            return response;
 40        }
 241        catch (Exception exception)
 242        {
 243            _logger.LogInvokeException(exception, request.ServiceAddress, request.Operation);
 244            throw;
 45        }
 246    }
 47}
 48
 49/// <summary>Provides extension methods for <see cref="ILogger" />. They are used by <see cref="LoggerInterceptor"/>.
 50/// </summary>
 51internal static partial class LoggerInterceptorLoggerExtensions
 52{
 53    [LoggerMessage(
 54        EventId = (int)LoggerInterceptorEventId.Invoke,
 55        EventName = nameof(LoggerInterceptorEventId.Invoke),
 56        Level = LogLevel.Information,
 57        Message = "Sent request {Operation} to {ServiceAddress} over {LocalNetworkAddress}<->{RemoteNetworkAddress} and 
 58    internal static partial void LogInvoke(
 59        this ILogger logger,
 60        ServiceAddress serviceAddress,
 61        string operation,
 62        StatusCode statusCode,
 63        EndPoint? localNetworkAddress,
 64        EndPoint? remoteNetworkAddress);
 65
 66    [LoggerMessage(
 67        EventId = (int)LoggerInterceptorEventId.InvokeException,
 68        EventName = nameof(LoggerInterceptorEventId.InvokeException),
 69        Level = LogLevel.Information,
 70        Message = "Failed to send request {Operation} to {ServiceAddress}")]
 71    internal static partial void LogInvokeException(
 72        this ILogger logger,
 73        Exception exception,
 74        ServiceAddress serviceAddress,
 75        string operation);
 76}