深夜,你是医院值班总医生。突然,手术室、急诊科、ICU的警报同时响起。病人没有昏迷,没有明显的生命危险,但你知道系统哪里不对劲——却说不清是哪个环节超时、哪台设备报错、哪个科室的数据没同步。如果这家医院只有一份布局图,你无从下手;但如果有生命体征监测仪(指标)、手术步骤记录(追踪)和完整病历档案(日志),你就能在三分钟内定位病灶。 这就是微服务世界的“可观测性”(Observability):让分布在几十个服务中的请求路径、系统指标和运行日志,如同体检设备一般清晰地反映系统健康状况。它由三大支柱构成——Trace(追踪)、Metric(指标)和 Log(日志),三者各司其职又互相印证,共同回答三个终极问题:发生了什么?哪里出了问题?为什么会这样? 本文将用“医院诊断系统”作为主比喻,带你从零看懂这三大支柱如何协同工作,以及服务网格如何把它们变成基础设施。

岗位关联

可观测性是 AI 运维(AIOps)的重要数据底座。掌握 Trace/Metric/Log 的关联分析,你就能让大模型和自动化系统“看懂”复杂系统的运行状态,为智能排障、容量预测和故障自愈提供高质量数据养料。

目录
  1. 可视化演示
  2. 三支柱概览
  3. Trace原理
  4. Metric原理
  5. Log管理
  6. 关联分析
  7. 网格观测
  8. 落地实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示可观测性三大支柱:分布式追踪(Trace)展示请求上下文传播与调用链,指标(Metric)聚合趋势监控与告警,日志(Log)结构化关联 trace_id,支撑数据驱动的故障诊断。

本节配有交互动效(进入视口后自动加载,约 3KB)。

分布式追踪 Trace Trace ID 经上下文传播贯穿调用链 W3C Trace-Context 定位慢请求与跨服务依赖瓶颈

三支柱概览

想象你是一家三甲医院的院长,刚接到命令:建设一套全院“健康态势感知系统”。你需要同时采购三类设备:一是生命体征监测仪,它贴在病人身上实时上报心率、血氧——这是 Metric;二是手术路径记录仪,它把每次治疗的检查步骤、转诊路径完整串联起来——这是 Trace;三是电子病历系统,它把每次处方、检查结果、护士备注都结构化存档——这是 Log。三者缺一不可,单靠任何一类都无法在复杂时刻做出准确判断。

在微服务世界里,一套交易请求会穿越网关、订单、库存、支付等多个服务。Metric 负责回答“系统现在整体快不快、稳不稳”——它像监测仪一样按秒采样,形成趋势曲线;Trace 负责回答“这一次请求到底走了哪些服务、各花了多久”——它像手术记录一样按“请求”为粒度还原完整路径;Log 则负责回答“某个服务里到底打印了什么、报了什么错”——它像病历一样记录离散事件。

三大支柱的关系可以用一个成熟度公式概括。观测覆盖率和数据质量直接决定你能多快地定位故障:

就像医院不可能只买心电图仪就开业,微服务系统也不能只做日志收集就宣称“可观测”。三大支柱相互补充:监测仪告诉你“心率骤降”(指标异常),手术记录告诉你“麻醉环节耗时过长”(追踪慢),病历告诉你“麻药师在 14:02 录入了一条过敏警告”(日志现场)。三者对照,才能锁定病灶。

O=0.3×CT+0.3×CM+0.4×CLO = 0.3 \times C_T + 0.3 \times C_M + 0.4 \times C_L
$O$ 是可观测性成熟度,$C_T$ 是链路追踪覆盖率,$C_M$ 是指标采集覆盖率,$C_L$ 是日志结构化率。权重代表对定位问题的贡献大小。
  1. 覆盖变量三个 $C$ 分别代表三类数据的覆盖率,取值 0 到 1
    CT,CM,CL∈[0,1]C_T, C_M, C_L \in [0, 1]
  2. 加权求和日志的权重最高(0.4),因为排障时 60% 以上的最终确认要靠日志
    O=0.3×CT+0.3×CM+0.4×CLO = 0.3 \times C_T + 0.3 \times C_M + 0.4 \times C_L
  3. 结果解读$O$ 越接近 1,说明系统被观测得越透彻,故障定位时间(MTTR)越短
    O→1⇒MTTR→min⁡O \to 1 \Rightarrow \text{MTTR} \to \min

