为什么很多系统监控很多,出了问题还是查不明白?

张开发
2026/4/18 6:04:52 15 分钟阅读

分享文章

为什么很多系统监控很多,出了问题还是查不明白?
高并发系统的链路追踪和可观测性怎么落地一次讲清日志、指标、Trace 和告警闭环大家好我是一名有 4 年工作经验的 Java 后端开发。很多系统平时看起来没问题但一到高峰或者线上出故障就会发现“哪里慢了、哪一步错了、哪台机器有问题”完全说不清。这篇文章我想系统聊一聊高并发系统的可观测性到底应该怎么做尤其是日志、指标、Trace 和告警怎么连成闭环。个人主页文章目录高并发系统的链路追踪和可观测性怎么落地一次讲清日志、指标、Trace 和告警闭环一、前言二、可观测性到底是什么2.1 Metrics2.2 Logs2.3 Traces三、为什么高并发系统更需要可观测性四、最推荐的落地方式4.1 日志标准化4.2 指标体系化4.3 Trace 全链路打通4.4 告警和观测结果打通五、Java 项目怎么落地5.1 日志里统一打印 traceId5.2 指标建议5.3 Trace 建议六、最容易踩的坑6.1 日志很多但没有 traceId6.2 指标很多但没有业务维度6.3 Trace 只打了入口不打下游6.4 告警很多但没有可执行信息七、面试中怎么回答八、总结九、结尾一、前言很多项目做监控往往停留在这些层面看 CPU看内存看接口 RT看错误日志这些当然重要但如果线上出现下面这种问题你就会发现它们还不够某个接口偶发超时到底慢在应用、Redis、MySQL 还是下游 HTTP一个请求横跨 6 个服务最终在哪一步失败了某个用户投诉下单失败怎么从入口一路追到 MQ 消费接口 RT 升高时到底是 SQL 慢、线程池满、GC 抖动还是下游超时这类问题真正需要的是完整的可观测性体系。也就是日志指标Trace告警四者一起工作。二、可观测性到底是什么可以简单理解成当系统出问题时你能不能快速知道“发生了什么、为什么发生、影响到哪里、现在恢复了没有”。在 Java 后端里我更建议把可观测性拆成三大核心2.1 Metrics看趋势。比如QPSRTTP99错误率线程池活跃数JVM 内存2.2 Logs看细节。比如参数异常堆栈关键动作业务上下文2.3 Traces看链路。比如一个请求经过网关订单服务商品服务库存服务支付服务MQ到底在哪一步慢了。三、为什么高并发系统更需要可观测性因为高并发系统的问题往往不是单点问题而是链路放大问题。比如一个下游慢上游线程开始堆积超时重试放大流量Redis 被继续打高数据库又被回源流量冲击如果没有可观测性你看到的可能只是一句“接口超时”但真正有用的问题应该是哪个接口超时哪个服务超时是谁先慢的哪个依赖先出问题四、最推荐的落地方式我更建议你按这个思路去做4.1 日志标准化至少统一traceIdspanIduserIdbizIderrorCode4.2 指标体系化至少统一监控接口 RT / TP95 / TP99错误率JVM线程池Redis / MySQL / MQ4.3 Trace 全链路打通至少要能串起来HTTP 请求RPC 调用DB 查询Redis 调用MQ 生产 / 消费4.4 告警和观测结果打通不是只会发告警而是告警出来以后能直接顺着图表、日志、Trace 去查。五、Java 项目怎么落地5.1 日志里统一打印 traceId例如在 MDC 里放MDC.put(traceId,traceId);日志格式里带出来[%X{traceId}]这样查日志时能按链路串起来。5.2 指标建议至少对这些做埋点Controller 接口耗时下游 HTTP 调用耗时SQL 耗时Redis 命中率MQ 积压量线程池队列长度5.3 Trace 建议如果你在 Java 里做现代可观测性比较推荐OpenTelemetryMicrometerPrometheusGrafana尤其是 Trace一定不要只追 HTTP 入口要尽量把DBRedisMQ也一起串进去。六、最容易踩的坑6.1 日志很多但没有 traceId最后查问题还是像大海捞针。6.2 指标很多但没有业务维度比如只知道错误率高却不知道是哪个接口、哪个店铺、哪个活动出问题。6.3 Trace 只打了入口不打下游最后你只能看到请求进来了但中间去哪了不知道。6.4 告警很多但没有可执行信息比如只告诉你RT 高了但没告诉你哪个接口哪个实例哪个依赖这种告警价值很有限。七、面试中怎么回答如果面试官问你高并发系统的可观测性一般怎么落地你可以这样回答第一我会把可观测性拆成日志、指标和 Trace 三部分。指标负责看趋势比如 RT、TP99、错误率、线程池、JVM、数据库、缓存等日志负责看业务细节和异常堆栈Trace 负责把一个请求在多个服务和多个依赖之间串起来。第二真正线上可用的可观测性不是这三样各做各的而是要通过 traceId 把日志、指标和链路打通这样告警出来以后能快速往下钻。第三在 Java 项目里我通常会优先统一日志格式和 MDC 的 traceId再做接口、SQL、Redis、MQ、线程池这些关键指标埋点最后通过 OpenTelemetry 一类方案把全链路追踪串起来。第四告警一定要和观测结果联动不然只知道“报错了”却不知道从哪里开始查排障效率还是很低。八、总结可观测性真正的价值不是多画几张监控图而是让线上问题能快速被定位、被解释、被复盘。如果只记一句结论我觉得可以记住这句高并发系统的可观测性核心不是日志、指标、Trace 各做一套而是让它们通过统一上下文串成一个排障闭环。九、结尾如果你觉得这篇文章对你有帮助欢迎点赞、收藏、关注。后面我会继续整理一些更偏实战的 Java 后端和线上排障文章。

更多文章