我想知道是否存在一些方法来禁止SpringBoot Actuator监视特定数据源。
场景:一个微服务使用3个数据源但是对于某些业务原因,它们是一个数据源,没有必要由Spring Boot Health Indicator监控。
如何禁用某个特定DataSource的监控?
提前谢谢了
Juan Antonio
我认为您必须禁用默认数据源运行状况指示器,您可以使用此属性执行此操作:
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
。
从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));
}
}