Trace原理

医生接到急诊:病人腹痛难忍。他不会盲猜,而是按路径检查——先问诊、再血常规、再影像。每一步都记录“检查单号”,最终串成一条完整的诊疗链。分布式追踪(Trace)干的就是这件事:给一次业务请求发一张“挂号单”(trace ID),让它在跨越的所有服务之间传递,每个服务内部再细分出一个个“检查项目”(Span)。

当请求到达网关时,追踪框架生成全局唯一的 trace ID,并注入 HTTP 头。下游的订单服务、支付服务在收到请求时,把这个 ID 继续传给更下游的服务,同时记录自己的 Span——包含服务名、开始时间、耗时、状态码。所有 Span 上报到追踪系统后,按 trace ID 拼装成瀑布图,你一眼就能看出 2.3 秒的延迟到底耗在了哪个服务。

链路越长,上报数据越多,成本线性增长。所以生产环境普遍采用采样策略——只记录一部分请求的完整链路:

采样策略就像“抽查病历”——不可能给每位病人写完整博士论文式病历,但必须保证每类典型病情都有记录。常用的有固定比例采样(每 10 个请求记 1 个)和优先级采样(保留错误尾采样)。线上出故障时,通过实时调整采样率,既控制成本又保留现场证据。

r=nNr = \dfrac{n}{N}
$r$ 是采样率,$n$ 是实际被记录的请求数,$N$ 是总请求数。采样率越低成本越小,但问题复现概率也越低。
  1. 定义采样率$n$ 表示被追踪系统完整记录的请求数量
    n=recorded requestsn = \text{recorded requests}
  2. 总请求量$N$ 是窗口期内系统处理的所有请求数
    N=total requestsN = \text{total requests}
  3. 计算比例采样率是二者之比,例如每秒 1000 个请求只记 100 个,$r = 0.1$
    r=nN=0.1r = \dfrac{n}{N} = 0.1

Metric原理

病房里的心电监测仪不会记录每一个心跳的完整波形,而是按秒上报心率、血氧、血压的数值,形成连续曲线。Metric(指标)就是系统的心电监测:它以固定周期采集可聚合的数值,比如 QPS(每秒请求数)、错误率、CPU 利用率、内存水位,并支持按服务、实例、接口等维度做聚合查询。

指标按语义分为三类。计数器(Counter)只增不减,适合累计请求总数;仪表盘(Gauge)可增可减,适合描述当前状态如内存用量;直方图(Histogram)记录分布,适合刻画延迟结构。三者配合,你既能看“总流量涨了多少”,也能看“某实例当前是否过载”,还能回答“99% 的请求在多少毫秒内完成”。

“99% 的请求在多少毫秒内完成”就是著名的百分位指标,比如 p99,它比平均值更真实——平均值会被极端值拉偏,就像一个班里有一个天才拉高了全班平均分,而 p99 关注的是“最慢的那 1% 病人等多久”:

指标告警要量体裁衣。给 p99 设置静态阈值,就像规定“所有病人体温必须低于 37.5℃”——运动后体温升高是正常的。更聪明的做法是设置动态基线:用过去两周同时段的数据做参考,当指标偏离基线超过 3 个标准差才告警,减少无效报警,让值班人员把注意力放在真正的“病情恶化”上。

p99=x(⌈0.99×N⌉)p_{99} = x_{(\lceil 0.99 \times N \rceil)}
$p_{99}$ 表示按耗时从小到大排序后,处于第 99% 位置的那个耗时值。它告诉你“绝大部分请求的真实体验下限”。
  1. 排序把这 1 分钟内所有请求的耗时从小到大排列
    x(1)≤x(2)≤⋯≤x(N)x_{(1)} \le x_{(2)} \le \dots \le x_{(N)}
  2. 定位计算第 99 百分位对应的序号,向上取整
    i=⌈0.99×N⌉i = \lceil 0.99 \times N \rceil
  3. 取值第 $i$ 个位置的耗时即为 p99
    p99=x(i)p_{99} = x_{(i)}

Log管理

