Grafana绘制多线时序图无法按group字段拆分序列如何解决
Grafana多折线时序图配置问题修复
现有环境
table1表结构及样例数据
| id | datetime | group |
|---|---|---|
| 0 | 2022-07-14 06:03:05.000 | 1 |
| 0 | 2022-07-14 05:02:05.000 | 1 |
| 0 | 2022-07-14 05:01:05.000 | 2 |
| 0 | 2022-07-14 04:03:05.000 | 1 |
| 0 | 2022-07-14 04:02:05.000 | 2 |
| 0 | 2022-07-14 04:01:05.000 | 3 |
| 0 | 2022-07-14 03:03:05.000 | 1 |
groups表结构及样例数据
| name | info |
|---|---|
| 1 | 'sdfdsf' |
| 2 | 'dsfdsfsd' |
| 3 | '234234' |
需求
按1小时时间间隔,统计table1中每个group对应的行数,绘制包含多条折线的时序图。
原有查询及问题
原有SQL如下,返回的统计结果数值正确,但在Grafana中仅展示单条折线,未按group拆分多序列:
select d.dt, coalesce(count(table1.id), 0) as count, g.group from ( select generate_series(date_trunc('hour', timestamp '${__from:date}'), date_trunc('hour', timestamp '${__to:date}'), '1 hour') as dt ) as d(dt) left join ( select distinct name from groups ) as g(group) on true left join table1 on table1.date >= d.dt and table1.date < d.dt + interval '1 hour' and table1.group = g.group group by 1, 3 order by 1
查询返回的正确样例数据:
| dt | count | group |
|---|---|---|
| 2022-07-14 06:00:00.000 | 1 | 1 |
| 2022-07-14 06:00:00.000 | 0 | 2 |
| 2022-07-14 06:00:00.000 | 0 | 3 |
| 2022-07-14 05:00:00.000 | 1 | 1 |
| 2022-07-14 05:00:00.000 | 2 | 2 |
| 2022-07-14 05:00:00.000 | 0 | 3 |
修复方案
1. 修正SQL语句适配Grafana识别规则
原有SQL存在4个影响Grafana识别的问题:
- 字段笔误:table1的时间字段名为
datetime,原查询误写为date - 时间列未按Grafana约定命名:将时间列别名设为
time,可被自动识别为时间维度 - 未处理SQL保留字冲突:
group是SQL保留字,需要转义;同时明确分组字段的标签属性,方便Grafana识别为拆分维度 - Grafana时间宏使用错误:用
${__from:timestamp}替代${__from:date},避免格式转换异常
修正后的SQL:
SELECT d.dt AS time, COUNT(t1.id) AS count, g.group_id AS group_name FROM ( SELECT generate_series( date_trunc('hour', ${__from:timestamp}::timestamp), date_trunc('hour', ${__to:timestamp}::timestamp), '1 hour'::interval ) AS dt ) d CROSS JOIN ( SELECT DISTINCT name AS group_id FROM groups ) g LEFT JOIN table1 t1 ON t1.datetime >= d.dt AND t1.datetime < d.dt + INTERVAL '1 hour' AND t1."group" = g.group_id GROUP BY d.dt, g.group_id ORDER BY d.dt
注:COUNT(t1.id)本身会将无匹配行的null值计数为0,不需要额外加coalesce包裹
2. 检查Grafana面板配置
- 在查询编辑页,确认
Format as下拉选项选择为Time series,不要选Table - 若使用Grafana 8以下版本,在查询配置的
Legend字段填写{{group_name}},指定按group_name字段拆分序列 - 进入面板的
Transform标签页,删除所有会合并时序的转换规则(例如配置错误的Merge、Series to rows规则)
配置完成后,Grafana会自动按group值拆分出多条独立折线,每个group对应一条时序。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

