< Summary

Information
Class: IceRpc.Metrics.MetricsInterceptor
Assembly: IceRpc.Metrics
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Metrics/MetricsInterceptor.cs
Tag: 1856_27024993493
Line coverage
89%
Covered lines: 26
Uncovered lines: 3
Coverable lines: 29
Total lines: 61
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%
InvokeAsync()100%22100%
.ctor(...)100%11100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Metrics/MetricsInterceptor.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>An interceptor that publishes invocation metrics using a singleton meter named "IceRpc.Invocation".
 10/// </summary>
 11/// <seealso cref="Meter"/>
 12/// <seealso cref="MetricsPipelineExtensions"/>
 13/// <seealso cref="MetricsInvokerBuilderExtensions"/>
 14public class MetricsInterceptor : IInvoker
 15{
 16    private readonly IInvoker _next;
 17    private readonly InvocationMetrics _invocationMetrics;
 18
 19    /// <summary>Constructs a metrics interceptor.</summary>
 20    /// <param name="next">The next invoker in the invocation pipeline.</param>
 21    public MetricsInterceptor(IInvoker next)
 022        : this(next, InvocationMetrics.Instance)
 023    {
 024    }
 25
 26    /// <inheritdoc/>
 27    public async Task<IncomingResponse> InvokeAsync(OutgoingRequest request, CancellationToken cancellationToken)
 528    {
 529        _invocationMetrics.RequestStart();
 30        try
 531        {
 532            IncomingResponse response = await _next.InvokeAsync(request, cancellationToken).ConfigureAwait(false);
 33            // A non-OK status code means the server returned a failure response.
 234            if (response.StatusCode != StatusCode.Ok)
 135            {
 136                _invocationMetrics.RequestFailure();
 137            }
 238            return response;
 39        }
 240        catch (OperationCanceledException exception) when (exception.CancellationToken == cancellationToken)
 141        {
 142            _invocationMetrics.RequestCancel();
 143            throw;
 44        }
 245        catch
 246        {
 247            _invocationMetrics.RequestFailure();
 248            throw;
 49        }
 50        finally
 551        {
 552            _invocationMetrics.RequestStop();
 553        }
 254    }
 55
 556    internal MetricsInterceptor(IInvoker next, InvocationMetrics invocationMetrics)
 557    {
 558        _next = next;
 559        _invocationMetrics = invocationMetrics;
 560    }
 61}