跳到主要内容
约 6 分钟5 张卡

监控与告警

监控采集系统状态,告警触发需要处理的事件。本文负责 Prometheus、指标设计和告警规则。

1. 面试核心​

先记住这几条,再读正文

2. Prometheus 的组成​

组件分工
Prometheus Server发现目标、抓取、存储、查询和计算规则
应用客户端库在应用内记录并暴露指标
Exporter将系统状态转换成可抓取指标
Pushgateway为特定批处理任务保留推送指标
Alertmanager分组、去重、抑制、静默和路由
Grafana展示查询和看板
远程存储支持长期保存或跨集群查询

默认抓取路径为 /metrics,可按目标配置。发现机制提供目标,relabel 规则筛选并改写标签。Kubernetes 可发现 Pod、Service 和 EndpointSlice。Operator 的 ServiceMonitor、PodMonitor 用来声明抓取配置。

up == 0 表示某个已发现目标抓取失败。目标从发现结果消失后,原 up 序列也会消失。该情形还需缺失检测或预期目标数量校验。

2.1 指标类型​

类型含义与用途
Counter累计事件数,可在重启时重置
Gauge当前值,可上升或下降
Histogram保存分布,可聚合后计算分位数
Summary提供 sum、count 及预先计算的分位数

每个标签组合都会形成独立序列。用户 ID、完整 URL 等高基数标签会扩大存储和查询成本。HTTP 路径可用模板值,例如 /users/:id。

Zabbix 提供主机模板及多种主动、被动采集。Prometheus 以标签和 PromQL 组织时序分析。选型应结合采集对象、服务发现与维护成本。

2.2 Pushgateway 与监控高可用​

Pushgateway 适合服务级短生命周期批处理任务。它保留已推送的数据,直到显式删除。任务消失后,旧成功指标仍会继续被抓取。因此,任务完成时间和旧序列清理都需设计。

长期服务优先暴露抓取端点。多个 Prometheus 可独立抓取同一目标。Alertmanager 集群协作去重通知。查询侧仍需处理重复序列,具体依赖远程存储方案。

外部心跳接收端检查通知是否按时到达。它用于验证规则、通知和接收链路。心跳接收端应独立于被监控系统。

3. 服务与资源指标​

黄金信号示例
延迟成功与失败请求分别统计 P50、P99
流量QPS、并发连接、新连接速率
错误5xx、业务失败、超时比例
饱和度队列积压、池等待、资源压力

USE 分别检查资源使用率、饱和度与错误。CPU 可结合运行队列与限流。内存可结合 PSI、回收和 OOM。磁盘检查空间、inode、I/O 延迟和设备错误。

代理服务还需监控每个上游的延迟与失败。TLS 证书期限、文件描述符和连接数也影响接入。业务层补充交易成功率,用户侧补充外部拨测。

4. 告警设计​

需要立即响应的告警,应对应用户影响或明确风险。每条规则需写清负责人、影响和处置入口。资源指标还可用于工单与容量规划。

机制作用
for: 5m条件持续成立后进入 firing
keep_firing_for条件消失后继续保留 firing 一段时间
分组合并同服务或同事故的通知
抑制已有上层故障时,抑制关联衍生告警
静默按匹配器和时间窗口暂停通知
路由根据标签选择接收人和通知渠道

规则先进入 pending,持续满足 for 后进入 firing。Alertmanager 的 group_wait 是等待聚合首批通知。repeat_interval 则控制重复通知间隔。它们处理的是不同阶段。

迟滞需要独立的进入和退出条件。单独设置 for 只增加持续时间,无法实现双阈值。keep_firing_for 提供延迟恢复,语义也不同。

SLO 消耗告警可组合长短窗口,见 SRE 的职责与工作方式。磁盘趋势预测可使用 predict_linear。流量低或数据缺失时,应另行核对统计有效性。

严重告警需要值班确认与超时升级。升级可由外部值班系统实现。Alertmanager 的通知路由本身没有人工确认流程。

5. 分位数聚合与速率​

以下示例针对经典 Histogram,并保留 job 维度。

histogram_quantile(
0.99,
sum by (job, le) (
rate(http_request_duration_seconds_bucket[5m])
)
)

