public static IServiceCollection AddHealthChecksUI(this IServiceCollection services, string databaseName = "healthchecksdb") { var configuration = services.BuildServiceProvider() .GetService <IConfiguration>(); var healthCheckSettings = new Settings(); var kubernetesDiscoverySettings = new KubernetesDiscoverySettings(); configuration.Bind(Keys.HEALTHCHECKSUI_SECTION_SETTING_KEY, healthCheckSettings); configuration.Bind(Keys.HEALTHCHECKSUI_KUBERNETES_DISCOVERY_SETTING_KEY, kubernetesDiscoverySettings); services .AddOptions() .Configure <Settings>(settings => configuration.Bind(Keys.HEALTHCHECKSUI_SECTION_SETTING_KEY, settings)) .AddSingleton <IHostedService, HealthCheckCollectorHostedService>() .AddScoped <IHealthCheckFailureNotifier, WebHookFailureNotifier>() .AddScoped <IHealthCheckReportCollector, HealthCheckReportCollector>() .AddHttpClient(Keys.HEALTH_CHECK_HTTP_CLIENT_NAME); services.AddDbContext <HealthChecksDb>(db => { var connectionString = healthCheckSettings.HealthCheckDatabaseConnectionString; if (string.IsNullOrWhiteSpace(connectionString)) { var contentRoot = configuration[HostDefaults.ContentRootKey]; var path = Path.Combine(contentRoot, databaseName); connectionString = $"Data Source={path}"; } else { connectionString = Environment.ExpandEnvironmentVariables(connectionString); } db.UseSqlite(connectionString); }); if (kubernetesDiscoverySettings.Enabled) { services.AddSingleton(kubernetesDiscoverySettings) .AddHostedService <KubernetesDiscoveryHostedService>() .AddHttpClient(Keys.K8S_DISCOVERY_HTTP_CLIENT_NAME, (provider, client) => client.ConfigureKubernetesClient(provider)) .ConfigureKubernetesMessageHandler() .Services .AddHttpClient(Keys.K8S_CLUSTER_SERVICE_HTTP_CLIENT_NAME); } var serviceProvider = services.BuildServiceProvider(); CreateDatabase(serviceProvider).Wait(); return(services); }
static IServiceCollection AddKubernetesDiscoveryService(this IServiceCollection services, KubernetesDiscoverySettings kubernetesDiscoverySettings) { KubernetesClientConfiguration kubernetesConfig; if (!string.IsNullOrEmpty(kubernetesDiscoverySettings.ClusterHost) && !string.IsNullOrEmpty(kubernetesDiscoverySettings.Token)) { kubernetesConfig = new KubernetesClientConfiguration { Host = kubernetesDiscoverySettings.ClusterHost, AccessToken = kubernetesDiscoverySettings.Token, // Some cloud services like Azure AKS use self-signed certificates not valid for httpclient. // With this method we allow invalid certificates SkipTlsVerify = true }; } else if (KubernetesClientConfiguration.IsInCluster()) { kubernetesConfig = KubernetesClientConfiguration.InClusterConfig(); } else { kubernetesConfig = KubernetesClientConfiguration.BuildConfigFromConfigFile(); } services.AddSingleton(kubernetesDiscoverySettings) .AddHostedService <KubernetesDiscoveryHostedService>() .AddSingleton <IKubernetes>(new Kubernetes(kubernetesConfig)) .AddHttpClient(Keys.K8S_CLUSTER_SERVICE_HTTP_CLIENT_NAME); return(services); }