PromQL之选择器和运算符
PromQL 匹配器
- 相等匹配器(=)
选择与提供的字符串完全相同的数据
例:筛选出id=“G1 Eden Space” 的数据
jvm_memory_used_bytes{id="G1 Eden Space"}
- 不相等匹配器(!=)
与相等匹配器相反,用来选择与提供字符串不相同的数据
例:选择 id 不为G1 Eden Space 的数据
jvm_memory_used_bytes{id!="G1 Eden Space"}
- 正则表达式匹配器(=~)
选择与提供的正则表达式相匹配的数据
例:从id 标签中筛选出 G1开头的数据
jvm_memory_used_bytes{id =~ "G1.*"}
- 不等于的正则表达式匹配器(!~)
选择与提供的正则表达式不匹配的数据
例:从id 标签中筛选出 不以G1开头的数据
jvm_memory_used_bytes{id !~ "G1.*"}
jvm_memory_used_bytes 同 {name = “jvm_memory_used_bytes”},也可以用其他匹配器
PromQL 选择器
瞬时向量选择器
返回在指定时间戳查询到的最新样本值
最简单形式:返回包含该指标名称的所有时间序列的瞬时向量
例:筛选出了所有指标为jvm_memory_used_bytes的数据
jvm_memory_used_bytes
区间向量选择器
返回一段时间内的样本数据。通过末尾[]
进行时间定义,如[1m],表示1分钟之内
例:返回一分钟内的数据
jvm_memory_used_bytes[1m]
图中每一条数据都4个样本值,表示1分钟之内采集了4次数据。
可使用的时间单位:秒(s)、分钟(m)、小时(h)、天(d)、周(w)、年(y)
偏移量修改器
可以让瞬时向量和区间向量的时间发生偏移
例:查询前1分钟的jvm_memory_used_bytes 样本值
jvm_memory_used_bytes offset 1m
注意与 jvm_memory_used_bytes[1m] 的区别
@ 修饰符
@ 修饰符能够修改瞬时向量和区间向量的求值时间,使用@时间戳 表示
例:查询 2023-01-18 19:08:59 的 jvm_memory_used_bytes 指标
jvm_memory_used_bytes @1674040139
例:查询2023-01-18 19:08:59 时,前 5分钟的 jvm_memory_used_bytes指标
jvm_memory_used_bytes @1674040139 offset 5m
PromQL 运算符
算术运算符
支持6种算术运算符,加法(+)、减法(-)、乘法(*)、除法(/)、模(%)、幂(^)
例1:计算堆内存使用率 sum(jvm_memory_used_bytes{area=“heap”}) 表示已使用的堆内存 sum(jvm_memory_max_bytes{area=“heap”}) 表示堆总内存
sum(jvm_memory_used_bytes{area="heap"})*100 / sum(jvm_memory_max_bytes{area="heap"})
逻辑运算符
and(并且)、or(或者)、unless(排除)
- vector1 and vector2 :产生一个新的向量,向量中的元素由vector1完全匹配 vector2的元素组成
- vector1 or vector2:产生一个新的向量,由vector1中的元素 和 vector2中不与vector1匹配的元素 组成
- vector1 unless vector2:产生一个新的向量,由vector1 中没有与vector2匹配的元素组成
还是用jvm_memory_used_bytes 指标来举例。
and 示例:
vector1:所有实例的堆内存数据
jvm_memory_used_bytes{area="heap"}
vector2:筛选出 instance=“192.168.0.113:9000”,area=“heap” 数据
jvm_memory_max_bytes{instance="192.168.0.113:9000",area="heap"}
and 运算符后,只保留了instance=“192.168.0.113:9000”,area=“heap” 标签相同的数据
jvm_memory_used_bytes{area="heap"} and jvm_memory_max_bytes{instance="192.168.0.113:9000",area="heap"}
发现 and 运算符并不管 指标名是否一样
or 示例:
为了更加直观,使用另外一个指标http_server_requests_seconds_count
unless 示例:
比较运算符
== 相等、!=不相等、>大于、<小于、>=大于等于、<=小于等于
例:在运算符之后加上bool关键字可以让结果返回0或1
99 >= bool 88
向量匹配
Prometheus 的向量与向量 之间进行运算操作时会基于默认的匹配规则:依次找到与左边向量元素匹配(标签完全一致)的右边向量元素进行运算,如果没有找到匹配元素,直接丢弃。向量匹配主要有:一对一,一对多,多对一。
一对一匹配:
即两遍拥有的标签完全相同,找到唯一一条条目依次进行匹配。
process_open_fds / process_max_fds
如果两边拥有的标签不一致可以用 on 或 ignoring 关键字修改标签间的匹配行为。
on:指定要匹配的标签,只匹配指定的标签。
ignoring:忽略某些标签,就是指定的这些标签不匹配,其他的都匹配。
如下示例中只对 instance 和 job 两个标签进行匹配。
sum by(instance, job) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
/ on (instance, job)
sum by(instance, job) (rate(node_cpu_seconds_total [5m] ))
两个瞬时向量进行比较时都会返回左边的表达式:
如下示例都会返回左边的表达式:可以根据需求来写表达式。
process_open_fds < process_max_fds
process_max_fds > process_open_fds
一对多或多对一匹配: 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>
分组只能用于 比较和算术运算符中
作者其他文章: Grafana 系列文章,版本:OOS v9.3.1
- Grafana 的介绍和安装
- Grafana监控大屏配置参数介绍(一)
- Grafana监控大屏配置参数介绍(二)
- Grafana监控大屏可视化图表
- Grafana 查询数据和转换数据
- Grafana 告警模块介绍
- Grafana 告警接入飞书通知
Spring Boot Admin 系列
相关文章
- 异步结果通知实现——基于Redis实现,我这操作很可以
- 为什么JSON.parse会损坏大数字,如何解决这个问题?
- MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
- 三个步骤,一天就搞定了MySQL,让我顺利拿下了天猫offer
- 基于Huggingface的定制音频数据情感识别
- gget:一款强大的基因组参考数据库的高效查询工具
- 比较CPU和GPU中的矩阵计算
- 服务计算的思考
- Go try 新提案靠谱吗?想简化错误处理了
- Meta元宇宙出狠活!一个摄像头就能捏出个会动的虚拟化身
- Kaggle发布年度调研报告,悬赏3万美元邀请你来「讲故事」
- 悼念!计算机图形学泰斗、中国CAD领域先驱刘慎权先生逝世
- 一篇彻底搞懂MySQL选择AP模型还是CP模型?
- 你和吴彦祖只差一个下巴?上科大提出SCULPTOR:从骨头开始捏脸更靠谱|SIGGRAPH Asia 2022
- Science与之江实验室联合发布:智能计算领域10个重大科学问题
- 又来?美国酝酿新对华技术禁令,目标直指量子计算和AI软件
- 聊聊那些年遇到过的奇葩代码
- Spring Boot下如何记录SQL语句、SQL参数、慢SQL日志
- 软件测试|数据库的内连接,左连接,右链接分别是什么
- TiDB 6.5 LTS 发版