20

我有一个计数器类型的度量varnish_main_client_req,我想设置一个警报,如果请求率在给定时间内下降/上升一定量(例如“最近 2 分钟内偏离的请求量!”),就会触发警报。

使用deriv()函数应该比比较相对值更好,但它只能与仪表一起使用。是否有可能转换一个不断增加的指标。与额定指标相反。测量?

查询deriv(rate(varnish_main_client_req[2m])[5m])

期望:Prometheus 计算过去 2 分钟内客户端请求的速率,并返回过去 5 分钟内结果值的导数。

实际结果

“错误”:“在字符 48 处解析错误:范围规范必须以度量选择器开头,但要跟在 *promql.Call 之后”

记录规则可能是一种选择,但对于应该与查询一起使用的东西来说,它感觉像是一种廉价的解决方法:

my_gauge_metric = rate(some_counter_metric[2m])

4

2 回答 2

19

解决方案

可以使用子查询语法在 Prometheus 2.7 版中引入):

deriv(rate(varnish_main_client_req[2m])[5m:10s])

警告:这些子查询很昂贵,即在 Prometheus 上产生非常高的负载。当您定期使用这些查询时(在警报等中),请使用记录规则。

子查询语法

<instant_query>[<range>:<resolution>]
  • instant_query:一个PromQL 函数,它返回一个即时向量
  • range: 偏移量(回到时间)开始第一个子查询
  • resolution:每个子查询的大小。

它返回一个range-vector.

在上面的示例中,Prometheus 运行rate()(= instant_query) 30 次(第一次从 5 分钟前到 -4:50,...,最后一次从 -0:10 到现在)。生成的范围向量输入到deriv()-function。

另一个例子(大部分在所有 Prometheus 实例上都可用):

deriv(rate(prometheus_http_request_duration_seconds_sum{job="prometheus"}[1m])[5m:10s])

如果没有子查询范围 ( [5m:10s]),您将收到以下错误消息:

char 80 处的解析错误:调用函数“deriv”时的预期类型范围向量,得到即时向量

于 2020-07-07T14:51:20.937 回答
10

是的,您需要为此使用记录规则。

Prometheus 计算过去 2 分钟内客户端请求的速率,并返回过去 5 分钟内结果值的导数。

这就是问题所在——Prometheus 应该在什么时间间隔合成这些数据?

于 2016-11-21T10:16:27.043 回答