Prometheus(五)——PromQL介绍

2023-11-08

PromQL介绍

Prometheus通过指标名称(metric names)以及对应的一组标签(lables)来唯一定义一条时间序列。
指标名称metric name反应了监控样本的基本标识,label则在这个基本特征上为采集到的数据提供多种特征维度。用户可以基于这些特征维度过滤、聚合,统计从而产生新的计算后的一条时间序列。
PromSQL是Prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询、聚合以及逻辑运算能力的支持。并且广泛的运用于Prometheus的日常应用中,例如对数据的查询、可视化、告警处理等。
可以这么说,PromQL 是Prometheus 所有应用场景的基础,理解和掌握 PromQL 是 Prometheus 入门的第一课。

基本用法

查询时间序列

当Prometheus通过exporters采集到监控指标样本数据后,就可以使用PromQL来完成监控样本数据的查询了。
当直接使用监控指标名称进行查询时,能够查询到该指标下所有时间序列。

例如:
prometheus_http_request_total
相当于
prometheus_http_request_total{}

该表达式会返回指标名称为 prometheus_http_requests_total 的所有时间序列:

prometheus_http_requests_total{code="200",handler="alerts",instance="localhost:
9090",job="prometheus",method="get"}= (20889@1518096812.326)
prometheus_http_requests_total{code="200",handler="graph",instance="localhost:9
090",job="prometheus",method="get"}= (21287@1518096812.326)

Prometheus还支持用户根据时间序列的标签匹配模式来进行时间序列的过滤。
目前主要支持两种匹配模式:

  • 完全匹配
  • 正则匹配

完全匹配

PromSQL支持使用“ = ” 和“ != ”两种完全匹配模式。

使用 label = value 的形式可以选择那些标签符合表达式定义的时间序列
使用 label ! = value的形式可以根据标签排除时间序列

例如,要排除prometheus_http_requests_total时间序列中instance值不为ocalhost:9
090的时间序列:

prometheus_http_requests_total{instance!="localhost:9090"}

反之,要查询prometheus_http_requests_total时间序列中instance值为ocalhost:9
090的时间序列:

prometheus_http_requests_total{instance="localhost:9090"}

正则匹配

prometheus还支持使用正则表达式作为匹配形式,多个表达式之间可使用" | "来分割

使用label = ~regx 来选择那些标签符合表达式定义的时间序列
使用label !~regx来排除不符合表达式的时间序列

例如,想查询多个环境下的时间序列,可以

prometheus_http_requests_total{environment=~"staging|testing|development",method!="GET"}

排除用法:

prometheus_http_requests_total{environment!~"staging|testing|development",method!="GET"}

范围查询

直接使用表达式查询某个标签名称得出的结果往往都是时间序列中最新的一条样本数据,这样的返回结果称为瞬时向量,相对应的这样的表达式称为瞬时向量表达式。
如果想要获取某一区间范围内的样本数据时,就需要使用区间向量表达式。其与瞬时向量表达式的最大区别就是,区间向量表达式需要定义需要查询的时间范围,时间范围通过**时间范围选择器[]**来定义。
例如,通过以下表达式可以返回最近5分钟之内该指标的所有样本数据:

prometheus_http_request_total{}[5m]

返回值

prometheus_http_requests_total{code="200",handler="alerts",instance="localhost:
9090",job="prometheus",method="get"}=[
1@1518096812.326
1@1518096817.326
1@1518096822.326
1@1518096827.326
1@1518096832.326
1@1518096837.325
] 9.
prometheus_http_requests_total{code="200",handler="graph",instance="localhost:9
090",job="prometheus",method="get"}=[
4@1518096812.326
4@1518096817.326
4@1518096822.326
4@1518096827.326
4@1518096832.326
4@1518096837.325
]

通过区间向量表达式得出的样本数据称为区间向量。
除了用m表示分钟之外,PromQL的时间选择器也支持其他时间单位:

标识 含义
s
m 分钟
h 小时
d
w
y

时间位移操作

无论是使用瞬时向量表达式还是区间向量表达式,得到的都是以当前时间为基准的时间序列下的样本数据。
那么如果想要得到5min之前的瞬时向量或是前一天的样本数据呢?
此时就需要使用时间位移操作来对基准时间进行改变,时间位移的关键字为offset
例如:

##5分钟前的该指标的瞬时向量
prometheus_http_request_total{}offset 5m
##前一天内的、该指标的区间向量
prometheus_http_request_total{}[1d]offset [1d]

使用聚合操作

一般情况下,在某指标的标签并非唯一的情况下,会返回不止一条符合标签值的样本数据。
而使用promQL的聚合操作,则可以对时间序列进行进一步的处理,而得出一条新的时间序列。
例如:

# 查询系统所有 http 请求的总量
sum(prometheus_http_request_total)

# 按照 mode 计算主机 CPU 的平均使用时间
ave(node_cpu_seconds_total)by(mode)

# 按照主机查询各个主机的 CPU 使用率
by(instance)

标量和字符串

标量(Scaler)

一个浮点型的数值类型。
标量只有数值,没有时序

10

需要注意的是,当时用表达式count(prometheus_http_request_total),返回的数据类型依然是瞬时向量。用户可以通过内置函数Scaler()来将其变为标量。

字符串

直接使用字符串作为 PromQL 表达式,则会直接返回字符串。

"this is a string"

合法的PromQL表达式

合法规则

合法的表达式必须至少包含一个标量名称(例如 http_request_total)或是不会匹配到空字符串的指标过滤器(例如{code=”200”})。
以下是合法的表达式:

 http_request_total
 http_request_total{}
 {method="get"}

以下是不合法的:

{job=".*"}

标签名称的表达

不仅可以使用 label=value的形式来表示标签名称,还可以使用内置__name__标签
来表示标签名称。

{__name__=~"http_request_total"}
{__name__="~node_disk_bytes_read|node_disk_bytes_written"}

PromQL操作符

使用PromQL除了可以用于快速查询和过滤时间序列之外,还可以通过使用操作符,对时间序列进行进一步的二次加工。这些操作符包括数学操作符、逻辑操作符和布尔操作符等等。

数学运算

PromQL支持的所有数学操作符有:

符号 含义
+ 加法
- 减法
* 乘法
/ 除法
% 取余
^ 幂运算

逻辑运算

布尔运算

PromQL支持的布尔运算符有:

符号 含义
== 等于
!= 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于

使用bool修饰符改变布尔运算符的行为

使用布尔运算符默认执行的一般是对时间序列的过滤,但其实我们会比较需要的是一个具体的布尔值,比如,只需要知道当前模块的 HTTP 请求量是否>=1000,如果大于等于1000 则返回 1(true)否则返回 0(false)。这里使用bool修饰符就可以改变布尔运算的默认行为。

prometheus_http_requests_total > bool 1000

另外,两个标量之间使用布尔运算必须使用bool修饰符
例如:

1 == bool 11 
输出结果为0
2 == bool 2	
输出结果为1

使用集合运算符

使用瞬时向量表达式能够获得一个包含多个时间序列的数据集合,我们称之为瞬时向量。
通过集合运算,可以在两个瞬时向量之间进行相应的集合操作。
目前,Prometheus支持的聚合运算符有:

运算符 含义
and 并且
or 或者
unless 排除
  • vector1 and vector2
    会产生一个由vector1组成的新向量。
    该向量包含vector1中完全匹配vector2中的元素产生。
  • vector1 or vector2
    会产生一个包含vector1的所有样本数据,以及vector2中不与vector1匹配的元素组成的新向量。
  • vector1 unless vector2
    会产生一个新的向量,新向量中的元素由 vector1 中没有与
    vector2 匹配的元素组成。

操作符优先级

对于复杂的正则表达式,需要知道操作符的优先级。
例如:

100 * (1 - avg (irate(node_cpu_seconds_total{mode='idle'}[5m])) by(job) )

其中 irate 是 PromQL 中的内置函数,用于计算区间向量中时间序列每秒的即时增长率
在 PromQL 操作符中优先级由高到低依次为:

  • ^
  • *, / , %
    • , -
  • =, !=,< = ,>=
  • and ,unless
  • or

PromQL聚合操作

Prometheus提供了以下的内置的聚合操作符,作用于瞬时向量
将瞬时向量返回的样本数据进行聚合,形成一个新的时间序列。

聚合操作符 含义
sum 求和
min 最小值)
max 最大值
avg 平均值
stddev 标准差
stdvar 标准差异
count 计数
count_values 对 value 进行计数
bottomk 后 n 条时序
topk 前 n 条时序
quantile 分布统计
使用聚合操作符的表达形式为:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

其中只有 count_values , quantile , topk , bottomk 支持参数(parameter)。
without用于将计算结果中不符合条件的标签筛去,留下需要的标签
by则正好相反,是将符合需要标签的结果留下。
例如:

sum(prometheus_http_request_total)without(instance)
等价于
sum(prometheus_http_request_total)by(code,handler,job,method)

如果只需要计算整个应用的 HTTP 请求总量,可以直接使用表达式:

sum(prometheus_http_requests_total)

count_values 用于时间序列中每一个样本值出现的次数
count_values 会为每一个唯一的样本值输出一个时间序列,并且每一个时间序列包含一个额外的标签。
例如:

count_values("count", prometheus_http_requests_total)

topk 和 bottomk 则用于对样本值进行排序,返回当前样本值前 n 位,或者后 n 位的时间序列。
获取 HTTP 请求数前 5 位的时序样本数据,可以使用表达式:

topk(5, prometheus_http_requests_total)

quantile 用于计算当前样本数据值的分布情况 quantile(φ, express)其中 0 ≤ φ ≤ 1。
例如,当φ为 0.5 时,即表示找到当前样本数据中的中位数:

quantile(0.5, prometheus_http_requests_total)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus(五)——PromQL介绍 的相关文章

随机推荐

  • 人工神经网络和神经网络,人工神经网络排名第一

    当今人工神经网络界的顶尖人物 5 Donald O Hebb Hebbian learning John J Hopfield Hopfield NN classic recurrent NN Stephen Grossberg Gross
  • BUCK电路分析设计(一)/备忘

    用于DC DC转换的降压型BUCK电路如图所示 基本工作原理为 输入一占空比为D的脉冲信号 当信号低电平时PMOS开启 NMOS关闭 电源通过PMOS 流经电感 并对电容与负载充电 电感电流线性上升 斜率为 VIN VO L 当信号为高电平
  • STM32学习记录2 1.26

    本人为纯纯初学者 水平非常低 写文章只是为了记录学习经历 并且输出文字加强理解与记忆 本文十分不严谨 只具参考作用 可能具有误导性 请谨慎阅读 如果各位dalao发现错误 欢迎友善的指正 建议与讨论 初入CSDN 对平台的规范不是很熟悉 还
  • 手机数据线连接电脑,电脑不仅可以读定手机文件,还可以通过手机热点进网...

    环境 一台正在通WIFI上网的手机 红米2 一台不能上网的华硕笔记本电脑 1 打开手机的设置 gt 其他连接方式 gt 网络热点 然后可以看到这样的一个名称 USB共享网络 这是个开关 默认的灰色的 当手机用数据线连接笔记本的电脑的时候 它
  • 什么是分而治之?

    分而治之 从语文上来说 有两个意思 1 分别治理 2 利用手段使国家 民族或宗教等产生分裂 然后对其进行控制和统治 而从软件工程来看 是一种方法 是有效算法设计中普遍采用的一种技术 所谓 分而治之 就是把一个复杂的算法问题按一定的 分解 方
  • 动力节点Spring Boot3项目版实战教程,学练一体,轻松掌握

    Spring Boot 3是一个非常令人期待的版本 将进一步扩大Spring Boot框架在应用程序开发领域的影响力 并带来更加出色的开发体验 Spring Boot 3的推出 带来个更多的新特性和功能 也为开发人员提供更高效 更优秀的开发
  • 中医四诊之五音 --详解

    from 老中医 LaoZY cn 医家箴言 肝呼应角 心言应徵 脾歌应宫 肺哭应商 肾呻应羽 五脏五声 以合五音 素问 阴阳应象大论 曰 视喘息 听音声 而知所苦 盖病苦于中 声发于外 有不可诬者也 故 难经 六十一难 曰 闻其五音以别其
  • Django rest_framework开发一组RESTFUL标准接口[ModelSerializer+GenericAPIView]

    Django rest framework开发一组RESTFUL标准接口 ModelSerializer GenericAPIView 不管何等复杂的业务逻辑 不管何等高效的开发框架 对后端来说最终都要落到对具体的某一个关系模型的增删改查上
  • 各类文件对应Content-Type

    两种初始化Map常量 1 new HashMap 2 static 静态代码块 static Map
  • 微信小程序:心跳动画

    封装工具类 var app getApp module exports animationMiddleHeaderItem animationMiddleHeaderItem 心跳动画 平移动画 function animationMidd
  • linux部署jenkins报错:ModuleNotFoundError: No module named ‘XXX‘已解决

    项目场景 实现接口自动化python jenkins allure 部署环境 linux中部署jenkins容器 容器需安装jdk python环境 python脚本 放入jenkins容器中 allure 安装在容器中 jenkins配置
  • JS逆向 -- 开发者工具介绍

    一 打开方式 1 通过快捷键F12 2 通过浏览器设置打开 二 常用的功能 1 元素 显示前端的相关东西 2 控制台 可以动态获取某些变量的值 比如获取当前页面的cookie值 3 源代码 动态调试的时候用到 可以下断点查看堆栈等相关操作
  • Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

    19行代码 把图片写到如excel 1 引言 2 代码实战 2 1 思路 2 2 文件准备 2 3 实战 2 3 1 安装 2 3 2 代码实战 3 总结 1 引言 小屌丝 鱼哥 新年快乐 小鱼 新年快乐 小屌丝 虽然是元旦 但是也算是迈入
  • Python 安装第三方库详解(含离线)

    文章目录 1 Python 在线安装第三方库 1 1 在 cmd 中运行 pip install xx 1 2 在 Pycharm 中安装 2 Python 离线安装第三方库 2 1 从官方库下载 1 Python 在线安装第三方库 1 1
  • 深度学习图像增强---python库imgaug

    图像增强python库imgaug landmark 增强 segmentation 增强 imgaug用来做图像增强的一个python库 1 图像增强是在小样本以及提高模型泛化能力的通常采用的措施 下面总结一下我之前用到过的一些内容 la
  • 虚拟机网卡不见了

    有的时候不知道为什么虚拟机就是不能上网 郁闷 排除了虚拟机网卡被禁用之类的原因的话 看下系统时间 如果没有跟物理机器时间一致 改成一样试试看
  • DBA典型的工作职责

    下面不是全部列表 但是包括了DBA的典型职责 把监视数据库实例当作每日必做工作以保证其可用性 解决不可用的问题 收集系统统计和性能信息以便定向和配置分析 配置和调整数据库实例以便在应用程序特定要求下达到最佳性能 分析和管理数据库安全性 控制
  • diff和patch使用指南

    diff和patch是一对工具 在数学上来说 diff是对两个集合的差运算 patch是对两个集合的和运算 diff比较两个文件或文件集合的差异 并记录下来 生成一个diff文件 这也是我们常说的patch文件 即补丁文件 patch能将d
  • 苹果手机忘记密码锁屏了怎么办,有什么处理方法可解

    我们平时用手机 不管什么牌子的手机 都会设置锁屏密码 是为更好的保护自己的隐私信息 但人有时候就是会犯这样的蠢事 蠢到自己都想哭 就是忘记锁屏密码 手机打不开 要是遇到什么急事 真的是快被自己气死 以苹果手机为例 那接下来由小编分享苹果手机
  • Prometheus(五)——PromQL介绍

    这里写自定义目录标题 PromQL介绍 基本用法 查询时间序列 完全匹配 正则匹配 范围查询 时间位移操作 使用聚合操作 标量和字符串 标量 Scaler 字符串 合法的PromQL表达式 合法规则 标签名称的表达 PromQL操作符 数学