prometheus使用 (四) 瞬时向量与区间向量

promQL语句和mysql数据库中select语句类似,都是用于查询某个对象下的数据信息
我们可以直接把promeheus中的"指标"看作是mysql中的"数据表"
通过查询指标,可以得到指标这个表中的存放的数据信息。并且可以通过筛选过滤来得到某个指标的详细信息

前言

#我们通过promQL语句查询得到的值主要有以下两种
1. "瞬时向量"   #查询得到最新的值,(实时数据)通常用于报警、实时监控
2. "区间向量"   #查询某一段时间范围内所有的样本值,多用于数据分析、预测

一. 瞬时向量

#查询磁盘总量
node_filesystem_size_bytes

#通过下图,可以看到直接通过查询指标的名称,可以查询这个指标(表)中所有的数据
#而我们获取到的这个值,是一个实时数据。你可以多点几下,可以发现后面的值一直在变

返回

通过上面的查询我们获取到了该"指标(表)"下的所有数据

但很多时候希望可以获取单条的详细信息,而不是大量无用的信息

在promQL语句中,我们可以通过"标签"对查询的数据进行筛选

案例1  筛选过滤

#我们添加一个mountpoint="/"的标签 (显示/分区的信息)
#必须满足这个标签的值才会显示
node_filesystem_size_bytes{mountpoint="/"}

案例2 多层筛选

上图可以看到符合该条件的信息只有两条,但第二条rootfs明显是我们不需要的,我们可以再此过滤

#在上面的基础上我们再追加一个device != "rootfs"
#注意,这里使用的是"!=" 不等于
node_filesystem_size_bytes{mountpoint = "/",device != "rootfs"}

案例3 算数运算

我们通过筛选得到了一个单独的值,但这个数值并不方便理解。 我们将他转换一下

node_filesystem_size_bytes{mountpoint = "/",device != "rootfs"} / 1024 / 1024 / 1024

#得到如下的信息
{device="/dev/mapper/centos-root", fstype="xfs", instance="192.168.1.21:9100", job="node", mountpoint="/"} 16.986328125


#我们回主机上查看
[root@k8s-node01 ~]# df -h | grep /$
/dev/mapper/centos-root   17G  5.8G   12G   35% /
#可以看到是很接近的,四舍五入的是17

小知识

#当我们使用下面语句查询时
node_filesystem_size_bytes{instance="192.168.1.21:9100"}  

#实际上是以下面的形式运行的
{__name__="node_filesystem_size_bytes",instance="192.168.1.21:9100"}

 

案例4  模糊匹配

我们并不是在所有的情况下都需要单个信息,当节点信息过多的时候。

我们有时会进行一些模糊的匹配机制来获取多个资源的值

#和上面的语法类似,不同的是将 (=,!=) 替换为了(=~,!~)
#如下
#匹配到的ip都会显示
node_filesystem_size_bytes{instance=~"(192.168.1.20:9100|192.168.1.21:9100|192.168.1.22:9100)"}

#匹配到的ip都不会显示
node_filesystem_size_bytes{instance!~"(192.168.1.20:9100|192.168.1.21:9100|192.168.1.22:9100)"}

二. 区间向量

上面我们通过promQL查询到的数据会返回一个样本值,这个值我们称之为"瞬时向量"

而我们想要获取一段时间范围内的数据时,我们则需要使用"区间向量表达式"

#首先我们要先了解一下时间范围的单位
#缩写      #单位
s         Seconds   秒
m         Minu        分
h         Hours       时
d         Days         天
w        Weeks      周
y         Years        月

案例1 获取2分钟内磁盘可用容量的值

#在结尾添加[2m]
node_filesystem_free_bytes{mountpoint = "/",device != "rootfs"}[2m]

可以看到,他会返回在2分钟内磁盘变化的值,前面标记的是磁盘可用的空间后面是磁盘最大空间

 

案例2 范围查询的偏移量(offset)

上面我们查询到了2分钟内的数据,但是我们现在反过来。
我们要查询2分钟之前的数据、或者昨天的数据做统计,就需要用到"偏移量"

#查询1小时前的最后两分钟的磁盘可用大小
node_filesystem_free_bytes{mountpoint = "/",device != "rootfs"}[2m] offset 1h

#不过本地查看,也没什么太大的浮动。

 我们可以通过predict_linear() 去预测磁盘多久会用完 (当返回的值小于0时可以设置报警)

#这里我们根据磁盘可用量在10分钟内的增长值,去预测1个小时内会不会占满
predict_linear(node_filesystem_free_bytes{mountpoint ="/"}[10m], 1*3600) < 0

#不出意外应该不会查询到任何东西
#自然增长没那么快,我这里磁盘容量大小是17G,我们去创建一个大文件做测试
dd if=/dev/zero of=file bs=5000M count=1  #写入一个5G的文件

 

刚开始的时候,我们不是很清楚要写些什么,可以先看看grafana上面的模板的语句进行参考

### Prometheus 查询语言使用指南 Prometheus 使用一种强大的查询语言 PromQL (Prometheus Query Language),用于从时间序列数据库中提取和处理数据[^1]。 #### 基本概念 PromQL 支持多种操作符来执行算术运算、比较以及逻辑组合。表达式的计算结果可以是瞬时向量、范围向量或标量之一。瞬时向量表示给定时间点的一组时间序列;范围向量则代表一段时间内的样本集合;而标量是一个简单的数值[^2]。 #### 函数应用 Prometheus 提供了一系列内置函数,这些函数接受参数并对输入的时间序列进行特定的操作。例如 `rate()` 函数用来计算每秒平均增长率,适用于计数器类型的指标。另一个例子是 `increase()` 函数,它返回指定时间段内增长了多少次。 ```python # 计算过去5分钟HTTP请求速率 rate(http_requests_total[5m]) ``` #### 聚合操作 聚合允许对多个时间序列的数据汇总成单个值。常见的聚合操作有 sum()、avg()、min() 和 max() 等。通过 group by 子句还可以按标签分组来进行局部聚合。 ```python # 获取所有实例上CPU利用率的最大值 max(cpu_usage) without(instance) ``` #### 数据过滤匹配 利用布尔表达式可以在查询语句里筛选符合条件的时间序列。这通常涉及到对比不同度量之间的关系或者基于标签的选择条件。比如可以通过正则表达式模式匹配来选取某些服务端口上的响应延迟情况。 ```python # 查找http状态码为5xx错误的服务调用次数 sum(rate(http_request_duration_seconds_count{status=~"5.."}[5m])) by (service) ``` #### 时间偏移功能 `offset` 关键字使得能够访问历史时刻的数据点,这对于分析趋势变化非常有用。结合其他语法结构一起使用时,可以帮助构建复杂的预测模型或是回顾过去的性能表现。 ```python # 对比当前时间和前一天同一时段的API请求数差异 irate(api_requests_total[5m]) - irate(api_requests_total offset 1d)[5m] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值