diff --git a/PostFundManagement.Domain/Extensions/Otel.cs b/PostFundManagement.Domain/Extensions/Otel.cs new file mode 100644 index 0000000..41c0fb3 --- /dev/null +++ b/PostFundManagement.Domain/Extensions/Otel.cs @@ -0,0 +1,52 @@ +namespace PostFundManagement.Domain.Extensions; + +public static class Otel +{ + public static WebApplicationBuilder AddWebTelemetry(this WebApplicationBuilder builder) + { + var serviceName = builder.Configuration.GetValue("Monitoring:ServiceName") ?? "Pfm"; + 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; + } +} \ No newline at end of file