目录
promQL 在表达式中支持的数据类型
简单语法介绍
rate的用法
指标过滤搜索
时间单位
聚合表达式
11个聚合函数
二元运算符(Binary Operators)
二元运算符优先级
向量匹配
向量一对一匹配
向量一对多/多对一匹配
promQL 在表达式中支持的数据类型
即时向量 时间
范围向量 数量
标量:单一数据没有方向的概念
字串: 一般都是标签对应值
GET(GET 请求方法):它是一种用于从服务器获取数据的请求方法
POST(POST 请求方法):它是一种用于向服务器提交数据的请求方法。 \
简单语法介绍
prometheus_http_requests_total 查询 HTTP的全部 请求的数量。
prometheus_http_requests_total[2m] 获取过去 2 分钟内的数据
prometheus_http_requests_total[2m]offset 5m 往前5分钟开始,获取两分钟内的数据
prometheus_http_response_size_bytes_sum /prometheus_http_response_size_bytes_count 在同一组数据中可以直接做除法
大小总和/数量
sum(prometheus_http_requests_total)by(code) ,,by(code) 选定code ,sum总请求数量
avg_over_time(prometheus_http_requests_total[1h]) 计算过去 1 小时内的指标的平均值。
rate的用法
简单来讲就是在你指定时间内的每秒的平均变化量
他可以把即时向量转换为范围向量的图形结果
rate (prometheus_http_requests_total[2m])
指标过滤搜索
指定标签名之类的进行指定过滤
过滤前
过滤后
这样也可以
进行速率计算
_name_ ~ 可以匹配标签名称,对名称进行过滤
时间单位
聚合表达式
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 without (code)(prometheus_http_requests_total) #统计de标签的种类
sum by (code)(prometheus_http_requests_total) #统计只有code标签的种类
11个聚合函数
sum()
: 计算时间序列数据的总和。avg()
: 计算时间序列数据的平均值。max()
: 找到时间序列数据的最大值。min()
: 找到时间序列数据的最小值。count()
: 计算时间序列数据的计数。stddev()
: 计算时间序列数据的标准差。stdvar()
: 计算时间序列数据的方差。topk()
: 找到时间序列数据中的前 K 个最大值。bottomk()
: 找到时间序列数据中的前 K 个最小值。quantile()
: 计算时间序列数据的分位数。rate()
: 计算时间序列数据的速率(变化率)。
二元运算符(Binary Operators)
PromQL支持基本的算术运算和逻辑运算,这类运算支持使用操作符连接两个操作数,因而也称为二元运算符或二元操作符;
算术运算符:
+
:加法运算符。-
:减法运算符。*
:乘法运算符。/
:除法运算符。%
:取模运算符。比较运算符:
==
:相等性比较运算符。!=
:不等性比较运算符。>
:大于比较运算符。<
:小于比较运算符。>=
:大于等于比较运算符。<=
:小于等于比较运算符。逻辑运算符:
and
:逻辑与运算符。or
:逻辑或运算符。unless
:逻辑非运算符。◼ 目前,该运算仅允许在两个即时向量间进行,尚不支持标量参与运算;
二元运算符优先级
Prometheus的复杂运算中,二元运算符存在如下给定次序中所示的由高到低的优先级
◼ ^
◼ *, /, %
◼ +, -
◼ ==, !=, =, >
◼ and, unless
◼ or
具有相同优先级的运算符满足结合律(左结合),但幂运算除外,因为它是右结合机制;
可以使用括号( )改变运算次序;
向量匹配
即时向量间的运算是PromQL的特色之一;运算时,PromQL为会左侧向量中的每个元素找到匹配的元素,其匹配行为有两种基本类型
◼ 一对一
◼ 一对多或多对一
向量一对一匹配
即时向量的一对一匹配
- 从运算符的两边表达式所获取的即时向量间依次比较,并找到唯一匹配(标签完全一致)的样本值;
- 找不到匹配项的值则不会出现在结果中;
rate(prometheus_http_requests_total{code="200"}[5m])>0.1*rate(prometheus_http_requests_total{code="200"}[1d])
这个例子就是一对一,意思就是过去五分的总值是否大于过去1天code200的总值的百分之一
下面这个官方图例子就是多对一匹配的例子
向量一对多/多对一匹配
一对多/多对一,需要保证相对的数据是有用的
一对多/多对一匹配
- “一”侧的每个元素,可与“多”侧的多个元素进行匹配;
- 必须使用group_left或group_right明确指定哪侧为“多”侧;
group_left表示左侧为多测, 多测:表示可以出现多次,一侧表示只能有一个进行比较
group_right表示右侧为多测
一对多
rate(prometheus_http_requests_total{code=~"2.*"}[5m])>.1*rate(prometheus_http_requests_total[5m])
这个 Prometheus 查询表达式是一个告警规则,用于检测过去 5 分钟内以状态码以 "2" 开头的 HTTP 请求的速率是否超过总请求数的 10%。
#prometheus_http_requests_total 记录了所有 HTTP 请求的计数器指标。。
#{code=~"2.*"} 是一个标签选择器,用于筛选出具有状态码以 "2" 开头的时间序
下面这个官方图例子就是多对一匹配的例子
rate(Method_code:http_errors[5m]) / ignoring(code) group_left rate(method:http_requests[5m])
rate(Method_code:http_errors[5m]):计算过去 5 分钟内 Method_code:http_errors 指标的速率。
/ ignoring(code):在计算过程中忽略 code 标签的差异。
group_left:按照左侧的标签进行分组。
rate(method:http_requests[5m]):计算过去 5 分钟内 method:http_requests 指标的速率,并按照 method 标签进行分组。
这个表达式使用 Prometheus 查询语言(PromQL),用于计算在过去 5 分钟内的 HTTP 错误率与 HTTP 请求速率之比,同时忽略状态码标签(code
)。