《你的SpringBoot应用还"活着"吗?监控告警入门指南》
每天5分钟,掌握一个SpringBoot核心知识点。大家好,我是SpringBoot指南的小坏。前两天我们聊了日志排查,今天来点更刺激的——监控告警。不想半夜被老板电话叫醒?这篇一定要看!
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
先问个扎心的问题
你的应用挂了,你是怎么知道的?
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
A. 用户打电话骂你(最惨)
B. 老板群里@你(有点惨)
C. 监控告警通知你(还行)
D. 还没挂过(别立flag)
如果你选了A或B,恭喜你,今天的内容能救你的命。如果选了C,那你很棒,但今天的内容能让你更省心。
一、真实故事:那个差点让我辞职的夜晚
去年双十一凌晨2点,我正睡得香,手机突然响了:
客服:“小坏哥,用户说下单一直失败!”
我(睡眼朦胧):“不可能啊,刚才还好好的...”
打开电脑,发现数据库连接池满了,但应用还在“装死”——没有报错,就是不响应。
最可怕的是:监控系统显示一切正常,绿色的小勾勾还在那微笑呢!
结果:
- 凌晨3点手动重启服务
- 损失了1小时的订单
- 第二天被老板约谈
- 扣了半个月奖金
教训:没有监控的系统,就像瞎子过马路——全靠运气!
二、SpringBoot自带的“体检中心”
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
SpringBoot其实自带了一个监控功能,叫Actuator。你可以理解为应用的“体检中心”。
2.1 3分钟快速开启
在pom.xml里加一行:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在application.yml里加几行:
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目
资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
management:
endpoints:
web:
exposure:
include: health,info,metrics # 暴露哪些端点
endpoint:
health:
show-details: always # 显示详细信息
启动应用,访问:http://localhost:8080/actuator/health
你会看到:
{
"status": "UP", // 应用活着
"components": {
"diskSpace": {
"status": "UP", // 磁盘空间够
"details": {
"total": 500GB,
"free": 300GB
}
},
"db": {
"status": "UP" // 数据库连接正常
}
}
}
2.2 几个常用“体检项目”
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
-
健康检查:
http://localhost:8080/actuator/health- 检查应用是否健康
- 检查数据库、Redis等是否正常
-
应用信息:
http://localhost:8080/actuator/info- 应用版本
- 构建时间
- Git提交信息
-
性能指标:
http://localhost:8080/actuator/metrics- CPU使用率
- 内存使用情况
- 请求次数
- 响应时间
-
环境配置:
http://localhost:8080/actuator/env- 当前所有配置
- 方便排查配置问题
三、自定义健康检查:监控第三方服务
有时候,你的应用自己没问题,但调用的第三方服务挂了。怎么办?
3.1 监控支付接口是否正常
@Component
public class PaymentHealthCheck implements HealthIndicator {
@Autowired
private PaymentService paymentService;
@Override
public Health health() {
// 调用支付接口的健康检查
boolean isHealthy = paymentService.checkHealth();
if (isHealthy) {
return Health.up()
.withDetail("message", "支付服务正常")
.withDetail("responseTime", "50ms")
.build();
} else {
return Health.down()
.withDetail("error", "支付服务不可用")
.withDetail("time", LocalDateTime.now())
.build();
}
}
}
访问/actuator/health,你会看到:
{
"status": "DOWN", // 整体不健康
"components": {
"payment": {
"status": "DOWN", // 支付服务挂了
"details": {
"error": "支付服务不可用",
"time": "2024-01-15T10:30:00"
}
}
}
}
3.2 监控数据库连接数
@Component
public class DatabaseHealthCheck implements HealthIndicator {
@Autowired
private DataSource dataSource;
@Override
public Health health() {
try {
// 获取数据库连接
Connection conn = dataSource.getConnection();
// 获取活跃连接数
int activeConnections = getActiveConnections(conn);
if (activeConnections > 50) { // 超过50个连接就警告
return Health.down()
.withDetail("error", "数据库连接数过高")
.withDetail("activeConnections", activeConnections)
.withDetail("maxConnections", 100)
.build();
}
return Health.up()
.withDetail("activeConnections", activeConnections)
.build();
} catch (Exception e) {
return Health.down()
.withDetail("error", "数据库连接失败")
.withDetail("message", e.getMessage())
.build();
}
}
}
四、集成Prometheus + Grafana(可视化监控)
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
Actuator的数据是文本的,不好看。我们需要可视化监控大屏。
4.1 什么是Prometheus + Grafana?
- Prometheus:监控数据收集器
- Grafana:数据可视化展示
简单理解:
- 以前:看一堆JSON数字
- 现在:看酷炫的图表,像电影里的黑客那样
4.2 5分钟搭建监控大屏
步骤1:添加依赖
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
步骤2:配置暴露端点
management:
endpoints:
web:
exposure:
include: prometheus,health,metrics
metrics:
export:
prometheus:
enabled: true
步骤3:启动Prometheus和Grafana(Docker版)
# 一键启动(需要先装Docker)
docker-compose up -d
步骤4:访问Grafana 打开 http://localhost:3000
- 用户名:admin
- 密码:admin
导入SpringBoot监控模板,你就有了一个酷炫的监控大屏:
你能看到:
- ✅ 实时请求量
- ✅ 平均响应时间
- ✅ 错误率
- ✅ JVM内存使用
- ✅ 数据库连接数
五、告警:让系统自己“打电话”给你
监控有了,但总不能一直盯着屏幕看吧?我们需要告警。
5.1 什么时候该告警?
需要立即处理的:
- 服务挂了(HTTP状态码不是200)
- 数据库连接失败
- 磁盘使用率 > 90%
- 错误率 > 5%
需要关注的:
- 响应时间 > 2秒
- CPU使用率 > 80%
- 内存使用率 > 85%
5.2 配置钉钉告警(最常用)
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
# application.yml
management:
endpoints:
web:
exposure:
include: health,prometheus
health:
defaults:
enabled: true
# 钉钉告警配置
alert:
dingtalk:
webhook: https://oapi.dingtalk.com/robot/send?access_token=xxx
enabled: true
@Component
public class DingTalkAlerter {
@Value("${management.alert.dingtalk.webhook}")
private String webhookUrl;
/**
* 发送告警到钉钉
*/
public void sendAlert(String title, String message, String level) {
// 构建钉钉消息
Map<String, Object> msg = new HashMap<>();
msg.put("msgtype", "text");
msg.put("text", Map.of(
"content", String.format("%s\n%s\n时间:%s",
title, message, LocalDateTime.now())
));
// 发送HTTP请求
restTemplate.postForObject(webhookUrl, msg, String.class);
}
/**
* 健康检查失败时自动调用
*/
@EventListener
public void onHealthChanged(HealthEndpointWebExtension.HealthEndpointWebExtensionHealth health) {
if (health.getStatus() == Status.DOWN) {
sendAlert(
"【紧急告警】应用健康检查失败",
"请立即处理!\n详情:" + health.getDetails(),
"ERROR"
);
}
}
}
5.3 告警消息示例
普通告警:
【应用告警】用户服务响应时间过长
服务:user-service
实例:192.168.1.100:8080
当前响应时间:2.5s(阈值:1s)
时间:2024-01-15 14:30:00
紧急告警:
【紧急告警】订单服务健康检查失败!
状态:DOWN
问题:数据库连接失败
影响:用户无法下单
时间:2024-01-15 14:35:00
请立即处理!
六、避坑指南:监控告警的常见坑
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
坑1:告警太多,直接无视
# ❌ 错误:什么都告警
alert:
rules:
- 响应时间 > 100ms
- CPU使用率 > 50%
- 内存使用率 > 60%
- 请求量增加10%
# ✅ 正确:只告警关键问题
alert:
rules:
- 服务不可用
- 错误率 > 5%
- 响应时间 > 3s
- 磁盘使用率 > 90%
坑2:监控系统自己挂了
// ❌ 错误:监控系统和服务在一起
// 服务挂了,监控也挂了
// ✅ 正确:监控系统独立部署
// 用单独的服务器部署Prometheus
// 或者用云监控服务(阿里云监控、腾讯云监控)
坑3:没有分级告警
// ❌ 错误:所有告警都打电话
sendAlert("CPU使用率高", "CPU 70%", "打电话");
// ✅ 正确:分级告警
if (level == "P0") {
callPhone("13800138000"); // 打电话
} else if (level == "P1") {
sendDingTalk("钉钉消息"); // 发钉钉
} else {
sendEmail("邮件通知"); // 发邮件
}
七、一个完整的监控告警方案
7.1 小型团队方案(成本低)
# SpringBoot Actuator + 钉钉告警
spring:
boot:
admin:
client:
url: http://localhost:8080
instance:
name: user-service
# 监控:Actuator端点
# 告警:钉钉机器人
# 成本:0元
7.2 中型团队方案(功能全)
# Prometheus + Grafana + AlertManager
monitoring:
prometheus: # 数据收集
enabled: true
grafana: # 数据展示
enabled: true
alertmanager: # 告警管理
enabled: true
# 告警渠道:钉钉、微信、邮件
# 成本:2台服务器
7.3 大型团队方案(专业级)
# 商业监控方案
# 阿里云ARMS + 云监控
# 或 Datadog、New Relic
# 功能:全链路追踪、智能告警、AI分析
# 成本:每年5-10万
八、哥哥们今日思考题
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 回复"Swagger源码",获取本文所有示例代码、配置模板及导出工具。
场景:你是公司的技术负责人,要设计一套监控告警方案,需要满足:
- 老板要看整体业务数据(订单量、用户数)
- 开发要排查技术问题(错误日志、性能瓶颈)
- 运维要保证系统稳定(服务器资源、网络)
- 成本有限,只有3台服务器
问题:
- 你会选择哪些监控工具?
- 如何设计告警策略?(什么情况打电话?什么情况发邮件?)
- 如何让非技术人员也能看懂监控数据?
在评论区分享你的方案,点赞最高的送《监控告警实战指南》纸质书!
下期预告:《SpringBoot性能优化:从10秒到1秒的实战技巧》—— 让你的应用飞起来! 零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
运营小贴士:
🎁 粉丝福利:
- 关注后回复“监控模板”,获取Grafana仪表盘JSON文件
- 转发到3个200人以上技术群,截图领《云原生监控实战》电子书
零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。
🔥 明日预告: “性能优化实战:让SpringBoot应用快10倍的技巧,明天见!”