病历档案是医生最信任的证据——它记录每一次量体温的结果、每一剂药的剂量、每一句患者主诉。日志(Log)就是系统的病历:一条条不可变的事件记录,每一条都包含时间戳、级别、来源和内容。与指标不同,日志是离散的,它描述的是“具体发生了哪件事”,而不是“数值是多少”。

现代云原生系统每秒产生海量日志,采集端要解决三个问题:从哪收、怎么收、收完放哪。通常每个节点部署采集代理(Agent)监听容器标准输出,经过轻量过滤和格式化后,送入日志管道,最终落到分布式检索系统。为了节约成本,日志按“热-温-冷”分级存储:最近 7 天在 SSD 高速检索,30 天归档到对象存储,更久的数据压缩后进入冷备。

原始文本日志难以高效检索,所以结构化日志成为标配——每条日志统一为 JSON 格式,带固定字段(时间、级别、服务名、trace ID)和可变字段。结构化的意义在于可以被程序可靠解析,为后续的关联分析和自动排障铺路。关键异常可以通过频率统计来发现“异动”:

医院里,药剂师打开病历如果看到的是潦草手写字,就很容易配错药。给日志制定统一格式,就是给病历“打印成标准表格”。有了结构化日志,你才能像查索引一样快速找出“今天凌晨所有支付失败的请求及其 trace ID”,然后顺着 ID 去翻追踪瀑布图——这正是下一节要讲的关联分析。

fk=count(k)∑j=1Kcount(j)f_k = \dfrac{\text{count}(k)}{\sum_{j=1}^{K} \text{count}(j)}
$f_k$ 是第 $k$ 类日志出现的频率,$\text{count}(k)$ 是它的条数,分母是所有日志类别条数总和。某类错误频率突增,往往就是故障前兆。
  1. 分类计数把日志按消息模板归类,统计每类出现次数
    count(k)=number of logs of type k\text{count}(k) = \text{number of logs of type } k
  2. 总量归一分母是所有类别数量之和,把绝对数变成相对比例
    ∑j=1Kcount(j)=total logs\sum_{j=1}^{K} \text{count}(j) = \text{total logs}
  3. 频率比较当 $f_k$ 从正常值突然跳升,说明系统行为发生异常
    fk≫baselinek⇒anomalyf_k \gg \text{baseline}_k \Rightarrow \text{anomaly}

关联分析

老练的主治医师不会只盯着一张检查单诊断。他先看监测仪——心率 150,异常;再看手术记录——这台手术在中午 12 点转入 ICU;最后翻病历——病历上写着“12:03 注射 X 药物后出现过敏反应”。三类证据互相印证,诊断一气呵成。这就是关联分析:把 Metric、Trace、Log 通过统一标识符打通,形成“症状—路径—现场”的完整证据链。

打通的关键是“统一标签体系”。每一类数据都要带上三个核心标签:服务名、实例 ID、trace ID。指标采集器在记录 QPS 曲线时打上 trace ID 标签;日志框架自动把当前上下文里的 trace ID 注入每条结构化日志;追踪系统天然以 trace ID 为主键。当告警触发时,排障人员点开某个 trace ID,就能同时看到这段时间内该服务的指标曲线、完整调用链和关键日志。

根因定位可以量化为对候选服务的打分——延迟越大、错误率越高的服务,越可能是“病灶”。假设我们同时观测 $n$ 个服务:

这套“关联-打分-排序”的思维,正是 AIOps 智能排障系统的雏形。人工排障时,医生凭经验把三项证据在脑中关联;而把规则沉淀成算法后,机器就能自动完成候选服务排序,把“最大嫌疑犯”推到值班人员面前,大幅缩短从告警到定位的时间。

Si=wd×DiDmax⁡+we×EiEmax⁡S_i = w_d \times \dfrac{D_i}{D_{\max}} + w_e \times \dfrac{E_i}{E_{\max}}
$S_i$ 是第 $i$ 个服务的根因嫌疑分,$D_i$ 是它的耗时增量,$E_i$ 是它的错误增量,$w_d$、$w_e$ 是对应的权重。
  1. 延迟归一把每个服务的耗时增量除以最大值,得到 0-1 的延迟嫌疑度
    DiDmax⁡∈[0,1]\dfrac{D_i}{D_{\max}} \in [0, 1]
  2. 错误归一把错误增量同样归一化,衡量异常程度
    EiEmax⁡∈[0,1]\dfrac{E_i}{E_{\max}} \in [0, 1]
  3. 加权求和两方面的证据各按权重合并,分数最高者列为第一嫌疑服务
    Si=wd×delay_scorei+we×error_scoreiS_i = w_d \times \text{delay\_score}_i + w_e \times \text{error\_score}_i

