当前位置: 首页 > 知识库问答 >
问题:

禁用和替换默认数据源健康指示器

融修平
2023-03-14

我目前正在使用Spring Boot Actuator“health”endpoint实现一个健康监控框架。致动器基础设施支持创建自定义健康检查,并提供大量内置健康检查;其中一个是数据源HealthIndicator

datasourcehealthdindicator组织的一部分。springframework。靴子启动。health软件包,目前我们的health framework正在使用它来检查数据源的运行状况。我需要使用自己稍微修改过的datasourcehealthdindicator版本,并禁用“默认值”

我已经尝试了这里和这里建议的解决方案,但没有成功。我能做错什么?

谢谢

编辑:8/18/2016, 3:38PM EST

我已将bean重命名为dbhealthdindicator,并将以下内容添加到我的配置类中:

@Bean
public HealthIndicator dbHealthIndicator() {
     return new dbHealthIndicator();
}

我现在得到以下例外情况:

org。springframework。豆。工厂BeanCreationException:创建名为“dataAccessMapperFactory”的bean时出错,该bean在类路径资源[udtContext.xml]中定义。

java.lang.RuntimeException:java.sql.SQLException:无法启动通用连接池:oracle.ucp.UniversalConnectionPoolException

编辑:8/19/2016, 9:22AM EST

这可能有助于证明我正在努力做什么。目前,我的/healthendpoint返回如下内容:

dataSource: {
     status: "UP",
     database: "mySql",
     hello: "hello"
}

我想让它返回更像这样的内容,“result”旁边的整数是数据库中存储过程返回的状态码:

dataSource: {
     status: "UP",
     database: "mySql",
     hello: "hello",
     result: 0
}

这是数据源HealthIndicator中的方法。执行检查的java:

private void doDataSourceHealthCheck(Health.Builder builder) throws Exception {
    String product = getProduct();
    builder.up().withDetail("database", product);
    String validationQuery = getValidationQuery(product);
    if (StringUtils.hasText(validationQuery)) {
        try {
            // Avoid calling getObject as it breaks MySQL on Java 7
            List<Object> results = this.jdbcTemplate.query(validationQuery,
                    new SingleColumnRowMapper());
            Object result = DataAccessUtils.requiredSingleResult(results);
            builder.withDetail("hello", result);
        }
        catch (Exception ex) {
            builder.down(ex);
        }
    }
}

我需要在builder下为这个方法添加八行代码。withDetail(“你好”,结果) ,以执行对存储过程的调用。我不想“反编译”默认类,我无法重写这个方法,因为它是私有的。我在想我可以复制数据源HealthIndicator。java在我自己的bean中编写代码,添加我的代码,并重新连接Spring以使用这个版本,但我不知道这是否可行。


共有1个答案

司徒鸿文
2023-03-14

通常我会查看该HealthIndex ator的配置。在这种情况下,它是HealthIndex atorAutoConfiguration。DataSourcesHealthIndex atorConfiguration。正如第一个链接建议所述。您需要将您的自定义bean命名为dbHealthIndex ator,以便@HRC tionalOnMissingBean(name="dbHealthIndex ator")不允许注册默认值。

提供一些启动日志或不适用于您的详细信息将有助于人们排除故障。

下面是我如何让它工作的一个例子:

@SpringBootApplication
public class StackoverflowWebmvcSandboxApplication {
    @Bean
    public HealthIndicator dbHealthIndicator() {
        return new HealthIndicator() {

            @Override
            public Health health() {
                return Health.status(Status.UP).withDetail("hello", "hi").build();
            }
        };
    }

    public static void main(String[] args) {
        SpringApplication.run(StackoverflowWebmvcSandboxApplication.class, args);
    }

    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello() {
            return "hello";
        }
    }
}

然后,/healthendpoint返回:

{
    "status": "UP",
    "db": {
        "status": "UP",
        "hello": "hi"
    },
    "diskSpace": {
        "status": "UP",
        "total": 127927316480,
        "free": 17191956480,
        "threshold": 10485760
    }
}
 类似资料:
  • Spring Cloud Stream为粘合剂提供健康指标。它以binders的名义注册,可以通过设置management.health.binders.enabled属性启用或禁用。

  • 我用的是Spring靴2 M3执行器。默认情况下,健康endpoint映射到。 是否可以将此路径更改为?

  • 我有一个基于SpringBoot的web应用程序,它公开了一个Consult health indicator bean。 该bean由SpringBoot的autoconfiguration正确创建和初始化,但是,尽管关联的配置属性“Management.health.consul.Enabled”设置为true,但指示器并未显示在执行器健康endpoint中: 经过进一步检查,我发现了负责获取

  • 我有spring boot 2 REST应用程序,启用了Spring执行器。默认情况下,spring会在endpoint中生成大量指标(jvm、cpu、内存等)。除此之外,我还使用测微计API创建自定义指标。到目前为止,它一直运行得很好。 现在,我需要只生成自定义指标,但禁用spring提供的所有默认指标。请注意,我不想禁用endpoint,但我只想禁用默认指标。 现在直接/间接地可能吗? 谢谢你

  • 我有一个基于SpringBoot的web应用程序,它公开了一个Consor健康指示器bean 在进一步检查后,我发现了负责获取所有可用指标的下面片段(HealthEndpoint Configuration.java): 在这里设置一个断点,我看到ConsultHealthIndicator bean确实没有列在applicationContext的输出中。getBeansOfType(Healt

  • 我们已经在几个项目中使用了Spring Boot,现在我们使用的是最新版本1.2.3。我们正在合并执行器。到目前为止,一切都很顺利,只是我们发现/health指示器[default]显示服务已关闭。事实并非如此。这些服务是通过数据源实现的。它可以调用其他SOAP或Rest服务。卫生服务部门在看什么来衡量一项服务是否下降?