< Summary

Information
Class: IceRpc.Metrics.MetricsMiddleware
Assembly: IceRpc.Metrics
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Metrics/MetricsMiddleware.cs
Tag: 1856_27024993493
Line coverage
89%
Covered lines: 26
Uncovered lines: 3
Coverable lines: 29
Total lines: 63
Line coverage: 89.6%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage
66%
Covered methods: 2
Fully covered methods: 2
Total methods: 3
Method coverage: 66.6%
Full method coverage: 66.6%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
DispatchAsync()100%22100%
.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)
 530    {
 531        _dispatchMetrics.RequestStart();
 32        try
 533        {
 534            OutgoingResponse response = await _next.DispatchAsync(request, cancellationToken).ConfigureAwait(false);
 35            // A non-OK status code means the dispatch produced a failure response.
 236            if (response.StatusCode != StatusCode.Ok)
 137            {
 138                _dispatchMetrics.RequestFailure();
 139            }
 240            return response;
 41        }
 242        catch (OperationCanceledException exception) when (exception.CancellationToken == cancellationToken)
 143        {
 144            _dispatchMetrics.RequestCancel();
 145            throw;
 46        }
 247        catch
 248        {
 249            _dispatchMetrics.RequestFailure();
 250            throw;
 51        }
 52        finally
 553        {
 554            _dispatchMetrics.RequestStop();
 555        }
 256    }
 57
 558    internal MetricsMiddleware(IDispatcher next, DispatchMetrics dispatchMetrics)
 559    {
 560        _next = next;
 561        _dispatchMetrics = dispatchMetrics;
 562    }
 63}