如何计算来自 Grafana 的普罗米修斯查询中的平均值

How to calculate the average value in a Prometheus query from Grafana

我试图在 Grafana 上创建一个 Prometheus 图,但找不到计算平均值的函数。

例如,为read_latency创建一个图表,结果包含很多标签。如果有 3 台机器,则分别有 3 个标签,分别为 machine1、machine2、machine3。这是一个图表(点击显示) Prometheus

我想把这三个组合在一起,所以只有一个tag:machines,取值是这三个的平均值。

Prometheus查询函数好像没有average()之类的东西,所以我不知道该怎么做。

我以前在 InfluxDB 上工作,图表可以显示如下(点击显示): influxDB

我认为您正在搜索 avg() 操作。 see documentation

使用内置 $__interval 变量,其中 node, name 是自定义标签(取决于您的指标):

sum(avg_over_time(some_metric[$__interval])) by (node, name)

或固定值,如 1m1h 等:

sum(avg_over_time(some_metric[1m])) by (node, name)

您可以使用 Grafana 变量进行过滤:

sum(avg_over_time(some_metric{cluster=~"$cluster"}[1m])) by (node, name)

简短回答:使用 avg() 函数来 return 多个时间序列的平均值。例如,avg(metric) returns 名称为 metric 的时间序列的平均值。

长答案:Prometheus 提供了两个计算平均值的函数:

  • avg_over_time 计算方括号中指定的回顾 window 上存储在数据库中的原始样本的平均值。平均值是根据每个匹配的时间序列独立计算的。例如,avg_over_time(metric[1h]) 计算名称为 metric 的每个时间序列过去一小时内原始样本的平均值。
  • avg 计算多个时间序列的平均值。平均值是根据图表上的每个点独立计算的。

如果您需要计算所有时间序列的原始样本的平均值,每个时间段都匹配给定的 selector,例如:

SELECT
  time_bucket('5 minutes', timestamp) AS t,
  avg(value)
FROM table
GROUP BY t

然后必须使用以下 PromQL 查询:

sum(sum_over_time(metric[$__interval])) / sum(count_over_time(metric[$__interval]))

不要使用 avg(avg_over_time(metric[$__interval])),因为它 return 是平均值的平均值,不等于实际平均值。有关详细信息,请参阅 this explanation