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])
)
- 但是有什么区别呢?
- 这里到底发生了什么?
- 如果我使用 "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])
但这根本行不通...(即时向量与范围向量等等...)。
所有这些示例都在错误地聚合,因为您计算的是平均值。你想要:
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
指标存在 job
、instance
和 datacenter
标签:
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
内存使用情况。
我对使用 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])
)
- 但是有什么区别呢?
- 这里到底发生了什么?
- 如果我使用 "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])
但这根本行不通...(即时向量与范围向量等等...)。
所有这些示例都在错误地聚合,因为您计算的是平均值。你想要:
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
指标存在 job
、instance
和 datacenter
标签:
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
内存使用情况。