《Kubernetes监控篇:prometheus常用函数表达式》



一、简介

PromQL是Prometheus提供的一个函数式的表达式语言,可以使用户实时地查找和聚合时间序列数据。表达式计算结果可以在图表中展示,也可以在 Prometheus表达式浏览器中以表格形式展示,或者作为数据源,以HTTP API的方式提供给外部系统使用。PromQL虽然以QL结尾,但是它不是类似SQL的语言,因为在时间序列上执行计算类型时,SQL语言相对缺乏表达能力。而PromQL语言表达能力非常丰富,可以使用标签进行任意聚合,还可以使用标签将不同的标签连接到一起进行算术运算操作。内置了时间和数学等很多函数可以使用。


二、 PromQL语法

2.1、表达式值类型

PromQL表达式或子表达式可以得到四种类型的值

1、瞬时向量 (Instant vector): 一组样本值,所有样本值共享时间序列(时间戳相同)
2、区间向量 (Range vector): 一组一段时间范围类的样本值
3、标量(Scalar),一个固定的浮点数,-x.y 、n.m格式
4、字符串 (String): 一个字符类型的值,可以使用单引号、双引号、反引号包裹,遵循goalng语法的转义规则


2.1、时序选择器

2.2.1、瞬时向量选择器

瞬时向量选择器用来选择一组时序在某个采样点的采样值。最简单的情况就是指定一个度量指标,选择出所有属于该度量指标的时序的当前采样值。

比如下面的表达式:

probe_success
probe_success{
    
    job="kube-service-http-probe", url="https://help.baidu.com/question?prod_id=1"}
probe_success{
    
    job="kube-service-http-probe", url=~".*help.baidu.com.*"}
apiserver_audit_event_total{
    
    job=~"kube-apiserver|kube-controller-manager|kube-scheduler",cluster="k8s-sdjw-pro"}

匹配标签值时可以是等于,也可以使用正则表达式。总共有下面几种匹配操作符:

=:完全相等
!=: 不相等
=~: 正则表达式匹配
!~: 正则表达式不匹配

2.2.2、区间向量选择器

区间向量选择器类似于瞬时向量选择器,不同的是它选择的是过去一段时间的采样值。可以通过在瞬时向量选择器后面添加包含在 [] 里的时长来得到区间向量选择器。比如下面的表达式选出了所有度量指标为 apiserver_request_total 且resource是pod的时序在过去 1 分钟的采样值。

apiserver_request_total{
    
    job="kube-apiserver",resource="pods"}[1m]

时长的单位可以是下面几种之一

s:seconds 
m:minutes 
h:hours 
d:days 
w:weeks 
y:years

2.2.3、偏移向量选择器

前面介绍的选择器默认都是以当前时间为基准时间,偏移修饰器用来调整基准时间,使其往前偏移一段时间。偏移修饰器紧跟在选择器后面,使用offset来指定要偏移的量。比如下面的表达式选择度量名称为 apiserver_request_total的所有时序在5分钟前的采样值。

apiserver_request_total{
    
    job="kube-apiserver",resource="pods"} offset 5m

下面的表达式选择 apiserver_request_total度量指标在1周前的这个时间点过去5分钟的采样值

apiserver_request_total{
    
    job="kube-apiserver",resource="pods"} [5m] offset 1w

三、PromQL操作符

3.1、二元操作符

3.1.1、算术类二元操作符

算术类二元操作符有以下几种:

+:加
-:减
*:乘
/:除
%:求余
^:乘方

3.1.2、比较类二元操作符

比较类二元操作符有以下几种:

== (equal)
!= (not-equal)
> (greater-than)
< (less-than)
>= (greater-or-equal)
<= (less-or-equal)

3.1.3、逻辑类二元操作符

逻辑操作符仅用于向量与向量之间:

and:交集
or:合集
unless:补集

具体运算规则如下:

vector1 and vector2的结果由在vector2里有匹配(标签键值对组合相同)元素的2. vector1 里的元素组成。
vector1 or vector2的结果由所有vector1里的元素加上在vector1 里没有匹配(标签键值对组合相同)元素的vector2里的元素组成。
vector1 unless vector2 的结果由在vector2里没有匹配(标签键值对组合相同)元素的vector1 里的元素组成。

3.1.4、二元操作符优先级

PromQL 的各类二元操作符运算优先级如下:

^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or

3.2、聚合操作符

PromQL的聚合操作符用来将向量里的元素聚合得更少。总共有下面这些聚合操作符:

sum:求和
min:最小值
max:最大值
avg:平均值
stddev:标准差
stdvar:方差
count:元素个数
count_values:等于某值的元素个数
bottomk:最小的 k 个元素
topk:最大的 k 个元素
quantile:分位数

四、PromQL函数

Prometheus 内置了一些函数来辅助计算,下面介绍一些典型的:

abs():绝对值
sqrt():平方根
exp():指数计算
ln():自然对数
ceil():向上取整
floor():向下取整
round():四舍五入取整
delta():计算区间向量里每一个时序第一个和最后一个的差值
sort():排序

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

猜你喜欢

转载自blog.csdn.net/m0_37814112/article/details/122614892