LabHub
学习 学习路径 课程

PCA — Prometheus 认证助理

后缀和冒号不是惯例,是契约

在 LabHub 中继续学习

一句话总结

Prometheus 的指标命名规则不是个人偏好,而是工具赖以工作的契约。_total 声明它是计数器,_bucket_sum_count 是直方图的三个组成部分,冒号只允许用于记录规则。只有从名称就能看出指标是什么,仪表板和告警才能相互信任。

概念图: 冒号只允许用于记录规则 · 原理上 · 暴露格式 · 四种类型

为什么需要它

类型选错后,未来想做的计算可能在原理上就无法完成。最常见的事故,是把延迟记录成仪表。

last_latency = Gauge("http_request_duration_seconds", "요청 처리 시간")
last_latency.set(elapsed)   # 앞선 값들은 전부 사라진다

如果抓取间隔为 15 秒、每秒有 500 个请求,7,500 个请求中只保存 1 个值,其余值仿佛从未存在。无法用这条时间序列计算 p99,事后重新处理数据也无法恢复。

工作原理

暴露格式是人类可读的文本。每行包含指标名称、花括号内的标签和值,并附有 # HELP# TYPE 注释。标准路径是 /metrics;若使用其他路径,必须在抓取配置中指定 metrics_path。OpenMetrics 对这一格式进行了标准化,并加入 exemplar 和 created timestamp。

四种类型

类型 暴露的时间序列 回答的问题
Counter x_total 每秒增加多少(需要 rate)
Gauge x 当前值是多少
Histogram x_bucket{le}, x_sum, x_count 分布如何(在服务器端估算分位数)
Summary x{quantile}, x_sum, x_count 此进程内部的分位数

Summary 在服务层面无用,原因就是前一模块讲过的性质:分位数不能合并。 Summary 输出客户端已经算好的分位数,因此无法把 40 个 Pod 的 p99 合成一个。Histogram 以牺牲桶分辨率范围内的精度为代价,换取了可聚合性。在分布式系统中,后者几乎总是更合适的交换。

指标来自哪里也是考试常见题。

记录规则把计算从查询时刻移到求值时刻。创建规则有四个判断标准:同一表达式在三处以上重复;查询超过 2 秒;告警每次求值都要运行繁重表达式;希望聚合高基数原始数据后长期保存。

名称遵循 수준:메트릭:연산 约定。从 route:http_requests:rate5m 这个名字,就能读出它是按路由聚合的请求数 5 分钟 rate。原始指标名称绝不使用冒号,因此只看名称便知道“这是派生时间序列”。

层级结构是关键。第 1 层只扫描一次原始数据,第 2 层只引用其结果,原始扫描因此只做一次。但组内规则从上到下求值,所以第 1 层必须位于第 2 层上方

现场会遇到的情况

曾经一次加入 2,000 条记录规则,结果产生约 100 万条时间序列,WAL 急剧增长。部署前的计算很简单:120 条路由分别为 5 种窗口创建规则就是 600 条;若有 50 条规则,就是 3 万条。规则文件像代码一样接受审查,但成本等同于新增指标。

CI 会协助验证。使用 promtool check rules 检查语法,用 promtool test rules 检查期望值。尤其是在单元测试中亲自算出并写明期望值后,未来有人“优化”规则却改变语义时,CI 就能发现。也有 promtool 无法发现的内容——规则之间的循环引用必须由人在审查中识别。

下一实验要做什么

/root/pca-rules/ 下编写记录规则文件和告警规则文件,使用 level:metric:operations 命名创建两层结构。随后,在 promtool 单元测试文件中亲自计算并填入输入时间序列和期望值,最后把相同内容转换为 Prometheus Operator 可读取的 PrometheusRule CR。