从 Prometheus 查询中的 return 值生成范围向量
Generating range vectors from return values in Prometheus queries
我有一个指标 varnish_main_client_req 类型的计数器,我想设置一个警报,如果某个请求的速率 drops/raises给定时间内的数量(例如“过去 2 分钟内偏离的请求数量!”)。
使用deriv()函数应该比比较相对值要好得多,但它只能与仪表一起使用。是否有可能转换一个不断增加的指标。与额定指标相反。规格?
查询: deriv(rate(varnish_main_client_req[2m])[5m])
预期:
Prometheus 计算过去 2 分钟内客户端请求的速率和 returns 最后 5 分钟内结果值的导数。
实际结果:
"error": "parse error at char 48: range specification must be preceded
by a metric selector, but follows a *promql.Call instead"
Recording rules 可能是一个选项,但对于应该与查询一起使用的东西来说,它感觉像是一种廉价的解决方法:
my_gauge_metric = rate(some_counter_metric[2m])
是的,您需要为此使用记录规则。
Prometheus calculates the rate of client requests over the last 2 mins and returns a derivative of the resulting values over the last 5 mins.
这就是问题所在 - Prometheus 应该在什么时间间隔内合成这些数据?
解决方案
可以使用 subquery-syntax (introduced in Prometheus version 2.7):
deriv(rate(varnish_main_client_req[2m])[5m:10s])
警告:这些子查询很昂贵,即在 Prometheus 上产生非常高的负载。
当您经常使用这些查询(在警报等中)时使用 recording-rules。
子查询语法
<instant_query>[<range>:<resolution>]
instant_query
:一个PromQL-function which returns an instant-vector)
range
:开始第一个子查询的偏移量(时间倒退)
resolution
:每个子查询的大小。
它returns一个range-vector
.
上面的例子中,Prometheus运行了rate()
(=instant_query
)30次(第一次从5分钟前到-4:50,...,最后一次-0:10到现在)。
生成的范围向量被输入到 deriv()
-函数。
另一个示例(主要适用于所有 Prometheus 实例):
deriv(rate(prometheus_http_request_duration_seconds_sum{job="prometheus"}[1m])[5m:10s])
如果没有子查询范围 ([5m:10s]
),您将收到此错误消息:
parse error at char 80: expected type range vector in call to function "deriv", got instant vector
I want to set up an alert that triggers if the rate of requests drops/raises by a certain amount in a given time (e.g. "Amount of requests deviated in the last 2 min!").
现在和 2 分钟前的请求率之间的偏差可以借助 offset modifier:
来计算
rate(varnish_main_client_req[2m]) - rate(varnish_main_client_req[2m] offset 2m)
这应该比 subquery 更快。
我有一个指标 varnish_main_client_req 类型的计数器,我想设置一个警报,如果某个请求的速率 drops/raises给定时间内的数量(例如“过去 2 分钟内偏离的请求数量!”)。
使用deriv()函数应该比比较相对值要好得多,但它只能与仪表一起使用。是否有可能转换一个不断增加的指标。与额定指标相反。规格?
查询: deriv(rate(varnish_main_client_req[2m])[5m])
预期: Prometheus 计算过去 2 分钟内客户端请求的速率和 returns 最后 5 分钟内结果值的导数。
实际结果:
"error": "parse error at char 48: range specification must be preceded by a metric selector, but follows a *promql.Call instead"
Recording rules 可能是一个选项,但对于应该与查询一起使用的东西来说,它感觉像是一种廉价的解决方法:
my_gauge_metric = rate(some_counter_metric[2m])
是的,您需要为此使用记录规则。
Prometheus calculates the rate of client requests over the last 2 mins and returns a derivative of the resulting values over the last 5 mins.
这就是问题所在 - Prometheus 应该在什么时间间隔内合成这些数据?
解决方案
可以使用 subquery-syntax (introduced in Prometheus version 2.7):
deriv(rate(varnish_main_client_req[2m])[5m:10s])
警告:这些子查询很昂贵,即在 Prometheus 上产生非常高的负载。 当您经常使用这些查询(在警报等中)时使用 recording-rules。
子查询语法
<instant_query>[<range>:<resolution>]
instant_query
:一个PromQL-function which returns an instant-vector)range
:开始第一个子查询的偏移量(时间倒退)resolution
:每个子查询的大小。
它returns一个range-vector
.
上面的例子中,Prometheus运行了rate()
(=instant_query
)30次(第一次从5分钟前到-4:50,...,最后一次-0:10到现在)。
生成的范围向量被输入到 deriv()
-函数。
另一个示例(主要适用于所有 Prometheus 实例):
deriv(rate(prometheus_http_request_duration_seconds_sum{job="prometheus"}[1m])[5m:10s])
如果没有子查询范围 ([5m:10s]
),您将收到此错误消息:
parse error at char 80: expected type range vector in call to function "deriv", got instant vector
I want to set up an alert that triggers if the rate of requests drops/raises by a certain amount in a given time (e.g. "Amount of requests deviated in the last 2 min!").
现在和 2 分钟前的请求率之间的偏差可以借助 offset modifier:
来计算rate(varnish_main_client_req[2m]) - rate(varnish_main_client_req[2m] offset 2m)
这应该比 subquery 更快。