Grafana - Как создать переменную / макрос части запроса sql для источника данных Mysql
У меня есть следующий запрос в Grafana, который поддерживается MySql DataSource.
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)
В Dashboard есть несколько 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,$ пол) не разрешаются генератором запросов, и сгенерированный запрос выглядит следующим образом.
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
Есть ли способ разрешить переменные, которые содержатся в других переменных. Или есть какой-то другой способ для вывода части запроса, которая содержит переменные?
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.
У меня также были проблемы с кавычками, вот мое решение, которое поддерживает 'Все' и многие выбраны:
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