菜单
文档breadcrumb arrow Grafana 文档breadcrumb arrow 数据源breadcrumb arrow MySQLbreadcrumb arrow MySQL 查询编辑器
Grafana Cloud Enterprise 开源 RSS

MySQL 查询编辑器

Grafana 的查询编辑器对于每个数据源都是独一无二的。有关 Grafana 查询编辑器的通用信息,请参阅查询编辑器。有关在 Grafana 中查询数据源的通用信息,请参阅查询和转换数据

MySQL 查询编辑器位于Explore 页面上。您也可以从仪表盘面板访问 MySQL 查询编辑器。点击面板右上角的省略号,然后选择 编辑

注意

如果在数据源配置页面或通过配置 provisioning 文件设置了默认数据库,则用户将只能查询该预配置的数据库。此功能位于一个功能标志后面,在启用 sqlDatasourceDatabaseSelection 后可用。

MySQL 查询编辑器组件

MySQL 查询编辑器有两种模式:BuilderCode

Builder 模式可帮助您使用可视化界面构建查询。Code 模式支持高级查询并提供了复杂 SQL 查询编写支持。

注意

如果您的表名或数据库名包含保留字或禁用字符,编辑器将在名称周围加上引号。例如,名称 table-name 将用反引号括起来 - `table-name`

MySQL Builder 模式

Builder mode

以下组件将帮助您构建 MySQL 查询

  • 格式 - 从下拉列表中选择 MySQL 查询的格式响应。默认是 表格。如果您使用 时序 格式选项,其中一列必须是 time

  • 数据集 - 从下拉列表中选择要查询的数据库。

    • 表格 - 从下拉列表中选择一个表。表对应于所选的数据库。

    • 数据操作 - 可选 从下拉列表中选择一个聚合。您可以点击 + 号 添加多个数据操作。点击 X 删除一个数据操作。点击 垃圾桶图标 删除整列。

    • - 选择要在其上运行聚合的列。

    • 别名 - 可选 从下拉列表中添加一个别名。您也可以通过在框中输入并点击 Enter 添加自己的别名。通过点击 X 删除别名。

  • 过滤器 - 切换以添加过滤器。

    • 按列值过滤 - 可选 如果您切换 过滤器,您可以从下拉列表中添加要过滤的列。要过滤更多列,点击条件下拉列表右侧的 + 号。您可以从条件旁边的下拉列表中选择各种运算符。添加多个过滤器时,您可以添加一个 AND 运算符以显示所有真条件,或添加一个 OR 运算符以显示任何真条件。使用第二个下拉列表选择一个过滤器。要移除过滤器,点击该过滤器的下拉列表旁边的 X 按钮。选择日期类型列后,您可以从运算符列表中选择 并选择 timeFilter,这将添加 $__timeFilter 宏到使用选定日期列的查询中。
  • 分组 - 切换以添加 按列分组

    • 按列分组 - 从下拉列表中选择要过滤的列。点击 + 号 按多个列过滤。点击 X 移除过滤器。
  • 排序 - 切换以添加 ORDER BY 语句。

    • 排序依据 - 从下拉列表中选择要排序的列。选择升序(ASC)或降序(DESC)顺序。
    • 限制 - 您可以为检索结果的数量添加一个可选限制。默认值为 50。
  • 预览 - 切换以预览查询构建器生成的 SQL 查询。预览功能默认开启。

MySQL Code 模式

要创建高级查询,切换到 Code 模式,点击编辑器窗口右上角的 Code。Code 模式支持表、列、SQL 关键字、标准 SQL 函数、Grafana 模板变量和 Grafana 宏的自动补全。在指定表之前,列无法自动补全。

选择 表格时序 作为格式。点击右下角的 {} 以格式化查询。点击向下箭头展开 Code 模式编辑器。CTRL/CMD + Enter 可作为执行查询的键盘快捷键。

警告

在 Code 模式下对查询所做的更改不会转移到 Builder 模式,并将被丢弃。系统将提示您将代码复制到剪贴板以保存任何更改。

您可以将宏添加到查询中,以简化语法并启用动态元素,例如日期范围过滤器。

