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

本文主要是介绍【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

在这里插入图片描述

这篇关于【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1151793

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被