springboot:运行状况终结点中缺少consur运行状况指示器

ergxz8rk  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(369)

我有一个基于springboot的web应用程序,它公开了一个consur健康指示器bean。
bean是通过springboot的自动配置正确创建和初始化的,但是,尽管关联的配置属性“management.health.consur.enabled”设置为true,指示器仍没有显示在actuator health端点中:

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

进一步检查后,我发现下面的代码片段负责获取所有可用的指示符(healthendpointconfiguration.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出现在根上下文中而不是子上下文中吗?
有没有办法强制它在子上下文中初始化,以便它在健康端点中正确注册?
我正在使用
springboot 2.3.1.版本
spring cloud starter Consour 2.2.4.0全部发布
先谢谢你。

编辑

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

fxnxkyjh

fxnxkyjh1#

为了让consur指示器工作,我必须提供自己的healthcributorregistry,在执行healthcributorbean查找时考虑父上下文:

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

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

相关问题