namespace LiteCharms.Features.Extensions; public static class Monitoring { public static WebApplicationBuilder AddMonitoring(this WebApplicationBuilder builder) { var serviceName = builder.Configuration.GetValue("Monitoring:ServiceName") ?? "LiteCharms"; var endpoint = builder.Configuration.GetValue("Monitoring:Address")!; var apiKey = builder.Configuration.GetValue("Monitoring:ApiKey"); var resourceBuilder = ResourceBuilder.CreateDefault() .AddService(serviceName); var otlpHeaders = !string.IsNullOrEmpty(apiKey) ? $"x-otlp-api-key={apiKey}" : null; builder.Logging.AddOpenTelemetry(logging => { logging.SetResourceBuilder(resourceBuilder); logging.AddOtlpExporter(opt => { opt.Endpoint = new Uri(endpoint); opt.Protocol = OtlpExportProtocol.Grpc; opt.Headers = otlpHeaders; }); }); builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .SetResourceBuilder(resourceBuilder) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddOtlpExporter(opt => { opt.Endpoint = new Uri(endpoint); opt.Protocol = OtlpExportProtocol.Grpc; opt.Headers = otlpHeaders; })) .WithMetrics(metrics => metrics .SetResourceBuilder(resourceBuilder) .AddMeter(serviceName) .AddAspNetCoreInstrumentation() .AddRuntimeInstrumentation() .AddOtlpExporter(opt => { opt.Endpoint = new Uri(endpoint); opt.Protocol = OtlpExportProtocol.Grpc; opt.Headers = otlpHeaders; })); return builder; } }