java - 如何在 Spring Boot 中禁用个人健康指标?
问题描述
我需要为单个数据源禁用 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));
}
}
解决方案
这似乎有效:
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);
}
}
推荐阅读
- python - 使用 Keras 构建 LSTM+Conv2D 模型
- python - 如何使用 Python 和 TF、Keras 从照片(.jpg 格式)中识别数字?
- php - 在 PHP 中从前端(客户端)发送 HTTP 请求
- go - 这段代码什么时候覆盖了 slice 元素?
- ajax - 查看实际响应而不是“此请求没有可用的响应数据”
- python - Python使用'url_for'寻找图像文件
- google-sheets - 在设定范围内寻找一个值并返回一个设定值
- python - 用于强制字符串的正则表达式包含英文字母和数字
- python-3.x - 控制参数更改时如何“刷新” wxpython gui?
- python-3.x - 为什么我的代码找不到我的文件/目录