using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StellaOps.Notifier.Worker.Retention; namespace StellaOps.Notifier.Worker.Observability; /// /// Extension methods for registering observability services. /// public static class ObservabilityServiceExtensions { /// /// Adds all observability services (metrics, tracing, dead-letter, chaos, retention). /// public static IServiceCollection AddNotifierObservability( this IServiceCollection services, IConfiguration configuration) { return services .AddNotifierMetrics(configuration) .AddNotifierTracing(configuration) .AddDeadLetterHandling(configuration) .AddChaosEngine(configuration) .AddRetentionPolicies(configuration); } /// /// Adds notifier metrics services. /// public static IServiceCollection AddNotifierMetrics( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(NotifierMetricsOptions.SectionName)); services.AddSingleton(); return services; } /// /// Adds notifier tracing services. /// public static IServiceCollection AddNotifierTracing( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(NotifierTracingOptions.SectionName)); services.AddSingleton(); return services; } /// /// Adds dead-letter handling services. /// public static IServiceCollection AddDeadLetterHandling( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(DeadLetterOptions.SectionName)); services.AddSingleton(); return services; } /// /// Adds chaos engine services. /// public static IServiceCollection AddChaosEngine( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(ChaosEngineOptions.SectionName)); services.AddSingleton(); return services; } /// /// Adds retention policy services. /// public static IServiceCollection AddRetentionPolicies( this IServiceCollection services, IConfiguration configuration) { services.Configure( configuration.GetSection(RetentionOptions.SectionName)); services.AddSingleton(); return services; } /// /// Builder for customizing observability services. /// public static ObservabilityServiceBuilder AddNotifierObservability(this IServiceCollection services) { return new ObservabilityServiceBuilder(services); } } /// /// Builder for customizing observability services. /// public sealed class ObservabilityServiceBuilder { private readonly IServiceCollection _services; public ObservabilityServiceBuilder(IServiceCollection services) { _services = services ?? throw new ArgumentNullException(nameof(services)); } /// /// Configures metrics options. /// public ObservabilityServiceBuilder ConfigureMetrics(Action configure) { _services.Configure(configure); return this; } /// /// Configures tracing options. /// public ObservabilityServiceBuilder ConfigureTracing(Action configure) { _services.Configure(configure); return this; } /// /// Configures dead-letter options. /// public ObservabilityServiceBuilder ConfigureDeadLetter(Action configure) { _services.Configure(configure); return this; } /// /// Configures chaos engine options. /// public ObservabilityServiceBuilder ConfigureChaos(Action configure) { _services.Configure(configure); return this; } /// /// Configures retention options. /// public ObservabilityServiceBuilder ConfigureRetention(Action configure) { _services.Configure(configure); return this; } /// /// Uses a custom metrics implementation. /// public ObservabilityServiceBuilder UseCustomMetrics() where T : class, INotifierMetrics { _services.AddSingleton(); return this; } /// /// Uses a custom tracing implementation. /// public ObservabilityServiceBuilder UseCustomTracing() where T : class, INotifierTracing { _services.AddSingleton(); return this; } /// /// Uses a custom dead-letter handler. /// public ObservabilityServiceBuilder UseCustomDeadLetterHandler() where T : class, IDeadLetterHandler { _services.AddSingleton(); return this; } /// /// Uses a custom chaos engine. /// public ObservabilityServiceBuilder UseCustomChaosEngine() where T : class, IChaosEngine { _services.AddSingleton(); return this; } /// /// Uses a custom retention policy service. /// public ObservabilityServiceBuilder UseCustomRetentionService() where T : class, IRetentionPolicyService { _services.AddSingleton(); return this; } /// /// Builds the services with default implementations. /// public IServiceCollection Build() { // Register defaults if not already registered _services.TryAddSingleton(); _services.TryAddSingleton(); _services.TryAddSingleton(); _services.TryAddSingleton(); _services.TryAddSingleton(); return _services; } } /// /// Extension methods for service collection to ensure singleton registration. /// file static class ServiceCollectionExtensions { public static void TryAddSingleton(this IServiceCollection services) where TService : class where TImplementation : class, TService { if (!services.Any(s => s.ServiceType == typeof(TService))) { services.AddSingleton(); } } }