服务监控:Actuator + Prometheus + Grafana
线上服务就像一辆行驶中的汽车——没有仪表盘你不知道油量、不知道速度、不知道发动机温度,等真抛锚了才发现问题,那就晚了。
一、为什么需要监控
线上服务跑着跑着突然卡了、内存满了、响应慢了——如果没监控,你只能靠用户投诉来发现问题。被动救火,永远慢半拍。
监控的核心价值:
- 线上问题无感知→提前预警:CPU飙到90%就告警,而不是等服务挂了才知道
- 性能瓶颈定位:哪个接口慢?慢在哪?是GC停顿还是数据库查询?
- 容量规划:QPS趋势分析,什么时候该加机器、加多少,数据说话
- 故障复盘:出问题后回溯监控曲线,快速定位根因
完整的监控体系分三层:指标监控(Metrics)→日志收集(Logging)→链路追踪(Tracing),即所谓的可观测性三支柱。本文聚焦指标监控。
二、SpringBoot Actuator
Actuator是SpringBoot自带的监控模块,提供了一系列HTTP端点,开箱即用。
2.1 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>2.2 核心端点一览
| 端点 | 路径 | 说明 |
|---|---|---|
| health | /actuator/health | 应用健康状态,探活用 |
| info | /actuator/info | 应用基本信息 |
| metrics | /actuator/metrics | 各类指标数据 |
| loggers | /actuator/loggers | 日志级别查看与动态修改 |
| env | /actuator/env | 环境变量配置 |
| threaddump | /actuator/threaddump | 线程转储信息 |
| heapdump | /actuator/heapdump | 堆内存转储文件下载 |
2.3 端点安全配置
默认只暴露/health,需要手动开启其他端点的Web访问:
management:endpoints:web:exposure:include:'*'# 暴露所有端点(生产环境按需选择)exclude:'env,beans'# 排除敏感端点base-path:/actuator# 基础路径endpoint:health:show-details:always# 显示健康详情(默认NEVER不显示)shutdown:enabled:false# 禁止远程关机(千万别开)访问/actuator/health返回示例:
{"status":"UP","components":{"db":{"status":"UP","details":{"database":"MySQL"}},"diskSpace":{"status":"UP","details":{"total":500107862016,"free":198656831488}},"ping":{"status":"UP"}}}三、Micrometer — 监控门面
Actuator本身的指标格式不够通用,Micrometer作为监控门面(类似SLF4J之于日志),将指标数据适配为不同监控系统的格式。
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency>引入后访问/actuator/prometheus,即可看到Prometheus格式的指标文本:
# HELP jvm_memory_used_bytes The amount of used memory # TYPE jvm_memory_used_bytes gauge jvm_memory_used_bytes{area="heap",id="G1 Eden Space"} 2.5165824E7 jvm_memory_used_bytes{area="heap",id="G1 Survivor Space"} 1048576.0 # HELP http_server_requests_seconds HTTP请求耗时 # TYPE http_server_requests_seconds summary http_server_requests_seconds_count{method="GET",status="200",uri="/api/user/{id}"} 1523 http_server_requests_seconds_sum{method="GET",status="200",uri="/api/user/{id}"} 12.345四、Prometheus — 时序数据库
Prometheus是CNCF旗下的开源监控系统,采用Pull模式主动从目标服务抓取指标数据。
4.1 核心概念
- 时序数据:每个指标按时间戳存储,形成时间序列
- Pull模式:Prometheus主动去拉取数据,而非被推送
- PromQL:专用查询语言,灵活聚合分析指标
4.2 配置抓取目标
# prometheus.ymlglobal:scrape_interval:15s# 每15秒抓取一次scrape_configs:-job_name:'springboot-app'metrics_path:'/actuator/prometheus'static_configs:-targets:['localhost:8080']labels:application:'my-app'env:'dev'4.3 常用PromQL查询
# HTTP请求QPS(每秒请求数) rate(http_server_requests_seconds_count[1m]) # 接口平均响应时间 rate(http_server_requests_seconds_sum[1m]) / rate(http_server_requests_seconds_count[1m]) # JVM堆内存使用率 jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} * 100五、Grafana — 可视化仪表盘
Grafana是一个开源的数据可视化平台,支持多种数据源,配合Prometheus做指标展示再合适不过。
5.1 配置流程
- 添加数据源:Settings → Data Sources → Add Prometheus,填写地址
http://localhost:9090 - 导入仪表盘:Dashboards → Import,输入模板ID或上传JSON
- 常用模板ID:
4701— JVM Micrometer监控面板12900— SpringBoot 2.1 Statistics11378— Node Exporter服务器监控
5.2 仪表盘核心面板
一个完整的SpringBoot监控面板通常包含:
| 面板 | 指标 | 说明 |
|---|---|---|
| JVM内存 | heap/non-heap used/max | 堆/非堆内存使用情况 |
| JVM线程 | threads_live/daemon/peak | 活跃线程数 |
| GC统计 | gc_pause_seconds | GC停顿时间和频率 |
| HTTP请求 | QPS/响应时间/错误率 | 接口性能指标 |
| CPU使用 | process_cpu_usage | 进程CPU占用 |
六、监控指标分类
6.1 JVM层面
- 内存:堆/非堆使用量、各内存区使用详情
- 线程:活跃线程数、守护线程数、线程状态分布
- GC:GC次数、GC耗时、各代GC统计
6.2 应用层面
- HTTP请求:QPS、响应时间分布、错误率
- 线程池:活跃线程数、队列积压数、拒绝任务数
- 数据库连接池:活跃连接数、等待线程数
6.3 自定义业务指标
通过Micrometer的MeterRegistry注册自定义指标:
@ComponentpublicclassOrderMetrics{privatefinalCounterorderCreateCounter;privatefinalCounterorderFailCounter;privatefinalGaugeorderPendingGauge;publicOrderMetrics(MeterRegistryregistry,OrderServiceorderService){// Counter:只增不减的计数器this.orderCreateCounter=Counter.builder("order.create.total").description("订单创建总数").tag("type","all").register(registry);this.orderFailCounter=Counter.builder("order.create.fail").description("订单创建失败数").register(registry);// Gauge:瞬时值this.orderPendingGauge=Gauge.builder("order.pending.count",()->orderService.getPendingCount()).description("待处理订单数").register(registry);}publicvoidincrementCreate(){orderCreateCounter.increment();}publicvoidincrementFail(){orderFailCounter.increment();}}// Timer:耗时统计@ServicepublicclassPaymentService{@AutowiredprivateMeterRegistryregistry;publicvoidpay(Orderorder){Timer.Samplesample=Timer.start(registry);try{// 支付逻辑doPay(order);}finally{sample.stop(Timer.builder("payment.duration").description("支付耗时").tag("channel",order.getChannel()).register(registry));}}}三种核心指标类型:
| 类型 | 说明 | 场景 |
|---|---|---|
| Counter | 只增不减 | 请求总数、错误总数 |
| Gauge | 可增可减的瞬时值 | 队列长度、内存使用量 |
| Timer | 耗时统计 | 接口响应时间、方法执行时间 |
七、完整搭建流程
1. SpringBoot应用引入actuator + micrometer-prometheus 2. 配置management.endpoints暴露prometheus端点 3. 启动Prometheus,配置scrape_configs抓取应用指标 4. 启动Grafana,添加Prometheus数据源 5. 导入JVM仪表盘模板(ID: 4701) 6. 创建自定义业务监控面板 7. 配置告警规则(Alertmanager)告警规则示例
# alert_rules.ymlgroups:-name:springboot-alertsrules:-alert:HighErrorRateexpr:rate(http_server_requests_seconds_count{status=~"5.."}[5m])>0.1for:2mlabels:severity:criticalannotations:summary:"接口错误率过高"description:"{{ $labels.uri }} 5xx错误率超过10%"-alert:HighMemoryUsageexpr:jvm_memory_used_bytes{area="heap"}/ jvm_memory_max_bytes{area="heap"}>0.85for:5mlabels:severity:warningannotations:summary:"JVM堆内存使用率超过85%"Actuator采集指标,Prometheus存储和查询,Grafana展示和告警——三件套配合起来,线上服务的健康状况就尽在掌握了。这套监控体系不需要写复杂的代码,主要是配置工作,但带来的运维价值是巨大的。