使用 promql 获取结果总数或高于阈值的百分比

Posted

技术标签:

【中文标题】使用 promql 获取结果总数或高于阈值的百分比【英文标题】:Get total number of results or percentage above threshold with promql 【发布时间】:2021-12-11 05:01:53 【问题描述】:

我正在尝试获取基于阈值的百分比。我的数据如下所示:


  "request": 
    "url": "api/datasources/proxy/1/api/v1/query_range?query=health&start=1635183780&end=1635184080&step=15",
    "method": "GET",
    "hideFromInspector": false
  ,
  "response": 
    "status": "success",
    "data": 
      "resultType": "matrix",
      "result": [
        
          "metric": 
            "__name__": "health",
            "application": "myapp"
          ,
          "values": [
            [
              1635183780,
              "3"
            ],
            [
              1635183795,
              "3"
            ],
            [
              1635183810,
              "3"
            ],
            [
              1635183825,
              "3"
            ],
            [
              1635183840,
              "3"
            ],
            [
              1635183855,
              "3"
            ],
            [
              1635183870,
              "3"
            ],
            [
              1635183885,
              "3"
            ],
            [
              1635183900,
              "3"
            ],
            [
              1635183915,
              "3"
            ],
            [
              1635183930,
              "3"
            ],
            [
              1635183945,
              "3"
            ],
            [
              1635183960,
              "3"
            ],
            [
              1635183975,
              "3"
            ],
            [
              1635183990,
              "3"
            ],
            [
              1635184005,
              "3"
            ],
            [
              1635184020,
              "3"
            ],
            [
              1635184035,
              "3"
            ],
            [
              1635184050,
              "3"
            ],
            [
              1635184065,
              "3"
            ],
            [
              1635184080,
              "3"
            ]
          ]
        
      ]
    
  

我想得到值是 3 时的百分比。所以就像在这种情况下它是 100%,但如果它低于 3,那将降低百分比。

我在 grafana 中使用 promql。我曾尝试做类似countcount_over_time 的操作,但由于结果显示它是即时向量而不是范围,因此出现错误。我的理解非常有限,所以我不确定如何获得此处表示的值的总数。甚至做类似count(health == 3) / count(health)

【问题讨论】:

我无法重现您的问题。我能够毫无问题地使用 count(metric==3)/count(metric) 。你能澄清一下到底是什么错误吗? @MarceloÁviladeOliveira 随着时间的推移使用时出现错误,但使用计数时,我只得到 1。我想得到结果的数量,在这种情况下为 21。 count(health==3) 将返回 21,但在您的问题中,您曾说过“我想获取值为 3 时的百分比”,并且您在尝试时遇到了错误。 是的,我在使用 count_over_time 时出现错误。计数有效,但我没有得到 21,我只得到 1。我确实想要一个百分比,但我包括了,以防有另一种方法可以获得相同的结果(promql 内置的东西) 【参考方案1】:

我终于能够解决这个问题,以防万一有人遇到问题。

在 grafana 中,我不得不将类型更改为即时。这将使用查询调用而不是 query_range 来查询 api。

那么就可以使用count_over_time:count_over_time(health[15m])

我仍然需要在值为 3 的情况下获取此指标,而简单地执行 count_over_time((health == 3)[15m]) 是行不通的。它基本上缺少一件事,那就是步骤。所以,我的最终查询最终是:count_over_time((health == 3)[15m:]),这让我得到了我需要的结果。

【讨论】:

最好在方括号中的冒号后面显式设置step 持续时间,否则如果传递给step 的查询参数超过/api/v1/query_range,则可能只考虑一部分原始样本原始样本之间的间隔。另一方面,如果查询 arg 中的 step 小于样本之间的间隔,则查询将返回膨胀的结果。最好使用 MetricsQL 中的count_eq_over_time 函数。 @valyala metricsQL 是插件吗?仍在尝试习惯 grafana 及其工作原理。 MetricsQL 是 VictoriaMetrics 的查询语言。它受到 PromQL 的启发,并且大部分都向后兼容 PromQL(docs.victoriametrics.com/MetricsQL.html 中提到了一些例外情况)。这意味着 Grafana 中的 Prometheus 仪表板在从 Prometheus 切换到 VictoriaMetrics 后应该继续工作

以上是关于使用 promql 获取结果总数或高于阈值的百分比的主要内容,如果未能解决你的问题,请参考以下文章

PromQL 正确获取 CPU 使用百分比

第七篇Prometheus PromQL 简单用法

pagehelper怎么计算总数的

从 ROC 曲线获取阈值

excel如何计算占总数的百分比

计算数据框中高于阈值的行数作为函数或其他列因子