从 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 更快。