【博客619】PromQL如何实现Left joins以及不同metrics之间的复杂联合查询
PromQL如何实现Left joins以及不同metrics之间的复杂联合查询
1、场景
我们需要在PromQL中实现类似SQL中的连接查询:
SELECT a.value*b.value, * FROM a, b
2、不同metrics之间的复杂联合查询
-
瞬时向量与瞬时向量之间进行数学运算:
例如:根据node_disk_bytes_written和node_disk_bytes_read获取主机磁盘IO的总量:
node_disk_bytes_written + node_disk_bytes_read这个表达式工作原理:
- 依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没找到匹配元素,则直接丢弃。同时新的时间序列将不会包含指标名称。
- 该表达式返回结果的示例如下所示:
{device=“sda”,instance=“localhost:9100”,job=“node_exporter”}=>1634967552@1518146427.807 + 864551424@1518146427.807
-
使用bool修饰符改变布尔运算符的行为
布尔运算符的默认行为是对时序数据进行过滤。而有时候需要的是真正的布尔结果。例如:
只需知道HTTP请求量是否>=1000,若大于等于1000则返回1(true)否则返回0(false)。这时可以使用bool修饰符改变布尔运算的默认行为。 例如:http_requests_total > bool 1000
使用bool修改符后,布尔运算不会对时间序列进行过滤,而是直接依次瞬时向量中的各个样本数据与标量的比较结果0或者1。从而形成一条新的时间序列:
http_requests_total{code=“200”,instance=“localhost:9090”,method=“get”} 1 -
一对一匹配
一对一匹配模式会从操作符两边表达式获取的瞬时向量依次比较并找到唯一匹配(标签完全一致)的样本值。
默认情况下,使用表达式:vector1 vector2
操作符两边表达式标签不一致,可用on(label list)或ignoring(label list)修改便签匹配行为。
- 使用ignoreing可以在匹配时忽略某些便签:
- {vector expr} 运算符 ignoring(
- 而on则用于将匹配行为限定在某些便签之内。
- {vector expr} 运算符 on(
例如当存在样本:
method_code:http_errors:rate5m{method=“get”, code=“500”} 24
method_code:http_errors:rate5m{method=“get”, code=“404”} 30
method_code:http_errors:rate5m{method=“put”, code=“501”} 3
method_code:http_errors:rate5m{method=“post”, code=“500”} 6
method_code:http_errors:rate5m{method=“post”, code=“404”} 21method:http_requests:rate5m{method=“get”} 600
method:http_requests:rate5m{method=“del”} 34
method:http_requests:rate5m{method=“post”} 120使用PromQL表达式:
method_code:http_errors:rate5m{code=“500”} / ignoring(code) method:http_requests:rate5m该表达式会返回在过去5分钟内,HTTP请求状态码为500的在所有请求中的比例。
如果没有使用ignoring(code),操作符两边表达式返回的瞬时向量中将找不到任何一个标签完全相同的匹配项,因此结果如下:{method=“get”} 0.04 // 24 / 600
{method=“post”} 0.05 // 6 / 120同时由于method为put和del的样本找不到匹配项,因此不会出现在结果当中。
- 使用ignoreing可以在匹配时忽略某些便签:
-
多对一和一对多:即下面的Left joins与Right joins
多对一和一对多两种匹配模式指的是“一”侧的每一个向量元素可以与"多"侧的多个元素匹配的情况。在这种情况下,必须使用group修饰符:group_left或者group_right来确定哪一个向量具有更高的基数(充当“多”的角色)。
-
聚合查询
-
常见聚合函数:
sum (calculate sum over dimensions)
min (select minimum over dimensions)
max (select maximum over dimensions)
avg (calculate the average over dimensions)
group (all values in the resulting vector are 1)
stddev (calculate population standard deviation over dimensions)
stdvar (calculate population standard variance over dimensions)
count (count number of elements in the vector)
count_values (count number of elements with the same value)
bottomk (smallest k elements by sample value)
topk (largest k elements by sample value)
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) -
用法
- 运算符 [without|by (label list)] ([parameter,] {vector expr})
- 运算符([parameter,] {vector expr}) [without|by (label list)]
-
区别:
- without 从结果向量中删除列出的标签,而所有其他标签都保留在输出中。 by 做相反的事情并删除未在 by 子句中列出的标签,即使它们的标签值在向量的所有元素之间都是相同的
-
example:
- sum without (instance) (http_requests_total)
- sum by (application, group) (http_requests_total)
-
3、PromQL如何实现Left joins,即实现:多对一和一对多查询
group_left或者group_right:
多对一和一对多两种匹配模式指的是“一”侧的每一个向量元素可以与"多"侧的多个元素匹配的情况。在这种情况下,必须使用group修饰符:group_left或者group_right来确定哪一个向量具有更高的基数(充当“多”的角色)。
语法:
<vector expr> <bin-op> ignoring(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> ignoring(<label list>) group_right(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_left(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) group_right(<label list>) <vector expr>
场景:
多对一和一对多两种模式一定是出现在操作符两侧表达式返回的向量标签不一致的情况。因此需要使用ignoring和on修饰符来排除或者限定匹配的标签列表。
示例:
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="get", code="404"} 30
method_code:http_errors:rate5m{method="put", code="501"} 3
method_code:http_errors:rate5m{method="post", code="500"} 6
method_code:http_errors:rate5m{method="post", code="404"} 21method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
查询:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
该表达式中,左向量method_code:http_errors:rate5m包含两个标签method和code。而右向量method:http_requests:rate5m中只包含一个标签method,因此匹配时需要使用ignoring限定匹配的标签为code。 在限定匹配标签后,右向量中的元素可能匹配到多个左向量中的元素 因此该表达式的匹配模式为多对一,需要使用group修饰符group_left指定左向量具有更好的基数。
最终的运算结果如下:
{method="get", code="500"} 0.04 // 24 / 600
{method="get", code="404"} 0.05 // 30 / 600
{method="post", code="500"} 0.05 // 6 / 120
{method="post", code="404"} 0.175 // 21 / 120
提醒:group修饰符只能在比较和数学运算符中使用。在逻辑运算and,unless和or才注意操作中默认与右向量中的所有元素进行匹配。
4、PromQL vs SQL
示例1:
SQL:
SELECT a.value*b.value, * FROM a, b
PromQL:
a * b
示例2:
SQL:
SELECT a.value * b.value, a.foo, a.bar
FROM a INNER JOIN b ON (a.foo == b.foo AND a.bar == b.bar)
PromQL:
a * on (foo, bar) b
示例3:
SQL:
SELECT a.value * b.value, a.*, b.baz
FROM a JOIN b ON (a.foo == b.foo AND a.bar == b.bar)
PromQL:
a * on (foo, bar) group_left(baz) b
相关文章:
【博客619】PromQL如何实现Left joins以及不同metrics之间的复杂联合查询
PromQL如何实现Left joins以及不同metrics之间的复杂联合查询 1、场景 我们需要在PromQL中实现类似SQL中的连接查询: SELECT a.value*b.value, * FROM a, b2、不同metrics之间的复杂联合查询 瞬时向量与瞬时向量之间进行数学运算: 例如:根…...
Win11自定义电脑右下角时间显示格式
Win11自定义电脑右下角时间显示格式 一、进入附加设置菜单 1、进入控制面板,选择日期和时间 2、选择修改日期和时间 3、选择修改日历设置 4、选择附加设置 二、自定义时间显示出秒 1、在选项卡中,选时间选项卡 2、在Short time的输入框中输入H:m…...
TrueNas篇-trueNas Scale安装
安装TrueNAS Scale 在尝试trueNas core时发下可以成功安装,但是一直无法成功启动,而且国内对我遇见的错误几乎没有案例,所以舍弃掉了,而且trueNas core是基于Linux的,对Linux的生态好了很多,还可以可以在t…...
element表单搜索框与表格高度自适应
一般在后台管理系统中,表单搜索框和表格的搭配是非常常见的,如下所示: 在该图中,搜索框有五个,分为了两行排列。但根据大多数的UI标准,搜索框默认只显示一行,多余的需要进行隐藏。此时的页面被…...
MySQL使用技巧整理
title: MySQL使用技巧整理 date: 2021-04-11 00:00:00 tags: MySQL categories:数据库 重建索引 索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面…...
七大设计原则之里氏替换原则应用
目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时,程序 P…...
1行Python代码去除图片水印,网友:一干二净
大家好,这里是程序员晚枫。 最近小明在开淘宝店(店名:爱吃火锅的少女),需要给自己的原创图片加水印,于是我上次给她开发了增加水印的功能:图片加水印,保护原创图片,一行…...
Connext DDS属性配置参考大全(2)
DDSSecure安全com.rti.servcom.rti.serv.load_plugin...
一起Talk Android吧(第四百九十二回:精简版动画)
文章目录概念介绍使用方法示例代码经验总结各位看官们大家好,上一回中咱们说的例子是"动画集合:AnimatorSetBuilder",这一回中咱们说的例子是" 精简版动画"。闲话休提,言归正转,让我们一起Talk Android吧&…...
seata源码-全局事务回滚服务端源码
这篇博客来记录在发起全局事务回滚时,服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中,有说到过,事务发起者在发现分支事务执行异常之后,会提交全局事务回滚的请求到netty服务端,这里是发…...
【Vue3源码】第一章 effect和reactive
文章目录【Vue3源码】第一章 effect和reactive前言1、实现effect函数2、封装track函数(依赖收集)3、封装reactive函数4、封装trigger函数(依赖触发)5、单元测试【Vue3源码】第一章 effect和reactive 前言 今天就正式开始Vue3源码…...
C函数指针
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、数组或字符型等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明:typedef int (*fun_ptr)(int,int); // 声明一个指…...
2023同等学力申请硕士计算机综合国考
同等学力国考报名要开始了 2023年2月15日,中国教育考试网和“全国同等学力人员申请硕士学位管理工作信息平台”(https://tdxl.chsi.com.cn,联系服务电话:010-67410388)公布报名工作通知。考生须按照通知要求进行注册或…...
英语基础-并列句概述
什么是并列句?并列句就是用连词把独立的句子连接起来,使得句子之间产生并列的逻辑。 1. 并列句中的逻辑 1. 小明步行上学,小红骑自行车上班。 Ming goes to school on foot,and Hong goes to work by bike. 平行逻辑 2. 小红经常玩手机…...
大数据框架之Hadoop:HDFS(一)HDFS概述
1.1HDFS产出背景及定义 HDFS 产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件…...
20230210组会论文总结
目录 【Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method】 【ShuffleMixer: An Efficient ConvNet for Image Super-Resolution】 【A Close Look at Spatial Modeling: From Attention to Convolution 】 【DEA-Net: Single i…...
Python - 数据容器dict(字典)
目录 字典的定义 字典数据的获取 字典的嵌套 字典的各种操作 新增与更新元素 [Key] Value 删除元素 pop和del 清空字典 clear 获取全部的键 keys 遍历字典 容器通用功能总览 字典的定义 使用{},不过存储的元素是一个个的:键值对&#…...
傻白探索Chiplet,文献阅读笔记汇总(十二)
Summary(方便分类管理) Article(文献出处) 方便再次搜索 Data(文献数据) 总结归纳,方便理解 Comments(对文献的想法)/Why(为什么看这篇文献)强…...
#电子电气架构——Vector工具常见问题解决三板斧
我是穿拖鞋的汉子,魔都中一位坚持长期主义的工科男。 今天在与母亲聊天时,得到老家隔壁邻居一位大姐年初去世的消息,挺让自己感到伤感!岁月如流水,想抓都抓不住。想起平时自己加班的那个程度,可能后续也要自己注意身体啦。 老规矩,分享一段喜欢的文字,避免自己成为高知…...
文本三剑客之grep
Grep是Linux用户用来搜索文本字符串的命令行工具。您可以使用它在文件中搜索某个单词或单词的组合,也可以将其他Linux命令的输出通过管道传输到grep,因此grep可以仅显示您需要查看的输出。grep的命令格式如下:grep 选项 查找条件 目标文件…...
Wan2.2-I2V-A14B prompt工程实战:如何编写提示词控制视频运动风格
Wan2.2-I2V-A14B prompt工程实战:如何编写提示词控制视频运动风格 1. 引言 想让AI生成的视频动起来更自然、更有电影感吗?Wan2.2-I2V-A14B模型可以帮你实现这个目标,但关键在于如何写好提示词。就像导演给演员说戏一样,好的提示…...
ValveResourceFormat:突破Source 2资源壁垒的深度解析方案
ValveResourceFormat:突破Source 2资源壁垒的深度解析方案 【免费下载链接】ValveResourceFormat 🔬 Valves Source 2 resource file format parser, decompiler, and exporter. 项目地址: https://gitcode.com/gh_mirrors/va/ValveResourceFormat …...
FlowState Lab助力前端3D渲染:WebGL中的实时波动表面生成
FlowState Lab助力前端3D渲染:WebGL中的实时波动表面生成 1. 引言:当科学计算遇上Web可视化 想象一下,气象学家正在分析海洋洋流数据,地质学家在研究地震波传播模式,或者游戏开发者需要实时生成动态水面效果。这些场…...
零基础如何成为AI产品经理?从零到高薪!3步拿下字节跳动AI产品经理Offer,附大厂真实JD拆解
在AI浪潮席卷各行各业的今天,AI产品经理已成为最炙手可热的职业之一。据行业数据显示,2026年1-2月新发AI岗位量同比增长约12倍,AI产品经理平均月薪突破6万元,薪资普遍在30K-60K之间。本文将从岗位认知、技能要求、学习路径、招聘市…...
3种方案解决TranslucentTB启动失败问题:从诊断到预防的完整指南
3种方案解决TranslucentTB启动失败问题:从诊断到预防的完整指南 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB TranslucentTB是一款备受欢迎的任务栏美化工具,能够实现Windows任务栏的透明效果&a…...
告别臃肿:优化jpackage打包的Java应用体积,从100M+瘦身到几十兆的配置技巧
深度优化jpackage打包体积:从百兆到几十兆的实战指南 Java开发者常面临一个尴尬的现实——用jpackage打包的应用程序体积动辄超过100MB,尤其是包含JavaFX的GUI应用。这种"臃肿"不仅影响分发效率,还会拖慢启动速度。本文将揭示jpack…...
Phi-4-Reasoning-Vision实战教程:自定义图片处理器适配PDF扫描件
Phi-4-Reasoning-Vision实战教程:自定义图片处理器适配PDF扫描件 1. 工具概览 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具。它专为双卡RTX 4090环境优化,通过Streamlit搭建了直观的交互界面&am…...
基于STM32MP157与OpenCV的嵌入式Linux人脸识别系统从零构建实战
1. 项目背景与核心价值 第一次拿到STM32MP157开发板时,我盯着这个巴掌大的板子有点发懵——这玩意儿真能跑人脸识别?事实证明它不仅能够,还能跑得很流畅。这个基于Cortex-A7内核的跨界处理器,配合OpenCV这个计算机视觉界的"瑞…...
SenseVoice-small-onnx企业落地实操:REST API集成语音转写服务完整方案
SenseVoice-small-onnx企业落地实操:REST API集成语音转写服务完整方案 语音转写技术正成为企业数字化转型的关键工具,从会议记录到客服质检,从多媒体内容处理到实时语音分析,高效准确的语音识别能力正在各个行业创造着实际价值。…...
Wan2.2-I2V-A14B参数详解:分辨率/时长/显存占用调优实战指南
Wan2.2-I2V-A14B参数详解:分辨率/时长/显存占用调优实战指南 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像,针对RTX 4090D 24GB显存显卡进行了深度适配。本镜像内置完整的运行环境和优化组件,开箱即用&…...
