掌握 Spring Boot Actuator 编写自定义健康指标和度量指标

Spring Boot Actuator 提供生产级监控能力。但默认的健康检查和指标并不总是足够!

主要内容:

✔ Spring Boot Actuator 概览
✔ 创建自定义健康指标
✔ 暴露自定义指标(CPU、数据库查询、API响应时间等)
✔ 使用Prometheus和Grafana可视化指标
✔ 在Kubernetes中部署Actuator

“隐藏服务器问题” 挑战

设想一个高流量电商网站🛒的场景:

问题表现: 系统看似正常,但用户突然反馈:

  • 结账流程缓慢
  • 随机500错误
  • 数据库性能下降

根本原因:标准Actuator健康检查仅报告:

✔ JVM运行中
✔ 数据库已连接

但无法检测性能瓶颈,如:

  • 慢查询
  • 内存泄漏
  • CPU峰值

解决方案: 通过自定义健康指标和监控指标实现真实系统状态追踪!

启用Spring Boot Actuator

添加依赖 (pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置端点 (application.yml)

management:
  endpoints:
    web:
      exposure:
        include: "health,metrics,info"
  endpoint:
    health:
      show-details: always

✔ 访问默认健康检查端点:

curl http://localhost:8080/actuator/health

✔ 响应示例:

{
  "status": "UP",
  "components": {
    "db": { "status": "UP" },
    "diskSpace": { "status": "UP" }
  }
}

 

创建自定义健康指标

自定义数据库查询健康检查

@Component
public class DatabaseQueryHealthIndicator extends AbstractHealthIndicator {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        long startTime = System.currentTimeMillis();
        jdbcTemplate.queryForObject("SELECT 1", Integer.class);
        long elapsedTime = System.currentTimeMillis() - startTime;
        
        if (elapsedTime < 100) {
            builder.up().withDetail("queryTime", elapsedTime + "ms");
        } else {
            builder.down().withDetail("queryTime", elapsedTime + "ms");
        }
    }
}

✔ 增强后的/health端点响应:

{
  "status": "UP",
  "components": {
    "dbQuery": {
      "status": "UP",
      "queryTime": "12ms"
    }
  }
}

暴露自定义指标

添加Micrometer依赖 (pom.xml)

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

监控API响应时间

@RestController
@RequestMapping("/api")
public class OrderController {

    @Autowired
    private MeterRegistry meterRegistry;

    @GetMapping("/orders")
    public List<String> getOrders() {
        Timer timer = Timer.builder("order_api_timer")
                .description("追踪/orders接口响应时间")
                .register(meterRegistry);
        
        return timer.record(() -> {
            simulateProcessingDelay();
            return List.of("Order1", "Order2");
        });
    }

    private void simulateProcessingDelay() {
        try {
            Thread.sleep(new Random().nextInt(200)); // 模拟随机延迟
        } catch (InterruptedException ignored) {}
    }
}

✔ 查询指标:

curl http://localhost:8080/actuator/metrics/order_api_timer

✔ 响应示例:

{
  "name": "order_api_timer",
  "measurements": [
    { "statistic": "COUNT", "value": 150 },
    { "statistic": "TOTAL_TIME", "value": 30.3 }
  ]
}

使用Prometheus & Grafana可视化

配置Prometheus (prometheus.yml)

scrape_configs:
  - job_name: 'spring-boot'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

Docker启动Prometheus:

docker run -d --name=prometheus -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

访问Prometheus UI: http://localhost:9090
指标查询示例: {order_api_timer}

配置Grafana看板

Docker安装Grafana:

docker run -d -p 3000:3000 grafana/grafana

配置步骤:

  1. 添加Prometheus作为数据源
  2. 创建新看板
  3. 添加order_api_timer指标面板

实时监控API性能! 📊

在Kubernetes中部署Actuator

配置Kubernetes健康探针

management:
  endpoint:
    health:
      probes:
        enabled: true
  health:
    livenessState:
      enabled: true
    readinessState:
      enabled: true

实现效果:/actuator/health返回DOWN状态时,Kubernetes将自动重启Pod

为什么Actuator是生产环境必备

  • 实时系统健康监控
  • 数据库性能追踪
  • API性能指标暴露
  • 云原生集成(Prometheus/K8s)

 

请登录后发表评论

    没有回复内容