【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • PromQL向量匹配
    • 1. PromQL向量匹配介绍
    • 2. PromQL一对一向量匹配
    • 3. PromQL一对多向量匹配
    • 4. PromQL向量匹配示例
      • 1、下载并运行程序,该程序用于模拟“向量匹配相关的”指标数据
      • 2、编辑Prometheus配置文件,抓取对应的指标数据
    • 5. PromQL向量匹配实践

PromQL向量匹配

在PromQL中,向量匹配是一种重要的概念,它允许用户根据标签(label)对多个时间序列进行复杂的计算和比较。本文将结合实际案例,详细介绍PromQL中的向量匹配用法。

1. PromQL向量匹配介绍

在Prometheus中,执行“向量与向量之间的运算”时,需要遵循向量匹配的规则。
这意味着两个向量必须具有“相同的标签”,且对应的“标签值也必须完全相同”,这才能进行运算。
如果有任何一个标签或标签值不匹配,那么此次的运算将不会执行。这种匹配规则也被称为“向量的一对一匹配”。
例如,下面两个时间序列可以成功进行一对一匹配,不用看指标名称是否一致。而后可以正常执行各种运算:
http_requests_total{job=“webserver”, instance=“jingtian01:9100”}
http_requests_duration_seconds{job=“webserver”,instance=“jingtian01:9100”}
因为它们的标签以及标签值完全一致,所以它们可以直接进行运算操作。

2. PromQL一对一向量匹配

但是在实际监控场景中,我们会经常遇到“标签不完全相同”的两个向量,但它们任然需要进行运算。

oldxu_requests_total{job="webserver", instance="jingtian01:9100"} 3200 :表示该实例的HTTP请求总数。
oldxu_requests_status_total{job="webserver", instance="jingtian01:9100", method="GET"} 500 :表示该实例中使用GET方法的HTTP请求总数。

假设我们想要计算使用GET方法的请求总数,占总请求数的比例是多少。
理想的计算公式是: GET方法的请求总数 / 总的请求数 * 100 = GET请求所占的比例。
但由于两个向量的标签不完全相同(一个有method标签,一个没有),因此无法直接进行计算。

为了解决这个问题,我们可以借助PromQL的向量匹配选项:
基于标签的匹配(on):指定基于哪些标签进行匹配。只有当指定的 ”标签及其值“ 在两个向量中都相同,向量之间才能进行运算。
忽略标签的匹配(ignoring):指定忽略某些标签,也就是在运算时不考虑这些标签,只要其他标签以及标签的值相同,向量之间就可以进行运算。

方式1:使用on关键字匹配特定标签,明明确指定仅基于job和instance标签进行匹配

# 表达式
oldxu_requests_status_total{method="GET"} / on (job, instance) oldxu_requests_total * 100

方式2:使用ignoring关键字忽略特定标签,忽略不希望参与匹配的method标签

# 表达式
oldxu_requests_status_total{method="GET"} / ignoring (method) oldxu_requests_total * 100

3. PromQL一对多向量匹配

在实际监控中,我们还会遇到需要进行“一对多向量匹配”的情况,即“一个时间序列中的数据点”需要与“另一个时间序列中的多个数据点”进行匹配运算。
举个例子:假设我们有如下两个指标:

# 第一个时间序列:记录了不同HTTP方法和状态码的错误请求总数。
oldxu_requests_error_total{job="webserver", method="GET",code="500"} 220
oldxu_requests_error_total{job="webserver", method="GET",code="404"} 130
oldxu_requests_error_total{job="webserver", method="PUT",code="501"} 3
oldxu_requests_error_total{job="webserver", method="POST",code="500"} 34
oldxu_requests_error_total{job="webserver", method="POST",code="502"} 48
# 第二个时间序列:记录了每种HTTP方法的请求总数。
oldxu_requests_instance_total{job="webserver",method="GET"} 600
oldxu_requests_instance_total{job="webserver","method"="POST"} 120

我们的目标是计算每种HTTP方法(GET和POST)对应不同状态码(404和500)的请求占该方法总请求的比例。大体计算公式如下:

# 1、GET方法为500的请求总数 / GET的总请求数 * 100 = GET 500错误比例。 (220 /600 * 100 = 21.666666666666668)
# 2、GET方法为404的请求总数 / GET的总请求数 * 100 = GET 404错误比例。 (130 /600 * 100 = 36.666666666666664)
# 3、POST方法为500的请求总数 / POST的总请求数 * 100 = POST 500错误比例。 (34 / 1
20 * 100 = 28.333333333333332)
# 4、POST方法为502的请求总数 / POST的总请求数 * 100 = POST 502错误比例。 (48 / 1
20 * 100 = 40 )

为了实现这一目标,我们有两个问题需要解决:
1、标签不一致:
具体问题:两个时间序列的标签集合不完全一致, oldxu_requests_error_total 包含code标签,而 oldxu_requests_instance_total 不包含。
解决方法:使用ignoring(code)来忽略code标签,从而使得两个时间序列在没有code标签的情况下可以匹配。

