可观测性¶
面试追问地图¶
| 主问题 | 必讲关键点 | 下一层追问 |
|---|---|---|
| 三大信号 | logs、metrics、traces、关联上下文 | 采样与成本 |
| 指标类型 | Counter、Gauge、Histogram、Summary | 分位数与聚合 |
| 告警 | 症状、持续时间、分级、降噪 | 抑制、分组和静默 |
| SLO | 用户视角、目标窗口、预算 | 多窗口燃烧率告警 |
| APM | trace/span、上下文传播、服务图 | 头采样与尾采样 |
一、信号与指标¶
日志、指标和链路各解决什么问题?¶
- 指标适合低成本聚合趋势、看板与告警,回答“是否异常、影响多大”。
- 链路记录一次请求跨服务的因果路径,回答“慢或错在哪一段”。
- 日志保留离散事件和诊断细节,回答“当时具体发生了什么”。
三者应通过 trace_id、span_id、服务名和版本等上下文关联。不要把用户 ID、订单 ID 等无界值作为 Prometheus label,否则时序基数会失控;这些高基数字段更适合日志或按需检索的链路属性。
Prometheus 四种指标类型如何选择?¶
- Counter:只增不减(进程重启归零)的累计量,如请求数、错误数;通常配合
rate()。 - Gauge:可升可降的瞬时值,如队列长度、在用连接数。
- Histogram:按桶统计分布,并提供 count/sum;可在服务端聚合后用
histogram_quantile()估算分位数。桶边界要围绕 SLO 设计。 - Summary:客户端在滑动窗口计算分位数;分位数通常不能跨实例正确聚合,适合聚合要求低且需客户端精度的场景。
平均值会掩盖长尾,延迟通常关注 p95/p99。但分位数也不能替代请求量和错误率:低流量服务的 p99 抖动不一定值得唤醒值班人员。
二、告警与可靠性目标¶
怎样设计可行动的告警?¶
告警应优先反映用户可见症状,如高错误率和高延迟,而不是为每个底层原因都发 Page。规则要包含持续时间,过滤短暂抖动,并附负责人、影响、看板和 Runbook。
- Page:正在造成显著用户影响,需要立即人工处理。
- Ticket:尚不紧急,但趋势会耗尽容量或可靠性预算。
- Dashboard:仅用于诊断,不主动通知。
Alertmanager 负责分组、路由、抑制和静默;这些机制用于减少重复通知,不能修复一条本身不可行动的告警。还需从外部黑盒探测监控链路本身,避免“监控和服务一起失明”。
SLI、SLO、SLA 和错误预算是什么?¶
- SLI:可测量的用户体验指标,例如成功请求比例、低于 300 ms 的请求比例。
- SLO:在明确时间窗口内对 SLI 的内部目标,例如 28 天可用性 99.9%。
- SLA:对客户的承诺,通常包含违约后果,不应与内部 SLO 混用。
- 错误预算:
1 - SLO。99.9% 的 SLO 允许窗口内 0.1% 的不合格事件。
预算消耗过快时,应把工程资源从功能发布转向可靠性。告警可使用短窗口和长窗口的燃烧率组合:短窗口发现快速故障,长窗口过滤偶发噪声;它比固定 CPU 阈值更贴近 SLO 是否会被耗尽。
三、APM 与排障¶
APM 如何定位一次慢请求?¶
一次 trace 由多个 span 构成,每个 span 记录操作、父子关系、耗时、状态和必要属性。上下文通过 HTTP/RPC/消息头传播,异步消费还要保留生产与消费的关联。
排查顺序通常是:从 SLO/告警确定影响范围 → 按服务、版本、区域切分指标 → 打开代表性慢/错 trace 找关键路径 → 用关联日志确认参数、重试和异常。采样必须明确:头采样成本可控但可能漏掉罕见错误;尾采样能优先保留慢和错链路,但需要集中缓冲与更高资源成本。