【发布时间】:2020-08-21 07:43:42
【问题描述】:
我有一个基于 SpringBoot 的 Web 应用程序,它公开了一个 consul 健康指示器 bean。
bean 由 springboot 的自动配置正确创建和初始化,但是,尽管关联的配置属性“management.health.consul.enabled”设置为 true,但指标并未显示在执行器健康端点中:
{
"status": "UP",
"components": {
"Kafka": {...},
"SchemaRegistry": {...},
"discoveryComposite": {...},
"diskSpace": {...},
"ping": {...},
"refreshScope": {...}
}
}
经过进一步检查,我发现了负责获取所有可用指标的波纹管 sn-p (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());
}
在那里设置断点,我看到 ConsulHealthIndicator bean 确实没有列在 applicationContext.getBeansOfType(HealthContributor.class) 调用的输出中,如下所示:
但是当我使用父应用程序上下文测试相同的调用时,我得到以下信息:
有人能解释一下为什么root context 中出现了这个特定的 bean,而child context 中却没有吗?
有没有办法强制它在子上下文中初始化,以便在健康端点中正确注册?
我附上了a sample project 允许重现问题。我还包含了应用程序使用的 consul 配置示例(您可以通过 consul import 命令导入它)。 运行上面的示例并转到健康端点(localhost:8080/monitoring/health),您会清楚地看到列表中缺少 consul 组件。
提前谢谢你。
【问题讨论】:
-
其他执行器端点怎么样?他们工作正常吗?喜欢 /beans
-
@DineshDontha 是的,所有端点都工作正常(包括健康端点),这只是由于弹簧上下文层次结构问题而没有显示的领事健康指标的问题。
标签: java spring spring-boot spring-boot-actuator consul