面试知识

3.3.6 Prometheus(监控系统)指标、告警与告警风暴治理

32-DevOps与可观测性 面试知识整理。

3.3.6 Prometheus(监控系统)指标、告警与告警风暴治理

版本边界:项目实际 Prometheus(监控系统)与 Alertmanager(告警管理器)版本待现场核对;本文只说明稳定的模型与配置语义,具体参数、废弃项和托管平台差异须在变更前核对官方文档。教学数字均为演练样例,不能被替换成项目事实。

0. 面试主线、信号边界与章节骨架

Prometheus(监控系统)把可聚合的数值样本变成时间序列,再用规则将症状转为可路由告警。它解决“何时、何类服务、何个受控维度出现趋势或偏离”,不能证明某一笔支付已入账、某个库存扣减已提交,也不能替代日志、链路和业务审计。日志(离散事件)回答细节和上下文,链路(受采样因果样本)回答被观察到的等待路径,指标(聚合数值)回答趋势和范围,订单、库存流水、账务流水与渠道回执才是业务终态的权威证据。

| 信号 | 数据模型 | 最适合回答 | 信息损失与不能证明的事实 | | --- | --- | --- | | 指标 | label(标签)受控的数值时间序列 | 错误率、延迟分布、容量、趋势、SLO(服务等级目标)燃烧 | 聚合丢失单请求细节;不能证明支付或库存终态 | | 日志 | 离散结构化事件 | 某次异常、实例上下文、变更时间线 | 采集可能丢失或重复;不能代表完整趋势 | | Trace(链路追踪) | 受采样 Span(跨度)关系 | 一次样本跨服务等待和重试 | 未采样路径不可见;相关性不是业务提交证明 | | 业务审计 | 权威状态与流水 | 订单、库存、资金、渠道事实 | 不宜替代秒级运行趋势与容量预警 |

本册的设计思想是分治聚合、症状告警、反馈延迟、基数预算、信息损失和监控自监控:先聚合出用户可感知症状,再沿变更、依赖、实例与业务审计逐层缩小;把新增 label(标签)当作要预算的索引成本;把抓取、规则和通知自身的延迟当作控制循环的一部分。

后续章节骨架:7. 直方图桶/分位数/平均与尾延迟;8. Recording Rule(记录规则)与查询成本;9. Alert Rule(告警规则)pending(等待)/firing(触发)/for(持续时间);10. Alertmanager(告警管理器)分组/抑制/静默/路由;11. 告警风暴、抖动、通知失败与根因聚合;12. 高可用、联邦、remote write(远程写入)、长时存储和监控自身;13. WMS(仓储管理系统)/支付/物流/导出/Runner(执行器)/IoT(物联网)项目、排障、容量、版本边界。

1. 指标、时间序列与标签基数

一个 time series(时间序列)由 metric name(指标名)和完整 label collection(标签集合)唯一确定;每个 scrape(抓取)时刻写入一个 sample(样本)。标签是有限、稳定、可聚合的维度,例如服务、环境、受控路由与结果类别;订单号、用户标识、追踪标识、异常文本和原始 URL(统一资源定位符)会产生近似每请求一个序列的高基数,应该留在日志或审计中。staleness(陈旧标记)让消失目标的旧值不被无限延续,目标丢失本身仍需由 up 等采集信号显式观察。

| 维度 | 期望状态 | 失败可见性 | 成本或审计边界 | | --- | --- | --- | | metric name(指标名) | 描述被测量对象与单位,稳定命名 | 同名不同语义会得到可执行但错误的查询 | 名称变更须有版本与迁移记录 | | label(标签) | 有限集合,能解释聚合 | 值无界时内存、索引和查询扇出上升 | 新增标签须经过基数预算 | | sample(样本) | 在固定抓取周期观察值 | 抓取失败、超时和目标消失必须可见 | 采样间隔决定短峰值损失 | | time series(时间序列) | 可按标签过滤和聚合 | 缺失不是零,需区别未上报与真实为零 | 不保存完整业务明细 |

flowchart LR
  A[WMS(仓储管理系统)/metrics] --> B[Prometheus(监控系统)scrape(抓取)]
  B --> C[metric name(指标名)]
  C --> D[label set(标签集合)]
  D --> E[time series(时间序列)]
  E --> F[TSDB(时序数据库)]
  B -.超时或拒绝.-> G[up=0 与 scrape 失败证据]
  D -.订单号等无界值.-> H[基数失控与内存压力]
  H --> I[删标签、归类并回日志/审计]

图 1 说明: 节点表示从暴露端点到序列存储的最小链路,实线是正常采集,虚线是两种必须可见的失败路径。前提是标签字典受控;正常结果可按服务、路由和结果聚合;抓取失败由 up 与抓取耗时暴露,基数失控则要回退为有限分类并把单值细节留给日志或审计。

数据演绎 1:基数预算。 演练样例中有 20 个实例、8 条受控路由、5 个状态码分类、3 个环境,则单个指标理论序列数为 20 x 8 x 5 x 3 = 2,400。若再加订单号且日内有 300,000 个不同值,上界变为 2,400 x 300,000 = 720,000,000,即使大部分组合未出现也已超过预算。输入是标签候选;阶段状态是先计算受控笛卡尔积,再识别无界订单号;输出是保留 routecode、删除订单号;失败分支是上线后 prometheus_tsdb_head_series 持续陡升;验证结论是用该指标和新增序列前三标签值核对,订单定位改查日志与订单审计。

热门面试题

  1. 问题:Prometheus(监控系统)的时间序列如何唯一确定?
    • 考点:指标身份与标签语义。
    • 回答思路:先给唯一键,再说明标签边界和聚合。
    • 详细答案:time series(时间序列)由 metric name(指标名)加完整 label collection(标签集合)唯一确定,样本只是该身份在某个时间点的值。设计时让标签表达有限业务分类或运行维度,使 sum by 能回答范围问题;不可枚举的订单号、用户标识和错误正文不应成为标签。
    • 进阶追问:实例标识可以作为标签吗?
    • 进阶回答:可以,但它会让每实例形成独立序列,应只在定位与基础设施指标中保留,并让高层告警先按服务聚合,避免实例重建造成通知重复。
  2. 问题:为什么“缺失”不能直接当作零?
    • 考点:观测缺口与业务零值。
    • 回答思路:区分未发生、未抓到和目标消失。
    • 详细答案:零表示被观测对象报告了数值零;缺失还可能是抓取超时、服务发现剔除、进程停止或标签变更。把缺失当零会掩盖监控盲区,正确做法是同时看 up、目标列表、抓取错误和业务总量,并按场景决定是否触发缺失告警。
    • 进阶追问:目标短暂重启如何减少误报?
    • 进阶回答:为目标可用性规则设置合理 for,同时保留重启事件、部署变更和服务发现证据;这延迟了通知,但避免一次抓取抖动被误判为真实不可用。
  3. 问题:高基数的根因和治理顺序是什么?
    • 考点:成本模型与止损。
    • 回答思路:从标签乘积、定位证据、改造和预算回答。
    • 详细答案:根因通常是把请求级或实体级值放入 label(标签),与实例、路由、状态等维度相乘后持续创建新序列。先以 Head Block(头部块)序列数、内存和查询延迟确认影响,停掉无界标签或在采集前 relabel(重标记)丢弃,再把详情转存日志或审计,最后为每个指标家族登记基数预算。
    • 进阶追问:哈希订单号能解决问题吗?
    • 进阶回答:不能。哈希只隐藏明文,不改变几乎每订单一个不同值的基数;还会让聚合没有业务解释力。

2. Counter(计数器)、Gauge(仪表盘值)、Histogram(直方图)与 Summary(摘要)

Counter(计数器)单调增加,进程重启可归零,适合请求数和失败数;Gauge(仪表盘值)可升可降,适合队列长度和在途任务;Histogram(直方图)以累积 bucket(桶)记录观测分布,可在服务端跨实例聚合;Summary(摘要)通常在客户端计算分位数,适合本地观测但不同实例的分位数不能正确相加。类型选错会让 PromQL(Prometheus 查询语言)语法正确而业务含义错误。

| 类型 | 典型值 | 正确计算 | 常见误用 | | --- | --- | --- | | Counter(计数器) | http_requests_total | 用 rateincrease 跨重启求增量 | 直接比较原始绝对值判断短窗流量 | | Gauge(仪表盘值) | runner_queue_age_seconds | 看当前值、变化与持续时间 | 用 rate 把队列年龄伪装成吞吐 | | Histogram(直方图) | 桶、总和与计数值 | 聚合桶后求分位数,sum(总和)/计数求平均 | 不同桶边界混聚合 | | Summary(摘要) | 客户端 quantile(分位) | 看单实例局部体验 | 将多个实例 P95(95 分位响应时间)平均 |

flowchart TB
  R[请求完成] --> C[Counter(计数器)total]
  R --> H[Histogram(直方图)bucket/sum/count]
  Q[队列轮询] --> G[Gauge(仪表盘值)]
  L[本地摘要] --> S[Summary(摘要)quantile(分位)]
  C --> P[rate(速率)与错误率]
  H --> P95[histogram_quantile P95]
  H --> AVG[sum / count 平均值]
  S -.不能跨实例正确聚合.-> X[仅作局部观察]

图 2 说明: 同一业务动作可同时产生计数和延迟分布,队列状态则是瞬时值。正常路径从类型到对应计算;失败路径强调 Summary(摘要)的客户端分位数不能跨实例聚合,因此全局尾延迟要优先采用桶边界统一的 Histogram(直方图)。

数据演绎 2:Counter(计数器)重启。 payment_callback_total 在 10:00 为 18,000,10:05 为 18,600,10:07 进程重启后为 40,10:10 为 310。输入是四次样本;阶段状态为原始值发生回落;输出是 10:00 至 10:10 的请求增量为 600 + 310 = 910,而不是 310 - 18,000。失败分支是直接相减得到负数并误判流量消失;验证结论是用 increase(payment_callback_total[10m]) 与重启指标、实例事件交叉核对。

热门面试题

  1. 问题:什么时候选择 Counter(计数器),什么时候选择 Gauge(仪表盘值)?
    • 考点:累计事件与瞬时状态。
    • 回答思路:按是否允许下降、是否需要跨窗口计算区分。
    • 详细答案:已完成请求、失败、重试等离散事件用 Counter(计数器),它的归零由 rateincrease 处理;队列深度、连接数、在途任务等当前状态用 Gauge(仪表盘值),因为它天然会上下波动。不要用 Gauge(仪表盘值)累计请求,否则重启和并发更新都难解释。
    • 进阶追问:库存余量能否用 Gauge(仪表盘值)?
    • 进阶回答:可以观测快照,但它不是库存权威账;扣减正确性仍要以库存流水和事务状态确认,且多库分片聚合要明确时间点与延迟。
  2. 问题:为什么 Summary(摘要)不适合全局 P99(99 分位响应时间)?
    • 考点:分位数不可加性。
    • 回答思路:说明客户端局部计算与服务端桶合并的差异。
    • 详细答案:Summary(摘要)把分位数在每个进程本地估算,两个实例的 P99(99 分位响应时间)没有权重和分布信息,平均后不是整体 P99(99 分位响应时间)。Histogram(直方图)保留累计桶计数,先按实例聚合相同边界的桶,再由 histogram_quantile 近似全局分位数。
    • 进阶追问:Histogram(直方图)分位数完全精确吗?
    • 进阶回答:不完全精确,它在桶内插值,精度受桶边界限制;把桶放在 SLO(服务等级目标)阈值和关注的尾延迟附近,能以可控成本换取更有用的估计。
  3. 问题:为什么不能对 Gauge(仪表盘值)随意使用 rate
    • 考点:函数和指标语义匹配。
    • 回答思路:说明 rate(速率)假设与反例。
    • 详细答案rate 面向可重置的单调 Counter(计数器),会把回落理解为重启后重新累计。队列长度和内存使用是 Gauge(仪表盘值),回落可能只是消费、释放或扩容;应比较当前值、最大值、持续时间或变化趋势,而不是把它解释成事件发生速率。
    • 进阶追问:队列积压应补哪两个指标?
    • 进阶回答:至少补待处理数量和最老消息年龄;数量反映规模,年龄反映用户等待,两者一起比单个阈值更接近业务影响。

3. pull(拉取)、服务发现、relabel(重标记)、Exporter(导出器)与 Pushgateway(推送网关)

Prometheus(监控系统)默认以 pull(拉取)控制循环从 target(目标)读取 /metrics,能统一超时、频率、目标健康和配置审计。Service Discovery(服务发现)把编排对象转为候选目标;relabel(重标记)在采集前筛选、改名或删除高风险标签;Exporter(导出器)把数据库、节点或业务外部系统的可观测状态转换为指标。Pushgateway(推送网关)适合无法被长期抓取的短任务暴露最后一次结果,但不会替短任务自动清理陈旧分组,也不能作为常驻服务的替代采集方式。

| 组件 | 期望职责 | 失败路径 | 恢复与审计 | | --- | --- | --- | | Service Discovery(服务发现) | 发现受控目标与元数据 | 标签错配或目标遗漏 | 比较目标列表与编排对象 | | scrape(抓取) | 定期拉取样本并记录耗时 | 超时、TLS(传输层安全协议)失败、返回非法文本 | 看 up、抓取错误与配置变更 | | relabel(重标记) | 筛选目标、保留有限标签 | 误删使业务指标消失 | 配置评审、目标差异与回滚 | | Exporter(导出器) | 适配非原生指标端点 | 被监控系统慢导致采集超时 | 独立超时与 exporter 自身指标 | | Pushgateway(推送网关) | 保留短任务最后结果 | 作业消失后遗留旧序列 | 任务完成后显式删除分组 |

sequenceDiagram
  participant SD as Service Discovery(服务发现)
  participant P as Prometheus(监控系统)
  participant E as Exporter(导出器)
  participant A as 应用/数据库
  SD->>P: 候选 target(目标)与元数据
  P->>P: relabel(重标记)筛选与基数约束
  P->>E: scrape(抓取)/metrics
  E->>A: 读取受控状态
  A-->>E: 数值或超时
  E-->>P: 样本或失败
  alt 超时、无目标或标签错误
    P->>P: 记录 up=0、抓取时长与目标差异
  else 正常
    P->>P: 写入 TSDB(时序数据库)
  end

