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

Другие вопросы по тегам