异步异常监控需重建调用链、防止异常丢失并精准定位:统一注入trace id(sleuth/opentelemetry/手动mdc传递),捕获上报异常(asyncuncaughtexceptionhandler/completablefuture处理),关联指标(micrometer打标+全字段日志),联动可视化告警(grafana+zipkin/skywalking)。

异步执行中的异常链路监控,关键在于让原本“断开”的调用链重新连起来,并确保异常不被吞掉、不被忽略、能定位到具体任务和上下文。
统一注入追踪上下文(Trace ID)
异步方法脱离主线程后,MDC 中的 Trace ID 默认不会自动传递。必须在任务提交前显式绑定:
- 使用 Sleuth + Brave 或 OpenTelemetry 自动传播上下文,支持 @Async 方法间透传
- 若用原生线程池,需手动在 submit 前将 MDC 内容快照并传入新线程:
MDC.getCopyOfContextMap()→ 构造 Runnable →MDC.setContextMap() - 消息队列场景下,在发送消息时把 trace_id 写入 headers,消费者端主动提取并还原 MDC
捕获并上报异步异常
@Async 方法抛出的异常默认不会到达调用方,也不会触发全局异常处理器,容易静默失败:
- 实现 AsyncUncaughtExceptionHandler,集中处理未捕获异常,记录日志 + 上报 Sentry/Prometheus
- 对返回 CompletableFuture 的方法,务必调用
whenComplete()或exceptionally()显式处理异常分支 - 避免只写
thenApply()而忽略后续异常,建议组合使用handle()统一收口
关联异常与执行指标
单看异常日志不够,要结合耗时、重试、状态变化等维度交叉分析:
- 用 Micrometer 定义 async_task_failures_total{task="xxx", cause="timeout"} 计数器,按异常类型打标
- 在异常捕获处记录完整堆栈 + 当前任务 ID + 执行耗时 + 输入参数摘要(脱敏后),方便回溯
- 配合 Zipkin/SkyWalking 查看该 trace 下所有 span,确认异常是否发生在下游服务或 DB 查询环节
可视化与告警联动
异常不是孤立事件,要放进可观测闭环里:
- 在 Grafana 中配置「异常率突增」面板:基于
rate(async_task_failures_total[5m]) / rate(async_task_total[5m]) - 对高频失败任务(如每分钟失败 ≥3 次)触发企业微信/钉钉告警,附带最近一条异常日志链接
- 点击告警可跳转至对应 trace 页面,直接看到从 HTTP 入口 → 异步调度 → DB 调用的全链路异常点