宏示例描述
$__time(dateColumn)将值替换为一个表达式,用于转换为 UNIX 时间戳并将列重命名为 time_sec。示例:UNIX_TIMESTAMP(dateColumn) AS time_sec
$__timeEpoch(dateColumn)将值替换为一个表达式,用于转换为 UNIX Epoch 时间戳并将列重命名为 time_sec。示例:UNIX_TIMESTAMP(dateColumn) AS time_sec
$__timeFilter(dateColumn)使用指定的列名将值替换为时间范围过滤器。示例:dateColumn BETWEEN FROM_UNIXTIME(1494410783) AND FROM_UNIXTIME(1494410983)
$__timeFrom()将值替换为当前活动时间选择的开始时间。示例:FROM_UNIXTIME(1494410783)
$__timeTo()将值替换为当前活动时间选择的结束时间。示例:FROM_UNIXTIME(1494410983)
$__timeGroup(dateColumn,'5m')将值替换为适合在 GROUP BY 子句中使用的表达式。示例:*cast(cast(UNIX_TIMESTAMP(dateColumn)/(300) as signed)*300 as signed),*
$__timeGroup(dateColumn,'5m', 0)$__timeGroup(dateColumn,'5m') 宏相同,但包含一个填充参数,以确保 Grafana 添加序列中的缺失点,使用 0 作为默认值。这仅适用于时序查询。
$__timeGroup(dateColumn,'5m', NULL)$__timeGroup(dateColumn,'5m', 0) 相同,但使用 NULL 作为缺失点的值。这仅适用于时序查询。
$__timeGroup(dateColumn,'5m', previous)$__timeGroup(dateColumn,'5m', previous) 宏相同,但使用序列中的上一个值作为填充值。如果不存在上一个值,则使用NULL这仅适用于时序查询。
$__timeGroupAlias(dateColumn,'5m')将值替换为与 $__timeGroup 相同的内容,但增加了一个列别名。
$__unixEpochFilter(dateColumn)使用指定的列名将值替换为时间范围过滤器,时间表示为 UNIX 时间戳。示例:dateColumn > 1494410783 AND dateColumn < 1494497183
$__unixEpochFrom()将值替换为当前活动时间选择的开始时间,以 UNIX 时间戳表示。示例:1494410783
$__unixEpochTo()将值替换为当前活动时间选择的结束时间,以 UNIX 时间戳表示。示例:1494497183
$__unixEpochNanoFilter(dateColumn)使用指定的列名将值替换为时间范围过滤器,时间表示为纳秒时间戳。示例:dateColumn > 1494410783152415214 AND dateColumn < 1494497183142514872
$__unixEpochNanoFrom()将值替换为当前活动时间选择的开始时间,以纳秒时间戳表示。示例:1494410783152415214
$__unixEpochNanoTo()将值替换为当前活动时间选择的结束时间,以纳秒时间戳表示。示例:1494497183142514872
$__unixEpochGroup(dateColumn,'5m', [fillmode])与 $__timeGroup 相同,但适用于存储为 Unix 时间戳的时间。请注意,fillMode 仅适用于时序查询。
$__unixEpochGroupAlias(dateColumn,'5m', [fillmode])与 $__timeGroup 相同,但同时也添加了列别名。请注意,fillMode 仅适用于时序查询。

表格 SQL 查询

如果 格式 选项设置为 表格,您可以执行几乎任何类型的 SQL 查询。表格面板将自动显示查询结果中的列和行。

您可以使用 SQL 关键字 AS 语法更改或自定义表格面板列的名称。

sql
SELECT
  title as 'Title',
  user.login as 'Created By' ,
  dashboard.created as 'Created On'
 FROM dashboard
INNER JOIN user on user.id = dashboard.created_by
WHERE $__timeFilter(dashboard.created)

表格面板结果

时序查询

格式 选项设置为 时序 以创建和运行时序查询。

注意

要运行时序查询,您必须包含一个名为 time 的列,该列返回 SQL datetime 值或表示 UNIX epoch 时间(秒)的数值数据类型。此外,查询结果必须按 time 列排序,以便在面板中正确可视化。

本节中的示例参考以下表格中的数据

