PromQL进阶
2021/11/1 23:39:52
本文主要是介绍PromQL进阶,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Prometheus的聚合函数
一般说来,单个指标的价值不大,监控场景中往往需要联合并可视化一组指标,这种联合机制即是指“聚合”操作,例如,将计数、求和、平均值、分位数、标准差及方差等统计函数应用于时间序列的样本之上生成具有统计学意义的结果等; 对查询结果事先按照某种分类机制进行分组(groupby)并将查询结果按组进行聚合计算也是较为常见的需求,例如分组统计、分组求平均值、分组求和等; 聚合操作由聚合函数针对一组值进行计算并返回单个值或少量几值作为结果- Prometheus内置提供的11个聚合函数也称为聚合运算符
- 这些运算符仅支持应用于单个即时向量的元素,其返回值也是具有少量元素的新向量或标量
- 这些聚合运行符既可以基于向量表达式返回结果中的时间序列的所有标签维度进行分组聚合,也可以仅基于指定的标签维度分组后再进行分组聚合
聚合表达式
PromQL中的聚合操作语法格式可采用如下面两种格式之一- <aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
-
<aggr-op> [without|by (<label list>)] ([parameter,] <vector expression>)
- without
- 从结果向量中删除由without子句指定的标签,未指定的那部分标签则用作分组标准;
- by
- 功能与without刚好相反,它仅使用by子句中指定的标签进行聚合,结果向量中出现但未被by子句指定的标签则会被忽略;
- 为了保留上下文信息,使用by子句时需要显式指定其结果中原本出现的job、instance等一类的标签
聚合函数
◆ sum( ):对样本值求和; ◆ avg ( ) :对样本值求平均值,这是进行指标数据分析的标准方法; ◆ count ( ) :对分组内的时间序列进行数量统计; ◆ stddev ( ) :对样本值求标准差,以帮助用户了解数据的波动大小(或称之为波动程度); ◆ stdvar ( ) :对样本值求方差,它是求取标准差过程中的中间状态; ◆ min ( ) :求取样本值中的最小者; ◆ max ( ) :求取样本值中的最大者; ◆ topk ( ) :逆序返回分组内的样本值最大的前k个时间序列及其值; ◆ bottomk ( ) :顺序返回分组内的样本值最小的前k个时间序列及其值; ◆ quantile ( ) :分位数用于评估数据的分布状态,该函数会返回分组内指定的分位数的值,即 数值落在小于等于指定的分位区间的比例; ◆ count_values ( ) :对分组内的时间序列的样本值进行数量统计;二元运算符(Binary Operators)
PromQL支持基本的算术运算和逻辑运算,这类运算支持使用操作符连接两个操作数,因而也称为二元运算符或二元操作符; 支持的运算- 两个标量间运算;
- 即时向量和标量间的运算:将运算符应用于向量上的每个样本;
- 两个即时向量间的运算:遵循向量匹配机制;
- 算术运算
-
- 支持的运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)和^(幂运算);
- 比较运算
-
- 支持的运算符:==(等值比较)、!=(不等)、>、<、>=和<=(小于等于);
- 逻辑/集合运算
-
- 支持的运算符:and(并且)、or(或者)和unless(除了);
-
- 目前,该运算仅允许在两个即时向量间进行,尚不支持标量参与运算;
二元运算符优先级
Prometheus的复杂运算中,二元运算符存在如下给定次序中所示的由高到低的优先级- ^
- *, /, %
- +, -
- ==, !=, <=, <, >=, >
- and, unless
- or
向量匹配
即时向量间的运算是PromQL的特色之一;运算时,PromQL为会左侧向量中的每个元素找到匹配的元素,其匹配行为有两种基本类型- 一对一 (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>
- ignore:定义匹配检测时要忽略的标签;
- on:定义匹配检测时只使用的标签;
- 例如, rate(http_requests_total{status_code=~"5.*"}[5m]) > .1 * rate(http_requests_total[5m])
向量一对多/多对一匹配
一对多/多对一匹配 “一”侧的每个元素,可与“多”侧的多个元素进行匹配; 必须使用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>
这篇关于PromQL进阶的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27海外开发者为 AutoMQ 写的精品介绍,太干了!
- 2024-11-27MQ项目开发资料详解
- 2024-11-27MQ消息队列资料入门详解
- 2024-11-27MQ消息中间件资料详解:新手入门教程
- 2024-11-27MQ消息中间件资料详解与入门指南
- 2024-11-27MQ源码资料详解与入门指南
- 2024-11-27MQ源码资料入门教程
- 2024-11-26MQ消息中间件教程:初学者快速入门指南
- 2024-11-26手写消息队列项目实战:从零开始的入门教程
- 2024-11-26MQ底层原理教程:初学者快速入门指南