< Summary

Information
Class: ClutterStock.Api.Extensions.OpenTelemetryServiceExtensions
Assembly: Api
File(s): /home/runner/work/ClutterStock/ClutterStock/backend/src/Api/Extensions/OpenTelemetryServiceExtensions.cs
Tag: 58_25416222083
Line coverage
100%
Covered lines: 35
Uncovered lines: 0
Coverable lines: 35
Total lines: 53
Line coverage: 100%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddOpenTelemetryObservability(...)50%22100%

File(s)

/home/runner/work/ClutterStock/ClutterStock/backend/src/Api/Extensions/OpenTelemetryServiceExtensions.cs

#LineLine coverage
 1using System.Reflection;
 2using System.Security.Claims;
 3using OpenTelemetry.Logs;
 4using OpenTelemetry.Metrics;
 5using OpenTelemetry.Resources;
 6using OpenTelemetry.Trace;
 7
 8namespace ClutterStock.Api.Extensions;
 9
 10internal static class OpenTelemetryServiceExtensions
 11{
 12    public static IServiceCollection AddOpenTelemetryObservability(this IServiceCollection services,
 13                                                                   IHostEnvironment environment)
 14    {
 315        var serviceVersion = Assembly.GetExecutingAssembly()
 316                                     .GetName()
 317                                     .Version?.ToString();
 18
 319        services.AddOpenTelemetry()
 320                .ConfigureResource(resource => resource.AddService(
 321                                       environment.ApplicationName,
 322                                       serviceVersion: serviceVersion))
 323                .WithTracing(static tracing => tracing
 324                                               .AddAspNetCoreInstrumentation(static options =>
 325                                               {
 326                                                   options.RecordException = true;
 327                                                   options.Filter = static ctx =>
 328                                                       !ctx.Request.Path.StartsWithSegments("/healthz");
 329                                                   options.EnrichWithHttpResponse = static (activity, response) =>
 330                                                   {
 331                                                       var user = response.HttpContext.User;
 332                                                       if (user.Identity?.IsAuthenticated != true)
 333                                                           return;
 334
 335                                                       var userId = user.FindFirstValue("sub")
 336                                                                    ?? user.FindFirstValue(ClaimTypes.NameIdentifier);
 337                                                       if (!string.IsNullOrEmpty(userId))
 338                                                           activity.SetTag("enduser.id", userId);
 339                                                   };
 340                                               })
 341                                               .AddHttpClientInstrumentation(static options => options.RecordException =
 342                                               .AddEntityFrameworkCoreInstrumentation()
 343                                               .AddOtlpExporter())
 344                .WithMetrics(static metrics => metrics
 345                                               .AddAspNetCoreInstrumentation()
 346                                               .AddRuntimeInstrumentation()
 347                                               .AddOtlpExporter())
 348                .WithLogging(static logging => logging
 349                                 .AddOtlpExporter());
 50
 351        return services;
 52    }
 53}