图 3 说明: 服务发现只提供候选,relabel(重标记)负责将其变成可预算的抓取目标;正常箭头从抓取到存储,失败箭头把目标遗漏、抓取超时和标签错误变成可查询证据。Exporter(导出器)不应把慢查询直接放大成整个抓取循环的阻塞。

数据演绎 3:抓取负载与短峰丢失。 400 个 target(目标),每 15 秒 scrape(抓取)一次,每次平均暴露 1,200 个样本,样本输入速率约为 400 x 1,200 / 15 = 32,000 样本每秒。某支付回调错误只持续 8 秒,若恰好夹在两次抓取之间,Counter(计数器)的后续增量仍会反映总失败数,但瞬时 Gauge(仪表盘值)峰值可能完全错过。失败分支是把未见到 Gauge(仪表盘值)峰值误认定“没有拥塞”;验证结论是增加事件计数、队列年龄及日志时间线,而不是盲目把全局周期缩短到造成采集过载。

热门面试题

  1. 问题:pull(拉取)模型相对业务服务主动推送的优势是什么?
    • 考点:控制面与失败可见性。
    • 回答思路:从调度、健康、认证和审计说明。
    • 详细答案:由 Prometheus(监控系统)统一发起抓取,可以集中控制周期、超时、认证、目标清单和失败记录,抓取失败本身可观察。业务服务无需在每次上报时处理重试风暴;但网络隔离的目标仍要通过代理或替代方案接入,不能假装拉取天然跨越所有边界。
    • 进阶追问:为什么短任务不能直接等待被抓取?
    • 进阶回答:任务可能在下一次抓取前结束,端点已不存在。可将完成结果推给 Pushgateway(推送网关)并显式删除分组,或将结果写入可抓取的稳定汇总服务;两者都要处理陈旧结果。
  2. 问题:relabel(重标记)最关键的治理价值是什么?
    • 考点:在写入前限制成本与语义。
    • 回答思路:先说筛选,再说标签收敛与回滚证据。
    • 详细答案:它在目标进入 TSDB(时序数据库)前基于发现元数据做保留、删除和规范化,能过滤无关目标、移除无界标签并统一服务身份。误配也会造成静默盲区,因此必须把规则纳入配置审计,发布后对比目标数、up 与关键业务总量。
    • 进阶追问:能否用 relabel(重标记)把订单号改成哈希?
    • 进阶回答:不能解决基数根因,哈希仍可能每订单一个不同标签值;应删除该维度,按有限业务类型聚合,并在日志或审计中保留订单检索能力。
  3. 问题:Pushgateway(推送网关)的陈旧数据风险如何治理?
    • 考点:作业生命周期。
    • 回答思路:说明分组身份、显式清理和时间约束。
    • 详细答案:Pushgateway(推送网关)保存的是最后被推送的分组值,作业失败或被删除时不会自动证明结果失效。为每类短任务使用稳定但有限的分组标签,作业完成后删除对应分组,并监控最后成功时间;告警应基于新鲜度而非旧的成功值。
    • 进阶追问:常驻 API(应用程序接口)服务可以用它吗?
    • 进阶回答:不建议。常驻服务应暴露可抓取端点,让实例消失、抓取失败和服务发现变化进入同一控制循环。

4. TSDB(时序数据库)Head(头部)、WAL(预写日志)、chunk(数据块)、block(数据块)、compaction(压缩合并)与 retention(保留)

写入路径先进入 WAL(预写日志)保障重启可恢复,再写入 Head(头部)中的活跃序列与 chunk(数据块),随后切成不可变 block(数据块),由 compaction(压缩合并)合并并按 retention(保留)删除过期数据。查询会同时读取 Head(头部)与多个 block(数据块)。这是一条以追加、压缩与索引换查询效率的数据流;高基数会在 Head(头部)首先消耗内存,保留期、样本率和副本策略决定磁盘成本与恢复窗口。

阶段正常路径故障或边界证据与动作
WAL(预写日志)追加最近写入,重启回放磁盘满、回放慢、损坏需按版本手册处置监控磁盘、重启耗时、错误日志
Head(头部)活跃序列与近期 chunk(数据块)高基数推高内存与重启恢复时间监控序列数、内存、创建速率
block(数据块)不可变压缩块供长期查询压缩滞后、对象或本地盘异常观察 compaction(压缩合并)与失败
retention(保留)按时间或空间回收误设过短造成证据缺失演练恢复并登记保留责任
flowchart LR
  S[sample(样本)] --> W[WAL(预写日志)]
  W --> H[Head(头部)与 chunk(数据块)]
  H --> B[block(数据块)]
  B --> C[compaction(压缩合并)]
  C --> R[retention(保留)回收]
  Q[PromQL(查询)] --> H
  Q --> B
  W -.磁盘满或回放失败.-> F[写入失败与恢复延迟]
  H -.高基数.-> M[内存压力与查询变慢]

图 4 说明: 正常数据沿 WAL(预写日志)到 Head(头部)再到 block(数据块)流动,查询同时覆盖新旧数据。失败路径分别显示存储可用性和基数成本:磁盘耗尽会影响写入与恢复,高基数先放大内存、索引和查询范围,不能只通过扩盘掩盖根因。

数据演绎 4:存储容量。 演练样例以 32,000 样本每秒持续 24 小时,原始样本数为 32,000 x 86,400 = 2,764,800,000。若压缩后按每样本 1.5 字节仅作理想下界,数据点约 4.15 GB;再加索引、WAL(预写日志)、块元数据、冗余与查询余量,不能按该下界配盘。输入是样本率和保留期;阶段状态是写入、压缩、保留;输出是先用实际环境测得每样本总占用再乘 30 天并预留恢复空间;失败分支是只按原始压缩比扩盘导致 WAL(预写日志)满;验证结论是压测写入、观察磁盘增长曲线并测试重启回放。

热门面试题

  1. 问题:为什么 WAL(预写日志)对 Prometheus(监控系统)重启恢复重要?
    • 考点:追加写与崩溃恢复边界。
    • 回答思路:解释先落日志、再重放到 Head(头部)的顺序。
    • 详细答案:近期样本先追加到 WAL(预写日志),进程异常后可按日志回放重建尚未固化的数据,降低已确认写入立即丢失的风险。它不等于无限可靠副本:磁盘损坏、容量耗尽、版本兼容和远程备份仍需另行设计,并用恢复演练验证。
    • 进阶追问:WAL(预写日志)越大越好吗?
    • 进阶回答:不是。更大意味着潜在恢复窗口更长、磁盘压力更高;应在写入量、恢复目标、持久化策略和可接受数据缺口之间取平衡。
  2. 问题:Head(头部)为什么是高基数首先伤害的位置?
    • 考点:活跃序列与内存索引。
    • 回答思路:从每个新序列需要身份和索引状态说明。
    • 详细答案:Head(头部)维护活跃时间序列、标签索引和近期样本,新标签组合会立即创建内存对象,序列越多,写入、垃圾回收、查询匹配和恢复回放都越重。增加机器只能推迟阈值,真正治理是删除无界标签、限制指标家族并建立预算。
    • 进阶追问:降低抓取频率能解决高基数吗?
    • 进阶回答:只能减少每序列样本数和总写入,不能减少不同 label collection(标签集合)数量;无界标签导致的序列爆炸仍然存在。
  3. 问题:retention(保留)应该如何设定?
    • 考点:证据窗口与容量边界。
    • 回答思路:先由排障、SLO(服务等级目标)和复盘窗口确定,再回推成本。
    • 详细答案:保留期要覆盖值班排障、发布对比、SLO(服务等级目标)窗口与事故复盘所需的证据,同时以样本率、基数、索引和冗余回推磁盘。不能因为容量紧张悄悄缩短保留;应先优化无价值指标,必要时把长期聚合数据交给专门长时存储并验证查询语义。
    • 进阶追问:删除原始数据后还能做精确根因吗?
    • 进阶回答:通常不能。下采样和聚合会丢失短峰和细维度,因此保留策略要明确哪些决策可做、哪些需要日志、链路或审计补证。

5. PromQL(Prometheus 查询语言)向量、rate(速率)、increase(增量)、聚合、join(连接)、offset(偏移量)与 subquery(子查询)

PromQL(Prometheus 查询语言)以 instant vector(瞬时向量)、range vector(区间向量)、scalar(标量)和 string(字符串)组合。rate 用区间内 Counter(计数器)样本估计每秒增长,increase 给出窗口增长;聚合前必须确认分母和标签维度相同;vector matching(向量匹配)或 join(连接)需明确 onignoringgroup_left 等语义,避免一对多放大。偏移表达式用于与过去窗口比较,subquery(子查询)用于先求一段时间内的表达式再聚合,但两者都会增加读取量和误读风险。

| 表达式模式 | 适用语义 | 正确前提 | 可执行但错误的反例 | | --- | --- | --- | | rate(counter[5m]) | 每秒事件速率 | 输入是 Counter(计数器)且窗口覆盖足够样本 | 对 Gauge(仪表盘值)求速率 | | increase(counter[1h]) | 窗口事件总增量 | 用于整数事件的近似累计 | 当作精确审计笔数 | | sum by (service) | 汇总受控维度 | 保留业务判断需要的标签 | 先丢 code 再算错误率 | | A / B | 同维度比率 | 分子分母标签集合一致 | 以实例分子除服务分母并静默错配 | | offset 1d | 同时段历史对比 | 周期、发布与时区可解释 | 把昨天健康当作今天正确基线 |

sequenceDiagram
  participant U as 值班人员
  participant P as PromQL(查询)
  participant T as TSDB(时序数据库)
  participant R as 规则引擎
  U->>P: 错误率、延迟或容量表达式
  P->>T: 选择器与时间窗口
  T-->>P: label(标签)匹配的向量
  P->>P: rate(速率)/聚合/join(连接)
  P-->>U: 结果与缺失维度
  R->>P: 周期评估相同表达式
  alt 标签不一致或样本缺失
    P-->>U: 空向量或错误匹配,需检查语义
  end

图 5 说明: 查询不是从原始文本中“搜答案”,而是先按标签选出向量,再经过函数和匹配得到聚合结果。正常路径依赖统一标签契约;失败路径包括空向量、分母缺失和错误的多对多匹配,必须在告警投产前用演练数据验证。

数据演绎 5:错误率分母对齐。 演练样例的库存服务 5 分钟内 5xx 增量为 90,总请求增量为 3,000,因此错误率为 90 / 3,000 = 3%。若分子按 service,instance 保留 3 个实例,分母先 sum by(service) 聚合,直接相除会出现标签错配或错误复制。正确输入是同维度的 sum by(service)(rate(...{code=~"5.."}[5m])) / sum by(service)(rate(...[5m]));失败分支是将单实例 30 错误除全服务 3,000 得到 1% 后再平均,掩盖实例故障;验证结论是分别列出分子、分母和最终向量标签。

热门面试题

  1. 问题rateincrease 如何选择?
    • 考点:窗口速率与增量语义。
    • 回答思路:先限定 Counter(计数器),再按输出单位说明。
    • 详细答案:二者都用于 Counter(计数器)并处理重置;rate 输出每秒速率,适合实时错误率、吞吐和告警阈值,increase 输出窗口内累计增量,适合报告“近一小时约发生多少事件”。它们基于采样点估计,不能取代逐笔审计计数。
    • 进阶追问:为什么短窗口会抖动?
    • 进阶回答:样本点少、流量低和抓取抖动都会使估计不稳定;应按流量与检测时限选择窗口,并配合 for、长短窗口和最小请求量条件。
  2. 问题:PromQL(Prometheus 查询语言)向量匹配最常见的业务错误是什么?
    • 考点:标签对齐与分母正确性。
    • 回答思路:以错误率为例说明先聚合再相除。
    • 详细答案:最常见的是分子和分母保留的 label(标签)不同,导致空结果、意外的一对多复制,或把实例级错误除以服务级请求后再平均。查询可以返回数字却没有业务含义。应先写出每个中间向量的标签集合,再在相同维度聚合并相除。
    • 进阶追问:什么时候需要 group_left
    • 进阶回答:当一侧是低基数的元数据、另一侧是多条业务序列,且确实要把元数据附加到多条序列时使用;先确认不会形成多对多,且附加标签不会放大基数。
  3. 问题offset 适合解决什么问题?
    • 考点:历史基线与变更边界。
    • 回答思路:说明同比对照和不可直接推断的条件。
    • 详细答案offset 可把同一表达式移到过去窗口,用于比较工作日同一时段的流量、延迟或容量。它只能提供对照,不证明今天的请求构成、版本、促销活动和依赖状态相同;告警仍应以当前用户影响和可解释阈值为主。
    • 进阶追问:subquery(子查询)有什么成本风险?
    • 进阶回答:它会让引擎在多个时间步重复计算内层表达式,范围大、基数高时可显著放大读取和规则评估成本;复杂表达式应先评估成本,必要时使用 Recording Rule(记录规则)。

6. RED(请求率、错误率、耗时)、USE(利用率、饱和度、错误)与 Golden Signals(黄金信号)

RED(请求率、错误率、耗时)从面向服务的请求体验观察,USE(利用率、饱和度、错误)从资源瓶颈观察,Golden Signals(黄金信号)把延迟、流量、错误和饱和度并列。三者不是指标清单,而是分治顺序:先从用户可感知的错误率和尾延迟识别症状,再看资源利用与队列饱和定位约束,最后回到日志、链路和业务审计验证。平台 up=1 只说明被抓取端点响应,不等于支付成功、库存正确或用户体验正常。

| 视角 | 核心指标 | 适配项目 | 不能单独证明 | | --- | --- | --- | | RED(请求率、错误率、耗时) | 请求率、失败率、P95(95 分位响应时间)/P99(99 分位响应时间) | WMS(仓储管理系统)下单、支付回调、物流查询 | 失败的具体订单和资金终态 | | USE(利用率、饱和度、错误) | CPU(中央处理器)、连接池、队列年龄、磁盘错误 | Runner(执行器)、异步导出、数据库依赖 | 用户实际受影响比例 | | Golden Signals(黄金信号) | 延迟、流量、错误、饱和度 | 跨服务值班看板 | 单一根因与修复正确性 | | 业务 SLI(服务等级指标) | 成功受理率、回调时效、轨迹新鲜度 | 支付、库存、跨境物流 | 运行时资源瓶颈细节 |

