【问题标题】:How to disable individual health indicator in Spring Boot?如何在 Spring Boot 中禁用个人健康指标?
【发布时间】:2021-05-09 04:24:14
【问题描述】:

我需要为单个数据源禁用 Spring Boot 运行状况指示器(我们有很多,我不想全部禁用它们或为其他数据源创建指示器,如果可能的话)。

我采取的方法是扩展 DataSourceHealthContributorAutoConfiguration。我知道这曾经在 DataSourceHealthIndicatorAutoConfiguration 发挥作用时起作用,但现在它是一个子接口,它无法按预期工作。

预期:不会检查使用 Snowflake 驱动程序的数据源的运行状况指示器

现实:数据源似乎在启动时被过滤掉了,但是仍然为所有数据源调用 createIndicator。

如果需要更多信息,请告诉我。这是我第一次尝试更改 java 代码,所以我可能会遗漏一些东西。

package com.org.database.snowflake.config;

import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration;
import java.util.Map;
import java.util.stream.Collectors;

@Configuration
public class ExcludeSnowflakeHealthIndicatorConfig extends DataSourceHealthContributorAutoConfiguration {

    public ExcludeSnowflakeHealthIndicatorConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
        // Filter out data sources that use the Snowflake Driver
        super(filterDataSources(dataSources), metadataProviders);
    }

    private static Map<String, DataSource> filterDataSources(Map<String, DataSource> dataSources) {
        return dataSources.entrySet().stream()
                .filter(dataSourceEntry -> {
                    if (dataSourceEntry.getValue() instanceof HikariDataSource) {
                        HikariDataSource hikariDataSource = (HikariDataSource) dataSourceEntry.getValue();
                        return !hikariDataSource.getDriverClassName().equals("net.snowflake.client.jdbc.SnowflakeDriver");
                    } else {
                        return true;
                    }
                }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }
}

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    这似乎有效:

    package com.org.database.snowflake.config;
    
    import com.zaxxer.hikari.HikariDataSource;
    import javax.sql.DataSource;
    import org.springframework.beans.factory.ObjectProvider;
    import org.springframework.boot.actuate.health.HealthContributor;
    import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    @Configuration
    public class ExcludeSnowflakeHealthIndicatorConfig extends DataSourceHealthContributorAutoConfiguration {
        private final Map<String, DataSource> ds;
    
        public ExcludeSnowflakeHealthIndicatorConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
            // Filter out data sources that use the Snowflake Driver
            super(filterDataSources(dataSources), metadataProviders);
            this.ds = filterDataSources(dataSources);
        }
    
        private static Map<String, DataSource> filterDataSources(Map<String, DataSource> dataSources) {
            return dataSources.entrySet().stream()
                    .filter(dataSourceEntry -> {
                        if (dataSourceEntry.getValue() instanceof HikariDataSource) {
                            HikariDataSource hikariDataSource = (HikariDataSource) dataSourceEntry.getValue();
                            return !hikariDataSource.getDriverClassName().equals("net.snowflake.client.jdbc.SnowflakeDriver");
                        } else {
                            return true;
                        }
                    }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        }
    
        @Bean
        public HealthContributor dbHealthContributor(Map<String, DataSource> dataSources) {
            return super.dbHealthContributor(ds);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-28
      • 2015-07-04
      • 2021-02-28
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多