面向 Java / Spring Boot 技术栈的通用可观测性(Observability)实践指南,从日志、指标、链路三大支柱出发,讲解规范化设计与 Actuator + Micrometer 落地,适合入门到进阶读者。
很多线上问题不是"代码不会写",而是**"出了问题没人知道、知道了也定位不到"**。可观测性(Observability)的目标就是让系统状态可见、问题可追踪、异常可告警。本章从三大支柱(日志、指标、链路)出发,给出各自的最佳实践,并落地到 Spring Boot 场景的 Actuator + Micrometer 组合。
| 维度 | 回答的问题 | 典型工具 |
|---|---|---|
| 日志(Logs) | 发生了什么 | ELK、Loki、Filebeat |
| 指标(Metrics) | 系统整体状态如何 | Prometheus + Grafana |
| 链路(Traces) | 一次请求经过哪些环节 | Jaeger、SkyWalking、Zipkin |
三者互补:日志偏细节、指标偏全局趋势、链路把一次请求串起来——只靠任何一个维度都无法高效排障。
核心指标清单:
| 类别 | 指标 |
|---|---|
| 流量 | QPS / TPS |
| 性能 | 响应时间(P50/P95/P99) |
| 质量 | 错误率 |
| JVM | 内存、GC 频率与耗时 |
| 线程 | 线程池队列长度、活跃线程数 |
| 依赖 | 数据库连接池使用率、Redis/MQ 延迟 |
指标使用三条原则:
微服务或多中间件调用场景下,链路追踪(Distributed Tracing)能回答三个问题:
核心机制:请求入口生成 traceId,逐跳传递,各服务上报 span(调用片段,即链路中的每一个处理段),汇聚后还原完整调用拓扑与耗时。
该图展示了一次跨服务请求的追踪过程:请求自网关入口生成全局唯一的 traceId(如 abc),随后逐级传递给订单服务、库存服务与支付服务,库存与支付又分别依赖 MySQL 和 Redis。各环节基于同一个 traceId 上报各自的 span,最终可在追踪系统中还原出完整的调用拓扑与每跳耗时,从而定位"卡在哪一跳"。
MeterRegistry.counter("order.create.total");在 pom.xml 中引入依赖并打开 /actuator/prometheus 端点后,即可通过 Micrometer 的默认绑定暴露 JVM、线程池、HTTP 等指标,再在业务代码中通过 MeterRegistry 声明自定义业务指标。整体落地路径遵循"先指标 + 日志,后链路追踪"的渐进策略,避免一次性引入过重体系。