< Summary

Information
Class: IceRpc.Internal.Metrics
Assembly: IceRpc
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/Metrics.cs
Tag: 592_20856082467
Line coverage
100%
Covered lines: 50
Uncovered lines: 0
Coverable lines: 50
Total lines: 93
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
100%
Covered methods: 8
Total methods: 8
Method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Dispose()100%11100%
.ctor(...)100%11100%
ConnectStart()100%11100%
ConnectStop()100%11100%
ConnectSuccess()100%11100%
ConnectionFailure()100%11100%
ConnectionDisconnected()100%11100%

File(s)

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

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using System.Diagnostics;
 4using System.Diagnostics.Metrics;
 5
 6namespace IceRpc.Internal;
 7
 8/// <summary>A helper class used to report client and server connection metrics.</summary>
 9internal sealed class Metrics : IDisposable
 10{
 311    internal static readonly Metrics ClientMetrics = new("IceRpc.Client");
 312    internal static readonly Metrics ServerMetrics = new("IceRpc.Server");
 13
 14    // The number of active connections.
 15    private long _activeConnections;
 16
 17    private readonly Meter _meter;
 18
 19    // The number of connections that are being connected.
 20    private long _pendingConnections;
 21
 22    // The number of connection that have been created.
 23    private long _totalConnections;
 24
 25    // The number of connections that start connecting and failed to connect, or connected successfully but
 26    // later terminate due to a failure.
 27    private long _totalFailedConnections;
 28
 29    /// <inheritdoc/>
 330    public void Dispose() => _meter.Dispose();
 31
 932    internal Metrics(string meterName)
 933    {
 934        _meter = new Meter(meterName);
 35
 936        _meter.CreateObservableUpDownCounter(
 937            "active-connections",
 338            () => Volatile.Read(ref _activeConnections),
 939            "Connections",
 940            "Active Connections");
 41
 942        _meter.CreateObservableUpDownCounter(
 943            "pending-connections",
 344            () => Volatile.Read(ref _pendingConnections),
 945            "Connections",
 946            "Pending Connections");
 47
 948        _meter.CreateObservableCounter(
 949            "total-connections",
 350            () => Volatile.Read(ref _totalConnections),
 951            "Connections",
 952            "Total Connections");
 53
 954        _meter.CreateObservableCounter(
 955            "total-failed-connections",
 356            () => Volatile.Read(ref _totalFailedConnections),
 957            "Connections",
 958            "Total Failed Connections");
 959    }
 60
 61    internal void ConnectStart()
 17462    {
 17463        Debug.Assert(_totalConnections >= 0);
 17464        Debug.Assert(_pendingConnections >= 0);
 17465        Interlocked.Increment(ref _totalConnections);
 17466        Interlocked.Increment(ref _pendingConnections);
 17467    }
 68
 69    internal void ConnectStop()
 17370    {
 17371        Debug.Assert(_pendingConnections > 0);
 17372        Interlocked.Decrement(ref _pendingConnections);
 17373    }
 74
 75    internal void ConnectSuccess()
 13576    {
 13577        Debug.Assert(_activeConnections >= 0);
 13578        Interlocked.Increment(ref _activeConnections);
 13579    }
 80
 81    internal void ConnectionFailure()
 12182    {
 12183        Debug.Assert(_totalFailedConnections >= 0);
 12184        Debug.Assert(_totalFailedConnections < _totalConnections);
 12185        Interlocked.Increment(ref _totalFailedConnections);
 12186    }
 87
 88    internal void ConnectionDisconnected()
 13389    {
 13390        Debug.Assert(_activeConnections > 0);
 13391        Interlocked.Decrement(ref _activeConnections);
 13392    }
 93}