网格观测

大医院建设成本最高的不是单个仪器,而是把所有科室的检查数据统一汇集的“输送带”系统。服务网格(Service Mesh)就是微服务世界的这条输送带:它让每个服务旁边自动挂载一个“贴身护士”——Sidecar 代理,所有进出流量都经过护士之手,从而无需改动业务代码就能自动完成 Trace 埋点、指标采集和日志格式统一。

数据面(Data Plane)的 Sidecar 负责“采集”:它拦截每一次 HTTP/gRPC 调用,自动生成 Span 并注入上下文;解析协议得到状态码、延迟、流量大小,生成标准的 RED 指标(Rate 速率、Errors 错误、Duration 耗时)。控制面(Control Plane)负责“配置与汇聚”:统一下发采样率、告警规则和导出目标,让所有 Sidecar 按同一标准行动。

网格把可观测性变成“平台能力”后,治理与观测就能联动。比如熔断:当某个服务的错误率超过阈值时,控制面自动触发熔断策略,并同步在指标曲线上打上“熔断事件”标记。观测数据量可以用一个简单的乘积模型估算:

医院铺设输送带后,护士不用再手写检查单,所有数据自动汇入中心系统。服务网格的最大价值不是技术炫酷,而是“默认可观测”——任何新服务接入网格,立刻获得三大支柱的标准数据,无需业务团队额外开发埋点代码。但要注意,Sidecar 也带来额外的延迟和数据量开销,这将在落地实践中权衡取舍。

V=∑i=1nSi×Ri×FiV = \sum_{i=1}^{n} S_i \times R_i \times F_i
$V$ 是每秒钟产生的观测数据条数,$S_i$ 是第 $i$ 个服务的副本数,$R_i$ 是每秒请求数,$F_i$ 是每个请求产生的观测数据条数系数。
  1. 单服务数据量一个服务的观测数据量等于副本数乘以请求速率再乘系数
    Si×Ri×FiS_i \times R_i \times F_i
  2. 求和汇总对所有服务求和,得到全系统每秒数据总量
    V=∑i=1nSi×Ri×FiV = \sum_{i=1}^{n} S_i \times R_i \times F_i
  3. 成本估算$V$ 直接决定存储和传输成本,是规划采集资源的依据
    V→cost∝VV \to \text{cost} \propto V

落地实践

从“医院有设备”到“医院能治病”,中间隔着系统性的工程规划。可观测性落地同样脱胎于三个关键决策:选什么标准、花多少钱、谁来建设。选型上,优先拥抱 OpenTelemetry——它是可观测性的“普通话”协议,定义了统一的 API、SDK 和导出格式,避免被某个厂商锁定。

成本控制是落地中最大的拦路虎。Trace 要采样,日志要分级存储,指标要控制基数(比如不按用户 ID 打标签)。一个常见策略是“全量采集、按需存储”:所有数据先经过内存管道,大多数指标聚合后丢弃原始点,只有错误路径的 Trace 才保留完整明细。存储分层也能大幅降本——热数据用高性价比的日志库,冷数据压缩后转入对象存储。

团队协同决定了工具能否真正用起来。平台团队(SRE/基础设施)负责搭建采集管道和统一看板,制定数据规范;业务团队负责在关键路径补充业务埋点(比如订单金额、支付渠道);值班团队负责沉淀告警治理规则,持续消除无效告警。三支团队共同维护一份“观测指标字典”,确保每个指标都有负责人和用途。

可观测性的最终检验标准是故障恢复时间。建设前后对比 MTTR 是关键指标。错误预算把质量目标量化成可计算的指标,让团队在“发布新功能”和“保证稳定性”之间找到平衡:

