< Summary

Information
Class: IceRpc.Metrics.MetricsMiddleware
Assembly: IceRpc.Metrics
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Metrics/MetricsMiddleware.cs
Tag: 275_13775359185
Line coverage
87%
Covered lines: 21
Uncovered lines: 3
Coverable lines: 24
Total lines: 57
Line coverage: 87.5%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage
66%
Covered methods: 2
Total methods: 3
Method coverage: 66.6%

Metrics

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

File(s)

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

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Extensions.DependencyInjection;
 4using IceRpc.Metrics.Internal;
 5using System.Diagnostics.Metrics;
 6
 7namespace IceRpc.Metrics;
 8
 9/// <summary>A middleware that publishes dispatch metrics using a singleton meter named "IceRpc.Dispatch".
 10/// </summary>
 11/// <seealso cref="Meter"/>
 12/// <seealso cref="MetricsRouterExtensions"/>
 13/// <seealso cref="MetricsDispatcherBuilderExtensions"/>
 14public class MetricsMiddleware : IDispatcher
 15{
 16    private readonly IDispatcher _next;
 17    private readonly DispatchMetrics _dispatchMetrics;
 18
 19    /// <summary>Constructs a metrics middleware.</summary>
 20    /// <param name="next">The next dispatcher in the dispatch pipeline.</param>
 21    public MetricsMiddleware(IDispatcher next)
 022        : this(next, DispatchMetrics.Instance)
 023    {
 024    }
 25
 26    /// <inheritdoc/>
 27    public async ValueTask<OutgoingResponse> DispatchAsync(
 28        IncomingRequest request,
 29        CancellationToken cancellationToken)
 330    {
 331        _dispatchMetrics.RequestStart();
 32        try
 333        {
 334            return await _next.DispatchAsync(request, cancellationToken).ConfigureAwait(false);
 35        }
 136        catch (OperationCanceledException)
 137        {
 138            _dispatchMetrics.RequestCancel();
 139            throw;
 40        }
 141        catch
 142        {
 143            _dispatchMetrics.RequestFailure();
 144            throw;
 45        }
 46        finally
 347        {
 348            _dispatchMetrics.RequestStop();
 349        }
 150    }
 51
 352    internal MetricsMiddleware(IDispatcher next, DispatchMetrics dispatchMetrics)
 353    {
 354        _next = next;
 355        _dispatchMetrics = dispatchMetrics;
 356    }
 57}