首页 > 解决方案 > 在 grafana 中显示每小时平均值(直方图)

问题描述

给定具有每小时数据点的(电力)市场数据的时间序列,我想显示一个条形图,其中包含每小时数据的所有时间/时间范围平均值,以便分析师可以轻松地将实际价格与所有时间平均值(哪个小时一天中最贵/最便宜的)。

我们有 cratedb 作为后端,它在 grafana 中使用,就像 postgres 源一样。

SELECT
  extract(HOUR from start_timestamp) as "time",
  avg(marketprice) as value
FROM doc.el_marketprices
GROUP BY 1
ORDER BY 1

所以我的数据基本上是这样的

time    value
23.00   23.19
22.00   25.38
21.00   29.93
20.00   31.45
19.00   34.19
18.00   41.59
17.00   39.38
16.00   35.07
15.00   30.61
14.00   26.14
13.00   25.20
12.00   24.91
11.00   26.98
10.00   28.02
9.00    28.73
8.00    29.57
7.00    31.46
6.00    30.50
5.00    27.75
4.00    20.88
3.00    19.07
2.00    18.07
1.00    19.43
0       21.91

经过几个小时摆弄条形图、直方图模式、热图面板等等,我只是无法在 Grafana 中用它绘制简单的小时直方图。我非常感谢有关如何使用任何面板来完成此任务的任何建议。

标签: histogramgrafanadate-histogram

解决方案


  1. 您的查询没有为 Grafana 返回正确的时间序列数据 - 时间字段不是有效的时间戳,所以不要只提取小时,而是提供完整start_timestamp的(我希望它是timestamp 数据类型,值是 UTC)
  2. 添加 WHEREtime条件 - 使用 Grafana 的宏__timeFilter
  3. 使用 Grafana 的宏$__timeGroupAlias进行每小时分组
SELECT
  $__timeGroupAlias(start_timestamp,1h,0),
  avg(marketprice) as value
FROM doc.el_marketprices
WHERE $__timeFilter(start_timestamp)
GROUP BY 1
ORDER BY 1

这将为您提供具有每小时平均值的历史图表数据。

所需的直方图可能很棘手,但您可以尝试创建指标,该指标将提取小时,例如

SELECT
  $__timeGroupAlias(start_timestamp,1h,0),
  extract(HOUR from start_timestamp) as "metric",
  avg(marketprice) as value
FROM doc.el_marketprices
WHERE $__timeFilter(start_timestamp)
GROUP BY 1
ORDER BY 1

然后将其可视化为直方图。请记住,Grafana 被指定用于时间序列数据,因此您需要适当的时间戳(不仅提取小时,最终您可以伪造它)否则您将很难在 Grafana 中可视化非时间序列数据。这第二个查询可能无法正常工作,但它至少给了你一个想法。


推荐阅读