就像医院最终靠“抢救成功率”而非“设备数量”来评价,可观测性工程的成功标准是“故障恢复更快、团队协作更顺、系统更透明”。它不是一次性项目,而是持续进化的体系:随着业务规模增长,采样策略、存储分层和告警规则都要定期复盘优化,让这套“诊断系统”始终保持敏锐。

SLO=1−EtotalNtotal\text{SLO} = 1 - \dfrac{E_{\text{total}}}{N_{\text{total}}}
$\text{SLO}$ 是服务可用性目标,$E_{\text{total}}$ 是窗口期内的错误请求数,$N_{\text{total}}$ 是总请求数。约定 99.9% 的 SLO,意味着每 1000 个请求最多允许 1 个失败。
  1. 错误占比计算窗口期内错误请求占总请求的比例
    e=EtotalNtotale = \dfrac{E_{\text{total}}}{N_{\text{total}}}
  2. 可用性定义SLO 等于 1 减去错误占比
    SLO=1−e\text{SLO} = 1 - e
  3. 预算概念1 减去 SLO 就是错误预算,比如 SLO 为 99.9% 时,每月最多允许约 43 分钟不可用
    error budget=1−SLO\text{error budget} = 1 - \text{SLO}

AI 应用场景

基于指标的智能异常检测

阶段:数据采集与异常检测

解决的问题:传统告警依赖人工设定固定阈值,业务高峰时误报率极高,凌晨 3 点经常被无效告警吵醒。AI 模型用历史 Metric 数据(QPS、错误率、延迟分位数)训练时序预测模型,动态生成预测区间,当实际值偏离预测区间超过预设程度时自动触发告警。

具体案例:某电商平台在大促前用过去 30 天的分位数数据训练轻量模型,大促当天流量是平时的 10 倍,固定阈值系统疯狂误报,而 AI 预警系统把误报率降低 80%,还提前 20 分钟预测出支付服务的延迟拐点,团队借此提前扩容。

基于 Trace 的智能根因定位

阶段:推理与根因分析

解决的问题:链路包含几十个服务,出现故障时人工对照瀑布图逐跳排查非常缓慢。AI 系统把 Trace 数据转化为“服务依赖图上的路径异常序列”,训练分类模型识别故障传播模式,直接输出最可疑的服务和调用路径,替代人工翻阅。

具体案例:某金融系统在一次全链路压测中,根因定位模块通过分析 10 万条 Trace,在 3 秒内锁定“用户服务 → 风控服务”链路上的内存缓存穿透问题,比人工排查快了近半小时,并且给出了证据链(耗时突增的 Span 列表 + 相关错误日志)。

Python 演示

python38 行
"""模拟分布式追踪数据并分析各服务耗时占比."""import random class Span:    """一次服务调用的记录."""    def __init__(self, service, start_ms, duration_ms):        self.service = service        self.start_ms = start_ms        self.duration_ms = duration_ms class MiniTracer:    """极简追踪器:收集 Span 列表."""    def __init__(self):        self.trace_id = 0        self.spans = []     def record_call(self, service, duration_ms):        """记录一条新的 Span."""        self.trace_id += 1        self.spans.append(Span(service, self.trace_id * 10, duration_ms)) def analyze(tracer):    """输出各服务耗时占比."""    total = sum(s.duration_ms for s in tracer.spans)    by_service = {}    for s in tracer.spans:        by_service[s.service] = by_service.get(s.service, 0) + s.duration_ms    print("各服务耗时占比:")    for svc, ms in by_service.items():        print(f"{svc}: {ms / total:.1%}") tracer = MiniTracer()for _ in range(5):    tracer.record_call("gateway", random.randint(10, 30))    tracer.record_call("cart", random.randint(20, 60))    tracer.record_call("payment", random.randint(50, 120)) analyze(tracer)
目的:用一个小而完整的例子演示如何收集 Trace 的 Span 数据,并按服务维度聚合耗时占比。
  1. class Span:定义一次服务调用的数据结构,对应真实追踪系统中的一条 Span 记录
  2. class MiniTracer:极简追踪器,在真实系统中对应 OpenTelemetry 的 Tracer 对象
  3. self.trace_id += 1每记录一次调用生成一个新 ID,对应真实系统中全局唯一的 trace ID
  4. self.spans.append(...)把 Span 保存到列表,对应追踪系统收集器中的 Span 缓冲队列
  5. sum(s.duration_ms for s in tracer.spans)计算所有调用总耗时,对应统计窗口的总时长
  6. by_service[svc] = ... + s.duration_ms按服务名分组聚合,对应指标聚合的 group by 操作
  7. ms / total计算耗时占比,可直接作为关联分析中“延迟嫌疑分”的输入,对应正文中的 $D_i / D_{\max}$

