从‘它怎么又挂了?’到‘服务健康了如指掌’:给你的Spring Boot应用加上Actuator与Prometheus监控

张开发
2026/4/8 10:47:47 15 分钟阅读

分享文章

从‘它怎么又挂了?’到‘服务健康了如指掌’:给你的Spring Boot应用加上Actuator与Prometheus监控
从‘它怎么又挂了’到‘服务健康了如指掌’给你的Spring Boot应用加上Actuator与Prometheus监控每次半夜被报警电话惊醒手忙脚乱连上服务器查日志的时候你有没有想过——如果能提前看到内存泄漏的苗头如果能实时掌握慢接口的分布如果能在用户投诉前发现异常线程阻塞三年前我负责的电商促销系统就曾因为一个缓存雪崩故障导致核心接口响应时间从200ms飙升到15秒而运维团队直到大量用户投诉支付超时才被动介入。那次事故后我们用两周时间为所有微服务接入了这套监控方案从此团队再也不用像救火队员一样被动响应。1. 为什么你的Spring Boot需要专业监控刚上线的应用就像新车跑起来似乎一切正常。但随着业务量增长你会发现CPU使用率莫名飙升、某个API响应时间缓慢增加、JVM老年代内存持续高位徘徊——这些慢性病往往在引发严重故障后才被注意到。传统日志排查法存在三个致命缺陷事后追溯日志反映的是已发生的问题无法预防故障信息碎片化需要手动关联不同系统的日志、指标和链路数据阈值僵化简单的CPU/Memory监控无法反映业务健康状态Spring Boot Actuator Prometheus Grafana的组合提供了多维度的解决方案实时指标每15秒采集一次JVM线程数、数据库连接池使用率等600维度数据历史趋势保留最近15天的监控数据方便对比业务高峰与日常表现业务视角可以自定义统计订单创建成功率、库存查询延迟等业务指标// 示例自定义业务指标 RestController public class OrderController { private final Counter orderCounter; public OrderController(MeterRegistry registry) { orderCounter registry.counter(order.create.total); } PostMapping(/orders) public Order createOrder() { orderCounter.increment(); // 每次创建订单时计数 // ... } }2. 五分钟接入Spring Boot Actuator现代Spring Boot已经内置了生产级监控能力只需要添加基础依赖即可开启。但90%的开发者只用了不到10%的功能我们先从最核心的配置开始!-- pom.xml 关键依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency在application.yml中建议这样配置端点暴露规则安全性后面会专门讲management: endpoints: web: exposure: include: health,info,metrics,prometheus endpoint: health: show-details: always prometheus: enabled: true启动应用后你会获得这些开箱即用的监控端点端点路径作用描述生产环境必备/actuator/health应用健康状态DB、磁盘等✓/actuator/metrics查看所有可用指标✓/actuator/prometheusPrometheus格式的指标数据✓/actuator/threaddump当前线程快照排查死锁按需开启提示首次接入时建议先用curl测试端点返回确认数据格式符合预期curl -s http://localhost:8080/actuator/prometheus | grep jvm_memory_used3. Prometheus的智能抓取与存储策略Prometheus不是简单的数据收集器它的Pull模型设计特别适合动态变化的微服务环境。这是我们的生产配置示例# prometheus.yml 关键配置 scrape_configs: - job_name: spring-apps scrape_interval: 15s metrics_path: /actuator/prometheus static_configs: - targets: [app1:8080, app2:8080] relabel_configs: - source_labels: [__address__] target_label: instance - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod几个容易踩坑的配置要点抓取频率业务系统建议15-30秒高频交易类可缩短到5秒标签处理合理使用relabel_configs添加env、zone等维度存储优化调整block_retention参数平衡存储成本与查询需求当你的应用实例数超过50个时建议采用这种分层架构[Spring Boot Apps] → [Prometheus Server] → [Grafana] ↓ [Alert Manager] ↓ [企业微信/钉钉]4. 打造业务级Grafana监控看板有了数据只是第一步如何让监控真正说话才是关键。分享我们交易系统的核心面板配置JVM监控模板直接导入ID4701堆内存分代统计折线图GC次数与耗时热力图线程状态堆叠面积图业务自定义看板示例配置# 订单创建成功率 1 - (sum(rate(http_server_requests_seconds_count{uri/orders,status!~2..}[1m])) / sum(rate(http_server_requests_seconds_count{uri/orders}[1m])))推荐六个必监指标错误率突增5分钟内HTTP 5xx比例超过0.5%慢接口API响应时间P99大于500ms线程阻塞tomcat_threads_busy 最大线程数*0.8数据库连接活跃连接数接近连接池上限消息堆积Kafka消费者滞后消息数1000缓存命中率Redis命中率低于85%注意不要直接使用社区模板的告警阈值应该根据业务高峰期的基线数据调整5. 生产环境安全加固方案监控数据可能暴露系统内部细节必须做好安全防护。我们的多层防护策略网络层Actuator端点只允许内网IP访问Prometheus配置TLS双向认证应用层Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()) .authorizeRequests() .requestMatchers(EndpointRequest.to(health,info)).permitAll() .anyRequest().hasRole(MONITOR); } }数据层敏感指标如含用户ID使用relabel_configs过滤Prometheus配置数据保留策略和磁盘加密6. 进阶用监控数据驱动性能优化有了持续运行的监控系统后我们发现了许多意想不到的性能瓶颈案例一订单查询接口的99分位响应时间在每天上午10点突然升高根因定时任务触发了全表扫描与业务高峰重叠解决改为分批次处理添加合适索引案例二内存使用率呈现锯齿状规律增长根因每周报表生成时未关闭ResultSet解决添加try-with-resources块监控最大的价值不是报警而是帮团队建立数据直觉。现在我们的架构评审会上大家会主动分析新功能可能影响的监控指标这种开发方式的转变让系统可用性从99.9%提升到了99.99%。

更多文章