使用Postgres JSON数据类型的Grafana绘图不起作用

时间:2019-05-29 03:46:04

标签: json postgresql grafana

我正在为自己所在公司的内部仪表板设置Grafana。我们有一个可以跟踪的电话系统,并且已将指标保存在数据库中。我已经提取了关键指标并将其存储在Postgres数据库中。看起来像这样:

postgres=# SELECT * FROM phonedata LIMIT 5;
 id |    date    |                                       data                                       
----+------------+----------------------------------------------------------------------------------
 16 | 2019-05-27 | {"avgDuration": "608", "avgQueuetime": "0:02:46.716667", "voicemailCount": "6"}
 17 | 2019-05-26 | {"avgDuration": "676", "avgQueuetime": "None", "voicemailCount": "0"}
 18 | 2019-05-25 | {"avgDuration": "506", "avgQueuetime": "0:01:32.684211", "voicemailCount": "1"}
 19 | 2019-05-24 | {"avgDuration": "540", "avgQueuetime": "0:02:14.784091", "voicemailCount": "11"}
 20 | 2019-05-23 | {"avgDuration": "616", "avgQueuetime": "0:03:09.433962", "voicemailCount": "10"}
(5 rows)

此数据显示“日期”列中显示的日期统计信息。这一切都很好。我有最近90天的数据,所以没有数据是没有问题的。

现在,我正在尝试在Grafana上制作一个图表,以显示每天平均通话时间,有点让我无法正常工作。

这里是指向我编写的代码的图像和Grafana上的图形的链接。 StackOverflow不允许我直接发布图像

https://i.imgur.com/3uQe9t5.png

这是写出的代码:

SELECT
    date AS "time",
    data->>'avgDuration'::VARCHAR as "values"
FROM
    phonedata
WHERE
    $__timeFilter(date) AND
    data->>'avgDuration' NOT ilike 'None'
ORDER BY 1

我觉得我已经很近了,但是还没到那儿。我对此尝试了许多不同的变体,但无法弄清楚。

任何帮助都是巨大的。

谢谢

(我正在运行Grafana v5.4.2(提交:d812109))

1 个答案:

答案 0 :(得分:0)

我已经开始工作了。

我认为这是由时区引起的。我在一些Grafana论坛上找到了讨论,讨论了一个问题,即返回数据时,表上显示的所有内容都是“ 1.56 Tri”。我更改了数据库的架构,将数据列从DATE类型更改为TIMESTAMPTZ。

这是PostgreSQL表现在的样子:

postgres=# SELECT * FROM phonedata LIMIT 5;
 id |          date          |                                   data
----+------------------------+---------------------------------------------------------------------------
  1 | 2019-06-03 00:00:00+12 | {"avgDuration": "543", "avgQueuetime":"0:04:13", "voicemailCount": "7"}
  2 | 2019-06-02 00:00:00+12 | {"avgDuration": "524", "avgQueuetime":"None", "voicemailCount": "2"}
  3 | 2019-06-01 00:00:00+12 | {"avgDuration": "573", "avgQueuetime":"0:03:04", "voicemailCount": "6"}
  4 | 2019-05-31 00:00:00+12 | {"avgDuration": "621", "avgQueuetime":"0:02:14", "voicemailCount": "15"}
  5 | 2019-05-30 00:00:00+12 | {"avgDuration": "729", "avgQueuetime":"0:02:39", "voicemailCount": "5"}
(5 rows)

这是Grafana代码现在的样子:

SELECT
  phonedata.date AS time,
  ((data->>'avgDuration')::NUMERIC) as values
FROM
  phonedata
WHERE
  $__timeFilter(phonedata.date)

这是现在的图形:

https://imgur.com/I5cqaMk.png

我还发现如果不能将任何值强制转换为NUMERIC,则图形将不会继续绘制图形。我会有avgDuration为“无”的一天,因为那天没有打过电话,这会破坏图表。因此,如果发生在5天前,它将绘制前4天的图表,在第5天失败,而从第6天开始。