Пример #1
0
        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);
        }
Пример #2
0
        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);
        }