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

Difference between PromQL "by" and "without" unclear

我对使用 Prometheus 摘要指标计算响应时间有疑问。

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

现在我尝试计算完整服务的平均响应时间。 我阅读了有关 "rate then sum" 的文章,要么我不明白计算是如何完成的,要么恕我直言,计算不正确。

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

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

我在这里的理解是为每个子集创建 "duration per second"(速率总和/速率计数)值,然后创建每个 service_id.

的总和

这对我来说绝对是错误的 - 但我认为它不符合我的理解。

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

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

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

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

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

所有这些示例都在错误地聚合,因为您计算的是平均值。你想要:

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

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

在 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])
  )
  • by 修饰符组 aggregate function 结果由 by(...) 内枚举的标签决定。
  • without 修饰符组 aggregate function 由除 without(...) 中列举的标签外的所有标签产生。

例如,假设 process_resident_memory_bytes 指标存在 jobinstancedatacenter 标签:

process_resident_memory_bytes{job="job1",instance="host1",datacenter="dc1"} N1
process_resident_memory_bytes{job="job1",instance="host2",datacenter="dc1"} N2
process_resident_memory_bytes{job="job1",instance="host1",datacenter="dc2"} N3
process_resident_memory_bytes{job="job2",instance="host1",datacenter="dc1"} N4

然后 sum(process_resident_memory_bytes) by (datacenter) 将 return 总结每 datacenter 内存使用情况,而 sum(process_resident_memory_bytes) without (instance) 将 return 总结每-job 每- datacenter 内存使用情况。