metrics数据
prometheus监控中对于采集过来的数据统一称为metrics数据。总体上来说metrics是对采集过来的数据的一种统称。
metrics数据分为以下几种类型:
metrics数据是键值形式的,即K/V形式的,以下面的一组metrics数据为例:
1 | # HELP node_cpu_guest_seconds_total Seconds the CPUs spent in guests (VMs) for each mode. |
上面一组metrics数据,前两行注释分别为HELP和TYPE,其中HELP是对该条metric数据的简单描述,而TYPE表示该metric的数据类型。
下面两行是metrics的K/V数据,以第一行为例,键名是node_cpu_guest_seconds_total{cpu="0",mode="nice"}
,键值是0
键名又分为指标名称和标签集,node_cpu_guest_seconds_total
是指标名称,指标名称代表着这项metrics数据的基本标识;{cpu="0",mode="nice"}
是标签集,标签则是这个基本标识上再次细分的多个可测量的维度。
PromQL查询数据
PromQL是Prometheus实现监控查询的核心功能,除了实现数据的对外查询和展现,同时告警监控也是依赖PromQL实现的。
通过PromQL,用户可以非常方便地对监控样本数据进行统计分析,PromQL支持常见的运算操作符,同时PromQL中还提供了大量的内置函数可以实现对数据的高级处理。
Prometheus 返回的查询结果有以下几种数据类型:
最简单的查询方式,Prometheus通过指标名称和标签唯一定义一条时间序列进行查询。
比如想要查询CPU总的使用时间,可以输入指标名称node_cpu_seconds_total
,可以看到出现的metrics项
如果想要查询更详细的维度,比如CPU在内核态的使用时间,可以使用标签,即在指标名称后追加{mode="system"}
使用技巧:
在使用标签查询时,可以添加多个标签,比如node_cpu_seconds_total{cpu="0",mode="system"}
在使用标签查询时,可以使用=
和!=
,比如node_cpu_seconds_total{mode="system"}
,不看内核态的时间
除了完全匹配外,还可以使用正则表达式,匹配符号使用=~
模糊匹配,使用!~
表示反向模糊匹配
使用正则表达式的时候,在标签的值里面使用|
表示逻辑或,比如node_cpu_seconds_total{mode=~"system|nice"}
上面几个例子查询到的都是瞬时向量,可以在查询表达式后面添加[1m]
,查询1分钟内所有样本数据,此时查询到的是区间向量。
二元操作符包括:数学运算符,逻辑运算符,布尔运算符
数学运算
PromQL支持对查询到的数据进行数学运算,对结果进行二次加工。
+
(加法)-
(减法)*
(乘法)/
(除法)%
(求余)^
(幂运算)比如:
1 | # 以 MB 为单位显示空闲内存 |
布尔运算
PromQL支持对查询到的数据的值进行布尔运算,对结果进行过滤。
另外,使用bool修改符后,布尔运算不会对结果进行过滤,而是将各个样本的数据与标量进行比较,得出结果0或1
==
(相等)!=
(不相等)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)bool
(布尔修饰符,需要结合其他布尔符号使用)比如:
1 | # CPU运行时间大于10s的监控项数据 |
集合运算符
PromQL支持两个瞬时向量之间的操作,可以在两个瞬时向量之间进行相应的集合操作,产生一个新的向量
and
(并且)or
(或者)unless
(排除)1 | vector1 and vector2 会产生一个新的向量,新向量包含vector1中完全匹配vector2中的元素组成 |
聚合操作符作用于瞬时向量,可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。
Prometheus提供了下列内置的聚合操作符:
sum ()
求和min ()
最小值max()
最大值avg()
平均值stddev()
标准差stdvar()
标准方差count()
计数count_values()
对value进行计数bottomk()
后n条时序topk()
前n条时序quantile()
分位数by()
分组聚合操作的语法如下:
1 | <aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] |
举例:
1 | # 求和 |
此处介绍三个内置函数,用于区间向量
increase()
增长量rate()
增长率irate()
瞬时增长率1 | increase() 函数中的参数是一个区间向量,increase函数获取区间向量中的第一个后最后一个样本并返回其增长量。因此,可以通过以下表达式计算CPU运行指标的平均每秒增长率:increase(node_cpu_seconds_total[2m])/120 |
1 |
|