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

eve*_*zon 8 prometheus calculation promql

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

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

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

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

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

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

这对我来说看起来完全错误 - 但我认为它不像我理解的那样工作。

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

sum without (path,host) (
    rate(request_duration_sum{status_code=~"2.*"}[5m])
    /
    rate(request_duration_count{status_code=~"2.*"}[5m])
)
Run Code Online (Sandbox Code Playgroud)
  • 但有什么区别呢?
  • 这里到底发生了什么?
  • 如果我使用“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])
Run Code Online (Sandbox Code Playgroud)

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

val*_*ala 9

  • 修饰符按 内枚举的标签对聚合函数by结果进行分组。by(...)
  • 修饰符按除 内枚举的标签之外的所有标签对聚合函数without结果进行分组。without(...)

例如,假设process_resident_memory_bytesmetric 存在于job,instancedatacenter标签中:

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
Run Code Online (Sandbox Code Playgroud)

然后sum(process_resident_memory_bytes) by (datacenter)将返回每个内存datacenter使用情况的摘要,同时sum(process_resident_memory_bytes) without (instance)将返回每个job内存datacenter使用情况的摘要。


bri*_*zil 7

所有这些示例都错误地聚合,因为您正在求平均值。你要:

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

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

  • 尝试 [Prometheus 文档](https://prometheus.io/docs/prometheus/latest/querying/basics/)。 (3认同)
  • 我认为这是正确的 - 因为你写了它。但我想了解给定查询真正做了什么。我必须学习什么讲座?在线课程、圣经……?;-) (2认同)