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

SpringBoot:健康endpoint缺少领事健康指标

有玄天
2023-03-14

我有一个基于SpringBoot的web应用程序,它公开了一个Consor健康指示器bean gement.health.consur.enabled”设置为true,指示器没有显示在执行器健康endpoint中:<>springboot的自动配置正确创建和初始化的,然而,尽管相关的配置属性“management.health.consur.enabled”设置为true,指示器没有显示在执行器健康endpoint中:<>

{
   "status": "UP",
   "components": {
        "Kafka": {...},
        "SchemaRegistry": {...},
        "discoveryComposite": {...},
        "diskSpace": {...},
        "ping": {...},
        "refreshScope": {...}
    }
}

在进一步检查后,我发现了负责获取所有可用指标的下面片段(HealthEndpoint Configuration.java):

    @Bean
    @ConditionalOnMissingBean
    HealthContributorRegistry healthContributorRegistry(ApplicationContext applicationContext,
            HealthEndpointGroups groups) {
        Map<String, HealthContributor> healthContributors = new LinkedHashMap<>(
                applicationContext.getBeansOfType(HealthContributor.class));
        if (ClassUtils.isPresent("reactor.core.publisher.Flux", applicationContext.getClassLoader())) {
            healthContributors.putAll(new AdaptedReactiveHealthContributors(applicationContext).get());
        }
        return new AutoConfiguredHealthContributorRegistry(healthContributors, groups.getNames());
    }

在这里设置一个断点,我看到ConsultHealthIndicator bean确实没有列在applicationContext的输出中。getBeansOfType(HealthContributor.class)调用如下所示:

有人能解释一下为什么这个特定的bean出现在根上下文中而不是子上下文中吗?

有没有一种方法可以强制它在子上下文中初始化,以便在健康endpoint中正确注册?

我目前正在使用

  • SpringBoot 2.3.1。发布
  • spring-Cloud-starter-consul-all 2.2.4。发布

提前谢谢你。

我附上了一个样本项目,允许复制的问题
我还包括了应用程序使用的领事配置(你可以通过领事导入命令导入它)<运行上面的示例并转到健康endpoint(localhost:8080/monitoring/health),您将清楚地看到列表中缺少consur组件。

共有1个答案

常乐
2023-03-14

为了让consul指标工作,我必须提供我自己的健康贡献者注册表,在那里我在执行健康贡献者bean查找时考虑父上下文:

  @Bean
  HealthContributorRegistry healthContributorRegistry(
      ApplicationContext applicationContext, HealthEndpointGroups groups) {
    Map<String, HealthContributor> healthContributors =
        new LinkedHashMap<>(applicationContext.getBeansOfType(HealthContributor.class));
    ApplicationContext parent = applicationContext.getParent();
    while (parent != null) {
      healthContributors.putAll(parent.getBeansOfType(HealthContributor.class));
      parent = parent.getParent();
    }
    return new DefaultHealthContributorRegistry(healthContributors);
  }

这是一个临时的解决方法,理想情况下,领事指标应该像其他健康贡献者一样开箱即用。

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

  • Spring Cloud Stream为粘合剂提供健康指标。它以binders的名义注册,可以通过设置management.health.binders.enabled属性启用或禁用。

  • 我正在寻找一种方法来改变Spring Boot的健康检查的头部(添加一些东西到它)。我搜索了这个主题,但我只找到了关于自定义健康功能等的问题(例如,如何在spring boot health中添加自定义健康检查?)。那不是我要找的。 我想使用标准/默认健康功能(因此我不想更改响应的主体(“status”:“up”),也不想实现自己的健康功能或自定义默认功能。我的目标是更改响应的标题以实现两个目标:

  • 对于我一直在开发的一个微服务,我创建了一个自定义健康检查类,扩展了AbstractHealthIndicator,并能够在中获得输出 但当我向领事注册服务时,健康检查状态为失败。 尝试将执行器url配置为领事健康检查为spring。云领事发现健康检查url=http://localhost:8080/actuator/health。但它仍然失败,出现错误http://localhost:8566/

  • 在设置ELB健康检查的对话框中,它会声明: 如果实例未通过健康检查,它将自动从负载均衡器中删除。自定义健康检查以满足您的特定需要。 当健康检查失败时,将从ELB后面删除实例。我的问题是围绕“健康门槛”设置。当你悬停在帮助上时,它会说: 在声明EC2实例健康之前连续运行状况检查成功的次数。 如果实例声明为健康的,它是否被拉回负载平衡组?

  • 我正在使用Quarkus构建REST API。我已经启用了以下微文件健康endpointhttps://quarkus.io/guides/microprofile-health 我想知道如何保护或降低<代码>