spring boot 全局异常处理可作为告警入口,在@restcontrolleradvice中识别严重异常(如数据库连接失败、redis超时等)并调用通知服务,分级告警、异步发送、封装通知工具类。

在 Spring Boot 中,全局异常处理本身不负责告警,但可以作为告警触发的入口点。关键是在 @RestControllerAdvice 的异常处理器中,把特定异常(如业务严重错误、系统级崩溃、数据库连接失败等)识别出来,并主动调用通知服务——比如发企业微信/钉钉消息、短信、邮件,或推送到 Prometheus + Alertmanager 实现分级告警。
明确哪些异常需要告警
不是所有异常都要告警,否则会淹没真正的问题。建议按严重程度分级:
-
必须告警:数据库连接异常(
CannotCreateTransactionException)、Redis 连接超时、Feign 调用全链路失败、OOM 前兆日志(如频繁 GC)、自定义的CriticalException -
可选告警:高频重复的业务异常(如 1 分钟内同类型
BusinessException超过 10 次),需配合计数器或滑动窗口判断 -
不告警:参数校验失败(
MethodArgumentNotValidException)、404、401、用户主动取消等预期内异常
集成轻量级通知渠道(以企业微信为例)
在 GlobalExceptionHandler 中注入一个通知工具类,避免硬编码 HTTP 调用逻辑:
- 封装
WeiXinAlertService,使用RestTemplate或WebClient调用企业微信机器人 Webhook - 构造告警内容时包含:
traceId、异常类型、简要消息、发生时间、请求路径、环境标识(如prod) - 建议异步发送(用
@Async),防止阻塞主响应流程
示例片段:
```java@ExceptionHandler(DataAccessException.class)
public ResponseEntity
alertService.asyncSendCriticalAlert("DB_ERROR", ex, req); // 异步发告警
return ApiResponse.error(500, "数据服务暂不可用");
}
对接监控告警体系(生产推荐)
更规范的做法是将异常事件转为指标或日志事件,交由专业系统处理:
- 用
Micrometer记录异常计数:counter("exception.count", "type", ex.getClass().getSimpleName()).increment() - 结合
Logback+ELK,在日志中打标ALERT_LEVEL=CRITICAL,由 Logstash 过滤后推至告警平台 - 在
handleUnknownException中上报OpenTelemetry事件,供 Grafana + Alertmanager 做阈值触发
避免重复告警和误报
直接在每个 @ExceptionHandler 方法里发消息容易导致刷屏。实用策略包括:
- 对同一异常类型做「时间窗口去重」:例如 5 分钟内相同异常只告警一次,用
ConcurrentHashMap + ScheduledExecutorService实现简易缓存 - 加开关控制:通过配置中心(如 Nacos)动态开启/关闭某类异常的告警,上线初期可先灰度
- 区分环境:仅
prod环境启用高危异常告警,dev/test只记录日志











