Spring Boot 监控实战:Actuator+Prometheus+Grafana,给系统装 “运营监控中心”(企业级运维必备)

内容分享19小时前发布
0 0 0

前面咱们把 Spring Boot 项目的性能、安全、异步能力都拉满了,但项目上线后你可能会慌:“接口调用成功率多少?JVM 内存用了多少?数据库连接池满了吗?”—— 就像奶茶店开业后,不知道客流量、原料库存、设备状态,遇到问题只能等用户投诉,被动又狼狈。

Spring Boot 生态早就备好了解决方案:Actuator(暴露系统指标)+ Prometheus(采集指标)+ Grafana(可视化监控) ,三者组合就是系统的 “运营监控中心”,像奶茶店的 “实时数据看板”:能看到 “接口调用量(客流量)”“JVM 内存占用(原料库存)”“接口响应时间(出餐速度)”,甚至能设置告警(原料不足自动提醒),让你主动掌握系统状态,提前排查问题。

今天全程聚焦 Spring Boot 生态,以图书管理系统为案例,手把手实现 “指标暴露 + 数据采集 + 可视化监控 + 告警配置”,新手也能跟着搭建,搞定企业级运维监控!

一、先搞懂:监控三件套是什么?(奶茶店类比)

1. 核心组件分工(监控 = 奶茶店运营中心)

组件 类比奶茶店 作用说明(Spring Boot 中)
Spring Boot Actuator 数据采集器(统计客流量、原料库存) 暴露系统核心指标(CPU、内存、接口调用量、数据库连接数),是监控的 “数据来源”
Prometheus 数据存储 + 分析(记录历史运营数据) 定时采集 Actuator 暴露的指标,存储在时序数据库中,支持多维度查询
Grafana 可视化看板(运营数据大屏) 将 Prometheus 的指标转换成图表(折线图、饼图),支持自定义仪表盘,直观展示系统状态

2. 为什么要做监控?(企业 3 大核心需求)

实时掌握状态:不用登录服务器,就能看到 JVM 内存、接口响应时间、数据库连接池等核心数据;提前预警问题:设置阈值(如 “CPU 使用率超 80% 告警”“接口响应时间超 500ms 告警”),提前发现隐患;快速定位故障:接口报错、系统卡顿时,通过监控数据快速定位瓶颈(是 JVM 内存泄漏,还是数据库慢查询)。

3. Spring Boot 生态优势

开箱即用:Actuator 是 Spring Boot 官方依赖,配置简单,不用写复杂采集代码;无缝整合:Prometheus 和 Grafana 有成熟的 Spring Boot 适配方案,几分钟就能打通数据链路;自定义灵活:支持新增业务指标(如 “图书借阅次数”“接口调用成功率”),贴合业务需求。

二、实操 1:Spring Boot 整合 Actuator(暴露系统指标)

Actuator 是监控的基础,负责暴露系统原生指标(JVM、Tomcat、数据库连接池)和自定义指标,配置超简单,两步就能搞定。

步骤 1:加依赖(Spring Boot 官方监控依赖)

xml



<!-- Spring Boot Actuator核心依赖(暴露指标) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.7.10</version>
</dependency>
 
<!-- Prometheus适配依赖(Actuator指标格式转换,供Prometheus采集) -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.10.6</version>
</dependency>

步骤 2:配置 Actuator(application-dev.yml)

默认情况下,Actuator 只暴露少量指标,需要配置开启全部核心指标,并开放访问端口(避免被拦截):

yaml



spring:
  application:
    name: book-manage-system # 应用名称(Prometheus采集时标识)
 
# Actuator配置(核心)
management:
  endpoints:
    web:
      exposure:
        include: '*' # 暴露所有监控端点(生产环境可按需开放,如health,prometheus,metrics)
      base-path: /actuator # 监控端点前缀(访问路径:http://localhost:8080/actuator/xxx)
  endpoint:
    health:
      show-details: always # 健康检查端点显示详细信息(如数据库、Redis连接状态)
  metrics:
    tags:
      application: ${spring.application.name} # 给所有指标加应用标签(多应用监控时区分)
  # 适配Prometheus(指定指标采集器)
  prometheus:
    metrics:
      export:
        enabled: true # 启用Prometheus指标导出

步骤 3:测试 Actuator 指标暴露

启动 Spring Boot 项目,访问以下端点,验证指标是否正常暴露:

健康检查:
http://localhost:8080/actuator/health
,返回系统健康状态(数据库、Redis 等组件是否正常):

json



{
  "status": "UP",
  "components": {
    "db": {"status": "UP", "details": {"database": "MySQL", "hello": "Hello"}},
    "redis": {"status": "UP", "details": {"version": "6.2.6"}},
    "diskSpace": {"status": "UP", "details": {"free": 102400000000, "total": 512000000000}}
  }
}

Prometheus 格式指标:
http://localhost:8080/actuator/prometheus
,返回大量时序指标(如
jvm_memory_used_bytes
(JVM 已用内存)、
http_server_requests_seconds_count
(接口调用次数)),这些指标会被 Prometheus 采集。

