Skip to content

PromQL 兼容性

概述

Datalayers 提供高度兼容的 PromQL 查询能力,支持绝大多数常用的选择器、运算符和函数,确保从 Prometheus 平滑迁移。

选择器

Datalayers 支持 Instant 选择器和 Range 选择器。

标签匹配支持

匹配运算符普通标签特殊标签 __name__特殊标签 __database__
=✅ 支持✅ 支持✅ 支持
!=✅ 支持✖ 不支持✖ 不支持
=~✅ 支持✖ 不支持✖ 不支持
!~✅ 支持✖ 不支持✖ 不支持

:Datalayers 支持 offset 修饰符,但不支持 @ 修饰符。

运算符

以下内容基于 Prometheus 官方 PromQL 运算符说明整理,示例仅用于展示语法。

一元与二元运算符

类别运算符说明示例
一元-一元取反,可作用于标量或 Instant 向量-up
算术二元+, -, *, /, %, ^标量/向量的加减乘除、取模、幂运算http_requests_total + 1
三角二元atan2基于两个序列的反正切,支持向量匹配atan2(node_load1, node_load5)
比较二元==, !=, >, <, >=, <=默认作为过滤;加 bool 返回 0/1up == 1, up > bool 0
逻辑/集合and, or, unless向量集合运算:交集/并集/差集up{job="api"} unless up{job="api",instance="node-1"}

向量匹配与分组修饰:向量与向量运算可使用 on() / ignoring() 指定匹配标签,并通过 group_left / group_right 进行多对一/一对多匹配。

聚合运算符

运算符说明示例
sum对向量求和sum(rate(http_requests_total[5m]))
avg对向量求平均值avg(node_cpu_seconds_total)
min取最小值min(node_memory_MemFree_bytes)
max取最大值max(node_memory_MemFree_bytes)
stddev标准差stddev(node_load1)
stdvar方差stdvar(node_load1)
topk取前 k 个最大值topk(5, rate(http_requests_total[5m]))
bottomk取前 k 个最小值bottomk(5, rate(http_requests_total[5m]))
count统计样本数count(up)
count_values按值计数并写入新标签count_values("value", up)
quantile计算分位数quantile(0.95, node_load5)

聚合分组:聚合运算可结合 by() / without() 指定分组标签。

暂不支持limitk, limit_ratio

函数

以下内容基于 Prometheus 官方函数说明整理,示例仅用于展示语法。

Instant 函数

函数说明示例
abs(v)绝对值abs(up - 1)
ceil(v)向上取整ceil(3.14)
exp(v)e 的幂exp(1)
ln(v)自然对数ln(10)
log2(v)以 2 为底对数log2(8)
log10(v)以 10 为底对数log10(1000)
sqrt(v)平方根sqrt(9)
acos(v)反余弦acos(1)
asin(v)反正弦asin(0.5)
atan(v)反正切atan(1)
sin(v)正弦sin(pi() / 2)
cos(v)余弦cos(0)
tan(v)正切tan(1)
acosh(v)反双曲余弦acosh(2)
asinh(v)反双曲正弦asinh(1)
atanh(v)反双曲正切atanh(0.5)
sinh(v)双曲正弦sinh(1)
cosh(v)双曲余弦cosh(1)
tanh(v)双曲正切tanh(1)
sgn(v)符号函数(-1/0/1)sgn(up - 1)
pi()圆周率常量pi()
deg(v)弧度转角度deg(3.14159)
rad(v)角度转弧度rad(180)
floor(v)向下取整floor(3.99)
clamp(v, min, max)将值限制到区间clamp(up, 0, 1)
clamp_max(v, max)限制最大值clamp_max(up, 1)
clamp_min(v, min)限制最小值clamp_min(up, 0)
scalar(v)将单元素向量转为标量scalar(up{instance="node-1"})
timestamp(v)返回样本时间戳timestamp(up)
sort(v)升序排序sort(up)
sort_desc(v)降序排序sort_desc(up)
histogram_quantile(q, v)基于直方图估算分位数histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
predict_linear(v, t)线性预测未来 t 秒后的值predict_linear(node_filesystem_free_bytes[1h], 3600)
absent(v)输入为空时返回 1absent(up{job="api"})

以上 Instant 函数语义参考 Prometheus 文档。

不支持:其它 histogram_<aggr> 函数。

Range 函数

函数说明示例
idelta(v[range])相邻两点差值idelta(node_memory_MemFree_bytes[5m])
count_over_time(v[range])统计样本数count_over_time(http_requests_total[5m])
stddev_over_time(v[range])标准差stddev_over_time(node_load1[10m])
stdvar_over_time(v[range])方差stdvar_over_time(node_load1[10m])
changes(v[range])值变化次数changes(up[10m])
delta(v[range])首尾差值(适合 gauge)delta(node_memory_MemFree_bytes[10m])
rate(v[range])平均每秒增长率(适合 counter)rate(http_requests_total[5m])
deriv(v[range])基于线性回归的导数deriv(node_load1[10m])
increase(v[range])总增量(rate × 时间窗)increase(http_requests_total[1h])
irate(v[range])近似瞬时每秒增长率irate(http_requests_total[5m])
resets(v[range])计数器重置次数resets(http_requests_total[1h])

其他函数

函数说明示例
label_join(v, dst, sep, src...)将多个标签拼成新标签label_join(up, "instance_job", "/", "instance", "job")
label_replace(v, dst, repl, src, regex)按正则替换标签label_replace(up, "instance", "$1", "instance", "(.*):\\d+")
sort_by_label(v, label...)按标签值升序排序sort_by_label(up, "instance")
sort_by_label_desc(v, label...)按标签值降序排序sort_by_label_desc(up, "instance")

PromQL 查询示例

场景查询
按作业统计 QPSsum by (job) (rate(http_requests_total[1m]))
按方法与状态码聚合sum by (method, status) (rate(http_requests_total[5m]))
5xx 错误率sum(rate(http_requests_total{status="500"}[5m])) / sum(rate(http_requests_total[5m]))
GET 请求量(窗口内样本数)count_over_time(http_requests_total{method="GET"}[2m])
Top N 实例吞吐topk(3, sum by (instance) (rate(http_requests_total[2m])))
P95 请求耗时(直方图)histogram_quantile(0.95, sum by (le) (rate(request_duration_seconds_bucket[5m])))
平滑后的平均 QPSavg_over_time(rate(http_requests_total{job="web"}[30s])[5m:30s])
缺失目标探测absent(http_requests_total{job="missing"})