flowchart TB
  U[用户结果与业务 SLI(服务等级指标)] --> R[RED(请求率、错误率、耗时)]
  R --> D{是否出现错误率或尾延迟症状}
  D -->|是| X[USE(利用率、饱和度、错误)]
  X --> L[日志/Trace(链路追踪)缩小故障域]
  L --> A[订单、库存、账务审计确认]
  D -->|否| C[容量与基线观察]
  X -.资源正常但用户失败.-> B[检查依赖、发布与业务状态机]

图 6 说明: 先以业务 SLI(服务等级指标)和 RED(请求率、错误率、耗时)找症状,再用 USE(利用率、饱和度、错误)解释资源约束,最终由权威审计确认影响。失败分支强调资源正常不代表用户正常,例如渠道拒绝、配置错误或状态机缺陷不会必然抬高 CPU(中央处理器)。

数据演绎 6:平台存活与用户错误分离。 演练样例中支付回调服务 up=1,近 5 分钟请求 10,000、应用 5xx 为 20,但渠道签名校验拒绝 600,且账务待确认 580。输入是平台、应用和业务三层计数;阶段状态是端点可抓取、技术错误率 20/10,000=0.2%、业务受理失败或待确认比例约 600/10,000=6%;输出是不能以 up5xx 代替支付 SLI(服务等级指标);失败分支是仅配 CPU(中央处理器)与 up 告警导致业务异常未触发;验证结论是以渠道回执和账务状态计算受理与终态指标。

热门面试题

  1. 问题:RED(请求率、错误率、耗时)和 USE(利用率、饱和度、错误)如何配合?
    • 考点:用户症状与资源根因分治。
    • 回答思路:先说明先后顺序,再给资源正常的反例。
    • 详细答案:RED(请求率、错误率、耗时)先回答服务是否正在伤害用户,USE(利用率、饱和度、错误)再回答资源是否形成约束,例如队列年龄、连接池等待和磁盘错误。先看 USE(利用率、饱和度、错误)容易把高 CPU(中央处理器)误当根因;资源正常时仍需检查依赖、发布、鉴权和业务状态机。
    • 进阶追问:队列长度和队列年龄哪个更重要?
    • 进阶回答:两者互补。长度显示积压规模,年龄显示最久用户已等待多久;流量高时长度增长未必异常,年龄持续升高通常更直接反映服务能力不足。
  2. 问题:Golden Signals(黄金信号)为何不等于四个固定告警?
    • 考点:信号框架与业务语义。
    • 回答思路:说明它是观察框架,阈值要由用户影响决定。
    • 详细答案:延迟、流量、错误和饱和度是防漏视角,不是复制四条静态阈值规则。支付回调需要看终态时效,物流需要看轨迹新鲜度,Runner(执行器)需要看任务年龄;每条告警要有严重度、归属、动作、恢复条件和业务验证。
    • 进阶追问:CPU(中央处理器)90% 是否一定要告警?
    • 进阶回答:不一定。高利用率可能稳定且无排队,低利用率也可能因外部依赖失败伤害用户;应结合饱和、错误、延迟和容量余量设定症状优先的告警。
  3. 问题:监控指标如何与业务审计建立边界?
    • 考点:证据分层。
    • 回答思路:分别说趋势、样本详情和权威终态。
    • 详细答案:指标用于发现趋势和量化影响范围,日志补某个请求的上下文,Trace(链路追踪)给出被采样调用路径,业务审计确认订单、库存、资金和渠道终态。四者可用受控业务键和时间窗关联,但不能把聚合百分比反推为逐笔成功,也不能把采样链路当全量账。
    • 进阶追问:告警恢复是否说明业务已恢复?
    • 进阶回答:不说明。告警恢复只代表表达式回到条件外,还要确认积压已清、失败任务补偿完成、账务或库存对账通过并保持观察窗口。

7. 直方图桶、分位数、平均与尾延迟

Histogram(直方图)的每个 le bucket(桶)是“小于等于该边界”的累计计数;+Inf 包含全部观测。histogram_quantile 在聚合后的累计桶中估计分位数,_sum / _count 给出平均值。平均值能掩盖少量极慢请求,分位数也会因桶内插值损失精度;因此桶边界应围绕服务的 SLO(服务等级目标)阈值、超时阈值和真实尾部区间设计,并统一在同一指标家族内使用。

| 计算 | 公式或查询骨架 | 适合的结论 | 边界 | | --- | --- | --- | | 平均延迟 | rate(_sum[5m]) / rate(_count[5m]) | 总体资源成本变化 | 不能代表慢用户比例 | | P95(95 分位响应时间) | histogram_quantile(0.95, sum by (le)(rate(_bucket[5m]))) | 大多数用户体验 | 桶内为估计值 | | SLO(服务等级目标)良好率 | 1 - rate(_bucket{le="阈值"}) / rate(_count) 的补集按语义改写 | 阈值内完成比例 | 必须确认边界和失败请求计入方式 | | P99(99 分位响应时间) | 0.99 分位的同类计算 | 长尾与超时风险 | 低流量下波动大 |

flowchart LR
  O[一次请求耗时] --> B1[le=0.1 bucket(桶)]
  O --> B2[le=0.3 bucket(桶)]
  O --> B3[le=1.0 bucket(桶)]
  O --> BI[le=+Inf bucket(桶)]
  B1 --> A[按 le 聚合 rate(速率)]
  B2 --> A
  B3 --> A
  BI --> A
  A --> Q[histogram_quantile]
  A --> S[SLO(服务等级目标)阈值内比例]
  Q -.桶太宽.-> E[尾延迟估计失真]

图 7 说明: 每次观测增加所有大于等于其耗时的累计桶,查询先按相同 le 聚合,再估计分位数或阈值内比例。失败路径是桶边界过宽或实例桶配置不一致,前者降低定位精度,后者使聚合没有共同分布语义。

sequenceDiagram
  participant U as 用户
  participant W as WMS(仓储管理系统)
  participant H as Histogram(直方图)
  participant P as Prometheus(监控系统)
  U->>W: 提交库存预占
  W->>H: 记录 0.42 秒观测
  H->>H: 增加 le=1、+Inf 等累计桶
  P->>H: scrape(抓取)bucket/sum/count
  P->>P: 聚合并估计 P95(95 分位响应时间)
  alt P95 高于 SLO(服务等级目标)
    P->>P: 进入规则与告警评估
  else 平均升高但尾部正常
    P->>P: 观察容量与发布变化
  end

图 8 说明: 时序图展示单次请求如何进入累计桶再被周期性抓取。正常路径把延迟分布转为服务级判断;失败分支区分尾部受损和仅平均变化,避免将一个平均数直接升级为用户严重事件。

数据演绎 7:平均值掩盖尾延迟。 演练样例的 100 次支付回调中,90 次为 100 ms(毫秒),10 次为 9,100 ms(毫秒)。平均为 (90 x 100 + 10 x 9,100) / 100 = 1,000 ms,但 90% 用户为 100 ms(毫秒),最慢 10% 已接近超时。输入是离散耗时;阶段状态是按 SLO(服务等级目标)边界 1 秒落桶,90 条落入 le=1、100 条落入 +Inf;输出是阈值内比例 90%,P95(95 分位响应时间)落在高桶,不能用 1 秒平均值说明“整体可接受”。失败分支是只看平均而漏掉长尾;验证结论是同时看桶、分位数、超时数和渠道终态。

热门面试题

  1. 问题:平均延迟和 P99(99 分位响应时间)分别解决什么问题?
    • 考点:中心趋势与尾部体验。
    • 回答思路:用资源成本和用户最差体验区分。
    • 详细答案:平均延迟适合观察整体工作量、资源成本和长期趋势,P99(99 分位响应时间)适合暴露少数用户的极慢体验、超时和重试风险。两者应一起看:平均正常而 P99(99 分位响应时间)恶化常意味着局部依赖或排队问题,平均升高而尾部稳定则可能是全局负载变化。
    • 进阶追问:P99(99 分位响应时间)低流量时为何不稳定?
    • 进阶回答:窗口内样本很少时,一个慢请求就能改变高分位估计;应延长窗口、设置最小请求量条件,或用 SLO(服务等级目标)阈值内比例补充判断。
  2. 问题:如何选择 Histogram(直方图)桶边界?
    • 考点:信息损失与成本权衡。
    • 回答思路:围绕阈值、超时和已知尾部,而非等间隔堆桶。
    • 详细答案:先列出用户可接受阈值、客户端超时、依赖超时和历史尾部区间,在这些点附近加密桶,其他区间可稀疏。桶越多,序列和写入成本越高;桶太少则分位数和阈值判断失真。所有会被聚合的实例必须使用同一边界。
    • 进阶追问:能否给每个接口单独一套细桶?
    • 进阶回答:只对关键且受控的路由这样做,先计算路由数乘桶数乘实例数的基数;高基数 URL(统一资源定位符)应归类为模板路由而非原始路径。
  3. 问题:如何用直方图表达 SLO(服务等级目标)?
    • 考点:好事件/总事件。
    • 回答思路:取阈值桶作好事件,计数器作总事件,再说明失败纳入方式。
    • 详细答案:若“1 秒内成功”才算好事件,分子取阈值内且成功结果的累计桶速率,分母取全部请求速率,明确超时、取消和 5xx 是否计为坏事件。这样得到的是聚合服务指标;支付、库存等终态仍要用业务流水确认。
    • 进阶追问:没有刚好等于 SLO(服务等级目标)阈值的桶怎么办?
    • 进阶回答:不能把相邻桶当作精确阈值。应调整桶边界并随版本发布,或明确该计算只是近似,避免把估计当合同式精确事实。

8. Recording Rule(记录规则)与查询成本

Recording Rule(记录规则)按固定周期把高成本或被反复使用的 PromQL(Prometheus 查询语言)表达式预计算为新时间序列。它把查询成本从每次看板交互前移到规则评估,也带来额外序列、延迟和语义版本责任。应只记录稳定、复用高、标签已收敛的中间结果;不要把原始高基数、一次性排障查询或不明确的分母包装成新指标。

决策项推荐做法失败模式验证证据
适用查询高复用的服务错误率、桶聚合、容量汇总将临时大查询固化查询日志与看板复用率
标签集合只保留告警和看板所需维度复制实例、路径等高基数新序列数和存储增量
评估周期小于业务检测时限且可承受周期太长导致反馈延迟规则耗时、最后评估时间
版本变更新旧规则并行核对后切换直接改语义导致历史断层比较图与规则审计
flowchart LR
  Q[原始 PromQL(查询)] --> E[规则评估]
  E --> R[Recording Rule(记录规则)序列]
  R --> D[看板与 Alert Rule(告警规则)]
  Q -.高基数或大范围.-> C[查询 CPU(中央处理器)与延迟]
  E -.表达式过慢.-> L[评估滞后与陈旧结果]
  L --> M[监控规则耗时与最后成功]

图 9 说明: 正常路径将稳定且高复用的聚合结果写回 TSDB(时序数据库),供看板和告警复用;失败路径提醒预计算不会消除成本,只会把成本转移到评估循环,必须监控规则是否及时完成。

sequenceDiagram
  participant T as TSDB(时序数据库)
  participant R as 规则引擎
  participant S as 记录序列
  participant A as Alert Rule(告警规则)
  T-->>R: 原始 Counter(计数器)与 bucket(桶)
  R->>R: 每 30 秒聚合服务维度
  R->>S: 写入 service:error_rate:5m
  A->>S: 读取预计算结果
  alt 评估超时或失败
    R->>R: 记录失败与评估延迟
    A->>A: 不把旧结果误作新鲜事实
  end

图 10 说明: 记录规则介于原始序列和告警之间,减少重复计算但引入一个评估周期的反馈延迟。失败路径要求把评估错误和新鲜度作为监控对象,避免规则链的静默失效。

数据演绎 8:查询成本前移。 演练样例中一个看板表达式每次扫描 20,000 个序列,30 位值班和开发人员每分钟刷新一次,理论匹配工作约 20,000 x 30 = 600,000 序列每分钟。改为每 30 秒评估一次、输出按 service 的 40 条记录序列后,原始扫描约每分钟 40,000 次匹配,读者侧只读 40 x 30 = 1,200 条。失败分支是把 instance 与原始 URL(统一资源定位符)也写进记录序列,输出仍接近原始基数;验证结论是比较规则输入、输出序列数、评估耗时和看板查询耗时。

热门面试题

  1. 问题:Recording Rule(记录规则)为什么能改善查询体验?
    • 考点:预计算与复用。
    • 回答思路:说明将共同表达式变成低基数中间序列。
    • 详细答案:它按周期执行一次复杂聚合,把服务级错误率、延迟桶汇总等结果保存为可直接读取的时间序列。看板和告警不再各自扫描同一批原始序列,交互延迟和峰值查询负载下降;代价是额外存储、规则维护和一段数据新鲜度延迟。
    • 进阶追问:所有查询都应做 Recording Rule(记录规则)吗?
    • 进阶回答:不应。偶发排障、临时维度和高基数探索不值得固化;先看复用率、成本和标签是否稳定,再决定是否记录。
  2. 问题:记录规则的结果可以作为财务或库存审计吗?
    • 考点:聚合信号边界。
    • 回答思路:说明预计算仍是聚合指标。
    • 详细答案:不可以。Recording Rule(记录规则)只把聚合指标预计算,可能受抓取缺失、窗口估计、标签丢弃和评估延迟影响。它可用于发现资金一致性风险的范围和时间窗,但支付流水、对账与库存审计才可确认逐笔事实。
    • 进阶追问:如何避免规则改名后看板断裂?
    • 进阶回答:先并行发布新旧规则、比对一段观察期的数值和标签,再迁移看板与告警,最后按保留策略下线旧规则;变更应保留版本与审计记录。
  3. 问题:规则评估变慢首先排查什么?
    • 考点:输入基数、范围和依赖链。
    • 回答思路:按表达式输入、时间范围、链式依赖和实例资源排序。
    • 详细答案:先看规则耗时、输入序列数、标签匹配与时间窗口,常见原因是新标签导致基数放大、范围过长或 subquery(子查询)重复计算;再查规则是否依赖另一个滞后的记录序列,最后检查 TSDB(时序数据库)资源。先收敛表达式,再考虑扩容。
    • 进阶追问:评估周期缩短一定更好吗?
    • 进阶回答:不一定。周期越短,反馈更快但查询压力更大;应从允许检测延迟反推,并确保单次评估有足够余量完成。

