《你的SpringBoot应用还"活着"吗?监控告警入门指南》

49 阅读9分钟

《你的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一键部署脚本和告警模板。

  1. 健康检查http://localhost:8080/actuator/health

    • 检查应用是否健康
    • 检查数据库、Redis等是否正常
  2. 应用信息http://localhost:8080/actuator/info

    • 应用版本
    • 构建时间
    • Git提交信息
  3. 性能指标http://localhost:8080/actuator/metrics

    • CPU使用率
    • 内存使用情况
    • 请求次数
    • 响应时间
  4. 环境配置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监控模板,你就有了一个酷炫的监控大屏:

!example.com/monitor-das…

你能看到:

  • ✅ 实时请求量
  • ✅ 平均响应时间
  • ✅ 错误率
  • ✅ 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源码",获取本文所有示例代码、配置模板及导出工具。

场景:你是公司的技术负责人,要设计一套监控告警方案,需要满足:

  1. 老板要看整体业务数据(订单量、用户数)
  2. 开发要排查技术问题(错误日志、性能瓶颈)
  3. 运维要保证系统稳定(服务器资源、网络)
  4. 成本有限,只有3台服务器

问题

  1. 你会选择哪些监控工具?
  2. 如何设计告警策略?(什么情况打电话?什么情况发邮件?)
  3. 如何让非技术人员也能看懂监控数据?

在评论区分享你的方案,点赞最高的送《监控告警实战指南》纸质书!


下期预告:《SpringBoot性能优化:从10秒到1秒的实战技巧》—— 让你的应用飞起来! 零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。


运营小贴士:

🎁 粉丝福利

  1. 关注后回复“监控模板”,获取Grafana仪表盘JSON文件
  2. 转发到3个200人以上技术群,截图领《云原生监控实战》电子书

零基础全栈开发Java微服务版本实战-后端-前端-运维-实战企业级三个实战项目 资源获取:关注公众号: 小坏说Java 获取我整理的Prometheus+Grafana一键部署脚本和告警模板。

🔥 明日预告: “性能优化实战:让SpringBoot应用快10倍的技巧,明天见!”