常见误区

误区我以为只要把服务日志统一收集到一个 Elasticsearch 里,配上 Kibana 看板,就算建设了完整的可观测性。毕竟排障时大家不都是查日志吗?

正解日志只看得到“某一台服务自己打印了什么”,却看不到请求从哪里来、在哪个环节延迟。没有 Trace,你无法还原跨服务的调用链;没有 Metric,你看不到延迟在哪个时间点开始劣化。形象地说,只收集日志相当于医院只有病历本而没有心电监测仪和手术路径记录——医生很难在复杂病情中快速找到病灶。

为何常见:日志是最早出现、最直观的观测手段,而且排查单机问题时确实够用。在小系统里长期工作的人容易把局部经验放大为全局认知。

误区既然要排障,那当然要把每个请求的链路都记下来,采样率设为 100% 最保险,反正存储又不贵。

正解全量采样意味着每笔请求经过 20 个服务就产生 20 条 Span,高峰期每秒上百万条数据,存储和传输成本会拖垮系统本身。合理做法是“头尾采样”:正常请求降采样到 1%,错误请求全量保留。就像医院不会给每个门诊病人都做 24 小时动态心电图——只有疑难重症才值得昂贵检查。

为何常见:成本在大规模集群中是隐性增长的,单次请求多几十字节看不出影响,乘以百万 QPS 就变成天文数字。小规模环境下的经验直接套用到大系统必然踩坑。

误区我恨不得给每个指标都配上告警规则,阈值调得越敏感越好,这样任何风吹草动都能第一时间知道。

正解告警规则泛滥会导致“告警疲劳”——值班人员每天收到几百条通知,真正严重的告警反而被淹没。高灵敏度的静态阈值在业务高峰期必然误报。正确做法是减少告警数量、提高告警质量:聚焦 SLO 相关的少数核心指标,用动态基线代替固定阈值,并且每条告警都要附带可执行的处置建议。

为何常见:人们倾向于相信“更多信息 = 更安全”,却忽略了注意力是稀缺资源。告警是消耗注意力的东西,而不是越多越好的收藏品。

误区Trace 是 APM 团队负责的,Metric 是监控团队负责的,Log 是日志平台负责的,三个工具各自有独立看板就行,出了问题分别看三个界面嘛。

正解故障定位最关键的动作是“跨数据关联”——看到指标异常时,要能顺着 trace ID 跳到调用链,再点进某条日志看现场。如果三个系统没有统一的 trace ID 和标签体系,排障就得在三个界面之间手动复制粘贴关键字,效率极低。医院里心电图、手术记录、病历若不能归到同一个病人 ID 下,医生再厉害也难做综合诊断。

为何常见:很多公司的观测工具是不同团队在不同时期引入的,天然存在数据孤岛。大家习惯了工具割裂,没有意识到“关联”才是可观测性的灵魂。

面试题

Q1. 可观测性三大支柱中,用于还原跨服务调用路径的是?

单选题 · easy

  • A.指标 Metric
  • B.追踪 Trace← 正确答案
  • C.日志 Log
  • D.配置 Config

答案:B。Trace 通过唯一的 trace ID 把一次请求跨所有服务的调用过程串联成完整链路,回答“走了哪些服务、各花多久”。Metric 回答整体健康趋势,Log 回答离散事件现场,都不负责还原调用路径。

Q2. 下列哪项是 Trace 中唯一标识一次完整请求的编号?

单选题 · easy

  • A.Span ID
  • B.Service ID
  • C.Trace ID← 正确答案
  • D.Node ID

答案:C。Trace ID 在一次请求入口生成,贯穿所有下游调用,是把散落在各服务的 Span 拼成完整调用链的主键。Span ID 只标识单次服务调用,Service ID 标识服务本身,均不能串联全链路。

