如何在Grafana中创建并以表格形式访问PostgreSQL多列查询变量?
在Grafana中用PostgreSQL实现多列表格式变量访问
默认情况下,Grafana的查询变量会把多列查询结果拆成扁平的集合,丢失了id和name的对应关系,没法直接像表格一样操作。要解决这个问题,得通过JSON序列化的方式保存结构化数据,再在查询中解析,具体步骤如下:
1. 修改变量查询,返回JSON格式数据
把原来的查询改成将结果序列化为JSON数组,让变量存储完整的键值对结构:
SELECT json_agg(row_to_json(t)) FROM (SELECT id, name FROM country) t;
这个查询会返回类似这样的JSON字符串:[{"id":1,"name":"spain"},{"id":2,"name":"germany"},{"id":3,"name":"usa"}]
2. 配置变量
在Grafana的变量设置里:
- 类型选「查询」,数据源选你的PostgreSQL实例
- 输入上面的查询语句,给变量起个名字(比如
country_data),保存即可
3. 在面板查询中解析JSON变量
在需要使用该表格数据的面板查询里,用PostgreSQL的jsonb_to_recordset函数把JSON字符串解析成临时表,就能像操作普通数据库表一样访问id和name了:
示例1:根据选中的ID获取对应名称
如果你有一个选择国家ID的变量selected_id,可以这样写查询:
SELECT name FROM jsonb_to_recordset(${country_data:raw}::jsonb) AS t(id int, name text) WHERE id = ${selected_id};
示例2:关联其他表查询
要是需要和其他表关联,比如和city表联动获取对应国家的城市:
SELECT c.name AS city_name, t.name AS country_name FROM city c JOIN jsonb_to_recordset(${country_data:raw}::jsonb) AS t(id int, name text) ON c.country_id = t.id;
为什么之前的写法没用
Grafana默认的多列变量会把所有列的值拼接成扁平的列表,完全丢失了id和name的对应关系,所以$(variable.name)这类写法根本识别不了结构化数据,必须先通过JSON序列化保留数据结构,再用数据库函数解析才能用。
内容的提问来源于stack exchange,提问作者Aitor Uaa
相关产品推荐
相关产品推荐

