prometheuspromql查询表达式
Basics
即时⽮量选择器
=:匹配与标签相等的内容
!=:不匹配与标签相等的内容
=~: 根据正则表达式匹配与标签符合的内容
!~:根据正则表达式不匹配与标签符合的内容
⽰例:
http_requests_total{environment=~"staging|testing|development",method!="GET"} #这将匹配method不等于GET,environment匹配到staging,testing或development的http_requests_total请求内容。
向量选择器必须指定⼀个名称或⾄少⼀个与空字符串不匹配的标签匹配器。以下表达式是⾮法的
{job=~"."} # Bad!
相反,这些表达式是有效的,因为它们都有⼀个与空标签值不匹配的选择器。
{job=~".+"} # Good!
{job=~".",method="get"} # Good!
范围⽮量选择器
持续时间仅限于数字,接下来是以下单位之⼀:
s - seconds
m - minutes
h - hours
d - days
w - weeks
y - years
在此⽰例中,我们选择在过去5分钟内为度量标准名称为http_requests_total且标签设置为job=prometheus的所有时间序列记录的所有值:http_requests_total{job="prometheus"}[5m]
偏移量修改器
偏移修改器允许更改查询中各个即时和范围向量的时间偏移。
例如,以下表达式相对于当前查询5分钟前的http_requests_total值:
http_requests_total offset 5m
注意,偏移修改器需要⽴即跟随选择器,即以下内容是正确的:
sum(http_requests_total{method="GET"} offset 5m) // GOOD.
以下内容是不正确的:
sum(http_requests_total{method="GET"}) offset 5m // INVALID.
同样适⽤于范围向量。这将返回http_requests_total⼀周前的5分钟增长率:
rate(http_requests_total[5m] offset 1w)
OPERATORS
⼆元运算符
算术⼆元运算符
Prometheus中存在以下⼆进制算术运算符:
(addition)
(subtraction)
(multiplication)
/ (division)
% (modulo)
^ (power/exponentiation)
⽐较⼆元运算符
== (equal)
!= (not-equal)
(greater-than)
< (less-than)
= (greater-or-equal)
<= (less-or-equal)
逻辑/集⼆进制运算符
and (intersection)
or (union)
unless (complement)
⼀对⼀⽮量匹配
⼀对⼀从操作的每⼀侧到唯⼀的条⽬对。在默认情况下,这是格式为vector1 vector2之后的操作。如果两个条⽬具有完全相同的标签集和相应的值,则它们匹配。 ignore关键字允许在匹配时忽略某些标签,⽽on关键字允许将所考虑的标签集减少到提供的列表:
ignoring()
on()
Example input:
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
Example query:
method_code:http_errors:rate5m{code="500"} / ignoring(code) method:http_requests:rate5m
这将返回⼀个结果向量,其中包含每个⽅法的状态代码为500的HTTP请求部分,在过去5分钟内测量。在不忽略(代码)的情况下,由于度量标准不共享同⼀组标签,因此不会匹配。⽅法put和del的条⽬没有匹配,并且不会显⽰在结果中:
{method="get"} 0.04 // 24 / 600
{method="post"} 0.05 // 6 / 120
多对⼀和⼀对多⽮量匹配
多对⼀和⼀对多匹配指的是"⼀"侧的每个向量元素可以与"多"侧的多个元素匹配的情况。必须使⽤group_left或group_right修饰符明确请求,其中left/right确定哪个向量具有更⾼的基数。
ignoring() group_left()
ignoring() group_right()
on() group_left()
on() group_right()
Example query:
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
在这种情况下,左向量每个⽅法标签值包含多个条⽬。因此,我们使⽤group_left表明这⼀点。右侧的元素现在与多个元素匹配,左侧具有相同的⽅法标签:
{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⽀持以下内置聚合运算符,这些运算符可⽤于聚合单个即时向量的元素,从⽽⽣成具有聚合值的较少元素的新向量:
sum (calculate sum over dimensions) #范围内求和
min (select minimum over dimensions) #范围内求最⼩值
max (select maximum over dimensions) #范围内求最⼤值
avg (calculate the average over dimensions) #范围内求最⼤值
stddev (calculate population standard deviation over dimensions) #计算标准偏差
stdvar (calculate population standard variance over dimensions) #计算标准⽅差
count (count number of elements in the vector) #计算向量中的元素数量
count_values (count number of elements with the same value) #计算向量中相同元素的数量
bottomk (smallest k elements by sample value)#样本中最⼩的元素值
topk (largest k elements by sample value)#样本中最⼤的元素值
quantile (calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions) #计算 0-1 之间的百分⽐数量的样本的最⼤值
这些运算符可以⽤于聚合所有标签维度,也可以通过包含without或by⼦句来保留不同的维度。
([parameter,] ) [without|by ()]
parameter仅⽤于count_values,quantile,topk和bottomk。without从结果向量中删除列出的标签,⽽所有其他标签都保留输出。 by相反并删除未在by⼦句中列出的标签,即使它们的标签值在向量的所有元素之间是相同的
例:如果http_requests_total具有按application,instance和group标签列出的时间序列,我们可以通过以下⽅式计算每个应⽤程序和组在所有实例上看到的HTTP请求总数:
sum(http_requests_total) without (instance)
等于:
sum(http_requests_total) by (application, group)
如果我们只对我们在所有应⽤程序中看到的HTTP请求总数感兴趣,我们可以简单地写:
sum(http_requests_total)
要计算运⾏每个构建版本的⼆进制⽂件的数量,我们可以编写:
count_values("version", build_version)
要在所有实例中获取5个最⼤的HTTP请求计数,我们可以编写:
topk(5, http_requests_total)
FUNCTIONS
abs(v instant-vector) #返回其绝对值
absent() # 如果传递给它的向量具有该元素,则返回空向量;如果传递给它的向量没有元素,则返回传⼊的元素。
Example query:
nginx_server_connections
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-
9fcd4d45b-sdqds",service="nginx-vts",status="accepted"} 89061
nginx_server_connections{endpoint="metrics",instance="192.168.43.5:9913",job="nginx-vts",namespace="dev",pod="nginx-vts-
9fcd4d45b-sdqds",service="nginx-vts",status="handled"} 2
absent(nginx_server_connections{job="nginx-vts"}) => {}
absent(nginx_server_connections{job="nginx-vts123"}) => {job="nginx-vts123"}
ceil(v instant-vector) #返回向量中所有样本值(向上取整数)
round(v instant-vector, to_nearest=1 scalar) #返回向量中所有样本值的最接近的整数,to_nearest是可选的,默认为1,表⽰样本返回的是最接近1的整数倍的值, 可以指定任意的值(也可以是⼩数),表⽰样本返回的是最接近它的整数倍的值
floor(v instant-vector) #返回向量中所有样本值(向下取整数)
changes(v range-vector) #对于每个输⼊时间序列,返回其在时间范围内(v range-vector)更改的次数
clamp_max(v instant-vector, max scalar) #限制v中所有元素的样本值,使其上限为max
clamp_min(v instant-vector, min scalar) #限制v中所有元素的样本值,使其下限为min
year(v=vector(time()) instant-vector) #返回UTC中给定时间的年份
day_of_month(v=vector(time()) instant-vector) #返回UTC中给定时间的⽉中的某⼀天,返回值为1到31
day_of_week(v=vector(time()) instant-vector) #返回UTC中给定时间的当周中的某⼀天,返回值为0到6
days_in_month(v=vector(time()) instant-vector) #返回UTC中给定时间的⼀个⽉的天数,返回值28到31
hour(v=vector(time()) instant-vector) #返回UTC中给定时间的当天中的某⼀⼩时,返回值为0到23
minute(v=vector(time()) instant-vector) #返回UTC中给定时间的⼩时中的某分钟,返回值为0到59
delta(v range-vector) #返回⼀个即时向量,它计算每个time series中的第⼀个值和最后⼀个值的差别
deriv(v range-vector) #计算每个time series的每秒的导数(derivative)
exp(v instant-vector) #计算v中所有元素的指数函数
histogram_quantile(φ float, b instant-vector) #从buckets类型的向量中计算φ(0 ≤ φ ≤ 1)百分⽐的样本的最⼤值
holt_winters(v range-vector, sf scalar, tf scalar) #根据范围向量中的范围产⽣⼀个平滑的值
idelta(v range-vector) #计算最新的2个样本值之间的差别
increase(v range-vector) #计算指定范围内的增长值, 它会在单调性发⽣变化时(如由于⽬标重启引起的计数器复位)⾃动中断
irate(v range-vector) #计算每秒的平均增长值, 基于的是最新的2个数据点
rate(v range-vector) #计算每秒的平均增长值
resets(v range-vector) #对于每个 time series , 它都返回⼀个 counter resets的次数
sort(v instant-vector) #对向量按元素的值进⾏升序排序
sort_desc(v instant-vector) #对向量按元素的值进⾏降序排序正则表达式任意内容
sqrt(v instant-vector) #返回v中所有向量的平⽅根
time() #返回从1970-1-1起⾄今的秒数,UTC时间
参考链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论