rate 先处理各实例的计数重置。sum 再合并同一服务的桶。le 保留桶边界,最后计算整体 P99。参与合并的经典直方图应使用一致的桶边界。

Summary 的分位数无法直接相加或平均成整体分位数。它的 sum 与 count 仍可聚合以计算均值。

服务错误率应使用错误总速率除以请求总速率。

sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))
/
sum by (job) (rate(http_requests_total[5m]))

该计算按各实例请求量加权。直接平均实例错误率会让低流量实例获得过高权重。还需处理零请求和错误序列未初始化的情形。数据缺失检测可使用 absent_over_time。动态服务也需维护预期目标的独立信息。

6 · 面试题卡片​

本页题目与参考回答

6.1 Prometheus 的架构是怎样的?它怎样发现和抓取目标?与 Zabbix 有什么区别?​

考察重点

  • Server、Exporter、Pushgateway、Alertmanager 的分工和拉取模型。
  • 服务发现与 relabel;指标类型;与 Zabbix 的定位差异。

相关内容:Prometheus 的组成。

参考回答

Prometheus Server 发现并抓取目标,存储时序并计算规则。

应用埋点或 Exporter 提供指标。Alertmanager 管理分组、去重、静默、抑制与通知。

服务发现提供目标,relabel 筛选并改写标签。Operator 可用 ServiceMonitor 或 PodMonitor 描述采集。抓取失败会产生 up=0,目标消失还需缺失检测。

Zabbix 提供主机模板及主动、被动采集。Prometheus 用标签与 PromQL 分析动态目标。两者选择取决于对象、查询及运维需求。

6.2 如果要监控一个生产环境的服务(例如一台代理服务器),你会监控哪些指标?​

考察重点

  • 用黄金信号、USE 方法组织指标,而不是罗列。
  • 分层覆盖:资源、中间件、应用、业务、用户侧。

相关内容:服务与资源指标。

参考回答

服务应覆盖延迟、流量、错误和饱和度。

再用 USE 方法检查 CPU、内存、磁盘与网络。

代理服务重点看上游分布、连接数与建立速率。还需检查 TLS 证书、文件描述符和超时。业务成功率与外部拨测用于验证用户实际结果。

看板用于定位原因,紧急告警用于触发明确处置。每条告警应能关联影响、负责人和处理入口。

6.3 告警怎样设置才合理?一个指标在阈值附近反复触发、一天告警几百次,怎样降下来?告警怎样收敛和升级?​

考察重点

  • 告警关联用户影响,并给出可执行动作。
  • 持续时间、迟滞、平滑、分组、抑制等降噪手段;分级与升级;告警系统自身的可用性。

相关内容:告警设计。

参考回答

告警应对应用户影响或需要处理的容量风险。

阈值结合 SLO、基线与处置时限设定。

瞬时尖峰可用 for 过滤。恢复抖动可用 keep_firing_for 缓解。双阈值迟滞需要额外状态逻辑,for 本身无法实现。

Alertmanager 按标签分组,并抑制关联衍生告警。静默用于计划维护。值班确认与升级可交给外部值班系统。外部心跳检测规则到通知的完整链路。

6.4 多个实例的 P99 能直接平均吗?错误率怎样跨实例聚合?​

考察重点:分布合并、计数重置与流量加权。

相关内容:分位数聚合与速率。

参考回答

整体 P99 要从聚合后的 Histogram 计算,错误率要用错误总速率除以请求总速率。

直接平均各实例 P99 会丢失请求数量和延迟分布信息。

经典 Histogram 先按序列计算 rate,再按 job 和 le 求和,最后用 histogram_quantile 计算分位数。Summary 的分位数无法这样合并,但 sum 和 count 可以聚合。

6.5 目标消失为什么不一定触发 up==0?Pushgateway 有什么生命周期问题?​

考察重点:目标缺失、旧序列与独立检测。

相关内容:Prometheus 的组成、Pushgateway 与监控高可用。

参考回答

up=0 对应仍被发现但抓取失败的目标。

目标被移除后,up 序列会消失。缺失检测需结合 absent_over_time 和预期目标信息。Pushgateway 则保留推送序列,直到显式删除。旧成功指标会掩盖任务停止,应检查完成时间。

7. 参考资料​