如何在Spring Boot中禁用单个运行状况指示器?



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

我采取的路径是扩展DataSourceHealthContributorAutoConfiguration。我知道当DataSourceHealthIndicatorAutoConfiguration在发挥作用时,这是可以工作的,但现在它是一个子接口,它不像预期的那样工作。

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

现实:数据源似乎在启动时被过滤掉了,然而,仍然为所有数据源调用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));
}
}

这似乎起作用了:

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);
}
}

最新更新