Skip to content

可观测性 ​

核心问题:日志、指标、链路追踪三大支柱如何落地?如何快速定位线上问题?

1. 可观测性三大支柱 ​

支柱回答的问题工具
日志(Logging)发生了什么?ELK、Loki
指标(Metrics)系统状态如何?Prometheus、Grafana
链路追踪(Tracing)请求经过了哪些服务?SkyWalking、Jaeger

三者各有侧重,日志提供细节,指标提供全局视图,链路追踪提供调用路径。它们不是靠同一个 TraceID 直接串联,而是两两之间采用不同的关联方式。日志与追踪通过 TraceID、SpanID 关联。指标与追踪通过服务、接口等维度定位问题,再借助追踪系统的查询能力或 Exemplars 跳转到具体 Trace。日志与指标通过服务、实例、接口、时间窗口等共同维度关联。

2. 结构化日志 ​

结构化日志的核心:用 JSON 等可解析格式输出,并携带请求上下文(如 userId、traceId),便于 ELK 检索。生产环境还需守住边界,只记录排障所需的上下文,优先使用非敏感业务标识,不记录密码、访问令牌等敏感信息,并对日志字段统一命名、脱敏和设保留策略,避免将高基数字段无差别地设为索引字段或标签。

各框架的结构化日志落地(MDC、Logback 配置)见 Spring 日志。

3. 指标监控 ​

指标监控的核心:采集 QPS、响应时间、错误率、资源使用率等时间序列数据,配合告警规则及时发现异常。

Micrometer 与 Actuator 的指标暴露见 Spring 指标。

4. 链路追踪 ​

链路追踪的核心:为请求建立 Trace 上下文,并在支持追踪的调用链中传播 TraceID,定位慢请求与错误传播路径。实际能否查到完整 Trace,取决于埋点、上下文传播和采样配置。

SkyWalking / OpenTelemetry 的接入见 Spring 链路追踪。

5. 监控体系设计 ​

层次监控内容示例阈值
基础设施CPU、内存、磁盘、网络CPU > 80%、内存 > 90%
应用层QPS、响应时间、错误率错误率 > 5%、P99 > 1s
业务层订单量、支付成功率支付成功率 < 95%

表格中的阈值只是示例,不能直接当作通用生产标准。实际告警策略应围绕延迟、错误率和流量建立服务级目标(SLO),结合错误预算设计告警;基础设施告警要结合持续时间、资源限制和实际业务影响判断,避免仅凭瞬时利用率触发;业务指标要结合业务目标、统计窗口和有效样本量设置阈值。

6. 线上问题定位方法论 ​

6.1 三板斧:日志、指标、链路 ​

txt
发现问题(告警、用户反馈、SLO 变化)
    │
    ▼
界定影响范围(时间窗口、接口、实例、下游依赖)
    │
    ▼
看指标(Grafana)确认问题范围和影响
    │
    ├── 有可用 Trace ── 看链路(Jaeger/SkyWalking)定位到具体环节
    │
    └── 无可用 Trace ── 检查采样策略、指标、日志与运行时证据,不能把找不到慢 Trace 当作问题不存在
    │
    ▼
看日志(Kibana)用 TraceID 或关键字定位异常堆栈
    │
    ▼
验证假设并确认恢复,复现或交叉验证,观察指标与业务影响回归正常,不只凭单一指标就认定根因已解决

上图是一条常用排查路径,不是必须严格执行的顺序。日志中已有明确异常堆栈时可直接从日志追查,CPU 飙高时线程栈和系统指标可能比 Trace 更有价值,按证据选择入口即可。

6.2 常见问题排查路径 ​

问题现象排查步骤常见根因
接口响应变慢看 P99 趋势 → 找慢 Trace → 定位慢在哪个环节 → 看该环节日志慢 SQL、缓存穿透、下游超时、GC 暂停
偶发 500 错误看错误率分布 → 搜 ERROR 日志 → 看异常堆栈 → 关联 TraceID空指针、参数校验异常处理不当、并发竞争、连接池耗尽
内存泄漏看堆内存趋势与 GC 情况 → 生成堆转储 → 分析大对象大集合未清理、ThreadLocal 泄露、缓存无上限
CPU 飙高找高 CPU 进程 → 找高 CPU 线程 → 将线程 ID 转为十六进制按 nid 查找线程栈死循环、频繁 Full GC、正则回溯
数据库连接池耗尽看活跃连接数 → 确认是否达上限 → 查慢 SQL → 查事务关闭慢 SQL 占连接、事务未提交、连接泄漏

JVM 诊断工具(jmap、jstack、Arthas)的用法见 Spring 生产排查。

核心原则:可观测性不是事后补充,而是从第一天就设计进去。

7. 本章小结 ​

可观测性三大支柱各司其职,又通过不同的关联方式协同工作。

支柱回答的问题数据形态代表技术栈
日志发生了什么?离散事件Logback → Filebeat → Elasticsearch → Kibana
指标整体状况如何?时间序列数值Micrometer → Prometheus → Grafana
链路追踪请求经过了哪里?哪里慢?调用树OpenTelemetry → Collector → Jaeger/SkyWalking

三者不是互斥选择,而是互补关系。日志提供细节,指标提供全局视图,链路追踪提供调用路径。日志与追踪靠 TraceID、SpanID 关联,指标与追踪靠维度或 Exemplars 跳转,日志与指标靠共同维度关联,三者组合起来有助于形成更完整的可观测能力。

Released under the MIT License.