2. 表达式语言数据类型
在Prometheus的表达式语言PromQL中,任何表达式或者子表达式都可以归为四种类型:
-
string
:字符串,一个当前没有被使用的简单字符串 -
scalar
:标量,一个简单的浮点值
-
instant vector
:瞬时向量,它是指在同一时刻,抓取的所有metrics指标数据。这些metrics指标数据的key都是相同的,也就是时间戳是相同的。 -
range vector
:范围向量,它是指在任何一个时间范围之内,抓取的所有metrics指标数据。
2.1. 字符串
字符串可以用单引号、双引号或者反引号表示
PromQL遵循与Go相同的转义规则。在单引号,双引号中,反斜杠\
作为转义字符,后面可以跟着a, b, f, n, r, t, v或者\
。 也可以使用八进制(\nnn)或者十六进制(\xnn, \unnnn和\Unnnnnnnn)提供特定字符。
在反引号内不处理转义字符。与Go不同,PromQL不会丢弃反引号中的换行符。例如:
"this is a string"
'these are unescaped: \n \\ \t'
`these are not unescaped: \n ' " \t`
2.2. 标量
标量浮点值可以直接写成这样的形式 [-](digits)[.(digits)]
-2.43
2.3. 瞬时向量选择器
瞬时向量选择器可以对一组时间序列数据进行筛选,并给出结果中的每个结果键值对(时间戳-样本值)。最简单的形式是,只有一个metric名称被指定。在一个瞬时向量中这个结果包含有这个metrics指标名称的所有样本数据的key-value。
下面这个例子选择所有时间序列度量名称为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:.*”} #
2.4. 范围向量选择器
范围向量类似于瞬时向量, 所不同在于,它们从当前实例来选择样本范围区间。在语法上,时间长度被追加在向量选择器尾部的方括号[]之中,用以指定对于每个样本范围区间中的每个元素应该抓取的时间范围样本区间。
时间长度有一个数值决定,后面可以跟下面的单位:
-
s
- seconds -
m
- minutes -
h
- hours -
d
- days -
w
- weeks -
y
- years
在下面这个例子中, 选择过去5分钟内,度量指标名称为http_requests_total
, 标签为job="prometheus"
的时间序列数据:
http_requests_total{job=”prometheus”}[5m]
2.5. 偏移修饰符
这个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)
2.6. 子查询
子查询可以在一个给定的范围和结果内进行查询。子查询的结果是一个范围向量
<instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]
2.7. 注释
PromQL支持行首以#
开头的行为注释行
# This is a comment
2.8. 运算符和函数
这两个也是查询中需要用到的,内容我们会在后面详细说
为了方便大家学习,请大家加我的微信,我会把大家加到微信群(微信群的二维码会经常变)和qq群821119334,问题答案云原生技术课堂,有问题可以一起讨论
-
个人微信
640.jpeg -
腾讯课堂
640-20200506145837072.jpeg -
微信公众号
640-20200506145842007.jpeg 专题讲座
2020 CKA考试视频 真题讲解 https://www.bilibili.com/video/BV167411K7hp
2020 CKA考试指南 https://www.bilibili.com/video/BV1sa4y1479B/
2020年 5月CKA考试真题 https://mp.weixin.qq.com/s/W9V4cpYeBhodol6AYtbxIA