9. Alert Rule(告警规则)pending(等待)、firing(触发)、for(持续时间)

Alert Rule(告警规则)在每次评估中把表达式为真的标签集合变为 active(活动)告警;首次满足条件进入 pending(等待),持续满足超过 for 后才进入 firing(触发),条件消失则恢复为 inactive(非活动)。for 是反馈延迟的设计:它过滤短暂抖动,却也推迟真实事故通知。因此阈值、窗口、for、严重度和恢复验证必须共同设计,而不是只改一个 CPU(中央处理器)百分比。

状态进入条件退出条件值班含义
inactive(非活动)表达式为假或系列缺失按规则处理条件再次为真无当前触发,但仍需看监控盲区
pending(等待)首次为真,尚未满 for条件为假则重置观察抖动与变更,不立即打扰
firing(触发)连续为真达到 for条件为假进入恢复路由、分组与处置开始
resolved(已恢复)Alertmanager(告警管理器)收到恢复新一轮条件持续为真需验证业务是否真正恢复
stateDiagram-v2
  [*] --> inactive
  inactive --> pending: 表达式为真
  pending --> inactive: 条件消失
  pending --> firing: 持续满足 for(持续时间)
  firing --> inactive: 表达式为假
  firing --> firing: 再次评估仍为真
  inactive --> [*]

图 11 说明: 状态图显示规则本身的生命周期,正常路径从 pending(等待)跨过 for 到 firing(触发);失败或抖动路径在 for 内回到 inactive(非活动)。它只描述告警条件,不等于通知是否送达或事故是否已关闭。

sequenceDiagram
  participant P as Prometheus(监控系统)
  participant R as Alert Rule(告警规则)
  participant M as Alertmanager(告警管理器)
  participant O as 值班人员
  P->>R: 每 30 秒评估错误率
  R->>R: 条件为真,进入 pending(等待)
  R->>R: 连续 5 分钟为真,进入 firing(触发)
  R->>M: 发送活动告警
  M->>O: 按路由通知
  alt 下一次条件为假
    R->>M: 发送恢复状态
    M->>O: 恢复通知或分组更新
  else 指标缺失
    R->>R: 按缺失语义单独评估,不当作自动恢复
  end

图 12 说明: 规则、通知和事故是三个状态机:Prometheus(监控系统)负责条件,Alertmanager(告警管理器)负责发送,值班流程负责业务恢复。失败路径特别保留缺失数据判断,防止采集盲区把 firing(触发)静默变成恢复。

数据演绎 9:for 与检测延迟。 错误率规则每 30 秒评估,表达式使用 5 分钟 rate 窗口,for: 5m。若真实故障从 10:00:00 开始且连续存在,最早在 10:00:30 看到满足窗口的异常趋势,持续到约 10:05:30 才可 firing(触发),通知还受分组等待影响。输入是窗口、评估周期和 for;输出是检测不是 5 分钟整,而是“窗口平滑 + 最多一个评估周期 + for + 通知延迟”;失败分支是只把 for 设为零导致单次抓取毛刺通知;验证结论是故障注入并记录每次状态转换时间。

热门面试题

  1. 问题for 的作用是什么,为什么不能统一设为零?
    • 考点:抖动过滤与反馈延迟。
    • 回答思路:同时说明收益和代价。
    • 详细答案for 要求条件连续成立一段时间后才 firing(触发),可以过滤抓取抖动、瞬时重试和发布短波。代价是延迟真实故障通知,因此用户影响严重、恢复窗口很短的告警可使用更短 for 并搭配更可靠指标;不能把所有规则统一设为零或统一设很长。
    • 进阶追问:表达式窗口和 for 是重复的吗?
    • 进阶回答:不是。窗口决定指标如何平滑和估计,for 决定布尔条件持续多久才升级;二者叠加决定检测延迟和抗抖动能力。
  2. 问题:firing(触发)是否等于已经发出通知?
    • 考点:状态机边界。
    • 回答思路:区分规则状态、通知状态和事故状态。
    • 详细答案:不等于。firing(触发)表示 Prometheus(监控系统)当前计算为真并上报活动告警;Alertmanager(告警管理器)还要经历去重、分组、路由、静默、抑制和渠道投递。通知收到后是否升级事故、业务是否恢复,仍由值班和权威业务指标决定。
    • 进阶追问:告警突然消失应该如何处理?
    • 进阶回答:先区分真实恢复、目标消失、规则评估失败和标签变化,检查 up、规则运行状态、最近配置和抓取数据;不能默认把消失当作恢复。
  3. 问题:如何避免低流量服务的错误率误报?
    • 考点:分母与样本量。
    • 回答思路:加入最小请求量、绝对错误数和更长窗口。
    • 详细答案:低流量下单个失败就可能得到 100% 错误率,应同时要求总请求量达到最小阈值,或以绝对失败数、较长窗口和业务重要性组合判断。对支付等关键低频路径可单独告警,但通知要说明样本量,便于值班人员正确解释风险。
    • 进阶追问:最小请求量会不会漏掉小流量事故?
    • 进阶回答:会有取舍,所以关键交易还要用业务新鲜度、队列年龄、定时探测或渠道回执缺失补充,而不是只依赖比率阈值。

10. Alertmanager(告警管理器)分组、抑制、静默与路由

Alertmanager(告警管理器)接收活动告警后,按 grouping(分组)压缩同一事件的实例噪声,按 deduplication(去重)避免重复通知,按 routing(路由)送往有归属的值班渠道,按 inhibition(抑制)在更高层症状成立时压住派生告警,按 silence(静默)在明确范围和期限内暂时停止通知。分组并不删除告警事实,抑制也不等于修复,静默必须可审计且有到期恢复检查。

| 机制 | 输入条件 | 作用 | 主要风险 | | --- | --- | --- | | grouping(分组) | 同一服务、环境、严重度等 | 将实例级告警合并为事件摘要 | 分组过粗隐藏独立故障 | | deduplication(去重) | 相同活动告警重复到达 | 减少重复渠道投递 | 标签不稳定导致去重失效 | | routing(路由) | 团队、严重度、业务域 | 送给能处置的人 | 默认路由吞掉关键告警 | | inhibition(抑制) | 根因或上层症状活动 | 暂压派生告警 | 错误抑制规则掩盖独立故障 | | silence(静默) | 有效范围、期限、原因 | 计划维护或已知事件降噪 | 无期限静默造成盲区 |

flowchart TB
  A[活动告警] --> D[deduplication(去重)]
  D --> G[grouping(分组)]
  G --> I{inhibition(抑制)是否命中}
  I -->|是| X[保留事实,不发送派生通知]
  I -->|否| S{silence(静默)是否命中}
  S -->|是| Y[记录静默范围与到期]
  S -->|否| R[routing(路由)]
  R --> N[通知渠道与值班归属]
  N -.投递失败.-> F[重试、失败告警与备用渠道]

图 13 说明: 正常路径先去重、分组再判断抑制和静默,最后按归属路由;抑制和静默都保留活动告警事实。失败路径把通知投递失败作为要观测的对象,避免“规则正确但人没收到”的假安全。

sequenceDiagram
  participant P as Prometheus(监控系统)
  participant AM as Alertmanager(告警管理器)
  participant P1 as Pager(值班渠道)
  participant T as 团队
  P->>AM: 200 个实例级告警
  AM->>AM: 按 service/environment/severity 分组
  AM->>AM: 抑制被上层依赖故障解释的告警
  AM->>P1: 一个事件摘要
  P1-->>AM: 投递确认或失败
  AM->>T: 记录路由、重试与通知状态
  alt 静默到期
    AM->>P1: 若仍活动,恢复通知
  end

图 14 说明: 时序图说明 200 个实例告警可压缩为一个可处置事件,但不是丢弃 199 个事实。静默到期时仍活动的告警需要重新进入路由,通知渠道失败也必须留下重试和备用路径证据。

数据演绎 10:分组压缩与通知限额。 演练样例中一个依赖故障导致 50 个 Pod(容器组)、每个 4 条实例告警,共 200 条活动告警。按 service,environment,severity 分组后形成 1 个摘要;若同一根因另触发 30 条下游超时告警,合理 inhibition(抑制)后应保留它们的活动状态但不额外呼叫。输入是 230 条告警和每分钟 10 条渠道限额;输出是一个严重事件摘要加控制台可查明细;失败分支是按 instance 分组导致 200 次呼叫,或过宽抑制把无关支付故障压掉;验证结论是故障演练检查通知数、分组键、被抑制原因和静默到期行为。

热门面试题

  1. 问题:分组和去重有什么区别?
    • 考点:事件压缩与重复投递。
    • 回答思路:分别说明面向不同告警与相同告警重复到达。
    • 详细答案:grouping(分组)把共享标签的多个活动告警组织成一个通知事件,例如多个实例同时不可用;deduplication(去重)处理同一活动告警反复到达或多个 Alertmanager(告警管理器)副本重复接收。前者降低认知负荷,后者降低渠道重复,两者都不应删除原始告警事实。
    • 进阶追问:分组标签如何选?
    • 进阶回答:选择能表达同一处置责任和共同影响面的稳定标签,如服务、环境、严重度、业务域;不要把实例或随机版本纳入默认分组,也不要把所有服务粗暴归为一个组。
  2. 问题:inhibition(抑制)和 silence(静默)如何区分?
    • 考点:自动关联与人工例外。
    • 回答思路:前者由活动条件驱动,后者由带期限的操作意图驱动。
    • 详细答案:inhibition(抑制)基于另一条更高层或根因候选告警当前活动,自动压住可预期的派生噪声;silence(静默)是人工或流程创建的标签匹配例外,用于维护或已知事件,必须有范围、期限、原因和审批痕迹。两者结束后都要检查是否仍有真实影响。
    • 进阶追问:能否在大故障时一键静默所有告警?
    • 进阶回答:不应。这样会隐藏新的独立严重事件;应优先保护严重度最高和业务症状告警,仅对已确认的派生域做有时限的抑制或静默。
  3. 问题:路由设计如何避免告警无人负责?
    • 考点:归属、兜底与投递验证。
    • 回答思路:说明标签契约、默认路由和渠道健康。
    • 详细答案:每条可通知告警应携带稳定的服务或业务域归属,路由将其映射到值班团队,同时设置受监控的默认兜底而不是悄悄丢弃。还要监控通知发送失败、重试、静默数和路由落点,定期演练主渠道和备用渠道。
    • 进阶追问:严重度应该由 Alertmanager(告警管理器)临时推断吗?
    • 进阶回答:不应主要依赖临时推断。严重度应在规则中基于用户影响、持续时间和错误预算等可审计条件给出,路由只消费该受控标签并保留升级规则。

11. 告警风暴、抖动、通知失败与根因聚合

告警风暴不是“通知量太大”这么简单,而是共同依赖、发布故障、标签爆炸、实例级重复、阈值抖动和通道限额共同放大的控制系统失灵。治理顺序应是症状优先保护值班通道,再按共同依赖、变更时间、业务影响与拓扑聚类形成根因候选;使用分组、抑制、持续时间和严重度降低派生噪声;监控通知失败并保留恢复验证。根因候选不是根因事实,仍要用变更、日志、链路与权威业务状态验证。

风暴源表现先做什么不能做什么
共同依赖断开多服务同时超时、实例告警爆发保留用户症状,按依赖聚类与抑制派生项仅扩充通知并逐条确认
阈值抖动firing(触发)/恢复来回切换调整窗口、for、滞回或最小样本量用永久静默遮住波动
标签爆炸每请求或每实例成为不同告警收敛 label(标签)与分组键把所有标签塞进路由
通知失败规则 firing(触发)但无人收到监控投递、重试和备用渠道假设渠道必然可靠
发布异常新版本一批实例同时错误关联版本、批次并暂停发布将所有新旧实例告警混为一组
flowchart TB
  S[用户症状告警] --> P[保护严重度与值班通道]
  P --> G[按依赖/服务/变更批次分组]
  G --> R[根因候选与派生告警抑制]
  R --> A[处置:回滚、限流、隔离或扩容]
  A --> V[业务指标与审计验证恢复]
  V --> C[删改规则、容量和演练]
  G -.实例标签无界.-> X[通知爆炸]
  X --> B[基数预算与分组修复]
  P -.通知渠道失败.-> N[备用渠道、重试与失败告警]

图 15 说明: 正常路径把风暴从大量告警压缩为“症状、共同域、处置、验证”的控制环,最后把复盘反馈回规则和容量。失败路径区分标签导致的通知爆炸和渠道不可达,二者都不能通过忽略告警来解决。

sequenceDiagram
  participant D as 数据库依赖
  participant S as 多个服务
  participant P as Prometheus(监控系统)
  participant AM as Alertmanager(告警管理器)
  participant O as 值班人员
  D-->>S: 连接超时
  S-->>P: 错误率、队列年龄与依赖错误上升
  P->>AM: 症状告警与实例派生告警
  AM->>AM: 分组、抑制、按严重度路由
  AM->>O: 一个服务域事件摘要
  O->>O: 查最近变更、依赖状态与业务影响
  alt 通知投递失败
    AM->>AM: 重试并切换备用渠道
  else 处置后恢复
    O->>O: 对账、积压清理与观察窗口验证
  end

图 16 说明: 多个服务的派生告警由共同依赖引发,分组和抑制负责降低噪声,但仍要将用户症状送到值班。失败分支把通知失败当作独立故障处理,恢复分支以对账和积压清理收口,不以单条 resolved(已恢复)通知草率结案。

数据演绎 11:5,000 条风暴的收敛。 演练样例中 IoT(物联网)规则服务错误触发 100 个设备批次,每批 10 个实例、每实例 5 条告警,得到 100 x 10 x 5 = 5,000 条活动告警。若按 service,region,severity,rule_group 分组,先形成 20 个事件摘要;确认共同规则发布为根因候选后,抑制同一规则下的实例级派生告警,保留设备离线和高优先级控制失败症状。失败分支是每条都路由到值班渠道,超过每分钟 50 条限额后反而丢失严重通知;输出是受控摘要、明细可检索、渠道健康可观测;验证结论是演练检查通知数量、抑制命中数、未被抑制的严重事件及恢复后补偿任务。

