Prometheus-3:一文详解promQL
读前提示:
本文字数较多且紧凑,最好预留15min一次性看完,好营养,易吸收。
promQL详解
PromQL基本介绍
- 指标名称代表着监控目标上某类可测量属性的基本特征标识
- 标签则是这个基本特征上再次细分的多个可测量维度
- 数据采集以特定的时间周期进行,因而,随着时间流逝,将这些样本数据记录下来,将生成一个离散的样本数据序列
- 该序列也称为向量(Vector);而将多个序列放在同一个坐标系内(以时间为横轴,以序列为纵轴),将形成一个由数据点组成的矩阵
Prometheus数据模型
- 例如,http_requests_total表示接收到的HTTP请求总数;
- 支持使用字母、数字、下划线和冒号,且必须能匹配RE2规范的正则表达式;
- 例如,http_requests_total{method=GET}和http_requests_total{method=POST}代表着两个不同的时间序列;
- 标签名称可使用字母、数字和下划线,且必须能匹配RE2规范的正则表达式;
- 以“_ _”为前缀的名称为Prometheus系统预留使用
指标名称及标签使用注意事项
- 指标名称相同,但标签不同的组合分别代表着不同的时间序列
- 不同的指标名称自然更是代表着不同的时间序列
promQL的数据类型
- 即时向量(Instant Vector):特定或全部的时间序列集合上,具有相同时间戳的一组样本值称为即时向量;
- 范围向量(Range Vector):特定或全部的时间序列集合上,在指定的同一时间范围内的所有样本值;
- 标量(Scalar):一个浮点型的数据值;
- 字符串(String):支持使用单引号、双引号或反引号进行引用,但反引号中不会对转义字符进行转义
数据类型演示
- 即时向量,例如:node_cpu_seconds_total{job="nodes"},返回同一时间一组样本值
- 范围向量,例如:node_cpu_seconds_total{job="nodes"}[1m],返回1min内的所有样本值
- 标量,例如:irate(node_cpu_seconds_total{job="nodes"}[1m]),返回一个浮点型的数据值
- 字符串,例如:node_cpu_seconds_total{job="nodes"},"nodes"就是字符串类型。
向量表达式使用要点
- 需要将返回值绘制成图形时,仅支持即时向量类型的数据
- 对于诸如rate一类的速率函数来说,其要求使用的却又必须是范围向量型的数据
匹配器
- =:选择与提供的字符串完全相同的标签
- !+:选择与提供的字符串不相同的标签
- =~:选择正则表达式与提供的字符串(或子字符串)相匹配的标签
- !~:选择正则表达式与提供的字符串(或子字符串)不匹配的标签。
- 匹配到空标签值的匹配器时,所有未定义该标签的时间序列同样符合条件
- 正则表达式将执行完全锚定机制,它需要匹配指定标签的整个值
- 向量选择器至少要包含一个指标名称,或者至少有一个不会匹配到空字符串的匹配器
- 使用"__name__"作为标签名称,还能够对指标名称进行过滤,例:{name=~"http_request.*"}
即时向量选择器
- 指标名称:用于限定特定指标下的时间序列,即负责过滤指标;可选;
- 匹配器(Matcher):或称为标签选择器,用于过滤时间序列上的标签;定义在{}之中;可选;
- 仅给定指标名称,或在标签名称上使用了空值的匹配器,例如node_cpu_seconds_total和node_cpu_seconds_total{}相等
- 仅给定匹配器,返回所有符合给定匹配器的所有时间的即使样本,例如:{job="nodes"}
- 指标名称和匹配器的组合,返回符合条件的所有时间序列上的即时样本,例如上边的node_cpu_seconds_total{job="nodes"}
范围向量选择器
- 时间范围:以当前时间为基准时间点,指向过去一个特定的时间长度;例如[5m]便是指过去5分钟之内;
- 时间格式:一个整数后紧跟一个时间单位,例如“5m”中的“m”即是时间单位;
- 可用的时间单位有ms(毫秒)、s(秒)、m(分钟)、h(小时)、d(天)、w(周)和y(年);
- 必须使用整数时间,且能够将多个不同级别的单位进行串联组合,以时间单位由大到小为顺序,例如1h30m,但不能使用1.5h;
偏移量修改器
- “http_requests_total offset 5m”,表示获取以http_requests_total为指标名称的所有时间序列在过去5分钟之时的即时样本
- “http_requests_total[5m] offset 1d”,表示获取距此刻1天时间之前的5分钟之内的所有样本
PromQL的指标类型
- Counter:计数器,单调递增,除非重置(例如服务器或进程重启)
- Gauge:仪表盘,可增可减的数据
- Histogram:直方图,将时间范围内的数据划分成不同的时间段,并各自评估其样本个数及样本值之和,因而可计算出分位数
- 可用于分析因异常值而引起的平均值过大的问题
- 分位数计算要使用专用的histogram_quantile函数
- Summary:类似于Histogram,但客户端会直接计算并上报分位数
Counter
- rate(http_requests_total[2h]),获取2小内,该指标下各时间序列上的http总请求数的增长速率;
- topk(3, http_requests_total),获取该指标下http请求总数排名前3的时间序列;
- irate(http_requests_total[2h]),高灵敏度函数,用于计算指标的瞬时速率;
- 基于样本范围内的最后两个样本进行计算,相较于rate函数来说,irate更适用于短期时间范围内的变化速率分析;
Gauge
- predict_linear(v range-vector, t, scalar)函数可以预测时间序列v在t秒后的值,它通过线性回归的方式来预测样本数据的Gauge变化趋势;
- predict_linear(node_sockstat_TCP_inuse{node_port="9100"}[2h],4*3600)根据近两小时的数据,预测出接下来4小时的tcp socket的活跃连接数
- delta(v range-vector)函数计算范围向量中每个时间序列元素的第一个值与最后一个值之差,从而展示不同时间点上的样本值的差值;
- delta(node_netstat_Tcp_CurrEstab{node_port="9100"}[2h]),返回该服务器活跃状态的TCP连接数与2小时之前的差异;
Histogram
- 它一般用横轴表示某个指标维度的数据取值区间,用纵轴表示样本统计的频率或频数,从而能够以二维图的形式展现数值的分布状况
- 为了构建Histogram,首先需要将值的范围进行分段,即将所有值的整个可用范围分成一系列连续、相邻(相邻处可以是等同值)但不重叠的间隔,而后统计每个间隔中有多少值
- 从统计学的角度看,分位数不能被聚合,也不能进行算术运算
- Histogram事先将特定测度可能的取值范围分隔为多个样本空间,并通过对落入bucket内的观测值进行计数以及求和操作
- 与常规方式略有不同的是,Prometheus取值间隔的划分采用的是累积(Cumulative)区间间隔机制,即每个bucket中的样本均包含了其前面所有bucket中的样本,因而也称为累积直方图:
- 可降低Histogram的维护成本
- 支持粗略计算样本值的分位数
- 单独提供了_sum和_count指标,从而支持计算平均值
- _bucket{le=""}:观测桶的上边界(upper inclusive bound),即样本统计区间,最大区间(包含所有样本)的名称为_bucket{le="+Inf"};
- _sum:所有样本观测值的总和;
- _count :总的观测次数,它自身本质上是一个Counter类型的指标;
- histogram_quantile()函数在计算分位数时会假定每个区间内的样本满足线性分布状态,因而它的结果仅是一个预估值,并不完全准确;
- 预估的准确度取决于bucket区间划分的粒度;粒度越大,准确度越低;
Summary
- Summary是一种类似于Histogram的指标类型,但它在客户端于一段时间内(默认为10分钟)的每个采样点进行统计,计算并存储了分位数数值,Server端直接抓取相应值即可;
- 但Summary不支持sum或avg一类的聚合运算,而且其分位数由客户端计算并生成,Server端无法获取客户端未定义的分位数,而Histogram可通过PromQL任意定义,有着较好的灵活性;
- {quantile="<φ>"},其中φ是分位点,其取值范围是(0 ≤φ≤ 1);计数器类型指标;如下是几种典型的常用分位点;
- 0、0.25、0.5、0.75和1几个分位点;
- 0.5、0.9和0.99几个分位点;
- 0.01、0.05、0.5、0.9和0.99几个分位点;
- _sum,抓取到的所有样本值之和;
- _count,抓取到的所有样本总
Prometheus的聚合函数
聚合表达式
- ([parameter,] ) [without|by ()]
- [without|by ()] ([parameter,] )
- without:从结果向量中删除由without子句指定的标签,未指定的那部分标签则用作分组标准;
- by:功能与without刚好相反,它仅使用by子句中指定的标签进行聚合,结果向量中出现但未被by子句指定的标签则会被忽略;
- 为了保留上下文信息,使用by子句时需要显式指定其结果中原本出现的job、instance等一类的标签
11个聚合函数
- sum( ):对样本值求和;
- avg ( ) :对样本值求平均值,这是进行指标数据分析的标准方法;
- count ( ) :对分组内的时间序列进行数量统计;
- stddev ( ) :对样本值求标准差,以帮助用户了解数据的波动大小(或称之为波动程度);
- stdvar ( ) :对样本值求方差,它是求取标准差过程中的中间状态;
- min ( ) :求取样本值中的最小者;
- max ( ) :求取样本值中的最大者;
- topk ( ) :逆序返回分组内的样本值最大的前k个时间序列及其值;
- bottomk ( ) :顺序返回分组内的样本值最小的前k个时间序列及其值;
- quantile ( ) :分位数用于评估数据的分布状态,该函数会返回分组内指定的分位数的值,即数值落在小于等于指定的分位区间的比例;
- count_values ( ) :对分组内的时间序列的样本值进行数量统计;
二元运算符
支持的运算:
- 两个标量间运算;
- 即时向量和标量间的运算:将运算符应用于向量上的每个样本;
- 两个即时向量间的运算:遵循向量匹配机制;
算术运算
比较运算
逻辑/集合运算
二元运算符优先级
- ^
- *, /, %
- +, -
- ==, !=, <=, <, >=, >
- and, unless
- or
- 具有相同优先级的运算符满足结合律(左结合),但幂运算除外,因为它是右结合机制;
- 可以使用括号( )改变运算次序;
向量匹配
- 一对一 (One-to-One)
- 一对多或多对一 (Many-to-One, One-to-Many)
向量一对一匹配
- 从运算符的两边表达式所获取的即时向量间依次比较,并找到唯一匹配(标签完全一致)的样本值;
- 找不到匹配项的值则不会出现在结果中;
<vector expr> <bin-op> ignoring(<label list>) <vector expr>
<vector expr> <bin-op> on(<label list>) <vector expr>
举例
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"} 21 method: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{code="500"} / ignoring(code) method:http_requests:rate5m
#左边
method_code:http_errors:rate5m{method="get", code="500"} 24
method_code:http_errors:rate5m{method="post", code="500"} 6 #右边
method: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{method="get"} 24
method_code:http_errors:rate5m{method="post"} 6 #右边
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
向量一对多/多对一匹配
- “一”侧的每个元素,可与“多”侧的多个元素进行匹配;
- 必须使用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>
举例
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"} 21 method: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="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"} 21 #右边
method:http_requests:rate5m{method="get"} 600
method:http_requests:rate5m{method="del"} 34
method:http_requests:rate5m{method="post"} 120
{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
Prometheus-3:一文详解promQL的更多相关文章
- 一文详解Hexo+Github小白建站
作者:玩世不恭的Coder时间:2020-03-08说明:本文为原创文章,未经允许不可转载,转载前请联系作者 一文详解Hexo+Github小白建站 前言 GitHub是一个面向开源及私有软件项目的托 ...
- 一文详解 Linux 系统常用监控工一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop)具(top,htop,iotop,iftop)
一文详解 Linux 系统常用监控工具(top,htop,iotop,iftop) 概 述 本文主要记录一下 Linux 系统上一些常用的系统监控工具,非常好用.正所谓磨刀不误砍柴工,花点时间 ...
- 一文详解 OpenGL ES 3.x 渲染管线
OpenGL ES 构建的三维空间,其中的三维实体由许多的三角形拼接构成.如下图左侧所示的三维实体圆锥,其由许多三角形按照一定规律拼接构成.而组成圆锥的每一个三角形,其任意一个顶点由三维空间中 x.y ...
- 一文详解 WebSocket 网络协议
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
- 1.3w字,一文详解死锁!
死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等待对方停止执行,以取得系统资源,但是没有一方提前退出,就称为死锁. 1.死锁演示 死锁的形成分为两个方面,一个是使用 ...
- 一文详解Redis键过期策略
摘要:Redis采用的过期策略:惰性删除+定期删除. 本文分享自华为云社区<Redis键过期策略详解>,作者:JavaEdge. 1 设置带过期时间的 key # 时间复杂度:O(1),最 ...
- 一文详解 Linux Crontab 调度任务
最近接到这样一个任务: 定期(每天.每月)向"特定服务器"传输"软件服务"的运营数据,因此这里涉及到一个定时任务,计划使用Python语言添加Crontab依赖 ...
- 一文详解如何在基于webpack5的react项目中使用svg
本文主要讨论基于webpack5+TypeScript的React项目(cra.craco底层本质都是使用webpack,所以同理)在2023年的今天是如何在项目中使用svg资源的. 首先,假定您已经 ...
- 从零入门 Serverless | 一文详解 Serverless 技术选型
作者 | 李国强 阿里云资深产品专家 今天来讲,在 Serverless 这个大领域中,不只有函数计算这一种产品形态和应用类型,而是面向不同的用户群体和使用习惯,都有其各自适用的 Serverless ...
- 一文详解 ARP 协议
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 公众号连载计算机网络文章如下 ARP,这个隐匿在计网 ...
随机推荐
- [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
- Sementic Kernel 案例之网梯科技在线教育
2023年4月25日,微软公布了2023年第一季度财报,营收528亿美元, 微软CEO纳德称,「世界上最先进的AI模型与世界上最通用的用户界面--自然语言--相结合,开创了一个新的计算时代.」该公司有 ...
- 2023-03-26:给定一个二维数组matrix, 每个格子都是正数,每个格子都和上、下、左、右相邻。 你可以从任何一个格子出发,走向相邻的格子, 把沿途的数字乘起来,希望得到的最终数字中,结尾的0
2023-03-26:给定一个二维数组matrix, 每个格子都是正数,每个格子都和上.下.左.右相邻. 你可以从任何一个格子出发,走向相邻的格子, 把沿途的数字乘起来,希望得到的最终数字中,结尾的0 ...
- redis内存突然暴增,排查思路是什么
1 这种暴增的应该还是上次一个群友说的,更多可能是外部因素导致的,应用新上线,定时任务这些,再有就是cat上查是哪些指令多,以及比对和之前的时间的差异 看是否有定时任务 或者 新上线的活动 ,在看下监 ...
- 2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系
2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系 ...
- Django4全栈进阶之路18 项目实战(用户管理):user_edit.html用户编辑画面设计
1.模块 {% extends 'base.html' %} {% block content %} <!-- 编辑用户表单 --> <div class="card mt ...
- group_concat 自定义聚合查询
group_concat
- 从 DevOps 到平台工程:软件开发的新范式
DevOps 是一种将开发和运营结合起来的方法,在应用规划.开发.交付和运营方面将人员.流程和技术结合起来.DevOps 使以前孤立的角色(如开发.IT运营.质量工程和安全)之间进行协调和合作.一直以 ...
- CST为什么要关闭 GPU 卡的 ECC 模式而开启 TCC 模式?操作使用【详解】
在使用CST软件之前,我们一般建议大家关闭 GPU 卡的 ECC 模式而开启 TCC 模式.那么,为什么要进行这样一个操作呢?在此之前,给大家科普一下什么是"ECC"和" ...
- Node.js出现‘Cannot find module init’ 解决方法
1. 首先查看当前根目录是否有node_module文件夹,如果有,请删除 2. 输入 npm clean cache 3. 再次输入 node init -y 大功告成