表达式语言数据类型
在Prometheus的表达式语言中,任何表达式或者子表达式都可以归为四种类型:
- 即时向量(instant vector) 包含每个时间序列的单个样本的一组时间序列,共享相同的时间戳。
- 范围向量(Range vector) 包含每个时间序列随时间变化的数据点的一组时间序列。
- 标量(Scalar) 一个简单的数字浮点值
- 字符串(String) 一个简单的字符串值(目前未被使用)
根据使用情况(例如绘图或者显示表达式的输出),这些类型中只有一些是由用户指定的表达式产生的结果而有效的,例如,即时向量表达式是可以绘图的唯一类型。
字符串
字符串可以用单引号、双引号或者反引号表示
PromQL遵循与Go相同的转义规则。在单引号,双引号中,反斜杠成为了转义字符,后面可以跟着a, b, f, n, r, t, v或者\。 可以使用八进制(\nnn)或者十六进制(\xnn, \unnnn和\Unnnnnnnn)提供特定字符。
在反引号内不处理转义字符。与Go不同,Prom不会丢弃反引号中的换行符。例如:
1 | "this is a string" |
浮点数
标量浮点值可以直接写成形式-[.(digits)]。
1 | -2.43 |
时间序列选择器
即时向量选择器
瞬时向量选择器可以对一组时间序列数据进行筛选,并给出结果中的每个结果键值对(时间戳-样本值): 最简单的形式是,只有一个度量名称被指定。在一个瞬时向量中这个结果包含有这个度量指标名称的所有样本数据键值对。
下面这个例子选择所有时间序列度量名称为http_requests_total
的样本数据:
http_requests_total
通过在度量指标后面增加{}一组标签可以进一步地过滤这些时间序列数据。
下面这个例子选择了度量指标名称为http_requests_total
,且一组标签为job=prometheus
, group=canary
:
http_requests_total{job=”prometheus”,group=”canary”}
可以采用不匹配的标签值也是可以的,或者用正则表达式不匹配标签。标签匹配操作如下所示:
=
: 精确地匹配标签给定的值!=
: 不等于给定的标签值=~
: 正则表达匹配给定的标签值!=
: 给定的标签值不符合正则表达式
例如:度量指标名称为http_requests_total
,正则表达式匹配标签environment
为staging, testing, development
的值,且http请求方法不等于GET
。
http_requests_total{environment=~”staging|testing|development”, method!=”GET”}
匹配空标签值的标签匹配器也可以选择没有设置任何标签的所有时间序列数据。正则表达式完全匹配。
向量选择器必须指定一个度量指标名称或者至少不能为空字符串的标签值。以下表达式是非法的:
{job=~”.*”} #Bad!
上面这个例子既没有度量指标名称,标签选择器也可以正则匹配空标签值,所以不符合向量选择器的条件
相反地,下面这些表达式是有效的,第一个一定有一个字符。第二个有一个有用的标签method
{job=~”.+”} # Good!{job=~”.*”, method=”get”} # Good!
标签匹配器能够被应用到度量指标名称,使用__name__
标签筛选度量指标名称。例如:表达式http_requests_total
等价于{__name__="http_requests_total"}
。 其他的匹配器,如:= ( !=, =~, !~)
都可以使用。下面的表达式选择了度量指标名称以job:
开头的时间序列数据:
{name=~”^job:.*”} #
范围向量选择器
范围向量类似瞬时向量, 不同在于,它们从当前实例选择样本范围区间。在语法上,时间长度被追加在向量选择器尾部的方括号[]中,用以指定对于每个样本范围区间中的每个元素应该抓取的时间范围样本区间。
时间长度有一个数值决定,后面可以跟下面的单位:
s
- secondsm
- minutesh
- hoursd
- daysw
- weeksy
- years
在下面这个例子中, 选择过去5分钟内,度量指标名称为http_requests_total
, 标签为job="prometheus"
的时间序列数据:
http_requests_total{job=”prometheus”}[5m]
偏移修饰符
这个offset
偏移修饰符允许在查询中改变单个瞬时向量和范围向量中的时间偏移
例如,下面的表达式返回相对于当前时间的前5分钟时的时刻, 度量指标名称为http_requests_total
的时间序列数据:
http_requests_total offset 5m
注意:offset
偏移修饰符必须直接跟在选择器后面,例如:
sum(http_requests_total{method=”GET”} offset 5m) // GOOD.
然而,下面这种情况是不正确的
sum(http_requests_total{method=”GET”}) offset 5m // INVALID.
offset偏移修饰符在范围向量上和瞬时向量用法一样的。下面这个返回了相对于当前时间的前一周时,过去5分钟的度量指标名称为http_requests_total
的速率:
rate(http_requests_total[5m] offset 1w)