热门面试题

  1. 问题:告警风暴的第一原则是什么?
    • 考点:症状优先与通道保护。
    • 回答思路:先保护用户影响和严重通知,再进行聚类。
    • 详细答案:先保证用户症状、严重度最高和安全边界告警能进入值班通道,再按共同依赖、服务域、发布批次和时间窗聚类,抑制可解释的派生噪声。不能先把全部告警关掉,因为风暴中仍可能叠加一个独立且更严重的支付、库存或控制故障。
    • 进阶追问:如何证明两个告警确实同根因?
    • 进阶回答:不能只凭同时发生证明。要结合依赖拓扑、变更记录、错误分类、链路或日志时间线,并以回滚、隔离或依赖恢复后的业务指标变化验证。
  2. 问题:告警抖动通常如何治理?
    • 考点:阈值、窗口与恢复条件。
    • 回答思路:区分测量噪声和真实容量反复饱和。
    • 详细答案:先确认是抓取抖动、低样本波动、阈值贴边还是资源反复饱和。对测量噪声可调整查询窗口、最小样本量和 for;对真实反复饱和要处理容量、限流或依赖,不应依赖无限静默。恢复也应有稳定观察期,避免每次越线都重新呼叫。
    • 进阶追问:什么是滞回?
    • 进阶回答:触发和恢复使用不同阈值或持续条件,例如 CPU(中央处理器)超过 85% 触发、低于 75% 才恢复,用于减少阈值附近反复切换;仍要结合用户症状。
  3. 问题:如何监控通知系统自身?
    • 考点:监控自监控与最终投递。
    • 回答思路:从接收、分组、路由、发送、失败和演练讲。
    • 详细答案:监控 Alertmanager(告警管理器)副本健康、接收与发送错误、通知队列、重试、静默数量、路由落点和渠道响应,并定期做受控测试告警确认真实值班链路。规则 firing(触发)但投递失败必须产生能走备用通道的元告警,避免依赖同一失效路径。
    • 进阶追问:测试告警会不会制造噪声?
    • 进阶回答:应使用专用标签、测试路由和明确时间窗,但最终也要定期验证真实升级路径;测试不应绕过所有生产路由逻辑。

12. 高可用、联邦、remote write(远程写入)、长时存储和监控自身

高可用不是两台 Prometheus(监控系统)简单并列,而是每个副本独立抓取和评估、下游按标签或去重处理重复结果,并明确配置、服务发现、存储和通知的故障域。federation(联邦)由上层 Prometheus(监控系统)抓取下层经过筛选的聚合指标,适合层级汇总;remote write(远程写入)把样本异步送向外部长期存储,适合跨集群和长保留,但会引入队列、重试、背压和查询一致性边界。监控系统也必须监控自身的目标数、抓取成功率、规则评估、TSDB(时序数据库)资源、远程队列和告警投递。

模式解决的问题新增失败边界必须自监控
高可用副本单副本故障与维护重复抓取、配置漂移、去重错误副本健康、配置摘要、重复通知
federation(联邦)分层汇总与隔离上层只见筛选结果、下层缺失联邦抓取成功与聚合完整性
remote write(远程写入)长保留、跨集群查询队列堆积、重试、丢失或延迟队列长度、发送失败、延迟
长时存储复盘与长期趋势下采样和对象存储访问边界数据新鲜度、查询范围、恢复演练
sequenceDiagram
  participant T as target(目标)
  participant P1 as Prometheus(监控系统)A
  participant P2 as Prometheus(监控系统)B
  participant RW as remote write(远程写入)队列
  participant LS as 长时存储
  participant AM as Alertmanager(告警管理器)集群
  T-->>P1: 独立 scrape(抓取)
  T-->>P2: 独立 scrape(抓取)
  P1->>RW: 样本批次
  P2->>RW: 样本批次
  RW->>LS: 异步发送或重试
  P1->>AM: 活动告警
  P2->>AM: 活动告警
  AM->>AM: 去重后通知
  alt 远程端不可用
    RW->>RW: 队列增长、背压与告警
  end

图 17 说明: 两个副本分别抓取以避免单点采集盲区,告警由 Alertmanager(告警管理器)去重;远程写是异步数据流,远端失败时队列增长而非“仍然成功”。前提是副本、去重与配置语义经现场版本核对,正常与失败路径均由自监控覆盖。

数据演绎 12:remote write(远程写入)队列。 演练样例写入速率为 32,000 样本每秒,远端在 10 分钟故障期间不能接收,理论积压为 32,000 x 600 = 19,200,000 样本。若恢复后远端净处理能力仅 48,000 样本每秒,则除维持新流量外的额外清空能力是 48,000 - 32,000 = 16,000 样本每秒,追赶时间约 19,200,000 / 16,000 = 1,200 秒,即 20 分钟。失败分支是队列内存或磁盘预算不足导致丢样;输出是明确的可接受延迟和丢失策略;验证结论是故障注入远端并观察积压、重试、恢复时间与长时查询新鲜度。

热门面试题

  1. 问题:Prometheus(监控系统)高可用为什么会有重复样本或重复告警?
    • 考点:独立抓取与下游去重。
    • 回答思路:说明副本独立性是可用性前提,去重是消费端责任。
    • 详细答案:高可用副本通常各自抓取同一目标、评估同一规则,因此下游会看到带副本差异的相似样本和告警。这样一台失效不会产生采集盲区;代价是存储和通知侧必须按受控副本标签去重,并持续检查两副本是否配置漂移或同时失败。
    • 进阶追问:两副本同时 up=1 是否代表监控链路可靠?
    • 进阶回答:不代表。它们可能共享同一服务发现、网络、认证或配置错误;故障域要拆开,并用外部探测、业务合成检查和配置审计补证。
  2. 问题:federation(联邦)和 remote write(远程写入)如何选?
    • 考点:拉取聚合与异步复制边界。
    • 回答思路:按上层汇总需求与原始样本长期保存需求区分。
    • 详细答案:federation(联邦)适合上层按需抓取下层已筛选、聚合的指标,减少跨域查询范围;remote write(远程写入)适合把更完整样本异步复制到长时或跨集群后端。二者都不自动保证零丢失,选择前要明确哪些原始维度、延迟和恢复窗口是业务必须的。
    • 进阶追问:远端写入失败能否阻塞本地抓取?
    • 进阶回答:设计上应通过队列隔离,但队列最终会占用资源并可能触及丢弃策略;必须监控积压和失败,不可把它当成无限缓冲。
  3. 问题:监控自身最少要覆盖哪些面?
    • 考点:观测闭环不盲区。
    • 回答思路:按目标、采集、存储、规则、通知和远程链路列举。
    • 详细答案:至少覆盖目标发现数与 up、抓取耗时和失败、样本与活跃序列、TSDB(时序数据库)内存磁盘和 compaction(压缩合并)、规则评估耗时错误、Alertmanager(告警管理器)投递重试失败、远程写队列与长时数据新鲜度。还要有外部探针和周期性通知演练,避免完全依赖同一故障域自证健康。
    • 进阶追问:自监控告警由谁接收?
    • 进阶回答:应有与被监控系统不同的兜底路径或外部监控,至少让通知失败、监控全局不可达和关键组件失效不会被同一个 Alertmanager(告警管理器)静默吞掉。

13. WMS(仓储管理系统)、支付、物流、导出、Runner(执行器)与 IoT(物联网)项目、排障、容量、版本边界

项目绑定应从“业务结果 -> 服务指标 -> 平台资源 -> 证据回查”建立最短闭环,而非为每个项目复制一套阈值。WMS(仓储管理系统)关注库存预占失败率、幂等冲突和锁等待;支付关注回调受理、终态时效与对账差异;跨境物流关注渠道成功率与轨迹新鲜度;导出与 Runner(执行器)关注队列年龄、执行耗时与资源隔离;IoT(物联网)关注设备批次异常、规则延迟和风暴收敛。所有项目版本、真实流量、SLO(服务等级目标)阈值及历史事故均待现场核对,不能从教学例子反推。

项目场景指标与告警处置与恢复验证权威边界
WMS(仓储管理系统)库存预占请求错误率、锁等待、幂等冲突、库存预占耗时限流、回滚变更、补偿后核对库存库存流水与订单状态
支付回调受理率、终态延迟、待确认年龄、渠道错误分类暂停有风险变更、查单补偿、对账渠道回执与账务流水
跨境物流渠道成功率、轨迹新鲜度、重试年龄降级渠道、重放任务、核验终态物流渠道终态
异步导出队列年龄、运行时长、内存、失败率限制并发、隔离资源、重试幂等任务导出任务与文件状态
Runner(执行器)排队时间、执行失败、容量、心跳停止派发、扩容或回滚任务包任务状态机与执行日志
IoT(物联网)设备异常比例、规则延迟、通知压缩率规则回滚、批次隔离、恢复后补偿设备状态与控制回执

数据演绎 13:Runner(执行器)容量与恢复追赶。 演练样例中 Runner(执行器)到达率为每分钟 240 个任务,单个执行器稳定处理 30 个任务每分钟,正常至少需要 240 / 30 = 8 个执行器。若一半执行器故障 10 分钟,积压约为 (240 - 4 x 30) x 10 = 1,200 个任务;恢复到 10 个执行器后净追赶能力为 10 x 30 - 240 = 60 个任务每分钟,清空约需 1,200 / 60 = 20 分钟。失败分支是只看 CPU(中央处理器)而忽略队列年龄,输出是把队列年龄、失败率和容量余量作为告警组合;验证结论是压测、故障注入、任务幂等校验和恢复后状态机对账。

热门面试题

  1. 问题:如何为库存防超卖设计 Prometheus(监控系统)指标?
    • 考点:症状、机制与权威核验。
    • 回答思路:覆盖预占结果、冲突、延迟和最终库存流水。
    • 详细答案:以库存预占请求总量、按受控错误类别的失败总量、幂等冲突、锁等待或队列年龄、预占延迟桶构建服务侧症状;告警先识别失败率或尾延迟,再关联发布和依赖。指标只能提示风险,最终必须以库存流水、订单状态和补偿记录确认是否实际超卖或重复扣减。
    • 进阶追问:把 SKU(库存单位)作为标签可以吗?
    • 进阶回答:通常不应直接使用全量 SKU(库存单位),因为商品数可能无界;可按仓、品类、热点等级等有限维度聚合,具体 SKU(库存单位)由日志、慢查询或库存审计定位。
  2. 问题:支付回调监控为何不能只看 HTTP(超文本传输协议)5xx?
    • 考点:技术成功与业务终态分离。
    • 回答思路:说明渠道拒绝、签名失败、未知结果和对账。
    • 详细答案:HTTP(超文本传输协议)5xx 只反映应用层错误,回调还可能因签名、业务状态、重复、渠道延迟或账务待确认而未形成可用终态。应分别统计受理、校验、落账、待确认年龄和对账差异,并将最终成功率建立在渠道回执与账务流水上,指标用于缩小时间窗和影响面。
    • 进阶追问:回调服务 up=1 但待确认积压怎么办?
    • 进阶回答:按业务症状处理,检查查单任务、渠道依赖、消息消费和最近变更,必要时限流或暂停发布;恢复后逐笔或分批对账,不因端点可用就宣布恢复。
  3. 问题:如何把 IoT(物联网)告警风暴治理落到项目话术?
    • 考点:量级、降噪、处置和验证闭环。
    • 回答思路:先描述批次异常,再给症状优先和根因候选聚类。
    • 详细答案:我会先以设备批次异常比例、规则处理延迟和控制失败作为用户或业务症状,按区域、规则版本和依赖域分组;当共同规则发布导致大量实例告警时,用抑制压住可解释派生项,保留控制失败和安全级事件,通过回滚或批次隔离止损。恢复后核对设备状态、控制回执、补偿任务和通知渠道记录,并把基数、分组和阈值缺口写入复盘。
    • 进阶追问:版本边界如何表达?
    • 进阶回答:明确说项目实际 Prometheus(监控系统)、Alertmanager(告警管理器)、采集器和存储版本待现场核对;只把已验证的配置、发布和演练证据写为事实,不把上游默认行为硬套到项目。

2. 正式 PlantUML(开源建模工具)图

Prometheus(监控系统)抓取、告警风暴与恢复闭环

图 18 说明: 正式图串联应用与 Exporter(导出器)、服务发现、抓取、WAL(预写日志)/TSDB(时序数据库)、规则、Alertmanager(告警管理器)、分组/抑制/静默、通知以及风暴失败和恢复。正常路径从受控指标进入规则与路由;失败路径包括目标丢失、基数失控、通知失败和派生风暴;业务结论是先保护症状告警和通知通道,再以业务审计验证恢复。

3. 项目排障 SOP(标准操作流程)与复习清单

| 步骤 | 第一证据 | 第二证据 | 动作风险与回归条件 | | --- | --- | --- | | 确认用户影响 | 业务 SLI(服务等级指标)、订单或任务量 | 权威流水、渠道回执、设备状态 | 不把 up 当业务恢复;明确受影响范围 | | 检查近期变更 | 发布批次、配置与规则版本 | 实例、服务发现、路由差异 | 暂停或回滚前确认兼容和补偿路径 | | 缩小服务域 | RED(请求率、错误率、耗时)与队列年龄 | USE(利用率、饱和度、错误)与依赖错误 | 先保护严重症状告警 | | 处理风暴 | 分组、抑制、路由和渠道失败 | 根因候选、通知明细与静默期限 | 不全局静默;保留独立严重事件 | | 验证恢复 | 规则恢复、积压下降、通知正常 | 审计对账、补偿完成与观察窗口 | 不能只凭 resolved(已恢复)关闭事故 |

复习清单:能解释时间序列身份与标签预算;能为 Counter(计数器)、Gauge(仪表盘值)、Histogram(直方图)和 Summary(摘要)选型;能手算错误率、桶、存储、分组和队列追赶;能区分规则、通知和事故状态;能讲清日志、指标、链路、业务审计的证据边界;能用 WMS(仓储管理系统)、支付、物流、Runner(执行器)和 IoT(物联网)案例说明告警从症状到恢复验证的闭环。

综合题库分隔

