我正在使用 Grafana 和 QuestDB 数据源插件。我想根据查询定义一个变量,就像这里的查询
select symbol, first(price) as price from trades
where symbol like '%BTC%'
符号 | 价格 |
---|---|
DOGE-BTC | 0.00000204 |
ETH-BTC | 0.05551 |
BTC-USDT | 37779.62 |
SOL-BTC | 0.0015282 |
MATIC-BTC | 0.00002074 |
BTC-USDC | 60511.1 |
AVAX-BTC | 0.00056124 |
XLM-BTC | 0.00000314 |
LTC-BTC | 0.001858 |
DOT-BTC | 0.0001379 |
ADA-BTC | 0.00001026 |
UNI-BTC | 0.0001715 |
BTC-美元 | 39269.98 |
当我使用该查询定义变量时,下拉列表仅包含
price
列。我想要的是将 symbol
列显示为下拉可见标签,但在幕后发送 price
列作为将在图表的 SQL 中插值的实际值。
使用 postgresql 数据源,我读到我可以使用特殊名称
__text
和 __value
为列添加别名,如下所示:
select symbol as __name, first(price) as __value from trades
where symbol like '%BTC%'
如果我使用 postgresql 数据源,即使指向 QuestDB 实例,这也是有效的。但是,对于 QuestDB 数据源,别名将被忽略。如果可能的话,我想继续使用 QuestDB 数据源,因为它具有更好的集成,但我需要解决此问题。
我们可以利用Grafana 的正则表达式变量过滤器。技巧是以我们可以通过正则表达式轻松解析的格式从变量定义中获取结果。
目标是拥有一种可以使用正则表达式解析为两个名为
text
和 value
的捕获组的格式。所以我能做的就是将我的两个表列连接为一个字符串,并使用永远不会出现在这些列上的分隔符。
with t as (
select symbol, first(price) as price from trades where symbol like '%BTC%'
)
select concat(symbol,'#',price) from t
现在在变量定义上我可以输入这样的正则表达式过滤器
/(?<text>[^#]+)\#(?<value>.*)/
它将首先捕获从开头到
#
(名称为 text
)的所有内容以及 #
之后的所有内容,直到名称为 value
的结尾。这样,Grafana 将在下拉列表中使用 name
,但当变量在图表中的任何位置使用时,则使用 value
。