三、实操 2:部署 Prometheus(采集监控指标)

Prometheus 的核心作用是 “定时拉取 Actuator 暴露的指标,存储起来”,相当于奶茶店的 “数据记录员”,按固定频率统计运营数据。

步骤 1:安装 Prometheus(本地测试 / 服务器部署)

本地测试(Windows):
官网下载 Prometheus 安装包(https://prometheus.io/download/);解压后修改配置文件
prometheus.yml
(核心是配置 Spring Boot 项目的指标地址);双击
prometheus.exe
启动,访问
http://localhost:9090
进入 Prometheus 界面。 服务器部署(Linux):用 Docker 一键启动:

bash


docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus prom/prometheus

步骤 2:配置 Prometheus(采集 Spring Boot 指标)

修改
prometheus.yml
,添加 Spring Boot 项目的采集配置:

yaml



global:
  scrape_interval: 15s # 采集频率:每15秒拉取一次指标(生产环境可设30s)
 
scrape_configs:
  # 采集Spring Boot项目指标(自定义任务名)
  - job_name: "book-manage-system"
    metrics_path: "/actuator/prometheus" # Actuator暴露的Prometheus指标路径
    static_configs:
      # 配置Spring Boot项目的地址(多个实例可添加多个targets)
      - targets: ["192.168.1.100:8080"] # 本地测试填"localhost:8080",服务器填项目IP+端口

步骤 3:验证 Prometheus 采集成功

启动 Prometheus 后,访问
http://localhost:9090
;点击 “Status”→“Targets”,查看
book-manage-system
任务的 “State” 是否为 “UP”(UP 表示采集成功);点击 “Graph”,输入指标名(如
jvm_memory_used_bytes
),点击 “Execute”,能看到指标的时序数据(折线图),说明采集成功。

四、实操 3:部署 Grafana(可视化监控大屏)

Prometheus 的图表功能简陋,Grafana 能把指标转换成 “高颜值、自定义” 的监控大屏,像奶茶店的 “运营数据看板”,直观展示所有核心指标。

步骤 1:安装 Grafana(本地 / 服务器部署)

本地测试(Windows):
官网下载 Grafana 安装包(https://grafana.com/grafana/download);双击安装,启动后访问
http://localhost:3000
,默认账号密码
admin/admin
(首次登录需修改密码)。 服务器部署(Linux):Docker 一键启动:

bash


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

步骤 2:Grafana 连接 Prometheus(添加数据源)

登录 Grafana 后,点击左侧 “齿轮图标(Configuration)”→“Data Sources”→“Add data source”;选择 “Prometheus”,配置 Prometheus 地址:
URL:
http://192.168.1.100:9090
(本地测试填
http://localhost:9090
,服务器填 Prometheus 的 IP + 端口);其他默认,点击 “Save & test”,显示 “Data source is working” 表示连接成功。

步骤 3:导入 Spring Boot 监控仪表盘(开箱即用)

Grafana 有大量现成的 Spring Boot 监控仪表盘模板,不用手动配置图表,直接导入即可:

点击左侧 “+”→“Import”,输入仪表盘 ID:
12856
(Spring Boot 2.x 监控模板,官方推荐);选择数据源为之前配置的 Prometheus,点击 “Import”;导入成功后,就能看到完整的 Spring Boot 监控大屏,包含:
系统指标:CPU 使用率、内存使用、磁盘空间;JVM 指标:堆内存、非堆内存、GC 次数、STW 时间;应用指标:接口调用次数、响应时间、错误率;数据库指标:连接池活跃数、空闲数、查询耗时。

步骤 4:自定义业务指标(贴合图书管理系统)

默认指标满足系统监控,但企业还需要业务指标(如 “图书借阅次数”“新增图书数”),用 Micrometer 自定义指标:

步骤 1:添加自定义指标配置

java

运行



package com.example.springbootdemo.config;
 
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
 * 自定义业务指标配置
 */
@Configuration
public class MetricsConfig {
 
    /**
     * 图书借阅次数计数器(累计指标)
     */
    @Bean
    public Counter borrowBookCounter(MeterRegistry registry) {
        return Counter.builder("book.borrow.count") // 指标名(自定义,规范:业务.操作.类型)
                .tag("application", "book-manage-system") // 标签(用于区分维度)
                .description("图书借阅总次数") // 指标描述
                .register(registry);
    }
 
    /**
     * 图书新增次数计数器
     */
    @Bean
    public Counter addBookCounter(MeterRegistry registry) {
        return Counter.builder("book.add.count")
                .tag("application", "book-manage-system")
                .description("图书新增总次数")
                .register(registry);
    }
}
步骤 2:在业务代码中使用自定义指标

修改
BookService

BorrowService
,在核心业务中调用计数器:

java

运行



@Service
public class BorrowService {
 
    // 注入自定义借阅次数计数器
    private final Counter borrowBookCounter;
 
    // 构造注入(避免@Autowired)
    public BorrowService(Counter borrowBookCounter) {
        this.borrowBookCounter = borrowBookCounter;
    }
 
    public boolean borrowBook(Long bookId, Long userId) {
        // 核心业务逻辑(略)
        boolean success = true;
 
        // 借阅成功后,计数器+1
        if (success) {
            borrowBookCounter.increment(); // 指标累加
        }
        return success;
    }
}
 
@Service
public class BookService extends ServiceImpl<BookMapper, Book> implements IService<Book> {
 
    private final Counter addBookCounter;
 
    public BookService(Counter addBookCounter) {
        this.addBookCounter = addBookCounter;
    }
 
    @Override
    public boolean save(Book book) {
        boolean success = super.save(book);
        if (success) {
            addBookCounter.increment(); // 新增图书成功,计数器+1
        }
        return success;
    }
}
步骤 3:在 Grafana 中添加自定义指标图表

进入之前导入的仪表盘,点击 “Add panel”→“Add visualization”;数据源选择 Prometheus,指标名输入
book_borrow_count_total
(Counter 指标自动加
_total
后缀);图表类型选择 “Stat”(统计总数)或 “Graph”(趋势图),点击 “Apply”;保存仪表盘后,就能看到 “图书借阅次数”“新增图书数” 的实时数据,贴合业务场景。

五、实操 4:配置告警(提前预警问题)

监控的核心价值之一是 “提前预警”,比如 “CPU 使用率超 80%”“接口错误率超 5%” 时,自动发送告警通知(邮件、钉钉、短信)。

步骤 1:Grafana 配置告警规则

进入监控仪表盘,点击某图表→“Edit”→“Alert”→“Create alert rule”;配置告警条件(以 “接口错误率超 5%” 为例):
指标:
sum(http_server_requests_seconds_count{status=~"5.."}
(5xx 错误接口数) / 
sum(http_server_requests_seconds_count)
(总接口数) > 0.05(5%);评估时间:For 1m(连续 1 分钟满足条件触发告警); 配置通知渠道:点击左侧 “Alerting”→“Contact points”→“Add contact point”,选择通知方式(如钉钉机器人、邮件),填写配置信息(如钉钉机器人 WebHook);关联通知渠道:在告警规则中选择创建的通知渠道,点击 “Save”。

步骤 2:测试告警效果

模拟接口报错(如故意抛出异常),当错误率连续 1 分钟超 5% 时,Grafana 会触发告警,通知渠道会收到消息(如钉钉机器人发送 “【告警】接口错误率超 5%,请及时排查”)。

六、避坑总结:监控三件套的 6 个新手坑

Actuator 端点未开放,Prometheus 采集失败

坑:
management.endpoints.web.exposure.include
只配置了
health
,没开放
prometheus
,导致 Prometheus 采集不到指标;解决:生产环境按需开放(
health,prometheus,metrics
),测试环境可设
*

Prometheus 配置的 targets 地址错误

坑:填了
localhost:8080
但 Prometheus 部署在另一台服务器,导致采集失败(State 为 DOWN);解决:targets 填 Spring Boot 项目的 “外网可访问 IP + 端口”,确保 Prometheus 能 ping 通项目。

Grafana 数据源 URL 配置错误

坑:Prometheus 部署在服务器,Grafana 填了
localhost:9090
,导致连接失败;解决:URL 填 Prometheus 的服务器 IP + 端口(如
http://192.168.1.101:9090
)。

自定义指标名不规范,难以维护

坑:指标名乱取(
jieshu_count
“add_book”),多指标时混淆;解决:遵循 “业务。操作。类型” 规范(如
book.borrow.count
“book.add.count”),加标签区分维度。

采集频率设太低 / 太高,影响性能

坑:Prometheus
scrape_interval
设 1 秒(太高,占用项目资源)或 10 分钟(太低,监控不实时);解决:生产环境设 30 秒 – 1 分钟,平衡实时性和性能。

告警阈值设置不合理,频繁误告警

坑:CPU 使用率超 50% 就告警,高峰期频繁触发,导致告警疲劳;解决:根据系统实际负载调整阈值(如 CPU 超 80%、接口响应时间超 500ms),设置 “连续触发时间”(如 1 分钟)。

总结:监控是项目上线的 “安全网”

Spring Boot Actuator+Prometheus+Grafana 的组合,让你从 “项目上线后两眼一抹黑” 变成 “实时掌握系统状态”:Actuator 负责暴露指标,Prometheus 负责采集存储,Grafana 负责可视化和告警,三者各司其职,构成企业级监控闭环。

就像奶茶店的运营监控中心,能提前发现 “原料不足”“设备故障”,避免影响生意;系统监控能提前预警 “内存泄漏”“接口报错”,避免故障扩大。配合之前的性能优化、安全防护、异步处理,你的 Spring Boot 项目不仅能 “跑起来”,还能 “稳定跑、可监控、易运维”,完全满足企业上线标准。

© 版权声明

相关文章

暂无评论

none
暂无评论...