繁体   English   中英

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

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

我试图在 Grafana 上创建一个普罗米修斯图,但我找不到计算平均值的 function。

例如,为 read_latency 创建一个图,结果包含许多标签。 如果有 3 台机器,则分别有 3 个标签,分别为 machine1、machine2、machine3。 这是一张图(点击显示)普罗米修斯

我想把这三者结合起来,那么就只有一个tag:machines,取值为这三者的平均值。

似乎普罗米修斯查询 function 没有像 average() 这样的东西,所以我不知道该怎么做。

我曾经在 InfluxDB 上工作,图表可以显示为(点击显示): influxDB

我认为您正在寻找 avg() 操作。 查看文档

简短回答:使用avg() function 返回多个时间序列的平均值。 例如, avg(metric)返回具有metric名称的时间序列的平均值。

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

  • avg_over_time计算在方括号中指定的 lookbehind 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])) ,因为它返回平均值的平均值,这不等于实际平均值。 有关详细信息,请参阅此说明

使用内置的$__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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM