Prometheus 常用函数详解
在编写监控查询语句时,理解内置函数的行为至关重要。PromQL 提供了丰富的工具来处理时间序列数据,从基础的数学运算到复杂的时间窗口分析。下面我结合实战经验,梳理了这些函数的使用场景和注意事项。
基础数学与标量转换
这类函数主要用于对样本值进行数值处理或类型转换。
abs(v):取绝对值。适用于需要消除负数影响的场景。ceil()/floor():向上或向下取整。常用于将浮点指标转换为整数展示。round(v, to_nearest=1):四舍五入。支持指定精度,比如to_nearest=0.5。exp(),ln(),log2(),log10(),sqrt():指数、对数和开方运算。注意特殊值(如NaN、Inf)的处理逻辑。scalar(v):将单元素向量转为标量。如果输入不是恰好一个元素,会返回NaN,适合用于条件判断。vector(s):将标量转为无标签的向量,常用于构造常量参与计算。
时间与日期提取
这些函数基于 UTC 时间,常用于按时间维度分组或过滤。
year(),month(),day_of_month(),day_of_week(),hour(),minute():分别返回年、月、日、周几、小时和分钟。默认参数为当前时间,也可传入向量。time():返回表达式求值时的 Unix 时间戳(秒)。注意它不是实时时钟,而是评估时刻的快照。timestamp(v):获取向量的采样时间戳。
范围向量分析(重点)
这是 PromQL 最强大的部分,但也是新手最容易出错的地方。务必区分 Gauge(仪表盘) 和 Counter(计数器) 的使用场景。
变化率与增量
rate(v):计算每秒平均增长率。自动处理计数器重置(reset),并外推至时间范围两端。推荐用于告警和慢速计数器。组合聚合操作时,先算rate再聚合。increase(v):计算指定时间范围内的总增量。本质是rate * 秒数,主要用于人类阅读。同样仅适用于计数器。irate(v):基于最后两个数据点计算的瞬时速率。波动大,适合快速变化的计数器绘图,但不建议用于告警,容易误报。
注意:
rate和irate只能用于 Counter。如果用 Gauge 计算,结果可能没有意义。
差值与导数
delta(v):计算范围内首尾值的差值。支持非整数结果,适用于 Gauge(如温度、内存使用率)。不要用于 Counter。deriv(v):计算每秒钟的导数。同样仅限 Gauge。idelta(v):计算最后两个样本的差值。类似delta但只取最近两点,仅限 Gauge。changes(v):统计范围内数值变化的次数。resets(v):统计计数器重置的次数。任何连续采样值的下降都被视为重置。
时间窗口聚合
当需要对一段时间内的数据进行汇总时,使用以下函数(后缀 _over_time)。
avg_over_time,min_over_time,max_over_time,sum_over_time:区间平均值、最小值、最大值、总和。count_over_time:区间内样本数量。quantile_over_time,stddev_over_time,stdvar_over_time:分位数、标准差、方差。
所有值在区间内权重相同,即使采样间隔不均匀。
直方图分位数
处理 Histogram 类型的指标(如请求延迟)时,必须配合 histogram_quantile。
histogram_quantile(0.9, rate(http_request_duration_seconds_bucket[10m]))
- 参数要求:第一个参数是分位数(0~1),第二个参数是带有
le标签的 bucket 向量。 - 插值逻辑:假设桶内线性分布。最高桶的上限必须是
+Inf,否则返回NaN。 - 聚合技巧:如果需要按
job聚合,记得在by子句中保留le标签,例如sum(rate(...)) by (job, le)。
标签操作
动态修改或合并标签,增强查询灵活性。
label_join(v, dst_label, separator, src_label_1, ...):将多个源标签的值用分隔符拼接成目标标签。label_replace(v, dst_label, replacement, src_label, regex):通过正则匹配替换标签值。支持$1,$2引用捕获组。
示例:
label_replace(up{service="a:b"}, "foo", "$1", "service", "(.*)")
存在性检查
absent(v):如果向量中没有元素,返回包含单个值为 1 的向量。常用于检测某个指标是否丢失。
排序
sort(v)/sort_desc(v):按样本值升序或降序排列向量元素。
总结:写 PromQL 时,先明确指标类型(Counter 还是 Gauge),再选择合适的函数。对于计数器,首选 rate;对于仪表盘,关注 delta 或 deriv。遇到直方图时,别忘了 le 标签的处理细节。

