PromQL是Prometheus内置的监控数据查询语言。
根据标签过滤
直接使用监控指标名称查询时,可以查询该指标下的所有时间序列。如:
http_requests_total
等同于:
http_requests_total{}
该表达式会返回指标名称为http_requests_total
的所有时间序列:
http_requests_total{code="200",handler="alerts",instance="localhost:9090",job="prometheus",method="get"}=(20889@1518096812.326)
http_requests_total{code="200",handler="graph",instance="localhost:9090",job="prometheus",method="get"}=(21287@1518096812.326)
可以根据时间序列的标签匹配模式进行过滤,目前主要支持两种匹配模式:
- 完全匹配(
label=value
和label!=value
) - 正则匹配(
label=~value
和label!~value
)
例如,需要查询所有http_requests_total
时间序列中满足标签instance
为localhost:9090
的时间序列:
http_requests_total{instance="localhost:9090"}
例如,查询多个环境下的时间序列序列可以使用如下表达式:
http_requests_total{environment=~"staging|testing|development",method!="GET"}
范围查询与时间位移
例如,通过以下表达式可以选择以当前时间为基准的最近5分钟内的所有样本数据:
http_request_total{}[5m]
除了使用m表示分钟以外,PromQL的时间范围选择器支持其它时间单位:
- s - 秒
- m - 分钟
- h - 小时
- d - 天
- w - 周
- y - 年
以上范围查询是基于当前时间的。如果我们想查询5分钟前的瞬时样本数据,或昨天一天的区间内的样本数据呢? 这个时候我们就可以使用offset
位移操作:
http_request_total{} offset 5m
http_request_total{}[1d] offset 1d
聚合函数
包括有:
- min (最小值)
- max (最大值)
- avg (平均值)
- sum (求和)
- stddev (标准差)
- stdvar (标准差异)
- count (计数)
- count_values (对value进行计数)
- bottomk (后n条时序)
- topk (前n条时序)
- quantile (分布统计)
如果需要整个应用的HTTP请求总量,可以:
sum(http_requests_total)
without
用于从计算结果中移除列举的标签,而保留其它标签,by则正好相反:
sum(http_requests_total) without (instance)
等价于
sum(http_requests_total) by (code,handler,job,method)
获取HTTP请求数前5位的时序样本数据,可以使用表达式:
topk(5, http_requests_total)
内置函数
例如查看 http_requests_total
5分钟内,平均每秒数据:
rate(http_requests_total[5m])
数学运算
PromQL支持的所有数学运算符如下所示:
+
(加法)-
(减法)*
(乘法)/
(除法)%
(求余)^
(幂运算)
例如,我们可以通过指标node_memory_free_bytes_total
获取当前主机可用的内存空间大小,其样本单位为Bytes
,如果换算为MB
作为单位:
node_memory_free_bytes_total / (1024 * 1024)
比较运算
支持的比较运算符有 ==,!=,>,<,>=,<=,
例如http_requests_total
结果中大于 100 的数据:
http_requests_total > 100
集合运算
Prometheus支持以下集合运算符:
- and (并且)
- or (或者)
- unless (排除)
例如http_requests_total
结果中等于 5 或者 2 的数据:
http_requests_total == 5 or http_requests_total == 2