PromQL的“ by”和“ without”之间的区别不清楚

时间:2018-06-27 14:01:34

标签: prometheus calculation promql

我对使用普罗米修斯摘要指标计算响应时间有疑问。

我创建了一个摘要指标,该指标不仅包含服务名称,而且还包含完整的路径和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])

但这根本不起作用...(即时向量与范围向量等等...)。

有什么想法吗?

提前THX !!!

2 个答案:

答案 0 :(得分: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的平均延迟以及所有其他剩余标签。

答案 1 :(得分:0)

使用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])
  )