using LiteCharms.Infrastructure.Database; using LiteCharms.Infrastructure.HealthChecks; namespace LiteCharms.Extensions; public static class Services { public static IServiceCollection AddHealthChecksSupport(this IServiceCollection services, IConfiguration configuration) { services.AddHealthChecks() .AddCheck("Self", () => HealthCheckResult.Healthy()) .AddCheck("PostgreSQL"); //services.AddHealthChecksUI(setup => //{ // setup.AddHealthCheckEndpoint("Lead Generator", $"{configuration["ASPNETCORE_URLS"]}/health"); // setup.SetEvaluationTimeInSeconds(15); //}).AddInMemoryStorage(databaseName: "healthuidb"); return services; } public static IServiceCollection AddLeadGeneratorDatabase(this IServiceCollection services, IConfiguration configuration) { services.AddPooledDbContextFactory(options => options.UseNpgsql(configuration.GetConnectionString("PostgresLeadGenerator"))); return services; } 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; } }