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

如何在Spring Boot健康检查状态变更时收到通知并同步至Prometheus指标?

当然有办法啦!我之前帮好几个开发者搞定过类似的需求,刚好可以给你一套落地性很强的方案——既能实时捕获健康检查指示器的状态变化,又能同步更新Prometheus指标,完美匹配你的需求。

1. 监听健康状态变更事件

Spring Boot 2.2版本之后提供了HealthChangedEvent事件机制,只要通过事件监听就能轻松捕获健康状态的变化。你可以写一个监听器类,用@EventListener注解来处理状态变更:

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

@Component
public class HealthStatusChangeListener {
    private final HealthMetrics healthMetrics;

    // 构造注入Prometheus指标维护类
    public HealthStatusChangeListener(HealthMetrics healthMetrics) {
        this.healthMetrics = healthMetrics;
    }

    @EventListener
    public void handleHealthChange(HealthChangedEvent event) {
        // 遍历所有健康检查指示器的状态变化
        event.getHealth().getDetails().forEach((indicatorName, state) -> {
            String status = state.toString();
            System.out.printf("指示器「%s」状态变更为: %s%n", indicatorName, status);

            // 同步更新Prometheus指标
            healthMetrics.updateIndicatorStatus(indicatorName, status);

            // 针对特定指示器(比如数据库)的特殊处理
            if ("db".equals(indicatorName) && "DOWN".equals(status)) {
                handleDatabaseDown();
            }
        });
    }

    // 数据库状态变为DOWN时的自定义操作
    private void handleDatabaseDown() {
        System.out.println("数据库健康状态触发DOWN告警,执行应急处理逻辑...");
        // 这里可以加发送邮件、调用告警接口等逻辑
    }
}

2. 同步维护Prometheus指标

要把健康状态导出为Prometheus可识别的指标,推荐用Spring Boot默认集成的Micrometer工具。我们可以用Gauge类型的指标来维护每个指示器的状态(比如用1代表UP,0代表DOWN),这样Prometheus就能实时抓取到状态值:

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@Component
public class HealthMetrics {
    // 用并发Map存储每个指示器的当前状态值
    private final ConcurrentMap<String, Integer> indicatorStatusMap = new ConcurrentHashMap<>();

    public HealthMetrics(MeterRegistry meterRegistry) {
        // 注册数据库健康状态指标
        Gauge.builder("health_indicator_status", indicatorStatusMap, map -> map.getOrDefault("db", 1))
                .tag("indicator", "db")
                .register(meterRegistry);
        
        // 如果有其他指示器(比如Redis、MQ),可以继续注册
        Gauge.builder("health_indicator_status", indicatorStatusMap, map -> map.getOrDefault("redis", 1))
                .tag("indicator", "redis")
                .register(meterRegistry);
    }

    // 更新指示器状态的方法
    public void updateIndicatorStatus(String indicatorName, String status) {
        // 把状态转为数值:UP=1,DOWN=0,其他状态可自定义
        int statusValue = "UP".equals(status) ? 1 : 0;
        indicatorStatusMap.put(indicatorName, statusValue);
    }
}

3. 必要的依赖与配置

要让这套方案跑起来,你需要确保项目引入了Actuator和Micrometer Prometheus依赖(以Maven为例):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

然后在application.yml里开启健康检查和Prometheus端点:

management:
  endpoints:
    web:
      exposure:
        include: health,prometheus  # 暴露需要的端点
  endpoint:
    health:
      show-details: always  # 必须开启,才能获取每个指示器的详细状态

完成这些配置后,访问/actuator/prometheus就能看到health_indicator_status指标,每个指示器的状态会在变化时自动更新,完全满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:46:11