4. 综合长答案题库

  1. 问题:你如何从零设计一套 Prometheus(监控系统)监控闭环?

    口述答案:我会先从用户结果而不是组件清单开始,为下单、支付回调、物流轨迹和异步任务定义可解释的 SLI(服务等级指标),再把它拆成服务的请求率、错误率、延迟桶、队列年龄和资源饱和度。应用通过受控 label(标签)暴露指标,Service Discovery(服务发现)生成目标,Prometheus(监控系统)定期 scrape(抓取)并记录目标健康,TSDB(时序数据库)保存时间序列,Recording Rule(记录规则)预计算高复用聚合,Alert Rule(告警规则)判断症状,Alertmanager(告警管理器)按归属分组、抑制和路由。设计时我会给每个指标写明所有者、单位、标签预算、缺失语义、保留期和不能证明的事实。告警优先指向用户影响,平台和资源指标用于缩小故障域。最后以订单、库存、账务或设备回执验证恢复,并持续监控抓取、规则和通知链路自身,避免监控系统失效时自我宣称健康。详见本册信号边界

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:第一批指标最少包含什么? 直接回答:用户 SLI(服务等级指标)、服务 RED(请求率、错误率、耗时)、关键队列年龄、依赖错误和监控自监控。
    • 追问:为什么不先收集所有可能指标? 直接回答:无目标采集会制造高基数、存储成本和无人负责的噪声,反而延长排障。
    • 追问:告警恢复后下一步是什么? 直接回答:核对积压、补偿和权威业务状态,并保留观察窗口,不以 resolved(已恢复)通知结案。
  2. 问题:如何解释时间序列与标签基数,并做治理?

    口述答案:我把一条 time series(时间序列)定义为 metric name(指标名)与完整 label collection(标签集合)的唯一组合,sample(样本)只是该组合在一次抓取时的数值。治理的核心不是背概念,而是先估算所有有限维度的乘积,例如实例、路由、状态码和环境;任何订单号、用户标识、Trace(链路追踪) ID(链路标识)、原始 URL(统一资源定位符)或异常文本这类近似每请求不同的值,都不能进入 label(标签)。它们应保留在日志、链路属性或业务审计中。上线前我会登记每个指标家族的标签、预期基数、负责人和淘汰条件;上线后用活跃序列、Head(头部)内存、新序列创建速率和最昂贵标签检查偏差。若发现失控,优先删除无界标签、归类路由或在 relabel(重标记)阶段丢弃,再验证看板和告警没有静默盲区。扩容只能争取止损时间,不能修复错误数据模型。详见标签基数

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:哈希用户标识能否降低基数? 直接回答:不能,哈希后的不同值数量几乎不变,只是隐藏了明文。
    • 追问:实例标签应该删掉吗? 直接回答:不必,实例是有限运行维度,但高层告警要先按服务聚合。
    • 追问:缺失数据为什么不是零? 直接回答:缺失还可能代表抓取失败、目标消失或标签变更,必须与 up 和目标发现一起判断。
  3. 问题:Counter(计数器)、Gauge(仪表盘值)、Histogram(直方图)和 Summary(摘要)如何选型?

    口述答案:我的判断标准是被测对象的数学语义。已完成请求、失败、重试等累计事件用 Counter(计数器),因为它只增不减,进程重启后的归零由 rateincrease 处理;队列深度、连接数、在途任务和缓存大小用 Gauge(仪表盘值),因为真实业务状态会升会降;延迟和响应大小需要同时支持平均值、阈值内比例和跨实例尾延迟时用 Histogram(直方图);Summary(摘要)多在客户端计算本地分位数,适合单实例诊断,却不能把多个实例 P95(95 分位响应时间)平均成全局 P95(95 分位响应时间)。选型后我还会约束单位、命名、标签和重置行为,例如库存余量即使能暴露成 Gauge(仪表盘值),也不能被当作库存流水。类型正确才能保证 PromQL(Prometheus 查询语言)得到的是有业务含义的结果,否则图表看似正常,告警实际上在对错误数学对象做判断。详见指标类型

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:请求总数为何不能用 Gauge(仪表盘值)? 直接回答:它会随重启和并发写入变化,无法可靠计算窗口事件增量。
    • 追问:Summary(摘要)何时可接受? 直接回答:单实例本地观察或不需要跨实例聚合的场景可用,但要明确它的边界。
    • 追问:一个指标能同时暴露计数和延迟吗? 直接回答:可以,完成请求增加 Counter(计数器),同一次耗时写入 Histogram(直方图)。
  4. 问题:如何用 Histogram(直方图)解释平均值、P95(95 分位响应时间)和 SLO(服务等级目标)?

    口述答案:Histogram(直方图)把每次观测累加到多个 le 的累计 bucket(桶),因此可以先按服务聚合相同边界的桶,再用 histogram_quantile 估计 P95(95 分位响应时间)或 P99(99 分位响应时间);_sum / _count 只给出平均延迟。平均值适合看总体资源消耗,却可能掩盖少量用户长时间等待,所以支付回调、库存预占和物流查询通常要同时看平均、尾延迟、超时数和阈值内比例。桶边界不能随意等间隔,应围绕用户 SLO(服务等级目标)、客户端超时、下游超时和历史长尾加密设置;同一聚合域的实例必须使用一致边界。若 1 秒是好事件阈值,就要有对应桶,并明确 5xx、取消和超时是否计为坏事件。分位数是桶内插值估计,不应被表述为逐请求精确事实,最终的交易成功仍回到审计流水确认。详见直方图与尾延迟

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:为什么 P99(99 分位响应时间)会跳动? 直接回答:低流量窗口中一个慢请求即可改变高分位估计,应结合样本量和较长窗口。
    • 追问:桶越多越好吗? 直接回答:不是,桶会乘以实例和标签增加序列成本,只在关键阈值附近加密。
    • 追问:能否用平均值代替阈值内比例? 直接回答:不能,平均值无法回答有多少请求在用户可接受时间内完成。
  5. 问题:Prometheus(监控系统)为什么以 pull(拉取)和服务发现为主?

    口述答案:pull(拉取)模型把抓取周期、超时、认证、目标清单和失败记录集中在 Prometheus(监控系统)控制面,服务发现将 Kubernetes(容器编排平台)或其他平台对象转成候选 target(目标),relabel(重标记)再筛选目标并把不受控元数据收敛成有限标签。它的关键价值是“抓取失败也可见”:端点超时、认证失败、发现遗漏或返回非法指标都会反映在 up、抓取耗时和配置差异中。Exporter(导出器)用于将节点、数据库或外部系统的受控状态翻译成指标,但不能让慢查询拖垮整个抓取循环。短生命周期批任务确实无法等待下次抓取,此时可用 Pushgateway(推送网关)保留最后一次结果,不过作业结束后必须显式清理分组并监控新鲜度。常驻服务不应滥用 Pushgateway(推送网关),否则实例消失会留下旧数据并破坏失败可见性。详见抓取与服务发现

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:拉取模型是否能跨越任何网络边界? 直接回答:不能,跨网段、认证和隔离需通过代理、受控出口或专用采集架构解决。
    • 追问:relabel(重标记)误配会怎样? 直接回答:可能删除关键目标或标签,形成静默盲区,因此需对比发现对象和目标列表。
    • 追问:Pushgateway(推送网关)成功值为何危险? 直接回答:它保存最后值,作业消失后旧成功不会自动变失败,必须以新鲜度告警。
  6. 问题:如何解释 TSDB(时序数据库)的 WAL(预写日志)和保留策略?

    口述答案:Prometheus(监控系统)写入时先追加 WAL(预写日志),再进入 Head(头部)的活跃序列和 chunk(数据块),随后形成不可变 block(数据块)并通过 compaction(压缩合并)压缩,查询同时读取近期 Head(头部)和历史块。WAL(预写日志)让进程重启可回放近期已接收样本,但它不是无限可靠副本,磁盘满、损坏、版本兼容和恢复时长都要通过演练确认。容量规划不能只用压缩后每样本字节估算,还要加上标签索引、WAL(预写日志)、块元数据、查询临时空间、冗余和恢复余量。retention(保留)应覆盖值班排障、发布对比、SLO(服务等级目标)窗口和事故复盘,再回推样本率与基数成本;不能因磁盘紧张悄悄缩短证据窗口。高基数首先损害 Head(头部)内存和恢复时间,所以治理优先级是修标签模型,再考虑扩盘和长时存储。详见TSDB(时序数据库)存储

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:降低抓取频率能解决高基数吗? 直接回答:只能减少样本数,不能减少不同标签组合形成的序列数。
    • 追问:保留期越长越好吗? 直接回答:不是,要在复盘证据价值、成本、查询速度和专用长时存储之间平衡。
    • 追问:如何验证恢复能力? 直接回答:在隔离环境演练重启、回放、磁盘余量和查询一致性,并记录实际恢复时间。
  7. 问题:你如何写正确的 PromQL(Prometheus 查询语言)错误率?

    口述答案:我先明确错误率的业务分子和分母,再让两侧聚合后的 label(标签)集合完全一致。以服务级 HTTP(超文本传输协议)5xx 为例,分子是按 service 聚合的 rate 失败 Counter(计数器),分母是同样按 service 聚合的全部请求 rate,二者相除后才是服务级错误率。常见错误是分子保留 instance、分母已经汇总到 service,此时可能得到空向量、意外一对多匹配,或把每实例错误率简单平均后低估大实例影响。对低流量服务,我会同时要求最小请求量或绝对错误数,防止一个失败变成 100% 后反复呼叫。rateincrease 都是采样估计,适合运行趋势和告警,不应被拿来替代支付或库存的精确审计计数。投产前我会在看板中显示分子、分母和结果三条表达式,故障演练验证标签、缺失样本和重启后的表现。详见PromQL(Prometheus 查询语言)语义

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问rate 应用于什么类型? 直接回答:可重置但单调递增的 Counter(计数器),不应用于自然上下波动的 Gauge(仪表盘值)。
    • 追问:空向量代表没有错误吗? 直接回答:不一定,也可能是分母缺失、标签错配或抓取盲区。
    • 追问offset 能证明同比异常吗? 直接回答:只能提供历史对照,发布、节假日和流量构成变化仍需单独解释。
  8. 问题:什么时候应使用 Recording Rule(记录规则)?

    口述答案:我只为高复用、标签稳定且成本已测量的 PromQL(Prometheus 查询语言)表达式建立 Recording Rule(记录规则),例如服务级错误率、统一桶边界的延迟聚合和容量汇总。它把原始序列的复杂扫描从每次看板刷新和每条告警前移到固定评估周期,输出低基数的中间时间序列,能显著改善多人同时查看时的查询体验。代价是额外写入、规则评估负载、一个或多个周期的新鲜度延迟以及规则语义版本责任。因此我会为每条记录规则登记输入序列、输出标签、评估周期、延迟预算、所有者和废弃计划,并监控评估耗时、失败和最后成功时间。一次性排障、原始高基数维度和不清楚分母的表达式不应固化,否则只是把错误查询永久写进存储。修改规则时先并行比较新旧结果,迁移看板和告警后再下线旧序列,防止历史图断层。详见Recording Rule(记录规则)

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:记录规则是否能取代原始指标? 直接回答:不能,预聚合会丢维度和短时细节,原始指标仍是排障和复算基础。
    • 追问:规则评估慢先优化哪里? 直接回答:先检查输入基数、窗口、匹配和子查询,再检查规则依赖链与 TSDB(时序数据库)资源。
    • 追问:为什么记录规则也要标签预算? 直接回答:它写出的也是新时间序列,若复制实例和路径维度会把成本原样带过去。
  9. 问题:Alert Rule(告警规则)的 for 如何设计?

    口述答案for 是告警控制循环中的持续性门槛,而不是一个随手填的延迟。表达式首次为真进入 pending(等待),连续满足 for 后才 firing(触发),期间条件消失就重置。设计时我会先定义可接受检测时间,再把指标窗口、抓取周期、规则评估周期、for、Alertmanager(告警管理器)分组等待和人工响应一起算进去。错误率用很短窗口容易受低样本和抓取抖动影响,设置适当 for 可以过滤短波;但支付终态时效、库存严重失败等用户影响强且恢复窗口短的场景,不能用过长 for 掩盖事故。我还会明确缺失数据的语义,因为目标消失不是自动恢复。规则状态、通知状态和事故状态是不同层次:firing(触发)只说明表达式持续为真,是否送达、是否处置、是否业务恢复还要看下游证据。详见告警状态机

    落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

    • 追问:窗口和 for 有何不同? 直接回答:窗口决定如何计算样本趋势,for 决定布尔条件连续多久才通知。
    • 追问:firing(触发)后表达式缺失怎么办? 直接回答:先排查抓取和规则链,不应把系列消失自动解释为业务恢复。
    • 追问:低流量错误率怎样避免误报? 直接回答:加最小请求量、绝对失败数或业务新鲜度条件,并说明样本量。
  10. 问题:如何设计 Alertmanager(告警管理器)路由?

口述答案:我把 Alertmanager(告警管理器)当作通知控制面,而不是简单转发器。规则先产生带有受控 serviceenvironmentseverityteam 和业务域标签的活动告警;Alertmanager(告警管理器)先做 deduplication(去重),再按能表达共同处置责任的标签 grouping(分组),用 routing(路由)将事件送到值班团队和兜底渠道。inhibition(抑制)只用于已经被更高层症状或共同依赖解释的派生告警,silence(静默)只用于有范围、原因、期限和审批痕迹的计划维护或已知事件。分组过细会造成呼叫风暴,分组过粗会吞掉独立故障,所以我会用故障注入校验分组数、通知摘要和未被抑制的严重事件。还必须监控投递失败、重试、路由落点和静默到期,因为规则 firing(触发)并不等于人已收到。恢复后要通过业务 SLI(服务等级指标)和审计确认,而非仅依赖一条恢复消息。详见Alertmanager(告警管理器)治理

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:分组键为何不放 instance直接回答:实例往往只是同一服务事故的重复表现,放入分组会将一个事件拆成大量通知。
  • 追问:静默和抑制如何选? 直接回答:共同根因活动时用自动抑制,计划维护或人工确认的例外用有期限静默。
  • 追问:默认路由有什么作用? 直接回答:避免未知标签的告警悄悄丢失,但默认渠道也必须有人值守和可观测。
  1. 问题:发生告警风暴时你的处置顺序是什么?

