【问题标题】:Graph in Grafana using Postgres Datasource with BIGINT column as time使用带有 BIGINT 列的 Postgres 数据源在 Grafana 中绘制图表作为时间
【发布时间】:2019-02-14 19:14:12
【问题描述】:

我正在尝试构建一个非常简单的图表,显示我在某个时间段内(例如每 5 分钟)获得了多少访问量。 我有 Grafana of 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”

  1. 解决方案 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

图表上没有数据。没有错误..

  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(unknown, bigint) 不存在

有人可以帮我解决这个简单的问题,因为我认为查询应该是紧凑、幼稚和简单的。但是 Grafana 演示其语法和功能的文档让我有些困惑。提前致谢!

【问题讨论】:

    标签: postgresql grafana metrics


    【解决方案1】:

    使用这个查询,如果visit_datetimestamptz,它将起作用:

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

    但是您的visit_datebigint,因此您需要将其转换为timestamp(可能与TO_TIMESTAMP()),否则您将需要找到其他方式来使用它与bigint。使用查询检查器进行调试,您将看到 Grafana 生成的 SQL。

    【讨论】:

    • 非常感谢!最后,根据您的建议,我解决了我的问题,请参阅下面的答案。
    【解决方案2】:

    Jan Garaj,非常感谢!我应该承认,您的 sn-p 以及更有价值的其他 cmets 建议切换到 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
    

    几个 cmets 来破译这一切 Grafana 魔法:

    1. Grafana 有其有限的DSL 来制作可配置的图表,这组函数转换为一些有意义的SQL(这是看到“编译”SQL 对我有很大帮助的地方,再次感谢)。
    2. 为了使我的BIGINT 列适用于预定义的Grafana 函数,我们只需将其转换为UNIX 纪元的秒数​​,因此,在数学语言中 - 只需除以 1000。
    3. 现在,WHERE 语句似乎不是那么简单和可预测,Grafana DSL 的工作方式不同,简单的除法没有成功,我通过使用另一个 Grafana 函数来解决它,以获得 FROMTO 点time(应该呈现 Graph 的时间段)但是这些函数会生成时间戳类型,而我们的列中确实有 BIGINT。所以,多亏了Postgres,我们有一堆转换器可以让它成为时间戳('1970-01-01 00:00:00 GMT'::timestamp + ((visit_date/1000)::text)::interval -为您生成一个BIGINT 值,转换为Postgres TIMESTAMPGrafana 处理得很好)。

    附注如果您不介意,我已将问题文本更改为更精确和详细。

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2021-04-01
      • 2022-01-18
      相关资源
      最近更新 更多