如何计算grafana / postgres中不同记录的列值之间的差异

Posted

技术标签:

【中文标题】如何计算grafana / postgres中不同记录的列值之间的差异【英文标题】:How to calculate the difference between column values of different records in grafana/postgres 【发布时间】:2019-08-03 00:43:44 【问题描述】:

我安装并连接了 Grafana 和 postgres。我使用 grafana 来显示我添加到 postgres 的数据图表。我的 postgres 数据库有一个表,其中包含来自多个来源的记录。架构如下所示:

time   | source | bid | ask
12:01  | bitmex | 10  | 11
12:01  | deribit| 10  | 11
12:02  | bitmex | 9   | 11

每个来源的确切时间不同。我可以为每个来源绘制不同的线:

我希望绘制两个不同来源的差异(每分钟分组)。我认为我需要选择“source = x”和“source = y”相同的分组分钟并减去它们,同时保留来自 Grafana 的时间宏以保持整个过程的速度。谁能指出我正确的方向?我认为 grafana 中的“图形查询构建器”根本不可能做到这一点。

【问题讨论】:

【参考方案1】:

我正在尝试做类似的事情。我没有进行连接,而是只进行了一次查询并在第 1 次查询中进行了数学运算并返回了我正在寻找的结果。

  floor(extract(epoch from finished)/20)*20 AS "time",
  first.value AS "value"
FROM (
  SELECT
    $__timeGroupAlias(finished,$__interval,0),
    finished,
    id,
    (extract(epoch from minion_jobs.finished) * 1000) - (extract(epoch from minion_jobs.created) * 1000) AS value
  FROM minion_jobs
  WHERE queue = 'parallel'
  GROUP BY value,minion_jobs.finished, id
)AS first

【讨论】:

【参考方案2】:

我无法在 grafana 中执行此操作(减去两个查询),并且能够使用 postgres 查询(包括 grafana 宏)来执行此操作:

SELECT (first / second * 10000 - 10000) as spread, time
FROM 
  (
    SELECT   $__timeGroupAlias("time",$__interval,previous), avg(bid) AS "first"
    FROM     bbo_20s
    WHERE    $__timeFilter("time") AND market = 1
    GROUP BY time
  ) AS e
FULL JOIN 
  (
  SELECT   $__timeGroupAlias("time",$__interval,previous), avg(bid) AS "second"
  FROM     bbo_20s
  WHERE    $__timeFilter("time") AND market = 2
  GROUP BY time
  ) AS c 
USING ("time") ;

结果看起来像这样并且非常高效:

【讨论】:

以上是关于如何计算grafana / postgres中不同记录的列值之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

Grafana 使用 Postgres 及时转移

Grafana 与 springboot 和 postgres 的集成

Grafana PostgreSQL 与时间序列不同 on()

Grafana Postgres 使用可具有多个值的 Where 查询时出错

如何在 Grafana 的 Timeseries 中绘制水平线

如何计算grafana数据源弹性中的百分比