Grafana - 如何为 Mysql 数据源创建 sql 查询部分变量/宏

Posted

技术标签:

【中文标题】Grafana - 如何为 Mysql 数据源创建 sql 查询部分变量/宏【英文标题】:Grafana - How to create sql query part variable/macro for Mysql datasource 【发布时间】:2019-06-18 23:41:45 【问题描述】:

我在 Grafana 中有以下由 mysql 数据源支持的查询。

SELECT
  $__timeGroupAlias(ts,$__interval),
  sum(total) AS "total"
FROM hp
WHERE
  $__timeFilter(ts) 
  AND customer_type IN ($CustomerType) AND age IN ($age) AND gender IN ($gender)
GROUP BY 1
ORDER BY $__timeGroup(ts,$__interval)

仪表板中有多个 singleStat/panel/graphs,它们使用不同的选择参数,但 WHERE 条件在所有这些中保持相同。

我想将条件保留为单独的常量变量,以便我可以在每个查询中仅添加该变量。

我尝试像这样构建我的查询。

SELECT
  $__timeGroupAlias(ts,$__interval),
  sum(total) AS "total"
FROM hp
$where_condition
GROUP BY 1
ORDER BY $__timeGroup(ts,$__interval)

并将where_condition 声明为WHERE $__timeFilter(ts) AND customer_type IN ($CustomerType) AND age IN ($age) AND gender IN ($gender)

但是查询失败,因为内部变量($CustomerType,$age,$gender)没有被查询生成器解析,生成的查询看起来像这样。

SELECT
  UNIX_TIMESTAMP(ts) DIV 900 * 900 AS "time",
  sum(total) AS "total"
FROM hp
ts BETWEEN FROM_UNIXTIME(1548311714) AND FROM_UNIXTIME(1548398114) 
AND customer_type IN ($CustomerType) AND age IN ($age) AND gender IN ($gender)
GROUP BY 1
ORDER BY UNIX_TIMESTAMP(ts) DIV 900 * 900

有没有办法解决包含在其他变量中的变量。或者是否有任何其他方法可以将包含变量的查询部分外部化?

【问题讨论】:

where_condition 使用了哪种变量类型,您的 Grafana 版本是什么? Grafana 版本 = v5.4.3,where_condition 使用了常量类型。 【参考方案1】:

constant 变量类型只生成静态字符串。它没有替代任何变量。切换到query 类型并使用MySQL 返回字符串,这将为您的where_condition 变量提供精确的字符串值。查询:

SELECT 'WHERE $__timeFilter(ts) AND customer_type IN ($CustomerType) AND age IN ($age) AND gender IN ($gender)'

恕我直言:变量替换也适用于constant 类型。您可以打开该https://github.com/grafana/grafana/issues 的功能请求。

【讨论】:

它有效。当使用像 $where_condition:csv 这样的变量时,我必须禁用引号。我会提出相同的功能要求。【参考方案2】:

我也遇到了引号问题,这是我的解决方案,支持“全部”和许多选择:

SELECT '
task_run_table.is_system = false 
AND 
(
    ''__all__'' = ''$user:raw''
    OR 
    task_run_table.user  = any ( string_to_array(''$user:raw'', '','')::text[])
)
AND 
(
    ''__all__'' = ''$job:raw''
    OR 
    task_run_table.job_name  = any ( string_to_array(''$job:raw'', '','')::text[])
)
' 

All 值被覆盖为__all__。 它是这样使用的:

SELECT 
  $__timeGroup(task_run_table.start_time, '$interval', NULL),
  task_run_table.name AS metric,
  COUNT(*) AS value
FROM
  task_run_table
WHERE 
  $__timeFilter(task_run_table.start_time) 
  AND 
  $default_filter:raw
  AND 
  task_run_table.state = $state
GROUP BY time, task_run_table.name
ORDER BY time, value DESC

【讨论】:

以上是关于Grafana - 如何为 Mysql 数据源创建 sql 查询部分变量/宏的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个 Prometheus 数据源配置 Grafana 仪表板?

如何为 microk8s grafana 设置 SMTP(prometheus 插件)

如何为 mysql 数据库创建多个 Debezium 连接器

如何为mysql中的现有表创建索引?

如何为 mysqlcluster 创建休眠配置文件?

如何为 AWS RDS 加载数据 infile mysql 工作台?