口述答案:发生风暴时我不会先逐条确认,更不会一键静默所有告警。第一步是保护严重度最高、用户症状和安全边界告警的通知通道,确认 Pager(值班渠道)或备用渠道没有被低价值重复消息占满。第二步按共同依赖、服务域、区域、版本批次和时间窗做聚类,形成“根因候选”与“派生现象”的分层;用 grouping(分组)压缩实例重复,用 inhibition(抑制)暂压已被上层故障解释的下游噪声,同时保留活动事实和独立严重事件。第三步检查最近发布、配置、依赖健康、队列年龄和业务 SLI(服务等级指标),选择回滚、隔离、限流、扩容或补偿。通知失败是独立故障,要看重试和备用渠道。恢复后不以告警数量下降为结论,而要确认积压清空、失败任务补齐、库存或账务对账完成,并复盘阈值、分组、基数预算和演练缺口。详见告警风暴治理

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:如何发现独立严重事件被错误抑制? 直接回答:审计抑制匹配、保留控制台活动告警,并在演练中注入无关故障验证仍能通知。
  • 追问:根因候选何时可以升级为结论? 直接回答:当变更、依赖证据、处置后的指标变化和业务验证形成可复核证据链时。
  • 追问:风暴结束后必须改哪些东西? 直接回答:至少审查症状告警、分组抑制、通知限额、标签预算、恢复验证和演练覆盖。
  1. 问题:告警抖动与通知失败如何分别治理?

口述答案:告警抖动是条件在阈值附近反复真假的测量或容量问题,通知失败是活动告警无法可靠到达处置人的传递问题,两者不能混在一起处理。对抖动,我先判断是抓取丢失、低样本波动、阈值贴边,还是队列和依赖确实周期性饱和;再通过合理窗口、最小样本量、for、触发与恢复不同阈值的滞回,或直接修复容量和依赖来治理。对通知失败,我监控 Alertmanager(告警管理器)接收、分组、发送、重试、失败、渠道响应和备用路径,并用受控测试告警定期演练。永久静默只能掩盖抖动,增加重试次数也不能修复错误路由或渠道不可达。两类治理的共同原则是保留事实、明确反馈延迟、记录配置变更,并在恢复后用业务指标验证。详见风暴与通知失败

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:滞回是什么? 直接回答:触发和恢复使用不同阈值或持续条件,减少指标在临界点来回切换。
  • 追问:渠道故障时能依赖同一渠道告警吗? 直接回答:不能,必须有独立的备用路径或外部监控。
  • 追问:如何验证静默不会留下盲区? 直接回答:检查标签范围、到期时间、审批、未命中严重度和到期后仍活动的重新通知。
  1. 问题:Prometheus(监控系统)高可用的关键边界是什么?

口述答案:Prometheus(监控系统)高可用的目标是减少单副本、维护和局部网络故障造成的观测盲区,不是让两台机器看起来同时存活。通常两个副本独立抓取同一 target(目标)、独立评估规则,再由 Alertmanager(告警管理器)按受控副本标签做去重通知;这样一台故障时另一台仍有数据,但代价是重复采样、存储和规则结果。设计时要拆开服务发现、认证、网络、配置发布、持久化和通知这些共同故障域,否则两副本可能因同一错误一起失明。对于长期查询和跨集群数据,还要明确副本去重、数据延迟、规则评估位置和恢复顺序。高可用验收不能只看两个 up=1,还应演练单副本下线、配置漂移、发现异常、Alertmanager(告警管理器)故障和外部探针,以业务 SLI(服务等级指标)仍可观测、通知仍可送达作为结果。详见高可用与自监控

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:两副本为何可能重复告警? 直接回答:它们独立评估同一规则,通知侧必须正确去重而不是关闭其中一台。
  • 追问:如何发现配置漂移? 直接回答:比较配置摘要、目标数、规则版本和关键查询结果,并对变更做审计。
  • 追问:共同故障域最容易漏掉什么? 直接回答:共享服务发现、证书、DNS(域名系统)、网络出口和同一发布流水线。
  1. 问题:remote write(远程写入)如何做容量与丢失边界设计?

口述答案:remote write(远程写入)把本地采集到的样本异步送往长时或跨集群后端,关键是把“本地抓取成功”和“远端已持久化”分开。设计时我会计算输入样本率、远端正常吞吐、故障期间可能积压、队列可用内存或磁盘、恢复后的净追赶能力和可接受数据新鲜度。例如远端故障十分钟时的积压等于样本率乘故障秒数,恢复后清空速度取决于远端处理能力扣除持续新流量。若队列预算不足,系统最终必须丢样、阻塞或降级,不能假装无限缓存。因此要明确哪些原始数据可接受延迟或丢失、哪些业务 SLI(服务等级指标)必须留在本地,并监控队列长度、重试、失败、丢弃、发送延迟和远端查询新鲜度。故障注入要覆盖远端不可用、慢响应和恢复追赶,结果写入容量计划。详见remote write(远程写入)

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:远端失败会立即影响本地告警吗? 直接回答:不必然,本地规则可继续运行,但队列会积压,长期会触及资源或丢失边界。
  • 追问:远程写入是否等于备份? 直接回答:不等于,复制延迟、过滤、去重和远端故障都需要单独验证恢复语义。
  • 追问:为何必须看恢复追赶时间? 直接回答:恢复能力若只等于新流量,积压永远清不掉,长期查询会一直陈旧。
  1. 问题:RED(请求率、错误率、耗时)与 USE(利用率、饱和度、错误)如何用于排障?

口述答案:我把 RED(请求率、错误率、耗时)用于判断服务是否正在伤害用户,把 USE(利用率、饱和度、错误)用于判断哪个资源或依赖形成约束。排障先看业务 SLI(服务等级指标)和 RED(请求率、错误率、耗时):错误率、阈值内比例或尾延迟是否在同一时间窗异常;再看队列年龄、连接池等待、CPU(中央处理器)利用率、磁盘错误、网络失败等 USE(利用率、饱和度、错误)证据。这样避免了“CPU(中央处理器)高就是根因”的反向推断,因为渠道拒绝、配置错误和状态机缺陷可以在资源正常时造成用户失败,反过来高 CPU(中央处理器)也可能没有用户影响。定位到服务域后,我再用 Trace(链路追踪)和日志补调用或实例细节,最后查订单、库存、账务或任务状态确认事实。告警设置以症状优先,容量指标多用于预警和处置辅助。详见RED(请求率、错误率、耗时)与 USE(利用率、饱和度、错误)

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:队列长度和年龄为何都要看? 直接回答:长度反映规模,年龄反映最久等待,两者结合能区分高流量与处理能力不足。
  • 追问:资源正常时用户仍失败怎么办? 直接回答:检查依赖、发布、鉴权、渠道和业务状态机,并用审计确认终态。
  • 追问:RED(请求率、错误率、耗时)能证明资金一致吗? 直接回答:不能,它只量化服务症状,资金一致性必须由账务流水和对账确认。
  1. 问题:如何用多窗口多燃烧率连接 SLO(服务等级目标)告警?

口述答案:多窗口多燃烧率的思路是把错误预算消耗速度与不同检测时限结合:短窗口用于快速发现严重且持续的用户伤害,长窗口用于确认它不是单次毛刺;慢性消耗则用更长窗口防止预算在数天内被悄悄烧完。我的前提是先定义好事件、总事件、窗口和数据源,例如支付回调“在约定时效内形成可确认终态”的比例,而不是简单用 up 或 CPU(中央处理器)。然后计算当前坏事件比例相对允许坏事件比例的倍数,并把短长窗口同时满足作为通知条件。这样比静态 CPU(中央处理器)阈值更接近用户影响,但它仍受抓取缺失、样本量和业务延迟影响,不能取代高风险变更审批、逐笔对账或事故指挥。告警内容应写明预算窗口、当前燃烧、样本量、受影响服务和下一步验证路径,恢复后检查积压与补偿是否追平。详见告警状态机

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:为什么需要短长两个窗口? 直接回答:短窗口提高响应速度,长窗口过滤毛刺,两者同时满足降低误报。
  • 追问:低流量业务如何用燃烧率? 直接回答:补充最小样本量、绝对失败数和业务新鲜度,避免比率被单个事件放大。
  • 追问:预算耗尽是否自动禁止所有发布? 直接回答:它约束风险决策,具体冻结和豁免仍要结合业务优先级与审批。
  1. 问题:库存防超卖场景如何设计指标、告警和恢复验证?

口述答案:库存防超卖不能只监控接口 5xx,我会从预占请求总量、成功与受控失败分类、幂等冲突、锁等待或队列年龄、延迟桶、补偿任务积压建立服务侧观察。告警先针对库存预占失败率、长尾延迟、幂等冲突突增和补偿年龄等症状,按仓、品类或热点等级等有限维度聚合,绝不直接用全量 SKU(库存单位)或订单号做 label(标签)。一旦异常,先确认近期发布、数据库或缓存依赖、流量突增和限流状态,必要时暂停风险变更、降级非关键入口或回滚;同时保留订单受理和库存流水的对账路径。Prometheus(监控系统)帮助量化影响范围和定位时间窗,日志和 Trace(链路追踪)帮助定位实例与依赖,但是否实际超卖、重复扣减或补偿成功,必须以库存流水、订单状态机和人工或自动对账的权威结果判定。恢复后继续观察积压与冲突回落,复盘热点标签和阈值。详见项目场景

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:SKU(库存单位)为何不能直接做标签? 直接回答:全量 SKU(库存单位)通常无界,会导致高基数和告警风暴,应用有限分类替代。
  • 追问:幂等冲突升高一定是故障吗? 直接回答:不一定,重试流量或用户重复提交也会增加,需结合发布、延迟和订单状态解释。
  • 追问:恢复后为何还要对账? 直接回答:服务指标恢复不证明此前失败或超时请求没有留下库存副作用。
  1. 问题:支付回调场景为何要同时监控技术和业务指标?

口述答案:支付回调的技术成功和资金终态天然不同。HTTP(超文本传输协议)5xx、应用延迟、队列积压和 up 能说明服务运行症状,却不能说明签名校验、幂等处理、落账、查单、渠道最终回执和对账是否完成。因此我会分层定义指标:入口请求与错误分类、签名和业务校验结果、受理到终态的延迟桶、待确认任务年龄、渠道错误比例、查单和补偿成功率、账务对账差异。告警优先指向用户或资金风险,例如待确认年龄超过可接受窗口、终态时效恶化或差异持续扩大;资源、连接池和外部渠道指标用于缩小故障域。发生异常先冻结高风险发布或切换受控降级,查询渠道和账务状态,再按幂等键补偿。Prometheus(监控系统)只负责趋势与范围,最终恢复必须以渠道回执和账务流水对账完成为证据。详见支付边界

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问up=1 能说明回调正常吗? 直接回答:不能,它只说明指标端点可抓取,业务可能仍在待确认或被渠道拒绝。
  • 追问:为何待确认年龄比数量重要? 直接回答:年龄直接反映最久资金状态悬而未决的时间,数量需结合流量解释。
  • 追问:告警恢复后可立即关闭事故吗? 直接回答:不行,必须确认查单、补偿和账务对账已经完成。
  1. 问题:跨境物流多渠道健康如何设计监控?

口述答案:跨境物流不能把多个渠道揉成一个总成功率,因为不同承运商、区域、接口版本和时区的失败模式不同。我会以受控的渠道、区域、业务动作和结果分类作为标签,采集请求率、成功或可重试失败比例、延迟桶、轨迹新鲜度、重试年龄和消息积压;原始运单号只进入日志或审计。告警先关注用户可感知的轨迹超过承诺时间未更新、某渠道持续失败、重试年龄增长和异步消费跟不上,再按渠道和版本分组路由给相应团队。排障时先看最近渠道适配发布、外部依赖错误、消息队列年龄和限流,再用链路、日志和运单状态核对。恢复路径可能是回滚适配、切换渠道、重放幂等任务或人工处理,但不能因为接口成功率回升就宣称轨迹完整;必须抽样或批量确认权威渠道终态与本地状态已追平。详见项目排障

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:渠道标签会不会高基数? 直接回答:受控渠道清单通常有限,关键是避免把运单号、原始错误文本和动态 URL(统一资源定位符)作为标签。
  • 追问:轨迹新鲜度如何计算? 直接回答:以当前时间减去最后可信轨迹时间,按业务承诺窗口分级告警。
  • 追问:切换渠道后如何验证? 直接回答:验证新渠道成功率、延迟和待处理年龄,并回查运单权威终态和重放结果。
  1. 问题:异步导出任务如何避免因监控不当造成资源事故?

口述答案:异步导出通常同时受任务到达率、队列、文件大小、数据库读取、内存、磁盘和对象存储影响,不能只监控 CPU(中央处理器)。我会暴露入队与完成 Counter(计数器)、排队数量和最老任务年龄 Gauge(仪表盘值)、执行耗时 Histogram(直方图)、失败分类、并发槽位、内存与磁盘临界资源,并按受控任务类型和优先级聚合。告警以队列年龄、失败率、长尾执行和资源饱和的组合为主,避免高流量时仅因队列长度绝对值呼叫。处置可包括限制并发、隔离大任务、暂停低优先级入口、扩容执行池或回滚导出版本,但每一步要考虑幂等、文件清理和数据库压力。恢复后需验证积压追赶时间、失败任务重试、重复文件清理和用户可下载状态,指标只帮助判断范围,任务表和文件状态才确认最终交付。详见项目场景

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:为何队列年龄比深度更直接? 直接回答:深度受流量影响,年龄直接表示已有用户等待多久,两者需一起看。
  • 追问:扩容执行器一定能恢复吗? 直接回答:不一定,数据库、对象存储或内存可能是瓶颈,必须先看 USE(利用率、饱和度、错误)。
  • 追问:如何避免重试重复导出? 直接回答:任务状态机、幂等键和输出文件去重是权威控制,监控只发现异常。
  1. 问题:Runner(执行器)调度的容量应如何从指标反推?

