< Summary

Information
Class: ArturRios.Util.WebApi.Handlers.TracePropagationHandler
Assembly: ArturRios.Util.WebApi
File(s): /home/runner/work/dotnet-webapi-util/dotnet-webapi-util/src/Handlers/TracePropagationHandler.cs
Line coverage
100%
Covered lines: 6
Uncovered lines: 0
Coverable lines: 6
Total lines: 37
Line coverage: 100%
Branch coverage
66%
Covered branches: 4
Total branches: 6
Branch coverage: 66.6%
Method coverage
100%
Covered methods: 1
Fully covered methods: 1
Total methods: 1
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
SendAsync(...)66.66%66100%

File(s)

/home/runner/work/dotnet-webapi-util/dotnet-webapi-util/src/Handlers/TracePropagationHandler.cs

#LineLine coverage
 1using System.Diagnostics;
 2using ArturRios.Util.WebApi.Extensions;
 3
 4namespace ArturRios.Util.WebApi.Handlers;
 5
 6/// <summary>
 7///     Propagates the W3C <c>traceparent</c> (and <c>tracestate</c>, when present) headers on outgoing HttpClient
 8///     requests. Register it on typed/named HttpClients with
 9///     <see cref="HttpClientBuilderExtensions.AddTracePropagation"/>.
 10/// </summary>
 11public class TracePropagationHandler : DelegatingHandler
 12{
 13    private const string TraceParentHeader = "traceparent";
 14    private const string TraceStateHeader = "tracestate";
 15
 16    /// <summary>Adds the current <see cref="Activity"/>'s W3C <c>traceparent</c> and <c>tracestate</c> headers to the
 17    /// outgoing request, if they aren't already present, before delegating to the inner handler.</summary>
 18    /// <param name="request">The outgoing HTTP request.</param>
 19    /// <param name="cancellationToken">A token to cancel the send operation.</param>
 20    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
 21        CancellationToken cancellationToken)
 22    {
 223        var activity = Activity.Current;
 24
 225        if (activity is not null && !request.Headers.Contains(TraceParentHeader))
 26        {
 127            request.Headers.TryAddWithoutValidation(TraceParentHeader, activity.ToTraceParent());
 28
 129            if (!string.IsNullOrEmpty(activity.TraceStateString))
 30            {
 131                request.Headers.TryAddWithoutValidation(TraceStateHeader, activity.TraceStateString);
 32            }
 33        }
 34
 235        return base.SendAsync(request, cancellationToken);
 36    }
 37}