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();
}
}
}