Prometheus 3.16:查询开始报「代价」了,anchored 与 smoothed 选择器正式转正

3.16 把查询代价估算做成可选特性:能预估、能上报实际开销、能设执行上限;另外 anchored/smoothed 选择器从实验转稳定,实验 search 接口把 batch_size 卡在 1000。

11 月 4 日,Prometheus 发了 3.16.0。这个项目这几年给人的印象是「稳得有点无聊」—— 每次发版都是一串 [CHANGE]、[FEATURE]、[PERF],读起来像一份工程日志。但这一版里有一条,我读的时候停下了:

--enable-feature=query-cost

v3.16.0 的发布说明:一长串按类型分组的条目

查询代价:从「跑完了才知道」到「跑之前先看」

打开这个特性之后,PromQL 能做三件事:估算查询代价、上报实际开销、设定可配置的执行上限。

发布说明里 PromQL 那一节:integral、代价估算、稳定化的选择器

为什么这事重要,得从监控系统的日常说起。Prometheus 最典型的故障不是「挂了」,而是「有人写了一个范围太宽的 rate(),把 TSDB 和查询进程一起拖死」。这类查询在写的时候完全看不出问题 —— 它合法、能跑、结果也对,只是要扫三个月的数据。

代价估算把这件事从「事后排查」变成「事前拒绝」。你可以给某些租户或某些接口设上限,超了直接返回错误。在被压垮之前拒绝一个查询,比压垮之后再解释为什么看板全白要好。

anchored 与 smoothed:从实验到默认开启

这两个选择器 2024 年就以 --enable-feature 的形式存在,这次的改动是:它们变成稳定特性,永远开启。

它们解决的问题很具体。用 rate() 算请求速率时,窗口边界会把计数器重置点切成两半,算出来的峰值偏低。anchored 让窗口锚定到真正的边界;smoothed 对边界做插值。对 SRE 来说,这是那种「一旦你知道存在就再也无法忽略」的偏差。

同一版还补了细节:当 float 时间序列走 anchored/smoothed 时,用起点时间戳来检测计数器重置(藏在 use-start-timestamps 后面)。

其余几条值得看的

变化 影响
实验 search 接口把 batch_size 卡到 1000 防止一次搜爆内存
开了 TLS 的 --web.config.file 时,--web.external-url 默认 https 少一个「分享出去的链接是 http」的坑
TSDB 拒绝标签名重复的 exemplar 以前会存下来,然后 API 返回重复的 JSON key
promtool 跑测试时打印文件名 一堆失败里终于知道是哪个文件
--allow-incompatible-block-duration 不再强制默认块时长

性能那一段也很实在:XOR2 压缩按编码代价选窗口、每序列元数据用 unique.Handle 去重、OTLP 直方图名字缓存、OpenMetrics 2.0 解析复用缓冲区。

Prometheus 的博客

升级建议

3.16 是次版本,没有破坏性变更,但有两处默认值动了(external-url 的协议、search 的 batch_size)。如果你的实例挂了 --web.config.file 并且依赖外部 URL 是 http,升级后检查一下反代和告警里的链接。

PromQL 文档:这些函数是新特性的落地处

至于 query-cost,我会先在预发打开一周,攒一批「如果设了上限,哪些查询会被拒」的数据,再决定阈值。监控系统的上限,不能拍脑袋定 —— 拒掉的第一个查询,往往就是那天唯一能解释故障的那个。

← 返回文章列表

评论

…