text
+---------------------+--------------+---------------------+----------+
| time_date_time      | value_double | CreatedAt           | hostname |
+---------------------+--------------+---------------------+----------+
| 2020-01-02 03:05:00 | 3.0          | 2020-01-02 03:05:00 | 10.0.1.1 |
| 2020-01-02 03:06:00 | 4.0          | 2020-01-02 03:06:00 | 10.0.1.2 |
| 2020-01-02 03:10:00 | 6.0          | 2020-01-02 03:10:00 | 10.0.1.1 |
| 2020-01-02 03:11:00 | 7.0          | 2020-01-02 03:11:00 | 10.0.1.2 |
| 2020-01-02 03:20:00 | 5.0          | 2020-01-02 03:20:00 | 10.0.1.2 |
+---------------------+--------------+---------------------+----------+

时序查询结果以宽格式数据帧返回。除 time 或类型为 string 的任何列都会转换为数据帧查询结果中的值字段。任何 string 列都会转换为数据帧查询结果中的字段标签。

注意

为了向后兼容,上述规则有一个例外,适用于返回三列的查询,其中包括一个名为 metric 的字符串列。此列不转换为字段标签,而是用作字段名,并且序列名设置为该 metric 列的值。参考以下包含 metric 列的示例。

包含 metric 列的示例

sql
SELECT
  $__timeGroupAlias(time_date_time,'5m'),
  min(value_double),
  'min' as metric
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time

数据帧结果

text
+---------------------+-----------------+
| Name: time          | Name: min       |
| Labels:             | Labels:         |
| Type: []time.Time   | Type: []float64 |
+---------------------+-----------------+
| 2020-01-02 03:05:00 | 3               |
| 2020-01-02 03:10:00 | 6               |
| 2020-01-02 03:20:00 | 5               |
+---------------------+-----------------+

要自定义默认序列名称格式(可选),请参阅标准选项定义

使用 $__timeGroupAlias 宏中的 fill 参数将 null 值转换为零的示例

sql
SELECT
  $__timeGroupAlias(createdAt,'5m',0),
  sum(value_double) as value,
  hostname
FROM test_data
WHERE
  $__timeFilter(createdAt)
GROUP BY time, hostname
ORDER BY time

给定以下示例中的数据帧结果并使用图面板,您将获得两个序列,分别命名为 value 10.0.1.1value 10.0.1.2。要以 10.0.1.110.0.1.2 的名称渲染序列,请使用标准选项定义 的显示值 ${__field.labels.hostname}

数据帧结果

text
+---------------------+---------------------------+---------------------------+
| Name: time          | Name: value               | Name: value               |
| Labels:             | Labels: hostname=10.0.1.1 | Labels: hostname=10.0.1.2 |
| Type: []time.Time   | Type: []float64           | Type: []float64           |
+---------------------+---------------------------+---------------------------+
| 2020-01-02 03:05:00 | 3                         | 4                         |
| 2020-01-02 03:10:00 | 6                         | 7                         |
| 2020-01-02 03:15:00 | 0                         | 0                         |
| 2020-01-02 03:20:00 | 0                         | 5                         |
+---------------------+---------------------------+---------------------------+

包含多列的示例

sql
SELECT
  $__timeGroupAlias(time_date_time,'5m'),
  min(value_double) as min_value,
  max(value_double) as max_value
FROM test_data
WHERE $__timeFilter(time_date_time)
GROUP BY time
ORDER BY time

数据帧结果

text
+---------------------+-----------------+-----------------+
| Name: time          | Name: min_value | Name: max_value |
| Labels:             | Labels:         | Labels:         |
| Type: []time.Time   | Type: []float64 | Type: []float64 |
+---------------------+-----------------+-----------------+
| 2020-01-02 03:05:00 | 3               | 4               |
| 2020-01-02 03:10:00 | 6               | 7               |
| 2020-01-02 03:20:00 | 5               | 5               |
+---------------------+-----------------+-----------------+

模板化

您可以利用变量,而无需在指标查询中硬编码服务器、应用或传感器名称等值。变量在仪表盘顶部显示为下拉选择框。这些下拉框使您可以轻松更改仪表盘中显示的数据。

请参阅模板,了解创建模板变量以及不同类型的介绍。

查询变量

如果添加一个 Query 模板变量,您可以编写一个 MySQL 查询来检索测量名称、键名或键值等项,这些项将显示在下拉菜单中。

例如,您可以使用变量通过在模板变量的 Query 设置中创建以下查询,从表中检索 hostname 列的所有值。

sql
SELECT hostname FROM my_host

一个查询可以返回多列,Grafana 将根据查询结果自动生成一个列表。例如,以下查询返回一个包含 hostnamehostname2 的值的列表。