2、一对多匹配:
具体问题: oldxu_requests_error_total 中的每个数据点,都需要与 oldxu_requests_instance_total 中的总请求数相除。
解决办法:必须明确左侧还是右侧为多的一边,因此我们可以使用 group_left 或 group_right 来指明哪个是“多”,然后进行匹配。

因此完整的PromQL查询如下:
1、使用ignoring(code)忽略左侧查询( oldxu_requests_error_total )中的code标签。
2、使用 group_left 修饰符来确保它能够与标签较少的右侧进行匹配。
3、将匹配后的结果相除,并乘以100得到百分比

# 表达式,group指向 指标结果多的
oldxu_requests_error_total
/ ignoring (code)group_left
oldxu_requests_instance_total * 100

4. PromQL向量匹配示例

1、下载并运行程序,该程序用于模拟“向量匹配相关的”指标数据

https://download.csdn.net/download/littlefun591/89728688?spm=1001.2014.3001.5501
在这里插入图片描述
在这里插入图片描述

[root@jingtian01 ~ ]#mv vectormatch_exporter_jingtian /usr/local/bin/
[root@jingtian01 ~ ]#chmod +x /usr/local/bin/vectormatch_exporter_jingtian 

编写启动脚本

[root@jingtian01 ~ ]#vim /usr/lib/systemd/system/vectormatch_exporter.service
[Unit]
Description=vectormatch_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
ExecStart=/usr/local/bin/vectormatch_exporter_jingtian --port 7002
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
[root@jingtian01 ~ ]#systemctl daemon-reload [root@jingtian01 ~ ]#systemctl start vectormatch_exporter.service 

查看启动状态

systemctl status vectormatch_exporter.service

在这里插入图片描述

浏览器查看数据源
在这里插入图片描述

2、编辑Prometheus配置文件,抓取对应的指标数据

[root@jingtian01 ~ ]#vim /etc/prometheus/prometheus.yml- job_name: "webserver"static_configs:- targets: ["jingtian01:7002"]

重新加载promethues配置文件

[root@jingtian01 ~ ]#curl -X POST http://localhost:9090/-/reload

示例1:一对一向量匹配
在这里插入图片描述

oldxu_requests_status_total{method="GET"} /  ignoring (method) oldxu_requests_total * 100

在这里插入图片描述

示例2:一对多向量匹配
在这里插入图片描述

5. PromQL向量匹配实践

实例1:查询每个实例CPU的各个模式使用的时间占“总CPU的时间”比例是多
少,也是就占多少百分比。
● 1、获取每个实例各个模式占用CPU的时间,按照(instance、mode, job)进行分组并求和;
● 2、获取每个实例总占用CPU时间,按照(instance, job)进行分组求和;
● 3、将每种模式所使用的CPU时间 / CPU总的时间 * 100 = 每种模式占总CPU时间的百分比;

sum(node_cpu_seconds_total) by (instance,mode,job) / ignoring(mode) group_left sum(node_cpu_seconds_total) by (instance,job) * 100

在这里插入图片描述

实例2:查询“每个CPU核心”上不同模式的时间,占总CPU时间的比率是多少,也就是占多少百分比。
1、计算“每个CPU核心”在“各个模式下”的累计CPU使用时间,按照(instance、cpu、mode)进行分组并求和;
2、计算“每个CPU核心的总CPU时间”不区分模式。按照(instance、cpu)进行分组并求和;
3、每个CPU核心的各个模式 / CPU核心的总时间 * 100 = 每个CPU核心的各个模式时间占用百分比

sum(node_cpu_seconds_total) by (instance,cpu,mode) / ignoring (mode) group_left sum(node_cpu_seconds_total) by (instance,cpu) * 100

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419775.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xilinx FPGA 原语解析(二):IBUFDS差分输入缓冲器(示例源码及仿真)

目录 前言: 一、原语使用说明 二、原语实例化代码模版 三、使用示例 1.设计文件代码 2.仿真文件代码 3.仿真结果 前言: 本文主要参考资料xilinx手册,《Xilinx 7 Series FPGA and Zynq-7000 All Programmable SoC Libraries Guide for…

全志A527 A133 A523 T527 T133 H6 H8应用无法开启后台服务

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改4.1 代码修改方法14.2 代码修改方法24.3 代码修改方法35.彩蛋1.前言 像全志的很多平台,普通的app并不能正常的启动后台的服务,这样对于应用层很困扰,无法启动后台的服务,功能就不能正常使用…

【自考zt】【软件工程】【21.10】

关键字: 软件需求基本性质、软件系统需求挑战、耦合(高内容,低无直接)、内聚(初始化时间)、uml包、rup边界类、测试首要目标、单元测试最后工作、性能需求 软件开发本质、软件需求规约三种风格、提炼、用…

【MySQL】MySQL库的操作

