跳转到内容

分布式可观测性

用途:拆完之后定位“请求慢在哪、错在哪台服务”时查阅

支柱 回答什么 典型形态
Metrics(指标) 系统整体是否健康、趋势如何 计数器、直方图、分位数;Prometheus + Grafana
Tracing(链路) 单个请求经过了哪些服务、耗时分布 TraceId/SpanId 贯穿;OpenTelemetry + Jaeger/Tempo
Logging(日志) 具体发生了什么、上下文是什么 结构化 JSON 日志 + 集中检索(Loki/ES)

三者必须能互相跳转:从告警下钻到链路,从链路定位到日志。做不到时排障时间会成倍增加。

  1. TraceId 贯穿:HTTP 头、消息属性、线程池与异步任务、定时任务都要传递;日志必须打印 TraceId。
  2. 统一标签:服务名、环境、版本、实例、接口名、错误码作为标准维度,避免每个团队自造。
  3. 业务标识可检索:订单号、流水号等进入日志与 span 属性,支持“按业务号看全链路”。
  4. RED 指标:每个入口统计 Rate(请求量)、Errors(错误)、Duration(延迟分布,用 P95/P99 不用均值)。
  5. 资源指标:CPU、内存、GC 停顿、线程池队列、连接池、下游调用耗时。
  6. 采样策略:高流量场景用尾部采样或错误优先采样,保证异常链路一定被记录。
  • 基于症状(用户可感知的错误率与延迟)而非原因(CPU 高)告警。
  • 分级:紧急(用户受影响)需立即响应;警告(趋势异常)允许工作时间处理。
  • 每条告警必须可执行:附排查链接(看板/日志查询/最近变更)。
  • 抑制与聚合:同一故障引发的连锁告警要收敛,避免噪声导致麻木。

多数故障来自变更。要求:发布事件写入统一时间线(在图上标注 deploy)、配置变更留痕、特性开关状态可查。排障第一问应是“最近改了什么”。

OpenTelemetry(采集标准与 SDK)、Prometheus + Grafana(指标)、Jaeger / Tempo(链路)、Loki / Elasticsearch(日志)、Alertmanager(告警路由)、Kiali(服务网格可视化)。

误区 修正
只有服务器指标没有业务指标 补 RED 与关键业务量(成功率、积压、对账差异)
用平均值看延迟 用 P95/P99,长尾才是问题
日志无结构、无 TraceId 统一结构化字段与链路上下文注入
采样丢弃错误链路 错误与慢请求强制保留
看板很多但无告警闭环 每条告警对应一个可执行动作
异步任务链路断链 消息属性传递 TraceId,任务侧续接
  • Cindy Sridharan《NetOps: Making the Unknowable Knowable》与其分布式系统文章合集
  • OpenTelemetry 官方规范(语义约定部分)
  • Google SRE Book 第 6 章(监控与告警)