目录
- 1. PromQL介绍
- 2. 基本用法
- 2.1 查询时间序列
- 2.2 范围查询
- 2.3 时间位移操作
- 2.4 聚合操作
- 2.5 标量和字符串
- 3. 表达式的合法格式
- 4. PromQL操作符
- 4.1 数学运算
- 4.2 布尔运算
- 4.3 集合运算符
- 4.4 操作符优先级
- 4.5 聚合操作
1. PromQL介绍
PromQL提供对时间序列数据进行逻辑运算、过滤、聚合的支持。应用于数据查询、可视化、告警处理
2. 基本用法
2.1 查询时间序列
点击Prometheus图标,进行查询页面。可以点击地图图标查看有哪些metrics name。输入要查询的metrics name和过滤条件,然后点击执行就会返回该时间序列中的一个瞬时(最新)监控数据
其中过滤条件支持完全匹配和正则匹配
- 完全匹配支持:
=
、!=
- 正则匹配支持:
=~
、!~
,多个表达式之间使用|
进行分隔
2.2 范围查询
查询过去一段时间范围内的监控数据时,需要使用区间向量表达式。如查询最近5分钟内的所有监控数据,一个label会有该时间范围内的一系列监控数据
时间范围还支持s(秒)、m(分钟)、h(小时)、d(天)、w(周)、y(年)
2.3 时间位移操作
在瞬时向量表达式或区间向量表达式中,都是以当前时间为基准。如果我们想查询,5 分钟前的瞬时监控数据,可以使用时间位移操作offset
2.4 聚合操作
可以对多个label的监控数据进行聚合,形成一条新的时间序列监控数据。如下公式:先取每个label最近5分钟的一系列时间序列。在每个label下,取最近的两个点计算速率。最后按code进行分组,对速率进行求和
2.5 标量和字符串
标量:一个浮点型的数字值,没有时序。可以通过scalar()函数将单个瞬时向量转换为标量,比如scalar(sum(prometheus_http_requests_total{}))
字符串
格式还有:"this is a string"
、'this is a string'
3. 表达式的合法格式
所有的PromQL表达式都必须至少包含一个指标名称(例如prometheus_http_requests_total),或一个不会匹配到空字符串的标签过滤器(例如{code=”200”})。如{job=~".*"}
不合法,因为会匹配到空字符串
还可以使用内置的__name__
标签来指定监控指标名称
4. PromQL操作符
4.1 数学运算
支持的所有数学运算符:+(加法)、-(减法) 、*(乘法)、/(除法)、%(求余)、^(幂运算)
4.2 布尔运算
支持以下布尔运算符如下:==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)
布尔运算默认的作用是对结果进行过滤。使用bool修饰符,可以不进行过滤,而是返回1(true)或0(false)。如下所示
4.3 集合运算符
通过集合运算,可以在两个瞬时向量之间进行相应的集合操作。支持以下集合运算符:
- and:集合1和集合2都有的label
- or:集合1和集合2的所有label(重叠的label只取一份)
- unless:集合1有,但集合2没有的label
4.4 操作符优先级
操作符中优先级由高到低依次为:
- ^
- *, /, %
- +, -
- ==, !=, <=, =, >
- and, unless
- or
4.5 聚合操作
可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。支持的聚合操作符如下:
- sum(求和)
- min(最小值)
- max(最大值)
- avg(平均值)
- stddev(标准差)
- stdvar(标准差异)
- count(计数)
- count_values(对value进行计数)
- bottomk(倒序排序后,后n条时序)
- topk(倒序排序后,取前n条时序)
- quantile(φ, express):其中0 ≤ φ ≤ 1。计算当前所有标签的数据值,在指定百分位的一个数据值。例如当φ为0.5时,表示计算当前所有标签的中位数
使用聚合操作的语法如下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
- 只有count_values、quantile、topk、bottomk支持参数(parameter)
- without用于从计算结果中移除列出的标签,而保留其它标签。by的计算结果
中只保留列出的标签,其余标签则移除 - label list使用逗号进行分隔
count_values的使用示例如下:
quantile的使用示例如下: