题记与说明
- 精读日期:2026-11-01
- 主题形式:主题研究(先检索 5 个来源并逐源精读,非单篇论文)
- 检索状态:网络可用,5 个来源全部在线抓取原文并精读
- 来源清单:
- Prometheus 官方文档 *Metric and label naming*(指标命名)— https://prometheus.io/docs/practices/naming/
- Prometheus 官方文档 *Alerting best practices*(告警哲学)— https://prometheus.io/docs/practices/alerting/
- Google SRE Workbook 第 5 章 *Alerting on SLOs*(SLO 告警,多窗口多烧率)— https://sre.google/workbook/alerting-on-slos/
- Grafana Labs 博客 *How to manage high cardinality metrics in Prometheus and Kubernetes*(成本控制)— https://grafana.com/blog/how-to-manage-high-cardinality-metrics-in-prometheus-and-kubernetes/
- Grafana Labs 博客 *SLOs: a guide to setting and benefiting from service level objectives*(SLO 建立)— https://grafana.com/blog/slos-a-guide-to-setting-and-benefiting-from-service-level-objectives/
一、主题概览
监控实践常被当成"装好 Prometheus + 套个 Grafana 面板"就完事,但这次精读的 5 个来源指向同一个判断:监控体系的难点不在工具部署,而在三个纪律性设计——
- 指标怎么命名:决定了一年后的 PromQL 还能不能读、能不能告警、会不会撞名(Prometheus 官方 naming 实践)。
- 告警怎么定义:决定值班的信噪比。核心是"对症状告警而非原因"+"按错误预算消耗速度(burn rate)告警",而非静态阈值(Prometheus alerting 实践 + Google SRE Workbook)。
- 成本怎么控:Prometheus 的成本几乎完全由基数(cardinality,指标名 × label 值组合 = 时间序列数)和抓取频率决定,是可以工程化治理的(Grafana cardinality 文章)。
- SLO 是粘合剂:SLO 把 1、2、3 串起来——SLI 决定测什么,错误预算决定何时告警,SLO 决定哪些指标/桶值得花钱保留(Grafana SLO 指南)。
二、逐源精读
来源 1:Prometheus 官方《Metric and label naming》
出处:https://prometheus.io/docs/practices/naming/ (Prometheus Authors,最佳实践文档)
文档定位:开头即声明这些约定不是使用 Prometheus 的强制要求,而是风格指南与最佳实践合集,组织可以自行调整:"The metric and label conventions presented in this document are not required for using Prometheus, but can serve as both a style-guide and a collection of best practices."
指标名的 MUST/SHOULD 规则(RFC 2119 语气):
- MUST 符合数据模型的合法字符(
[a-zA-Z_:][a-zA-Z0-9_:]*); - SHOULD 带一个单词级的应用/领域前缀(client library 里叫 namespace),应用专属指标通常就用应用名:
prometheus_notifications_total、process_cpu_seconds_total、http_request_duration_seconds; - MUST 指向单一单位(不要把秒和毫秒混进一个指标)、单一量(不要把请求大小和请求时长混进一个指标);
- SHOULD 使用基准单位(seconds, bytes, meters,而非 milliseconds, megabytes, kilometers);
- SHOULD 以复数形式的单位后缀结尾;累积计数再加
total:http_request_duration_seconds、node_memory_usage_bytes、http_requests_total(无单位累积计数)、process_cpu_seconds_total(有单位累积计数)、foobar_build_info(提供二进制元数据的伪指标);
- MAY 按词序排序便于字典序分组(例:
prometheus_tsdb_head_truncations_closed_total家族排在一起 vs 更好读但排序打散的prometheus_tsdb_head_closed_truncations_total); - SHOULD 在所有 label 维度上指代同一个被测逻辑物。经验法则:"either the
sum()or theavg()over all dimensions of a given metric should be meaningful (though not necessarily useful). If it is not meaningful, split the data up into multiple metrics."(把各队列容量放一个指标可以,把队列容量和当前元素数混在一起不行。)
为什么坚持在名字里带单位和类型后缀(对 OpenTelemetry 风格的反驳,这一节很有价值):
"It's critical, especially during monitoring/SRE incident practices to look on PromQL expressions in plain YAML and understand the underlying metric type and unit you work with."
"With growing adoption and metric changes over time, there are cases where lack of unit and type information in the metric name will cause certain series to collide (e.g. process_cpu for seconds and milliseconds)."即:Prometheus 生态大量消费场景是纯 YAML(告警、record rule、自动扩缩容配置),没 UI 补全帮你解释单位;且缺单位会随时间造成指标撞名。
Label 规则:label 用于区分被测物的特征(api_http_requests_total 用 operation="create|update|delete" 区分请求类型),不要把 label 名塞进指标名(冗余且 label 被聚合掉后名字变误导)。紧随其后的 CAUTION 是全文最重要的一段:
"Remember that every unique combination of key-value label pairs represents a new time series, which can dramatically increase the amount of data stored. Do not use labels to store dimensions with high cardinality (many different label values), such as user IDs, email addresses, or other unbounded sets of values."
基准单位表(部分):时间=seconds;字节=bytes(bits 一律换算成 bytes);百分比=ratio(0–1);功率不直接导出,而是导出 joules 计数器再 rate(joules[5m]) 得 Watts;质量用 grams 避免 kilo 前缀问题。
来源 2:Prometheus 官方《Alerting best practices》
出处:https://prometheus.io/docs/practices/alerting/ (官方实践页,引用 Rob Ewaschuk 的 *My Philosophy on Alerting*,基于其在 Google 的观察)
核心哲学:保持告警简单、对症状告警而不是原因、维护好控制台用于定位原因、以及——
"avoid having pages where there is nothing to do."(避免发出"收到后无事可做"的 page。)
具体规则:
- 告警名没有字符限制(label 值可用的都可用),社区惯例是 Camel Case(如
HighErrorRate)。 - 控制告警总数:聚焦"与最终用户痛苦相关联的症状",而不是试图抓住该痛苦的每一个可能原因;告警应链接到相关控制台;给告警留 slack,小抖动不 page。
- 在线服务:
- 延迟和错误率要"as high up in the stack as possible"(在栈的尽可能高层)告警;
- 延迟只在栈上一个点 page——下层组件慢但用户总延迟没问题就不该 page;
- page 用户可见错误;导致该错误的下游错误不再单独 page;
- 对特性差异大的请求类型(或低流量会被高流量淹没的场景)考虑分开建告警。
- 批处理任务:page 的条件是"最近一次成功久到会造成用户可见问题";阈值应允许至少两次完整运行(每 4 小时跑一次、耗时 1 小时的任务,10 小时阈值合理);如果单次失败不可容忍,正确做法是把任务跑得更频繁——单次失败不应需要人工介入。
- 容量:接近容量未必立即影响用户,但通常需要人介入以避免近期 outage——值得告警。
- 元监控(metamonitoring):对 Prometheus/Alertmanager 本身的可用性告警,但优先用症状式(如一个 blackbox 测试覆盖 PushGateway→Prometheus→Alertmanager→email 全链路,好过对每个组件单独告警);用外部黑盒监控补充白盒监控,兜住"内部监控全挂"的场景。
来源 3:Google SRE Workbook 第 5 章《Alerting on SLOs》
出处:https://sre.google/workbook/alerting-on-slos/ (Google,Chris Jones 等著,该章是 SLO 告警的事实标准参考)
章旨:"having good SLOs that measure the reliability of your platform, as experienced by your customers, provides the highest-quality indication for when an on-call engineer should respond."——把 SLO 转成可执行告警规则,在错误预算烧穿前响应。
评估告警策略的 4 个属性(后续 6 种方案的评判轴):
| 属性 | 含义 |
|---|---|
| Precision | 触发的告警中"重大事件"的比例 |
| Recall | 重大事件中被检出的比例 |
| Detection time | 各种条件下发出通知的耗时 |
| Reset time | 问题解决后告警继续 firing 的时长 |
6 种方案演进(前 3 种不可行/有缺陷,方案 6 最推荐):
- 短窗口错误率 ≥ SLO(10m 窗口 ≥0.1%):完全宕机 0.6 秒检出、recall 好,但 precision 极差——10 分钟 0.1% 错误率只消耗月度预算 0.02% 就 page;极端推演"每天收 144 条告警、一条都不处理、SLO 照样达标"。
- 放大窗口到 36h(对应 5% 月预算):precision 变好(完全宕机 2 分 10 秒检出),但 reset time 灾难性变差——错误早已停止,36 小时平均仍超阈值,告警继续 firing 36 小时;且长窗口 rate 计算内存/IO 代价高。
- 短窗口 +
for: 1hduration 参数:官方明确否定——"For the reasons listed in Table 5-3, we do not recommend using durations as part of your SLO-based alerting criteria." 理由:(a) duration 不随事故严重度缩放,100% 宕机与 0.2% 事故同样 1 小时才报(那一小时已烧掉 30 天预算的 140%);(b) duration 计时器在指标短暂回落到 SLO 内时会重置——每 10 分钟持续 5 分钟的 100% 错误尖峰永远不触发告警,却烧掉 35% 预算(每个尖峰约 12%)。 - 单烧率 + 固定窗口:burn rate = 相对 SLO 的预算消耗速度(99.9% SLO、30 天窗口下恒定 0.1% 错误率 = burn rate 1)。固定 1h 窗口、要求 5% 预算消耗 → burn rate 36。precision/检出都好,但 recall 低:35x 持续烧率永远不触发(20.5 小时烧完全部预算),reset 仍长达 58 分钟。
- 多烧率:快烧 page、慢烧 ticket。官方建议起点:"We recommend 2% budget consumption in one hour and 5% budget consumption in six hours as reasonable starting numbers for paging, and 10% budget consumption in three days as a good baseline for ticket alerts." 对应配置:
expr: (
job:slo_errors_per_request:ratio_rate1h{job="myjob"} > (14.4*0.001)
or
job:slo_errors_per_request:ratio_rate6h{job="myjob"} > (6*0.001)
)
severity: page
expr: job:slo_errors_per_request:ratio_rate3d{job="myjob"} > 0.001
severity: ticket缺点:参数多;3d 窗口 reset 更长;需要告警抑制——"10% budget spend in five minutes also means that 5% of the budget was spent in six hours, and 2% of the budget was spent in one hour",不抑制会一事故三通知。
- 多窗口 + 多烧率(MWMB,最推荐):在多烧率上再 AND 一个短窗口(推荐为长窗口的 1/12),确认"此刻仍在烧"才通知,压掉 false positive 并改善 reset time。官方推荐参数表(99.9% SLO):
| Severity | 长窗口 | 短窗口 | Burn rate | 预算消耗 |
|---|---|---|---|---|
| Page | 1 hour | 5 minutes | 14.4 | 2% |
| Page | 6 hours | 30 minutes | 6 | 5% |
| Ticket | 3 days | 6 hours | 1 | 10% |
完整配置示例:
expr: (
job:slo_errors_per_request:ratio_rate1h{job="myjob"} > (14.4*0.001)
and
job:slo_errors_per_request:ratio_rate5m{job="myjob"} > (14.4*0.001)
)
or
(
job:slo_errors_per_request:ratio_rate6h{job="myjob"} > (6*0.001)
and
job:slo_errors_per_request:ratio_rate30m{job="myjob"} > (6*0.001)
)
severity: page章末结论:"In most cases, we believe that the multiwindow, multi-burn-rate alerting technique is the most appropriate approach to defending your application's SLOs."
烧率→耗尽时间直觉表(99.9% SLO):burn rate 1→30 天;2→15 天;10→3 天;1000→43 分钟。
低流量服务:10 请求/小时的服务单条失败请求 = 小时错误率 10%,对 99.9% SLO 是 1000x 烧率、立即 page,而 30 天只有 7 次失败配额——单个请求可能因大量"短暂且不值得修"的原因失败。官方给出四个方向:合成流量(blackbox prober/集成测试已有现成部件)、合并共享故障域的小服务一起监控、改产品(客户端重试+指数退避+抖动、fallback 路径)、降低 SLO 与利益相关者协商(99.9%→99%,代价是产品决策,影响错误预算政策)。
极端可用性目标:90% 目标下"1 小时耗 2% 预算"的 page 条件永远不可能触发(100% 宕机一小时也只烧 1.4%);99.999% 月度目标下 100% 宕机 26 秒烧穿预算——比多数监控的采集间隔还短,"The only way to defend this level of reliability is to design the system so that the chance of a 100% outage is extremely low"(靠灰度:先放 1% 用户,同样 1% 烧率下有 43 分钟响应窗口)。
规模化告警:100 个微服务各自定制窗口/烧率 = 不可持续的 toil。"Once you decide on your alerting parameters, apply them to all your services." 把请求类型归入桶:CRITICAL(99.99%, 100ms@90)、HIGH_FAST(99.9%, 100ms)、HIGH_SLOW(99.9%, 1000ms/5s@99)、LOW(99%)、NO_SLO(暗启动/alpha,明确不在 SLO 内)——5 个桶足够保护用户满意度,toil 远小于逐请求类型定制。
来源 4:Grafana Labs《How to manage high cardinality metrics in Prometheus and Kubernetes》
出处:https://grafana.com/blog/how-to-manage-high-cardinality-metrics-in-prometheus-and-kubernetes/ (2022-10,Grafana Labs 官方博客)
基数为什么爆炸:云原生把单机单应用换成多节点多 pod 微服务(每层都要 label);kube_pod_status_phase 这类指标在每个 pod 状态迁移(pending→running→failed)时新建序列,短命 Job 场景尤甚;15+ 语言 client library 让埋点太容易,dev 指标漏进生产;exporter 本身就重——Node exporter 默认约 500 条时间序列,MySQL exporter 约 1000 条(原文:"roughly 500 Prometheus time series by default" / "roughly 1,000 time series and not all of those are valuable");最致命的是无界 label(session_id/user_id/device_id),流量一涨序列跟着涨。
成本影响:更多基数 = 更多存储/计算 = 更高可观测性支出;库变大后查询和面板变慢,"prolong MTTR when troubleshooting outages"(拖长故障定位时间)——成本问题同时是可靠性问题。
识别手段:
- 四象限分析:按"基数 vs 价值"画散点,先打第三象限(高成本、没人用),再复查第四象限(高价值高基数)的 label 粒度是否必要;
- cardinality 管理面板(Grafana Cloud Pro/Advanced);
- Mimirtool(开源 CLI):扫描 dashboards/alerts/recording rules 中未使用的指标输出 JSON,完全未用的可 drop;
- Usage Insights:按 label 集追踪序列数随时间,把增长归因到团队/环境/应用。
四个治理杠杆(本文最实操的部分):
- 调抓取频率:默认 15s(=4 DPM,datapoints per minute),用
count_over_time(scrape_samples_scraped[1m])查实际用量;把不关键指标提到 60s "can reduce costs by up to 75%"(降本上限 75%,这是全文最硬的数字)。 - 裁剪直方图桶:每个 bucket 是经
lelabel 的一条序列;桶应对齐 SLO(50ms SLO 就没必要区分 5ms 和 10ms)。裁剪桶是安全的,因为桶是累积的——被删桶以下的值滚入下一个桶,histogram_quantile 仍可用。 - 删 label 要小心:只有当剩余 label 组合仍唯一时才能删;否则 Prometheus 丢弃重复样本造成数据损失(文中例子:一个
env下多个ip值会互相覆盖成 1/3/7)。 - recording rules 先聚合再删:agent 不可重配、直接删 label 会撞重复时,先
sum by(env) (my_metric_total{})生成聚合序列,再 drop 明细,保留 1+3+7→11 的卷积。
来源 5:Grafana Labs《SLOs: a guide to setting and benefiting from service level objectives》
出处:https://grafana.com/blog/slos-a-guide-to-setting-and-benefiting-from-service-level-objectives/ (Jake Swiss,2025-02-05)
为什么用 SLO:功能还是修 bug 犹豫不决时,SLO 把焦点拉回"your users and their experience";从任意阈值转向"user-impact-driven metrics",从被动救火转向主动事件管理;error budget 是发布与否的"red light, green light"机制——预算烧穿先修问题再上功能。
示例结构(checkout 流):SLI = 点击"Place Order"到确认页完全加载的时间;目标 = 99.9% 交易 2 秒内完成(滚动 30 天);错误预算 = 30 天内最多 0.1% 交易超时。注意 SLI 是端到端用户体验而非某个内部组件指标。
四步建立法:
- 识别关键用户旅程/服务,从小做起(如绑定 SLA 的服务);
- 基于历史数据和客户预期定目标,拉利益相关者对齐;
- 上对齐的工具(Prometheus / Grafana Cloud);
- 建立错误预算并"as a strategic tool for prioritization and accountability"。
评审节奏:把 SLO review 塞进 retrospective/sprint review/季度规划;违约时 blameless postmortem("treat them as opportunities for learning rather than failures")。
常见坑:
- 到处追 100% 可靠性:"striving for 100% reliability everywhere is unrealistic"——资源浪费且导致倦怠;正确做法是面向客户 API 99.9%、内部管理工具允许更低;
- 对原始指标告警/监控每个小抖动 → 分析瘫痪;正确做法是 RED 方法(Rate, Errors, Duration)埋点、监控用户影响;
- 全组织一步 rollout → 团队挣扎并"abandon the project altogether";先试点一个用户影响清晰的服务,分享经验攒势能;
- 违约追责 → 毁掉学习文化。
可引述金句:"Error budgets define how much unreliability you're willing to tolerate within a given period." / "SLOs aren't just a technical tool—they're a strategic advantage."
三、七维提取
1. 核心问题
监控体系从"能用"到"可靠且可负担"之间隔着四个设计问题:指标如何命名才能让人和机器在一年后还能正确消费(单位/类型/碰撞);告警如何定义才能在正确的时间用正确的严重级通知正确的人(precision/recall/detection/reset 四难权衡);成本如何在指标爆炸式增长下受控(cardinality 治理);以及用什么统一框架决定"测什么、何时告警、什么值得花钱"(SLO 与错误预算)。传统静态阈值监控在这四点上系统性失效。
2. 主要主张
- 命名(Prometheus 官方):指标名 =
<前缀>_<子系统>_<名>_<单位复数>_<total后缀>;必须单一单位单一量、基准单位、counter 必带_total;坚持把单位/类型写进名字,因为生态大量消费发生在纯 YAML 里,事故演练时从 PromQL 一眼看懂单位是关键(critical);无界 label(user ID/email)禁止入 label。 - 告警哲学(Prometheus 官方 + Rob Ewaschuk):对症状(与最终用户痛苦关联)告警,不对原因告警;栈的尽可能高层只 page 一次;"避免发出无事可做的 page";批任务阈值容得下至少两次完整运行;对监控系统自身做元监控并用外部黑盒兜底。
- SLO 告警(Google SRE Workbook):静态阈值和
for:duration 都不配做 SLO 告警;正确姿势是多窗口多烧率(MWMB)——推荐 99.9% SLO 下 Page(1h+5m, 14.4x, 2%预算)、Page(6h+30m, 6x, 5%)、Ticket(3d+6h, 1x, 10%);短窗口取长窗口 1/12;参数全服务统一而非逐服务定制;低流量服务靠合成流量/合并监控/降 SLO 解决;极端 SLO(>99.99% 或 <90%)的告警参数必须重调甚至"告警防不住,只能靠架构"。 - 成本控制(Grafana):成本由 cardinality 主导;治理四杠杆 = 抓取频率(15s→60s 最高降 75%)、裁直方图桶对齐 SLO、谨慎删 label(防样本重复丢失)、recording rules 先聚后删;识别靠四象限分析和 Mimirtool 找"无人使用"指标。
- SLO 建立(Grafana):SLI 必须是端到端用户体验(RED 方法);目标基于历史数据+客户预期而非拍脑袋;100% 到处设防不现实且致倦怠;错误预算是功能发布 vs 可靠性投入的红绿灯;先试点、塞进常规评审、blameless。
3. 方法
五个来源共同的方法论是把监控从"技艺"变成"有判据的工程":
- Prometheus 官方用 RFC 2119 MUST/SHOULD/MAY 分级给出可 lint 的命名规范,并给出"sum()/avg() 对所有维度有意义"这条可操作的合理性检验;
- SRE Workbook 用受控推演:固定其他变量,逐个引入告警机制(短窗口→长窗口→duration→单烧率→多烧率→多窗口多烧率),每步用 4 个量化属性打分,bad case 给具体数字(每 10 分钟 5 分钟 100% 尖峰烧 35% 预算却不告警);
- Grafana 用成本归因法:把费用拆到序列数×采样率,用四象限(基数×价值)定位浪费,再给出逐杠杆的 relabel/rule 配方;
- Grafana SLO 指南用旅程驱动法:从关键用户旅程反推 SLI,再定目标、预算、评审节奏,配文化落地(试点/教育/可视化/blameless)。
4. 数据与证据
- 命名规范直接来自 Prometheus 官方文档原文(MUST/SHOULD 逐条 + 基准单位表 + "plain YAML 中读懂单位是 critical"论述)——权威性最高。
- SRE Workbook 的关键数字:短窗口方案 0.6s 检出但单次告警仅耗 0.02% 月预算;36h 窗口 reset time 36 小时;duration 方案下周期性尖峰烧 35% 预算零告警;烧率表 1→30d/2→15d/10→3d/1000→43min;推荐参数表(14.4/6/1);99.999% 目标 100% 宕机 26s 烧穿预算。证据充分:每个结论都有量化 bad case 或 Pros/Cons 表支撑,且该方案被业界(Grafana SLO 产品文档、多家厂商)当事实标准引用。
- Grafana 成本文章的硬数字:Node exporter ~500 序列/MySQL exporter ~1000 序列、默认 15s 采集=4 DPM、60s 采集降本 up to 75%、裁桶安全性论证(桶累积)。证据中等:75% 是上限口径(依赖"大部分指标不关键"的前提),未给跨场景平均数;Grafana 有推销 Grafana Cloud/Mimir 的利益相关(文中自夸 Mimir 扩到 10 亿活跃序列)。
- Grafana SLO 指南:以checkout 为例给出 SLI/目标/预算的完整示例,但通篇是规范性建议、无量化实验数据——属于经验共识而非实证。
5. 结论
- 命名是一次性投入、长期复利的纪律:单位写进名字、counter 带
_total、无界值禁入 label,这三条违反任何一条都会在告警编写或账单上被追债。 - 告警的正确形态由 SLO 导出:先有错误预算,才有烧率;先有烧率,才有 page/ticket 分级。多窗口多烧率是当前最优解,且参数应全组织统一、按请求分级(CRITICAL/HIGH_FAST/HIGH_SLOW/LOW/NO_SLO)而非逐服务调参。
- 成本控制本质是 cardinality 控制,且与 SLO 强耦合:不服务任何 SLO 的桶和指标就是纯成本,裁剪它们(对齐 SLO 的桶、60s 采集、无人使用的序列 drop)可省至多 75%。
- SLO 的最大价值不在技术而在决策:把"该修 bug 还是发功能"从争论变成红绿灯,把告警从阈值变成预算消耗速度。落地要小步试点、进常规评审、blameless。
6. 局限
- 各来源立场:Prometheus 两篇是官方实践但明言"非强制";SRE Workbook 参数(14.4/6/1)明确说是 "starting numbers"、"The appropriate numbers depend on the service";Grafana 两篇有商业动机(推 Grafana Cloud/Adaptive Metrics/Mimir),75% 降本与 10 亿序列数字应打折看待。
- 未覆盖:Prometheus 单机存储/内存的实际 sizing 公式(本次来源只给了 cardinality 视角,没给磁盘估算式);Grafana 面板设计实践本身;remote write/长期存储(Mimir/Thanos/Cortex)的成本对比;OTel 与 Prometheus 命名约定的冲突只在官方文档里带过一段,未深入;Alertmanager 路由/抑制的具体配置实践(Workbook 只指出"需要抑制")。
- 适用边界:MWMB 假设有稳定的请求计数指标;无请求型服务(如批处理、流式)要换 SLI(Workbook 的批处理规则在来源 2);低流量个人自托管服务直接套 99.9% 参数会制造噪声 page——Workbook 自己也承认单请求即可 1000x 烧率。
- 本主题为多来源主题研究而非单篇论文精读,七个维度是跨源综合,单个来源内部并未同时完整覆盖七维。
7. 对我的启发
- 给自己自托管的服务栈立命名规范:n8n/Whisper/本地网关等自建 exporter 一律
<应用>_<子系统>_<量>_<单位复数>_total,秒和字节做基准单位。最直接的应用:以后写任何 metrics 埋点(包括给自己 LLM 应用记录 token/延迟的指标——可与我此前的"LLM 应用可观测性"精读笔记衔接),先查命名规范再动手,避免process_cpu式撞名。 - 告警从"阈值表"迁到"烧率表":个人服务的监控常犯的正是 Workbook 方案 1 的错误——抖动就通知。改用双窗口 AND(如 1h+5m 同超阈值才通知)+ 一条 3d ticket 级慢烧规则,可以显著降夜间误报;且不要用
for:参数替代长窗口(timer 会因短暂回落重置,这是官方实测证伪的方案)。 - 成本控制第一动作是降抓取频率和裁桶:不重要的指标 15s→60s(-75% 上限),直方图桶只保留 SLO 附近的档位——对自托管单机 Prometheus 立竿见影,省内存和磁盘;
count_over_time(scrape_samples_scraped[1m])可以直接拿来审计。 - 给个人/小团队场景把 SLO 简化成三件套:一条端到端 SLI(RED 的 E 和 R 就够)、一个 99% 级目标(个人服务不值得 99.9%)、一条 ticket 级慢烧告警。Workbook 的低流量章节说明:小流量下与其硬套高可用参数,不如合成探针(blackbox 已内置)或干脆把 SLO 降到实际影响水平。
- 写作素材角度:"告警四属性(precision/recall/detection/reset)"和"烧率=预算消耗速度"是两个非常适合科普的模型;"144 条告警/天且一条不管 SLO 仍达标"和"99.999% 目标 26 秒烧穿预算"是两个现成的反直觉故事钩子。
四、跨源连接图
┌────────────────────────────────────────────┐
│ SLO(Grafana 指南:旅程→SLI→目标→预算) │
│ 决定:测什么、值得花多少钱、何时算违约 │
└──────────┬─────────────────┬───────────────┘
│ │
┌─────────────▼─────┐ ┌───────▼────────────────┐
│ 指标命名(官方) │ │ 告警规则(官方+SRE Workbook)│
│ 单位进名字/total后缀 │ │ 症状优先 + MWMB 烧率表 │
│ 无界值禁入 label │ │ 短窗=长窗/12,参数全局统一 │
└─────────┬─────────┘ └───────┬────────────────┘
│ │
┌─────────▼─────────────────────▼────────┐
│ 成本控制(Grafana):cardinality 治理 │
│ 采集频率/裁桶对齐SLO/删label/recording rules │
└────────────────────────────────────────┘四者闭环:SLO 定义价值 → 命名保证可消费性 → 烧率告警消费错误预算 → cardinality 治理把预算花在服务 SLO 的序列上。
五、参考链接(全部于 2026-11-01 在线精读)
- Prometheus Authors, *Metric and label naming* — https://prometheus.io/docs/practices/naming/
- Prometheus Authors, *Alerting best practices*(含 Rob Ewaschuk *My Philosophy on Alerting* 引用)— https://prometheus.io/docs/practices/alerting/
- Google, *Alerting on SLOs*, SRE Workbook Ch.5 — https://sre.google/workbook/alerting-on-slos/
- Grafana Labs, *How to manage high cardinality metrics in Prometheus and Kubernetes* — https://grafana.com/blog/how-to-manage-high-cardinality-metrics-in-prometheus-and-kubernetes/
- Grafana Labs (Jake Swiss), *SLOs: a guide to setting and benefiting from service level objectives* — https://grafana.com/blog/slos-a-guide-to-setting-and-benefiting-from-service-level-objectives/
(补充检索线索,未精读仅参考:dlow 博客烧率推导 https://blog.dlow.me/everything/slo-and-burn-rate ;Cisco Outshift 烧率解密 https://outshift.cisco.com/blog/in-depth-tech/burn-rate-demystified )