【问题标题】:Generating range vectors from return values in Prometheus queries从 Prometheus 查询中的返回值生成范围向量
【发布时间】: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])

【问题讨论】:

    标签: prometheus


    【解决方案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_sum{job="prometheus"}[1m])[5m:10s])
    

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 每次执行查询时,我想。我虽然可以像使用即时向量一样对待函数的返回值。我要试试录音规则,谢谢你的帮助。
      • 录制规则可能是解决方案,但我认为您需要进一步解释该问题。对于像我这样不太了解舞会功能的人,我会问为什么我不能将“速率”结果作为一系列点,每 2 分钟记录一次作为即时向量。
      • 似乎在发布此答案后添加了对子查询的支持:prometheus.io/blog/2019/01/28/subquery-support/#examples
      猜你喜欢
      • 2021-01-20
      • 2022-01-22
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2020-06-29
      • 2014-02-17
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多