Q3. p99 延迟指标的含义是什么?

单选题 · mid

  • A.平均 99% 的请求耗时
  • B.最慢的 1% 请求的平均耗时
  • C.排序后处于 99% 位置的耗时值← 正确答案
  • D.99% 的请求在指定阈值内完成

答案:C。p99 是将所有请求耗时排序后,取第 99 百分位位置的那个值,代表“最慢的 1% 请求的下界”。它比平均值更能反映大部分用户的实际体验,B 描述的是“最慢 1% 的平均值”,D 是 SLO 的表述。

Q4. 关于 Trace 采样策略,以下说法正确的是?

单选题 · mid

  • A.采样率必须保持 100%
  • B.只采样错误请求丢弃正常请求
  • C.正常请求降采样错误请求全采← 正确答案
  • D.采样与成本控制毫无关系

答案:C。生产环境通常对正常请求按比例降采样(如 1%),对错误请求全量保留,既控制存储成本又保证故障证据完整。100% 采样成本过高,完全丢弃正常样本又无法发现性能劣化。

Q5. 结构化日志相比文本日志的核心优势是?

单选题 · easy

  • A.人类阅读更方便
  • B.可被程序可靠解析和检索← 正确答案
  • C.占用磁盘空间更少
  • D.不需要采集代理就能生成

答案:B。结构化日志以统一字段(时间、级别、服务名、trace ID)组织内容,机器可以稳定解析,从而支持关联分析和自动排障。人类阅读其实不如纯文本直观,磁盘占用也未必更少。

Q6. 服务网格中 Sidecar 代理主要负责?

单选题 · mid

  • A.执行业务逻辑计算
  • B.自动拦截流量并采集观测数据← 正确答案
  • C.存储各类日志和指标
  • D.替代控制面的配置下发

答案:B。Sidecar 是数据面组件,拦截进出服务的流量,自动完成 Trace 埋点、指标生成和协议解析。业务逻辑由服务自身处理,日志存储、配置下发分别属于存储系统和控制面职责。

Q7. 下列哪项属于关联分析中统一标签体系的核心要素?

单选题 · hard

  • A.日志文件名称
  • B.服务名与 Trace ID← 正确答案
  • C.容器镜像版本
  • D.数据库连接池大小

答案:B。关联分析靠服务名、实例 ID、Trace ID 这类贯穿三类数据的标签打通证据链。日志文件名无法关联指标,镜像版本和连接池大小不参与跨数据关联。

Q8. 可观测性三大支柱分别回答哪些问题?

多选题 · mid

  • A.Metric 回答“整体趋势是否正常”← 正确答案
  • B.Trace 回答“一次请求走了哪些路径”← 正确答案
  • C.Log 回答“具体服务打印了什么事件”← 正确答案
  • D.Config 回答“配置项是否被修改”

答案:ABC。三大支柱的分工是:Metric 看趋势,Trace 看路径,Log 看现场。Config 变更记录不属于可观测性三大支柱范畴,虽然配置审计有价值,但它不是本文定义的三支柱之一。

Q9. 关于服务网格对可观测性的增强,下列说法正确的是?

多选题 · mid

  • A.业务代码无需改动即可自动埋点← 正确答案
  • B.控制面统一管理采样与告警规则← 正确答案
  • C.所有服务延迟一定降为零开销
  • D.观测与治理策略可以联动触发← 正确答案

答案:ABD。Sidecar 透明代理使得业务代码零改动获得埋点能力,控制面统一下发规则,熔断等治理动作可与观测指标联动。但 Sidecar 会引入额外网络跳数,增加少量延迟,不存在零开销。

Q10. 可观测性工程落地时,控制成本的有效手段有哪些?

多选题 · hard

  • A.Trace 采用头尾采样策略← 正确答案
  • B.日志按热冷分级存储← 正确答案
  • C.指标按高基数标签全量存储
  • D.存储根据访问频度自动降级← 正确答案

答案:ABD。头尾采样保留关键样本同时削减数据量,分级存储把冷日志压缩归档,自动降级优化费用。高基数标签(如按用户 ID 打标签)会让指标存储爆炸式增长,是典型成本陷阱,应当避免。