如何计算来自 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)
或固定值,如 1m
、1h
等:
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。
我试图在 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)
或固定值,如 1m
、1h
等:
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。