【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

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式