< Summary

Information
Class: Api.ServiceExtension.OpenTelemetryCollectionExtensions
Assembly: Api
File(s): /home/runner/work/CleanArchitectureTemplate/CleanArchitectureTemplate/src/Api/ServiceExtension/OpenTelemetry.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 48
Coverable lines: 48
Total lines: 72
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddOpenTelemetryWithExporters(...)0%4260%
AddJaeger(...)100%210%
AddZipkin(...)100%210%

File(s)

/home/runner/work/CleanArchitectureTemplate/CleanArchitectureTemplate/src/Api/ServiceExtension/OpenTelemetry.cs

#LineLine coverage
 1using OpenTelemetry.Logs;
 2using OpenTelemetry.Metrics;
 3using OpenTelemetry.Resources;
 4using OpenTelemetry.Trace;
 5
 6namespace Api.ServiceExtension;
 7
 8[Flags]
 9public enum TelemetryExporters {
 10  None = 0,
 11  Jaeger = 1,
 12  Zipkin = 2
 13}
 14
 15public static class OpenTelemetryCollectionExtensions {
 16  public static IServiceCollection AddOpenTelemetryWithExporters(
 17       this IServiceCollection services,
 18       IConfiguration configuration,
 019       TelemetryExporters exporters) {
 020    var serviceName = configuration.GetValue<string>("OpenTelemetry:ServiceName") ?? "DefaultApi";
 21
 022    services.AddOpenTelemetry()
 023        .WithTracing(tracer => {
 024          tracer
 025                  .SetSampler<AlwaysOnSampler>()
 026                  .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName))
 027                  .AddAspNetCoreInstrumentation()
 028                  .AddHttpClientInstrumentation();
 029
 030          if (exporters.HasFlag(TelemetryExporters.Jaeger))
 031            tracer.AddJaeger(configuration);
 032          if (exporters.HasFlag(TelemetryExporters.Zipkin))
 033            tracer.AddZipkin(configuration);
 034        })
 035        .WithMetrics(metrics => {
 036          metrics
 037                  .AddAspNetCoreInstrumentation()
 038                  .AddHttpClientInstrumentation()
 039                  .AddRuntimeInstrumentation()
 040                  .AddMeter(
 041                      "Microsoft.AspNetCore.Hosting",
 042                      "Microsoft.AspNetCore.Server.Kestrel",
 043                      "Microsoft.AspNetCore.Http.Connections",
 044                      "System.Net.Http",
 045                      serviceName,
 046                      "Microsoft.AspNetCore.Routing",
 047                      "Microsoft.AspNetCore.Diagnostics",
 048                      "Microsoft.AspNetCore.RateLimiting");
 049        });
 50
 051    services.Configure<OpenTelemetryLoggerOptions>(logging =>
 052        logging.AddOtlpExporter());
 53
 054    return services;
 055  }
 56
 057  public static TracerProviderBuilder AddJaeger(this TracerProviderBuilder builder, IConfiguration configuration) {
 058    var port = configuration.GetValue("Ports:JAEGER_PORT", "4317");
 059    builder.AddOtlpExporter(opt => {
 060      opt.Endpoint = new Uri($"http://jaeger:{port}");
 061    });
 062    return builder;
 063  }
 64
 065  public static TracerProviderBuilder AddZipkin(this TracerProviderBuilder builder, IConfiguration configuration) {
 066    var port = configuration.GetValue("Ports:ZIPKIN_PORT", "9411");
 067    builder.AddZipkinExporter(opt => {
 068      opt.Endpoint = new Uri($"http://zipkin:{port}/api/v2/spans");
 069    });
 070    return builder;
 071  }
 72}