目录 创建数据库字符集和效验规则查看系统默认字符集和效验规则查看数据库支持的字符集查看数据库支持的字符集效验规则字符集对数据库的影响 操纵数据库查看数据库显示创建语句修改数据库数据库删除总结 数据库的备份和恢复备份恢复注意事项 查看数据库的连接情况 创建数据库 …

【C++】 Vector

文章目录 1 背景2 什么是 vector?3 vector 特性4 基本函数实现5 基本用法6 例子在 vector 最后移除和插入数据clear() 清除 vector 中所有数据排序访问(直接数组访问&迭代器访问)二维数组两种定义方法 7、参考 1 背景 C 中的容器&#x…

图片转pdf格式怎么弄?非常值得推荐的图片转PDF方法

图片转pdf格式怎么弄?在数字化办公和日常生活中,将图片转换成 PDF 格式已经成为一种常见而有效的处理方式。这种转换不仅能够将多张图片汇总到一个文件中,从而简化管理和共享的过程,还能够确保图像的原始质量和格式不会因不同设备…

WPS如何查看已添加到词典的单词

WPS Office(12.1.0.17827) ① 点击文件,在文件中找到选项 ② 找到拼写检查并点击自定义词典 ③ 如果要删除已添加到词典的"错词",则点击修改 ④ 选择"错词", 点击删除

STM32重定义printf,实现串口打印

在“usart.c”文件中加入以下代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch; }…

快速搞定会议记录,别错过这四款语音识别转文字!

作为一个偶尔需要在办公室做会议记录和采访录音整理的打工人。我表示,真的不想要练手速了,尤其是很多人在讲话的时候并不会在意别人来不来得及记录,只在意自己讲不讲的完,好在后面我找了几款语音识别转文字的工具,可算…

52%回报率背后:GPT-4o量化交易机器人的30天实战传奇

_本文介绍了如何利用GPT-4o,结合量化交易技术创建盈利的交易机器人策略,并通过回溯测试验证这一策略的有效性。 量化交易可以盈利,但只有拥有丰富资源、拥有编码和数学技能的交易者或大型机构才能使用。 但时代变了!现在有了 Cha…

idear获取git项目

最近想下载个ruoyi项目来包装简历,结果打开idear总是上一个项目,找不到get for vcs只好自己捣鼓了,顺便记录留着下次用。 步骤: 1. 2. 3.输入我们想访问的地址 eg: 点击克隆,我们就能获取项目到本地了。

【零基础必看的数据库教程】——SQL WHERE 子句

WHERE 子句用于提取那些满足指定条件的记录,过滤记录。 SQL WHERE 语法: SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明: column1, column2, ...:要选择的字段名称,可以为多个字段。如…

网络层ip协议

一.概念 ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。 ip协议中的一些设备如下: 主机: 配有 IP 地址, 但是不进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 主机和路由器的统…

浅谈OLTP 与 OLAP 数据建模的差异

OLTP 与 OLAP:常见工作流 联机分析处理 (OLAP) 和联机事务处理 (OLTP) 是两种主要的数据处理系统。两者之间存在多种差异。 OLTP 系统旨在处理来自多个用户的多个事务,它们通常用于许多应用程序的后端。例如,在线商务网站将使用 OLTP 系统来…

Spring6梳理7——依赖注入之特殊类型属性

目录 ①字面量赋值 ②null值 ③xml实体 ④CDATA节 ①字面量赋值 什么是字面量? int a10; 字面量是在源代码中用来表示固定值的表示法。几乎所有的计算机编程语言都支持基本值的字面量表示,例如整数、浮点数和字符串。许多语言还支持布尔类…

网络运维管理:确保企业网络系统稳定运行之道

在当今数字化时代,企业网络系统的稳定运行和高效管理是企业业务持续发展和创新的关键。网络运维管理的核心目标正是确保网络设备和服务的高可用性、优化网络性能、保护网络安全、快速解决网络故障以及有效管理网络配置。本文将深入探讨网络运维管理系统的关键组件、…

CSS - 搜索框小动效

点击搜索框动画变长&#xff0c;搜索框有内容不变&#xff0c;无内容失去焦点&#xff0c;变回原来模样。<div :class"type true ? s_r_z : s_r" click"onChange"><div class"input_s"><input blur"handleBlur" v-mo…

计算机毕业设计选题推荐-流浪动物领养管理系统-Java/Python项目实战(亮点:数据可视化分析、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

uniapp 各个端接入腾讯滑动行为验证码示例

验证调起页面&#xff1a; <template><view class"app"><text>{{ obj.ret }}</text><button click"varify">验证</button></view> </template><script>export default{data(){return{obj: {}}},on…

黑马大事件项目开发

项目介绍 演示网站&#xff1a; https://fe-bigevent-web.itheima.net/login 实现 1&#xff09;创建项目 npm init vuelatest2&#xff09;安装项目需要的依赖 npm install element-plus --save npm install axios npm install sass -D3&#xff09;在main.js中加入Elem…