从 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 查询中的返回值生成范围向量的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 按标签查询范围向量

Prometheus-PQL

在 Prometheus 查询中选择最大的标签值

如何在 Prometheus 中一次调用执行多个查询

如何在 Prometheus 查询中设置返回样本频率?

Prometheus 中的 increase() 有时会使值翻倍:如何避免?