从 Prometheus 查询中的返回值生成范围向量
Posted
技术标签:
【中文标题】从 Prometheus 查询中的返回值生成范围向量【英文标题】:Generating range vectors from return values in Prometheus queries 【发布时间】:2017-04-04 16:43:13 【问题描述】:我有一个计数器类型的指标 varnish_main_client_req,我想设置一个警报,如果请求率在给定时间内下降/上升一定数量(例如“请求数量在最后 2 分钟内偏离了!”)。
使用deriv() 函数应该比比较相对值更好,但它只能与仪表一起使用。是否有可能转换一个不断增加的指标。与额定指标相反。量规?
查询:deriv(rate(varnish_main_client_req[2m])[5m])
期望: Prometheus 计算过去 2 分钟内客户端请求的速率,并返回过去 5 分钟内结果值的导数。
实际结果:
"error": "在 char 48 处解析错误:必须在指定范围之前 通过度量选择器,但遵循 *promql.Call 代替"
Recording rules 可能是一种选择,但对于应该与查询一起使用的东西来说,它感觉像是一种廉价的解决方法:
my_gauge_metric = rate(some_counter_metric[2m])
【问题讨论】:
【参考方案1】:解决方案
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,它返回一个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_sumjob="prometheus"[1m])[5m:10s])
如果没有子查询范围 ([5m:10s]
),您将收到以下错误消息:
在字符 80 处解析错误:调用函数“deriv”时的预期类型范围向量,得到即时向量
【讨论】:
【参考方案2】:是的,您需要为此使用记录规则。
Prometheus 计算过去 2 分钟内客户端请求的速率,并返回过去 5 分钟内结果值的导数。
问题就在这里——Prometheus 应该在什么时间间隔合成这些数据?
【讨论】:
每次执行查询时,我想。我虽然可以像使用即时向量一样对待函数的返回值。我要试试录音规则,谢谢你的帮助。 录制规则可能是解决方案,但我认为您需要进一步解释该问题。对于像我这样不太了解舞会功能的人,我会问为什么我不能将“速率”结果作为一系列点,每 2 分钟记录一次作为即时向量。 似乎在发布此答案后添加了对子查询的支持:prometheus.io/blog/2019/01/28/subquery-support/#examples以上是关于从 Prometheus 查询中的返回值生成范围向量的主要内容,如果未能解决你的问题,请参考以下文章