График в Grafana с использованием источника данных Postgres со столбцом BIGINT в качестве времени - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь построить очень простой график, показывающий, сколько посещений я получил за определенный период времени (например, за каждые 5 минут).У меня Grafana v. 5.4.0 в паре с Postgres v. 9.6 полными данных.Моя таблица ниже:

CREATE TABLE visit (
    id                    serial CONSTRAINT visit_primary_key PRIMARY KEY,
    user_credit_id        INTEGER NOT NULL REFERENCES user_credit(id),
    visit_date            bigint NOT NULL,
    visit_path            varchar(128),
    method                varchar(8) NOT NULL DEFAULT 'GET'
);

Вот некоторые данные:

 id | user_credit_id |  visit_date   |                 visit_path                  | method 
----+----------------+---------------+---------------------------------------------+--------
  1 |              1 | 1550094818029 | /                                           | GET
  2 |              1 | 1550094949537 | /mortgage/restapi/credit/{userId}/decrement | POST
  3 |              1 | 1550094968651 | /mortgage/restapi/credit/{userId}/decrement | POST
  4 |              1 | 1550094988557 | /mortgage/restapi/credit/{userId}/decrement | POST
  5 |              1 | 1550094990820 | /index/UGiBGp0V                             | GET
  6 |              1 | 1550094990929 | /                                           | GET
  7 |              2 | 1550095986310 | /                                           | GET
...

Итак, я попробовал эти 3 варианта (на самом деле, десятки других без удачи) безуспешно:

  1. Решение A:
SELECT
  visit_date as "time",
  count(user_credit_id) AS "user_credit_id"
FROM visit
WHERE $__timeFilter(visit_date)
ORDER BY visit_date ASC

Нет данных на графике.Ошибка: pq: неверный синтаксис ввода для целого числа: «2019-02-14T13: 16: 50Z»

Решение B
SELECT
  $__unixEpochFrom(visit_date),
  count(user_credit_id) AS "user_credit_id"
FROM visit
GROUP BY time
ORDER BY user_credit_id

Series ASELECT
  $__time(visit_date/1000,10m,previous),
  count(user_credit_id) AS "user_credit_id A"
FROM
  visit
WHERE
 visit_date >= $__unixEpochFrom()::bigint*1000 and
 visit_date <= $__unixEpochTo()::bigint*1000
GROUP BY 1
ORDER BY 1

Нет данных на графике.Нет ошибки ..

Решение C :
SELECT
  $__timeGroup(visit_date, '1h'),
  count(user_credit_id) AS "user_credit_id"
FROM visit
GROUP BY time
ORDER BY time

Нет данных на графике.Ошибка: pq: функция pg_catalog.date_part (неизвестно, bigint) не существует

Может кто-нибудь помочь мне разобраться с этой простой проблемой, поскольку я считаю, что запрос должен быть компактным, наивным и простым .. Но Grafana Документы, демонстрирующие его синтаксис и функции, меня немного смущают .. Заранее спасибо!

No success with graph query

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Ян Гарадж, Большое спасибо!Я должен признать, что ваш фрагмент и, что более ценно, ваши дополнительные комментарии, советующие переключиться на отладку SQL, значительно помогли мне сделать «прорыв».Итак, результирующий запрос, который решил мою проблему ниже:

SELECT
  $__unixEpochGroup(visit_date/1000, '5m') AS "time",
  count(user_credit_id) AS "Total Visits"
FROM visit
WHERE
  '1970-01-01 00:00:00 GMT'::timestamp + ((visit_date/1000)::text)::interval BETWEEN
  $__timeFrom()::timestamp
  AND
  $__timeTo()::timestamp
GROUP BY 1
ORDER BY 1

Несколько комментариев, чтобы расшифровать все это Grafana magic:

  1. Grafana имеет ограничение DSL доСоздавая настраиваемые графы, этот набор функций преобразуется в какой-то значимый SQL (здесь мне очень помог просмотр «скомпилированного» SQL, большое спасибо еще раз).
  2. Чтобы сделать мой столбец BIGINT подходящим дляпредопределенные Grafana функции, нам нужно просто преобразовать их в секунды с UNIX эпохи, поэтому в математическом языке - просто разделить на 1000.
  3. Теперь выражение WHERE кажется не таким простым и предсказуемым, Grafana DSLработает по-разному, где простое деление не сработало, и я решил это с помощью других Grafana функций, чтобы получить FROM и TO точек времени (период времени, для которого должен отображаться график), но эти функции генерируют тип метки временив то время как у нас есть BIGINT в нашей колонке.Итак, благодаря Postgres у нас есть куча средств преобразования, чтобы сделать его меткой времени ('1970-01-01 00:00:00 GMT' :: timestamp + ((visit_date / 1000) :: text) :: interval -генерирует одно BIGINT значение, преобразованное в Postgres TIMESTAMP, с которым Grafana отлично справляется).

debugging_result_sql

PS Если вы не возражаете, я изменил текст моего вопроса, чтобы быть более точным и подробным.

0 голосов
/ 15 февраля 2019

Используйте этот запрос, который будет работать, если visit_date равен timestamptz:

SELECT
  $__timeGroupAlias(visit_date,5m,0),
  count(*) AS "count"
FROM visit
WHERE
  $__timeFilter(visit_date)
GROUP BY 1
ORDER BY 1

Но ваш visit_date равен bigint, поэтому вам нужно преобразовать его в timestamp (возможно, сTO_TIMESTAMP()) или вам нужно будет найти другой способ, как использовать его с bigint.Используйте инспектор запросов для отладки, и вы увидите SQL, сгенерированный Grafana.

...