我想知道是否存在某种方式来禁用SpringBoot执行器对特定SpringBoot的监视。
场景: One Microservice使用3条数据资源,但由于某些业务原因,其中一条数据资源不需要由监视。
如何禁用对特定DataSource的监视?
事先非常感谢
胡安·安东尼奥
发布于 2017-10-14 17:01:09
我认为您必须禁用默认的数据源健康指示符,使用此属性可以这样做:
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都将自动注册到health
执行器中,所以您只需要让Spring创建您的自定义HealthIndicator
,它就会被执行器公开。
对于背景,您可以看到Spring如何配置默认数据源健康状况签入:org.springframework.boot.actuate.autoconfigure.DataSourcesHealthIndicatorConfiguration
。
发布于 2019-04-11 14:25:20
从Spring 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));
}
}
发布于 2021-11-19 13:03:30
我认为最简单的方法是
@Configuration
public class DatasourceHealthCheckConfig extends DataSourceHealthContributorAutoConfiguration {
public DatasourceHealthCheckConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
super(dataSources, metadataProviders);
}
@Override
public HealthContributor dbHealthContributor(Map<String, DataSource> dataSources) {
// remove the required datasource from the dataSources map by its name
return super.dbHealthContributor(dataSources);
}
}
https://stackoverflow.com/questions/46746784
复制相似问题