Skip to content

Spring Boot Actuator 与可观测性

应用真正上线之后,团队最怕的往往不是“功能没写出来”,而是服务出问题了,但不知道它现在到底发生了什么。这就是可观测性主线。

在 Spring Boot 生态里,Actuator 是这条线里最基础、最常见的入口之一。

这篇文章重点讲:

  1. Actuator 到底是什么
  2. 它解决什么问题
  3. 健康检查、指标、信息端点分别在做什么
  4. 它和日志、链路追踪、监控平台是什么关系
  5. 企业里为什么说“有监控”不等于“可观测性就做好了”

1. 为什么企业应用一定要有可观测性

因为系统上线以后,真正的难点往往变成:

  1. 服务活着吗
  2. 请求慢在哪
  3. 错误是偶发还是持续
  4. 哪个下游在拖慢当前服务
  5. 资源是不是快打满了

如果没有统一观测能力,排障会非常被动。

所以可观测性最核心的目标不是“多几个面板”,而是让系统内部状态能被及时看见、理解和追踪。


2. Actuator 到底是什么

Spring Boot Actuator 可以看成 Spring Boot 提供的一组应用运行时管理与观测端点。

它解决的是:应用上线后,健康状态、指标信息、配置概况和部分运行时信息,如何有统一出口可供查看。

你也可以把它理解成给应用开了一组“运行时观察窗口”。


3. 它主要暴露哪些信息

最常见的几类通常包括:

  1. 健康检查
  2. 指标信息
  3. 应用信息
  4. 环境与配置概况
  5. Bean、映射、日志级别等运行时信息

这里要特别注意:Actuator 不是业务接口,而是运维和观测接口。


4. 一个最小接入示例

通常只要引入依赖:

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

再配一部分端点暴露:

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

这样应用就会暴露一组基础观测端点。


5. health 端点到底在看什么

health 是最常见、也最先接入的一个端点。

它解决的是应用当前是否健康。

但“健康”不是只看进程还活着,还包括很多依赖资源状态,例如:

  1. 数据库是否可用
  2. Redis 是否可用
  3. 磁盘空间是否正常

例如:

json
{
  "status": "UP"
}

或者更详细一些:

json
{
  "status": "UP",
  "components": {
    "db": { "status": "UP" },
    "redis": { "status": "UP" }
  }
}

6. metrics 端点到底在看什么

metrics 解决的是应用运行过程中的指标数据怎么统一查看。

例如常见指标包括:

  1. JVM 内存
  2. 线程数
  3. HTTP 请求次数与耗时
  4. 数据库连接池状态
  5. 自定义业务指标

这条线特别重要,因为很多性能问题不是靠日志直接看出来的,而要靠指标趋势判断。


7. infoenvbeans 这些端点分别是干什么的

7.1 info

更偏展示应用静态信息,例如:

  1. 应用名
  2. 版本
  3. 构建信息

7.2 env

更偏查看应用当前环境配置来源和属性。

7.3 beans

更偏查看容器里有哪些 Bean。

这些端点都很有用,但也要注意权限和暴露范围。


8. Actuator 和日志、链路追踪是什么关系

这部分一定要分开看。

8.1 Actuator

更偏当前运行状态和指标出口。

8.2 日志

更偏记录具体事件发生了什么。

8.3 链路追踪

更偏一次请求跨多个服务时,整条调用链怎么串起来。

所以要把边界看清:Actuator 只是可观测性的一部分,不等于全部可观测性。


9. 为什么说企业里要同时看日志、指标和链路

因为它们解决的问题并不一样。

能力更适合回答的问题
日志某次具体请求发生了什么
指标系统整体趋势怎么样
链路追踪一次请求跨服务时卡在哪一跳

真正完整的可观测性,通常要把这三类能力结合起来。


10. 自定义健康检查怎么做

企业里经常不止想看数据库、Redis 是否正常,还会想看:

  1. 第三方支付接口
  2. 核心配置是否加载成功
  3. 某个依赖服务是否可用

这时可以自定义健康检查。

例如:

java
@Component
public class DemoHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        boolean ok = true;
        if (ok) {
            return Health.up().withDetail("service", "demo").build();
        }
        return Health.down().withDetail("reason", "dependency timeout").build();
    }
}

11. 自定义指标为什么也很重要

系统里最关键的很多问题,并不总能靠 JVM 指标看出来。

例如你可能更关心:

  1. 下单成功率
  2. 支付失败次数
  3. 缓存命中率
  4. 队列积压长度

这时就需要自定义指标。

例如:

java
@Service
public class OrderService {

    private final Counter createOrderCounter;

    public OrderService(MeterRegistry meterRegistry) {
        this.createOrderCounter = meterRegistry.counter("order.create.count");
    }

    public void createOrder() {
        createOrderCounter.increment();
    }
}

12. Actuator 常见配置点

配置项作用
management.endpoints.web.exposure.include指定暴露哪些端点
management.endpoint.health.show-details控制健康信息是否展示细节
management.server.port单独指定管理端口
management.metrics.tags.*给指标统一打标签

例如:

yaml
management:
  server:
    port: 9090
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus

13. 和 Prometheus、Grafana 这些平台是什么关系

Actuator 自己不是完整监控平台。

把分工摊开看:

  1. Actuator 提供指标和状态出口
  2. Prometheus 负责采集指标
  3. Grafana 负责把指标可视化展示

也就是说:Actuator 更像应用侧的观测数据出口,而不是最终展示平台。


14. 工程上最容易踩的几个坑

14.1 误区一:把所有端点都直接暴露出去

这会带来明显安全风险。

14.2 误区二:有 Actuator 就等于可观测性做好了

不是。

日志、指标、链路追踪、告警体系都还要一起建设。

14.3 误区三:只看健康状态,不看趋势指标

很多问题在服务“还没挂”的时候,其实指标早就开始恶化了。

14.4 误区四:只盯技术指标,不看业务指标

CPU 正常不代表业务正常。


15. 一句话总结

Actuator 在 Spring Boot 里最核心的价值,是为应用提供统一的运行时观测出口;而企业里真正完整的可观测性,还要把健康检查、指标、日志、链路追踪和告警平台一起接成一条闭环。

基于 VitePress 构建的个人技术笔记。