creates simple healthchecks
This commit is contained in:
85
HealthCheckServiceCollectionExtensions.cs
Normal file
85
HealthCheckServiceCollectionExtensions.cs
Normal file
@@ -0,0 +1,85 @@
|
||||
using MCVIngenieros.Healthchecks.__;
|
||||
using MCVIngenieros.Healthchecks.__.__Controllers;
|
||||
using MCVIngenieros.Healthchecks.Abstracts;
|
||||
using MCVIngenieros.Healthchecks.Options;
|
||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using Microsoft.Extensions.Options;
|
||||
using System.Reflection;
|
||||
|
||||
namespace MCVIngenieros.Healthchecks;
|
||||
|
||||
// Extension methods for IServiceCollection
|
||||
public static class HealthCheckServiceCollectionExtensions
|
||||
{
|
||||
private static IServiceCollection AddHealthChecksSupport(this IServiceCollection services, HealthCheckContainerOptions options)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(services, nameof(services));
|
||||
services.AddSingleton<IHealthCheckContainer, HealthCheckContainer>();
|
||||
services.AddSingleton(Microsoft.Extensions.Options.Options.Create(options));
|
||||
services.AddCheck<ImAliveHealthcheck>();
|
||||
services.AddControllers().AddApplicationPart(typeof(HealthCheckController).Assembly);
|
||||
return services;
|
||||
}
|
||||
|
||||
public static IServiceCollection AddHealthChecksSupport(this IServiceCollection services)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(services, nameof(services));
|
||||
var options = new HealthCheckContainerOptions();
|
||||
|
||||
var scope = services.BuildServiceProvider().CreateScope();
|
||||
var config = scope.ServiceProvider.GetRequiredService<IConfiguration>();
|
||||
scope.Dispose();
|
||||
services.Configure<HealthCheckOptions>(nameof(HealthCheckOptions), config.GetSection(nameof(HealthChecksConfigs)));
|
||||
scope = services.BuildServiceProvider().CreateScope();
|
||||
var hcopts = scope.ServiceProvider
|
||||
.GetRequiredService<IOptionsSnapshot<HealthCheckOptions>>().Get(nameof(HealthCheckOptions));
|
||||
scope.Dispose();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(hcopts.CacheDuration) && TimeSpan.TryParse(hcopts.CacheDuration, out TimeSpan cacheDuration))
|
||||
{
|
||||
options.CacheDuration = cacheDuration;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(hcopts.Timeout) && TimeSpan.TryParse(hcopts.Timeout, out TimeSpan timeout))
|
||||
{
|
||||
options.Timeout = timeout;
|
||||
}
|
||||
|
||||
if (hcopts.AssembliesToScan != null && hcopts.AssembliesToScan.Length > 0)
|
||||
{
|
||||
options.AssembliesToScan = hcopts.AssembliesToScan.Select(Assembly.Load);
|
||||
}
|
||||
|
||||
return services.AddHealthChecksSupport(options);
|
||||
}
|
||||
|
||||
public static IServiceCollection AddHealthChecksSupport(this IServiceCollection services, Action<HealthCheckContainerOptions>? configure = null)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(services, nameof(services));
|
||||
ArgumentNullException.ThrowIfNull(configure, nameof(configure));
|
||||
var options = new HealthCheckContainerOptions();
|
||||
configure?.Invoke(options);
|
||||
return services.AddHealthChecksSupport(options);
|
||||
}
|
||||
|
||||
public static IServiceCollection AddHealthCheck<T>(this IServiceCollection services)
|
||||
where T : class, IHealthCheck
|
||||
=> services.AddCheck<T>();
|
||||
|
||||
public static IServiceCollection AddCheck<T>(this IServiceCollection services)
|
||||
where T : class, IHealthCheck
|
||||
{
|
||||
services.TryAddTransient<IHealthCheck, T>();
|
||||
return services;
|
||||
}
|
||||
|
||||
public static IServiceCollection DiscoverHealthChecks(this IServiceCollection services)
|
||||
{
|
||||
// This will trigger the discovery when the container is built
|
||||
var provider = services.BuildServiceProvider();
|
||||
var container = provider.GetRequiredService<IHealthCheckContainer>();
|
||||
container.DiscoverHealthChecks();
|
||||
return services;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user