You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java代码中通过Spring API获取Actuator健康检查结果?

获取Spring Boot Actuator健康检查组件状态的Java实现方案

当然可以通过Spring的API直接获取健康检查的组件状态,而且完全不需要自己去解析/actuator/health的JSON响应——Spring已经提供了更优雅的内部API来实现这个需求。下面分几种场景给你具体的实现思路:

1. 直接通过HealthEndpoint获取完整健康状态

这是最直接的方式,你可以注入HealthEndpoint来获取所有组件的健康信息,然后遍历找出状态为DOWN的组件:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class HealthMonitorService {

    private final HealthEndpoint healthEndpoint;
    // 假设你已经实现了这个Slack通知服务
    private final SlackNotificationService slackNotificationService;

    public HealthMonitorService(HealthEndpoint healthEndpoint, SlackNotificationService slackNotificationService) {
        this.healthEndpoint = healthEndpoint;
        this.slackNotificationService = slackNotificationService;
    }

    // 可以用@Scheduled注解定时调用,比如每分钟检查一次
    public void checkAndNotifyFailedComponents() {
        Health overallHealth = healthEndpoint.health();
        Map<String, Health> components = overallHealth.getDetails();

        for (Map.Entry<String, Health> entry : components.entrySet()) {
            String componentName = entry.getKey();
            Health componentHealth = entry.getValue();

            if (componentHealth.getStatus().equals(Health.Status.DOWN)) {
                // 调用你的Slack通知方法,传入故障组件名和状态
                slackNotificationService.triggerSlackNotifications(componentName, componentHealth.getStatus().toString());
            }
        }
    }
}

2. 针对你的自定义HealthIndicator的优化

你现在重写的health()方法是自定义HealthIndicator的逻辑,这个方法只会反映当前Indicator对应的单个组件状态,不会自动聚合DB这类其他组件的状态。如果想在整体健康状态变为DOWN时触发通知并获取所有故障组件,建议:

  • 不要在自定义Indicator里直接触发通知,而是通过定时调用上面的checkAndNotifyFailedComponents()方法,或者用下面的实时监听方案。
  • 如果你确实想在自定义Indicator里关联其他组件状态,可以注入HealthAggregator或者直接获取其他HealthIndicator实例,但这种方式灵活性较差,不如直接用HealthEndpoint方便。

3. 实时监听健康状态变化

如果希望实时感知健康状态变化,而非定时轮询,可以使用Spring的ApplicationListener监听HealthChangedEvent:

import org.springframework.boot.actuate.health.HealthChangedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class HealthChangeListener implements ApplicationListener<HealthChangedEvent> {

    private final SlackNotificationService slackNotificationService;

    public HealthChangeListener(SlackNotificationService slackNotificationService) {
        this.slackNotificationService = slackNotificationService;
    }

    @Override
    public void onApplicationEvent(HealthChangedEvent event) {
        Map<String, Health> components = event.getHealth().getDetails();

        components.forEach((componentName, health) -> {
            if (health.getStatus().equals(Health.Status.DOWN)) {
                slackNotificationService.triggerSlackNotifications(componentName, health.getStatus().toString());
            }
        });
    }
}

关键注意事项

  • 确保你的项目已经引入Actuator依赖,且HealthEndpoint处于启用状态(默认启用,若有安全配置需允许内部访问)。
  • 若只关心DB组件,可以在遍历的时候直接判断componentName.equals("db"),针对性处理。
  • 建议添加去重逻辑:记录上次通知的组件状态,仅当状态从UP变为DOWN时发送通知,避免重复告警。

内容的提问来源于stack exchange,提问作者David Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:59:38