口述答案:Runner(执行器)容量不能只按 CPU(中央处理器)百分比定,我会从业务到达率、单任务服务时间、每执行器并发能力、失败重试、队列年龄、外部依赖和故障余量反推。先测稳定吞吐和不同任务类型的耗时分布,计算正常所需执行器数;再模拟半数实例失效、发布重叠和峰值到达,计算积压量与恢复后的净追赶能力。监控上同时保留入队、开始、完成、失败 Counter(计数器),排队数量和最老年龄 Gauge(仪表盘值),执行延迟 Histogram(直方图),执行器心跳、槽位利用和依赖错误。告警以任务年龄和用户影响优先,容量指标用于提前扩缩容和防止重试风暴。处置要控制派发、隔离坏任务或回滚任务包,恢复后核对任务状态机、幂等结果和补偿队列;单纯看到 CPU(中央处理器)降下来不能证明任务已经追平。详见Runner(执行器)容量演绎

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:如何计算恢复追赶时间? 直接回答:用积压量除以恢复后处理能力减去持续到达率的净能力。
  • 追问:为何要按任务类型分开? 直接回答:不同类型服务时间和资源占用差异大,混合平均会掩盖慢任务拖累。
  • 追问:执行器心跳正常代表任务正常吗? 直接回答:不代表,心跳仅表明进程存活,还要看派发、完成、年龄和业务结果。
  1. 问题:IoT(物联网)报警风暴如何同时治理指标和通知?

口述答案:IoT(物联网)风暴的关键是把设备海量重复现象与真正需要人工处置的症状分开。我会以设备批次异常比例、规则处理延迟、控制失败、消息积压、通知压缩率和渠道失败为核心指标,标签限制在区域、规则版本、设备类型和严重度等有限维度,绝不把设备标识直接扩散到所有告警。发生风暴时先保护控制失败、安全事件和用户影响告警,按规则版本、区域、共同依赖和发布时间聚类,形成根因候选;用 Alertmanager(告警管理器)分组压缩实例级重复,用抑制压住已被共同规则故障解释的派生告警,同时保留明细用于排查。处置可能是规则回滚、批次隔离、限流和补偿重放。恢复验证不止看通知数下降,还要核对设备状态、控制回执、积压清理和补偿成功,最后把基数预算、分组键、阈值和渠道限额纳入复盘。详见IoT(物联网)风暴治理

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:设备标识完全不能使用吗? 直接回答:可在日志、审计或受限排障查询中使用,不应作为普遍时序标签和分组键。
  • 追问:为何保留被抑制告警事实? 直接回答:便于确认抑制范围、发现独立异常并为复盘提供完整证据。
  • 追问:如何防止通知通道被淹没? 直接回答:症状优先、分组、受控抑制、路由限额、失败监控和备用渠道共同实施。
  1. 问题:日志、指标、链路和业务审计如何划清边界?

口述答案:我不会把四类信号互相替代。指标是受控标签下的聚合时间序列,最适合发现错误率、延迟、容量与趋势,但会丢失单请求细节;日志记录离散事件和上下文,适合定位异常参数、实例和时间线,却可能有采集缺失或重复;Trace(链路追踪)展示被采样请求的跨服务路径和等待关系,能缩小故障域,但未采样路径不可见,相关性也不等于因果;业务审计、库存流水、账务流水和渠道回执才是订单与资金终态的权威事实。排障时通常先由业务 SLI(服务等级指标)和 Prometheus(监控系统)确定时间窗与受影响维度,再用链路和日志解释调用或实例,最后以审计确认影响和补偿结果。所有关联键都要受控,不能把订单号、隐私或大对象放入时序标签。这样既保留了快速检测能力,也避免从聚合数字反推逐笔成功。详见信号边界

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:指标错误率能证明有多少订单失败吗? 直接回答:不能直接证明,它受抓取、聚合和标签分类影响,订单审计才可逐笔确认。
  • 追问:Trace(链路追踪)成功是否代表支付成功? 直接回答:不代表,调用返回成功不等于账务提交、渠道终态或对账完成。
  • 追问:日志为何也不是权威账? 直接回答:日志可能丢失、重复、异步写入或被脱敏,且不是业务状态机的提交证据。
  1. 问题:如何做 Prometheus(监控系统)容量规划?

口述答案:容量规划从可观测业务的样本率和故障恢复目标开始,而不是先给机器配置。我要计算 target(目标)数、每个目标样本数、抓取间隔、标签基数、直方图桶数、规则输入范围和保留天数,得到每秒写入量、活跃序列、Head(头部)内存、WAL(预写日志)增长和块存储的实际曲线;再加入高峰流量、发布重叠、单副本故障、远程写积压和 compaction(压缩合并)余量。查询侧还要评估常用看板、规则与长范围查询的并发,避免只按写入扩容。每个假设必须通过压测和故障注入校准,例如把抓取目标增加、注入高基数错误标签、暂时阻断远端写入,再观察内存、磁盘、规则耗时和恢复追赶。容量告警本身要留在用户症状之后,防止基础设施预警挤掉真正的业务事故通知。详见TSDB(时序数据库)容量

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:直方图会怎样影响容量? 直接回答:每个桶都会形成额外序列,桶数乘以标签组合和实例数必须纳入预算。
  • 追问:为何要预留 compaction(压缩合并)空间? 直接回答:合并块和查询会产生临时资源峰值,磁盘贴边可能导致写入或恢复失败。
  • 追问:容量是否只看存储? 直接回答:不是,Head(头部)内存、规则 CPU(中央处理器)、查询并发和网络同样是约束。
  1. 问题:版本未知时怎样回答 Prometheus(监控系统)配置与升级问题?

口述答案:版本未知时我不会猜测默认值、参数名或托管平台行为。我会明确项目实际 Prometheus(监控系统)、Alertmanager(告警管理器)、Exporter(导出器)、采集器和长时存储版本待现场核对,并先固定本次讨论的稳定模型,例如拉取、时间序列、规则状态机和分组抑制语义。涉及配置格式、废弃参数、原生直方图、远程写协议、持久化格式或高可用去重时,要在变更前查项目部署记录、官方对应版本文档、兼容矩阵和演练结果。升级设计还要明确配置备份、规则比较、存储兼容、回退是否可逆、双副本滚动顺序和恢复验证。面试中这样回答不是回避,而是说明我知道版本是运行事实的一部分:不能把“我见过的行为”泛化成所有版本,更不能在监控系统升级时牺牲告警和数据连续性。详见版本边界

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:哪些变化最需要演练? 直接回答:规则与路由语义、存储恢复、远程写、认证、服务发现和高可用去重都应演练。
  • 追问:能否直接在生产改告警规则? 直接回答:应先做配置校验和并行观察,明确回滚与通知影响,再受控发布。
  • 追问:托管平台默认值能当上游事实吗? 直接回答:不能,托管平台可能改写采集、保留、认证和告警行为,必须单独核对。
  1. 问题:为什么“监控自身”是 Prometheus(监控系统)设计的一部分?

口述答案:监控系统如果只测业务却不测自身,会在最需要它时形成静默盲区。我的自监控覆盖六段链路:服务发现的目标数量和变化,scrape(抓取)的成功率、耗时和错误,TSDB(时序数据库)的样本写入、活跃序列、Head(头部)内存、WAL(预写日志)与磁盘、规则评估耗时和失败,Alertmanager(告警管理器)的接收、分组、投递、重试和静默,remote write(远程写入)队列与长时数据新鲜度。仅依赖同一集群内部指标仍可能受共同故障域影响,所以还要有外部探针、独立的通知兜底和周期性测试告警。自监控告警也要有优先级:全局采集、规则或通知链路失效应优先于一般容量预警;否则值班人员可能收到大量派生业务告警,却不知道观测本身已经不可信。恢复时检查数据连续性和缺口范围,不能只看进程重启成功。详见监控自监控

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:测试告警如何避免影响值班? 直接回答:使用专用标签、测试路由和明确窗口,同时周期性验证真实升级路径。
  • 追问up=1 为何不足以证明监控健康? 直接回答:它只说明某次端点抓取成功,不覆盖规则、存储、通知和外部业务语义。
  • 追问:数据缺口如何处理? 直接回答:记录缺口时间和范围,排查根因,并在事故分析中明确哪些结论不可得。
  1. 问题:业务告警触发后的标准排障路径是什么?

口述答案:我会沿“用户影响、变更、服务症状、资源约束、调用细节、权威状态”的顺序排障。先确认业务 SLI(服务等级指标)和受影响范围,避免从 CPU(中央处理器)或实例告警出发误判;再检查最近发布、配置、规则和服务发现变化,确认是否存在明确时间相关。随后用 RED(请求率、错误率、耗时)确定服务、路由或渠道维度,用 USE(利用率、饱和度、错误)判断队列、连接池、磁盘或依赖约束;必要时借助 Trace(链路追踪)和日志定位具体等待与错误分类。处置动作如回滚、限流、隔离、扩容和重放要写清风险与回归条件。最后以订单、库存、账务、任务或设备回执确认恢复,清理积压并保持观察窗口。若同时出现告警风暴,还要先保证严重用户症状和通知通道没有被派生告警淹没。整个过程保留时间线、查询、变更和决策证据,便于复盘。详见项目排障 SOP(标准操作流程)

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:为何先看变更? 直接回答:变更是高概率可验证原因,但不能替代对用户影响和依赖证据的检查。
  • 追问:回滚后指标下降是否足够? 直接回答:不够,还要确认积压、补偿和权威业务状态已经恢复。
  • 追问:何时应扩容? 直接回答:确认到达率、服务时间与资源饱和形成约束且扩容不会压垮下游时。
  1. 问题:PromQL(Prometheus 查询语言)“能执行但语义错误”的典型例子有哪些?

口述答案:我会主动检查四类“有数字但没意义”的查询。第一类是把 rate 用在 Gauge(仪表盘值)上,把正常回落误解释为重置后的事件速率;第二类是分子和分母标签不同,例如实例级错误除服务级请求,得到空结果或错误复制;第三类是先丢失状态码或渠道等关键维度再聚合,导致错误率无法说明是哪个业务域受损;第四类是把多个 Summary(摘要)的本地 P95(95 分位响应时间)平均成全局尾延迟;第五类是把 increase 估计的事件数当作精确审计笔数;第六类是把缺失序列当作零或恢复。治理方法是为每条关键查询写清输入类型、窗口、标签集合、分母、缺失语义和期望单位,在看板中展示中间向量,并用重启、低流量、目标消失和标签变化的演练样例验证。查询审查必须与规则、告警和项目业务语义一起做。详见PromQL(Prometheus 查询语言)反例

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:为何不能平均多个 P95(95 分位响应时间)? 直接回答:分位数不可加,平均会丢掉各实例请求量和分布信息。
  • 追问:缺失序列怎样处理? 直接回答:按业务明确区分零值、未上报、目标消失和查询匹配错误。
  • 追问:如何防止规则变更引入语义回归? 直接回答:新旧规则并行比对,检查标签、数值、通知和恢复条件后再切换。
  1. 问题:如何把查询成本纳入可观测性治理?

口述答案:查询成本和写入成本一样需要预算。PromQL(Prometheus 查询语言)成本主要由扫描的时间序列数、时间范围、时间步长、正则或向量匹配、subquery(子查询)重复计算、并发看板和规则依赖链决定。我的做法是先为高复用看板和告警记录输入基数、响应时间、查询频率与业务价值,收敛标签和范围;对于稳定的共同聚合使用 Recording Rule(记录规则)预计算,并监控规则输出序列、评估耗时和新鲜度。长时间范围探索应走受控排障流程,避免值班高峰一次查询拖慢规则或在线图表。优化时不能只缓存结果,因为错误的标签或分母会被更快地传播;先保证语义正确,再压缩基数、减少无关维度、合理选择窗口和预聚合。容量演练还要模拟多人刷新、事故期间查询放大和高基数输入,确认规则和告警仍有资源余量。详见查询成本

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:最先看哪个成本信号? 直接回答:规则评估耗时、查询延迟、活跃序列和高频大范围表达式是优先证据。
  • 追问:Recording Rule(记录规则)会不会增加成本? 直接回答:会,它将重复读成本转为周期计算和额外存储,必须比较总成本。
  • 追问:事故时能否禁止所有复杂查询? 直接回答:可限制高风险探索查询,但要保留关键看板、规则和证据查询的通道。
  1. 问题:请用一个完整项目话术讲 Prometheus(监控系统)告警风暴治理。

口述答案:在 IoT(物联网)规则发布、支付回调或 WMS(仓储管理系统)库存依赖异常这类场景,我会先说明不虚构项目版本和历史数字,实际 Prometheus(监控系统)与 Alertmanager(告警管理器)版本待现场核对。我的方案是先给关键用户结果建立 SLI(服务等级指标),再补服务 RED(请求率、错误率、耗时)、队列年龄、依赖错误和通知链路指标;标签只保留服务、区域、规则版本、渠道、严重度等受控维度。故障时不逐条处理数千实例告警,而是先保护控制失败、资金或库存风险等症状告警,按共同依赖和发布批次分组,将可解释的派生告警抑制,检查通知失败并用备用渠道。处置可能是暂停发布、回滚规则、限流、隔离批次或扩容,之后用业务审计、渠道回执、库存流水和补偿任务验证恢复。复盘把无界标签、错误分组、抖动阈值、容量余量和演练缺口变为有负责人和验证条件的行动项。详见正式风暴闭环图

落地时我还会把这一结论转成可执行闭环:为相关规则登记负责人、业务影响、标签集合、评估窗口、通知路由和恢复条件;在发布前用受控流量或故障注入检查抓取、表达式、分组、通知与回滚是否按预期工作。运行中记录变更版本和证据时间线,既避免把瞬时采样当成绝对事实,也避免把某一次成功验证推广到所有租户、实例和依赖。若指标与业务审计冲突,以权威状态为准并保留差异作为后续排查线索。同时我会观察规则评估、告警投递、队列追赶和长期趋势,确认治理动作没有将压力转移给下游;若发现其余服务或渠道也受影响,重新按共同依赖和严重度聚类,而不是沿用最初假设。最终把数据来源、查询、负责人、处置动作、回归条件和复盘改进记录在变更审计中,形成下一次发布可以复用的证据。

  • 追问:为什么先保留症状告警? 直接回答:症状直接表示用户或安全影响,根因候选可能错误,不能让派生噪声淹没真正影响。
  • 追问:分组后是否丢失实例明细? 直接回答:不丢失,通知压缩但活动告警和标签明细仍可在控制台查询。
  • 追问:如何定义完成恢复? 直接回答:指标稳定、通知链路正常、积压和补偿完成,并经库存、账务、任务或设备权威状态验证。