不监视特定的数据源以进行运行状况检查

时间:2017-10-14 16:27:13

标签: spring spring-boot spring-boot-actuator

我想知道是否存在某种方法来禁止SpringBoot Actuator监视特定数据源。

情境: 一个微服务使用3个数据源但是对于某些业务原因,它们是一个数据源,没有必要由Spring Boot Health Indicator监控。

如何禁用某个特定数据源的监控?

非常感谢提前

Juan Antonio

2 个答案:

答案 0 :(得分:6)

我认为您必须禁用默认数据源运行状况指示器,您可以使用此属性执行此操作:

management.health.db.enabled=false

然后配置您自己的健康指标,这些指标仅解决您感兴趣的数据源,可能是这样的:

@Autowired
private DataSource dataSourceA;

@Autowired
private DataSource dataSourceB;

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorA() {
    return new DataSourceHealthIndicator(dataSourceA);
}

@Bean
public DataSourceHealthIndicator dataSourceHealthIndicatorB() {
    return new DataSourceHealthIndicator(dataSourceB);
}

或者,或者编写自己的多个数据源健康指标'通过扩展AbstractHealthIndicator并仅将您感兴趣的Datasources注入其中。任何类型为HealthIndicator的Spring bean都将自动注册到health执行器,因此您只需让Spring创建自定义HealthIndicator,它就会被执行器暴露出来。

对于后台,您可以看到Spring如何配置默认数据源运行状况检查:org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration

答案 1 :(得分:0)

从Spring Boot 2开始,您可以通过覆盖org.springframework.boot.actuate.autoconfigure.jdbcDataSourceHealthIndicatorAutoConfiguration从运行状况检查中过滤数据源。在下面的示例中,没有池名称的数据源被过滤。

@Configuration
public class YourDataSourceHealthIndicatorAutoConfiguration extends DataSourceHealthIndicatorAutoConfiguration {

    public NonMigrationDataSourceHealthIndicatorAutoConfiguration(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
        // Filter out datasources without a pool name
        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.getPoolName() != null;
                    } else {
                        return true;
                    }
                }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }
}