< Summary

Information
Class: IceRpc.Internal.MetricsProtocolConnectionDecorator
Assembly: IceRpc
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/MetricsProtocolConnectionDecorator.cs
Tag: 1856_27024993493
Line coverage
100%
Covered lines: 44
Uncovered lines: 0
Coverable lines: 44
Total lines: 79
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage
100%
Covered methods: 5
Fully covered methods: 5
Total methods: 5
Method coverage: 100%
Full method coverage: 100%

Metrics

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

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/MetricsProtocolConnectionDecorator.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Transports;
 4
 5namespace IceRpc.Internal;
 6
 7/// <summary>Provides a log decorator for protocol connections.</summary>
 8internal class MetricsProtocolConnectionDecorator : IProtocolConnection
 9{
 10    private readonly bool _connectStarted;
 11    private readonly IProtocolConnection _decoratee;
 12    private bool _isConnected;
 13    private bool _isShutdown;
 14    private readonly Metrics _metrics;
 15
 16    public async Task<(TransportConnectionInformation ConnectionInformation, Task ShutdownRequested)> ConnectAsync(
 17        CancellationToken cancellationToken)
 18618    {
 18619        if (!_connectStarted)
 10520        {
 10521            _metrics.ConnectStart();
 10522        }
 23        try
 18624        {
 18625            (TransportConnectionInformation connectionInformation, Task shutdownRequested) =
 18626                await _decoratee.ConnectAsync(cancellationToken).ConfigureAwait(false);
 16127            _metrics.ConnectSuccess();
 16128            _isConnected = true;
 16129            return (connectionInformation, shutdownRequested);
 30        }
 2531        catch
 2532        {
 2533            _metrics.ConnectionFailure();
 2534            throw;
 35        }
 36        finally
 18637        {
 18638            _metrics.ConnectStop();
 18639        }
 16140    }
 41
 42    public async ValueTask DisposeAsync()
 18643    {
 18644        await _decoratee.DisposeAsync().ConfigureAwait(false);
 18645        if (_isConnected)
 16146        {
 16147            if (!_isShutdown)
 9448            {
 49                // shutdown failed or didn't call shutdown at all.
 9450                _metrics.ConnectionFailure();
 9451            }
 16152            _metrics.ConnectionDisconnected();
 16153        }
 18654    }
 55
 56    public Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken) =>
 13457        _decoratee.InvokeAsync(request, cancellationToken);
 58
 59    public async Task ShutdownAsync(CancellationToken cancellationToken)
 8360    {
 8361        await _decoratee.ShutdownAsync(cancellationToken).ConfigureAwait(false);
 6762        _isShutdown = true;
 6763    }
 64
 65    /// <summary>A protocol connection decorator to log connection metrics.</summary>
 66    /// <param name="decoratee">The protocol connection decoratee.</param>
 67    /// <param name="metrics">The metrics object used to log the metrics.</param>
 68    /// <param name="connectStarted">Whether or not the ConnectStart events has be already logged. For server connection
 69    /// the event is logged from a separate <see cref="Server.IConnector"/> decorator.</param>
 18670    internal MetricsProtocolConnectionDecorator(
 18671        IProtocolConnection decoratee,
 18672        Metrics metrics,
 18673        bool connectStarted)
 18674    {
 18675        _connectStarted = connectStarted;
 18676        _decoratee = decoratee;
 18677        _metrics = metrics;
 18678    }
 79}