Графические графы с типом данных Postgres JSON не работают - PullRequest
1 голос
/ 29 мая 2019

Я настраиваю 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(commit: d812109))

1 Ответ

0 голосов
/ 04 июня 2019

У меня это работает.

Я полагаю, это было вызвано часовыми поясами. Я нашел обсуждение на некоторых форумах 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)

И вот как теперь выглядит код Графана:

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-й день.

...