从Prometheus查询中的返回值生成范围向量

时间:2016-11-21 10:11:01

标签: prometheus

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

使用deriv()函数应该比比较相对值好得多,但它只能用于仪表。是否有可能转换一个不断增加的指标又名。与额定指标相反。评估

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

期望: 普罗米修斯计算过去2分钟内客户请求的比率,并在过去5分钟内返回结果值的导数。

实际结果

  

“error”:“char 48处的解析错误:必须在范围规范之前   通过一个度量选择器,但在* promql.Call后面改为“

Recording rules可能是一个选项,但对于适用于查询的内容来说,感觉就像是一种廉价的解决方法:

my_gauge_metric = rate(some_counter_metric[2m])

2 个答案:

答案 0 :(得分:5)

解决方案

可以使用subquery-syntaxintroduced 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,它返回一个instant-vector
  • range:开始第一个子查询的偏移量(时间上)
  • resolution:每个子查询的大小。

它返回一个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]),您将收到以下错误消息:

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

答案 1 :(得分:3)

是的,您需要使用录制规则。

  

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

这就是问题 - 普罗米修斯在什么时间间隔合成这些数据?