4.9. PromQL¶
PromQL 查询结果主要有 3 种类型:
1. 瞬时数据 (Instant vector):
包含一组时序,每个时序只有一个点,例如:
http_requests_total
2. 区间数据 (Range vector):
包含一组时序,每个时序有多个点,例如:
http_requests_total[5m]
3. 纯量数据 (Scalar):
纯量只有一个数字,没有时序,例如:
count(http_requests_total)
查询条件:
http_requests_total{code="200"} // 表示查询名字为 http_requests_total,code 为 "200" 的数据
http_requests_total{code!="200"} // 表示查询 code 不为 "200" 的数据
http_requests_total{code=~"2.."} // 表示查询 code 为 "2xx" 的数据
http_requests_total{code!~"2.."} // 表示查询 code 不为 "2xx" 的数据
操作符:
1. 算术运算符:
支持的算术运算符有 +,-,*,/,%,^,
例如 http_requests_total * 2 表示将 http_requests_total 所有数据 double 一倍。
2. 比较运算符:
支持的比较运算符有 ==,!=,>,<,>=,<=,
例如 http_requests_total > 100 表示 http_requests_total 结果中大于 100 的数据。
3. 逻辑运算符:
支持的逻辑运算符有 and,or,unless,
例如 http_requests_total == 5 or http_requests_total == 2 表示 http_requests_total 结果中等于 5 或者 2 的数据。
4. 聚合运算符:
支持的聚合运算符有 sum,min,max,avg,stddev,stdvar,count,count_values,bottomk,topk,quantile
例如 max(http_requests_total) 表示 http_requests_total 结果中最大的数据。
备注
注意,和四则运算类型,Prometheus 的运算符也有优先级,它们遵从(^)> (❋, /, %) > (+, -) > (==, !=, <=, <, >=, >) > (and, unless) > (or) 的原则
内置函数 [1]
Prometheus 内置不少函数,方便查询以及数据格式化,例如:
// 将结果由浮点数转为整数的 floor 和 ceil,
floor(avg(http_requests_total{code="200"}))
ceil(avg(http_requests_total{code="200"}))
查看 http_requests_total 5分钟内增长率:
rate(http_requests_total[5m])
访问量前10的HTTP地址:
topk(10, http_requests_total)
聚合, 统计高级查询:
1. count 查询: 统计当前记录总数
count(http_requests_total)
2. sum 查询: 统计当前数据总值
sum(http_requests_total)
3. avg 查询: 统计当前数据平均值
avg(http_requests_total)
4. top 查询: 查询最靠前的 3 个值
topk(3, http_requests_total)
5. irate 查询,过去 5 分钟平均每秒数值
irate(http_requests_total[5m])
实例:
# 查询系统所有http请求的总量
sum(http_request_total)
# 按照mode计算主机CPU的平均使用时间
avg(node_cpu) by (mode)
# 按照主机查询各个主机的CPU使用率
sum(sum(irate(node_cpu{mode!='idle'}[5m])) / sum(irate(node_cpu[5m]))) by (instance)