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 结果中最大的数据。

Note

注意,和四则运算类型,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)
[1]https://prometheus.io/docs/querying/functions/