【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

相关文章

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2