【问题标题】:Difference between PromQL "by" and "without" unclearPromQL“by”和“without”之间的区别不清楚
【发布时间】:2018-12-06 11:16:35
【问题描述】:

我有一个关于使用 Prometheus 汇总指标计算响应时间的问题。

我创建了一个汇总指标,它不仅包含服务名称,还包含完整路径和 http 方法。

现在我尝试计算完整服务的平均响应时间。 我阅读了有关“率然后求和”的文章,要么我不明白计算是如何完成的,要么计算是恕我直言不正确。

据我所知,这应该是计算每秒响应时间的正确方法:

sum by(service_id) (
    rate(request_duration_sum{status_code=~"2.*"}[5m])
    /
    rate(request_duration_count{status_code=~"2.*"}[5m])
)

我在这里理解的是为每个子集创建“每秒持续时间”(速率总和/速率计数)值,然后为每个 service_id 创建总和。

这对我来说看起来绝对是错误的 - 但我认为它不像我理解的那样起作用。

获得相同外观结果的另一种方法是:

sum without (path,host) (
    rate(request_duration_sum{status_code=~"2.*"}[5m])
    /
    rate(request_duration_count{status_code=~"2.*"}[5m])
)
  • 但有什么区别?
  • 这里到底发生了什么?
  • 老实说,如果我使用“max”而不是“sum”,为什么我只能得到可测量的值?

如果我会忽略我阅读的所有内容,我会尝试以下方式:

rate(sum by(service_id) request_duration_sum{status_code=~"2.*"}[5m])
/
rate(sum by(service_id) request_duration_count{status_code=~"2.*"}[5m])

但这根本行不通...(即时向量与范围向量等等...)。

【问题讨论】:

    标签: prometheus calculation promql


    【解决方案1】:

    所有这些示例的汇总都不正确,因为您正在平均平均值。你想要:

      sum without (path,host) (
        rate(request_duration_sum{status_code=~"2.*"}[5m])
      )
    /
      sum without (path,host) (
        rate(request_duration_count{status_code=~"2.*"}[5m])
      )
    

    这将返回每个 status_code 加上任何其他剩余标签的平均延迟。

    【讨论】:

    • 我认为这是对的——因为你写的。但我想了解给定查询的真正作用。我必须学习什么讲座?在线课程、圣经……? ;-)
    【解决方案2】:

    在 Grafana 中使用 Prometheus 指标时,without 关键字对我不起作用(至少正如我预期的那样)。 by 我得到了令人满意的结果:

      sum by (status_code)(
        rate(request_duration_sum{status_code=~"2.*"}[5m])
      )
    /
      sum by (status_code)(
        rate(request_duration_sum{status_code=~"2.*"}[5m])
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-29
      • 2016-05-13
      • 2019-09-27
      • 2011-05-22
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多