sql
SELECT my_host.hostname, my_other_host.hostname2 FROM my_host JOIN my_other_host ON my_host.city = my_other_host.city

要在查询中使用时间范围相关的宏,例如 $__timeFilter(column),您必须将模板变量的刷新模式设置为 时间范围改变时更新

sql
SELECT event_name FROM event_log WHERE $__timeFilter(time_column)

另一种选择是创建键/值变量的查询。查询应返回两列,分别命名为 __text__value__text 列必须包含唯一值(否则只使用第一个值)。这使得下拉选项能够将一个文本友好的名称显示为文本,同时使用一个 ID 作为值。例如,查询可以使用 hostname 作为文本,id 作为值

sql
SELECT hostname AS __text, id AS __value FROM my_host

您还可以创建嵌套变量。例如,如果您有一个名为 region 的变量,您可以配置 hosts 变量以仅显示当前所选区域内的主机,如下例所示。如果 region 是一个多值变量,请使用 IN 运算符而不是 = 来匹配多个值。

sql
SELECT hostname FROM my_host  WHERE region IN($region)

使用 __searchFilter 在查询变量中过滤结果

在查询字段中使用 __searchFilter 允许根据用户在下拉选择框中的输入来过滤查询结果。如果您不输入任何内容,__searchFilter 的默认值是 %。

请注意,您必须将 __searchFilter 表达式用引号括起来,因为 Grafana 不会自动添加它们。

以下示例演示了如何在查询字段中使用 __searchFilter,以便用户在下拉选择框中输入时能够实时搜索 hostname

sql
SELECT hostname FROM my_host  WHERE hostname LIKE '$__searchFilter'

在查询中使用变量

模板变量值仅在模板变量是 multi-value 时才加引号。

如果变量是多值变量,使用 IN 比较运算符而不是 = 来匹配多个值。

您可以使用两种不同的语法

$<varname> 示例,模板变量名为 hostname

sql
SELECT
  UNIX_TIMESTAMP(atimestamp) as time,
  aint as value,
  avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in($hostname)
ORDER BY atimestamp ASC

[[varname]] 示例,模板变量名为 hostname

sql
SELECT
  UNIX_TIMESTAMP(atimestamp) as time,
  aint as value,
  avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
ORDER BY atimestamp ASC

禁用多值变量的引号

Grafana 会自动为多值变量创建带引号的逗号分隔字符串。例如:如果选择了 server01server02,它将被格式化为:'server01', 'server02'。要禁用引号,请对变量使用 csv 格式选项

Grafana 会自动将多值变量格式化为带引号的逗号分隔字符串。例如,如果选择了 server01server02,它们将被格式化为 'server01', 'server02'。要移除引号,请为变量启用 CSV 格式选项。

${servers:csv}

阅读有关变量格式选项的更多信息,请参阅变量 文档。

注解

注解 允许您在图表上叠加丰富的事件信息。您可以通过 仪表盘设置 > 注解视图 添加注解查询。

使用包含time 列(包含 epoch 值)的查询示例

sql
SELECT
  epoch_time as time,
  metric1 as text,
  CONCAT(tag1, ',', tag2) as tags
FROM
  public.test_data
WHERE
  $__unixEpochFilter(epoch_time)

使用包含 timetimeend 列(包含 epoch 值)的区域查询示例

sql
SELECT
  epoch_time as time,
  epoch_timeend as timeend,
  metric1 as text,
  CONCAT(tag1, ',', tag2) as tags
FROM
  public.test_data
WHERE
  $__unixEpochFilter(epoch_time)

使用包含 time 列(包含原生 SQL 日期/时间数据类型)的查询示例

sql
SELECT
  native_date_time as time,
  metric1 as text,
  CONCAT(tag1, ',', tag2) as tags
FROM
  public.test_data
WHERE
  $__timeFilter(native_date_time)
名称描述
time日期/时间字段的名称,可以是包含原生 SQL 日期/时间数据类型或 epoch 值的列。
timeend可选的结束日期/时间字段名称,可以是包含原生 SQL 日期/时间数据类型或 epoch 值的列。
text事件描述字段。
tags可选的字段名称,用于将事件标签作为逗号分隔字符串。

告警

使用时序查询创建告警。告警规则条件尚不支持表格格式的查询。

有关告警的更多信息,请参阅以下内容