当前位置: 首页 > article >正文

【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.kler.cn/a/297083.html

相关文章:

  • 单片机工程师:创新与挑战之路
  • 网站安全需求分析与安全保护工程
  • SprinBoot+Vue校园数字化图书馆系统的设计与实现
  • Android Fragment 学习备忘
  • guava-Immutable(不可变集合)
  • MybatisPlus 快速入门
  • 硬件工程师笔试面试知识器件篇——电容
  • ActiveMQ 反序列化漏洞复现(CVE-2015-5254)
  • 编译安装调试 scaLapack 和 openmpi 以及 lapack
  • 干货分享:2024四大录音转文字工具推荐!
  • 构建Web3社交平台:DeBox式DApp开发全攻略
  • docker-mysql容器数据卷挂载
  • Qt_环境搭建
  • Benchmark.NET:让 C# 测试程序性能变得既酷又简单
  • 南卡、韶音、墨觉:精选三款旗舰骨传导耳机全面对比评测!
  • Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误
  • ORCAD出BOM--位号在同一个Excel格子里
  • Golang的panic和recover
  • 哈希表,算法
  • 软件工程知识点总结(3):需求分析(二)——分析模型建模