本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
连接到 MySQL 数据源
添加 MySQL 数据源,以便能够查询和可视化兼容 MySQL 的数据库中的数据。
重要
Grafana 版本 8.0 更改了 MySQL、Postgres 和微软 SQL Server 数据源的数据帧的基础数据结构。因此,将以宽格式返回时间序列查询结果。有关更多信息,请参阅 Grafana 数据帧文档中的宽格式
要让你的可视化效果像以前一样工作,你可能需要进行一些手动迁移。Github 上记录了一个解决方案,网址为 Postgres/mySQL/msSQL:v8.0 中与时间序列查询和数据列顺序相关的重大变化
添加数据源
-
选择顶部标题中的 Grafana 图标,打开侧面菜单。
-
在仪表板链接下的侧面菜单中,您应该找到一个名为 “数据源” 的链接。
-
选择顶部标题中的 “+ 添加数据源” 按钮。
-
从 “类型” 下拉列表中选择 “MySQL”。
数据源选项
名称 | 描述 |
---|---|
Name
|
数据源名称。这就是您在面板和查询中查看数据源的方式。 |
Default
|
默认数据源意味着将为新面板预先选择该数据源。 |
Host
|
您的 MySQL 实例的 IP 地址/主机名和可选端口。 |
Database
|
你的 MySQL 数据库的名称。 |
User
|
数据库用户的登录名/用户名。 |
Password
|
数据库用户的密码。 |
Max open
|
数据库的最大打开连接数,默认unlimited (Grafana v5.4+)。 |
Max idle
|
空闲连接池中的最大连接数,默认2 (Grafana v5.4+)。 |
Max lifetime
|
可以重复使用连接的最大时间(以秒为单位),默认为 14400 /4 小时。这应始终低于 MySQL 中配置的 wait_timeout |
最小时间间隔
$_interval
$_interval_ms
变量的下限。建议设置为写入频率,例如,1m
如果您的数据每分钟写入一次。也可以在仪表板面板的数据源选项下覆盖/配置此选项。此值的格式必须为一个数字,后跟一个有效的时间标识符;例如,1m
(1 分钟)或30s
(30 秒)。支持以下时间标识符。
标识符 | 描述 |
---|---|
y
|
年 |
M
|
月 |
w
|
周 |
d
|
天 |
h
|
小时 |
m
|
分钟 |
s
|
秒 |
ms
|
毫秒 |
数据库用户权限
重要
在添加数据源时指定的数据库用户应仅被授予对要查询的指定数据库和表的 SELECT 权限。Grafana 不会验证查询是否安全。该查询可以包括任何 SQL 语句。例如,DROP TABLE
user;
将运行USE otherdb;
和之类的语句。为了防范这种情况,我们强烈建议您创建权限受限的特定 MySQL 用户。
以下代码示例显示如何创建权限受限的特定 MySQL 用户。
CREATE USER 'grafanaReader' IDENTIFIED BY 'password'; GRANT SELECT ON mydatabase.mytable TO 'grafanaReader';
要授予对更多数据库和表的访问权限,可以根据需要使用通配符 (*
) 代替数据库或表。
查询编辑器
在面板的编辑模式下,您可以在指标选项卡中找到 MySQL 查询编辑器。要进入编辑模式,请选择面板标题,然后选择编辑。
查询编辑器有一个 “生成的 SQL” 链接,在面板编辑模式下,该链接会在查询运行后显示。选择它,它将展开并显示已运行的原始插值 SQL 字符串。
选择表、时间列和指标列 (FROM)
当您首次进入编辑模式或添加新查询时,Grafana 将尝试在查询生成器中预填第一个包含时间戳列和数字列的表。
在 FROM 字段中,Grafana 将建议已配置数据库中的表。要选择数据库用户有权访问的其他数据库中的表或视图,可以手动输入一个完全限定名称 (database.table),例如。otherDb.metrics
时间列字段是指保存您的时间值的列的名称。为指标列字段选择值是可选的。如果选择了一个值,则指标列字段将用作系列名称。
指标列建议将仅包含具有文本数据类型(文本、tinytext、mediumtext、longtext、varchar、char)的列。如果要使用具有不同数据类型的列作为指标列,则可以使用 cast: 来输入列名CAST(numericColumn as CHAR)
。您也可以在指标列字段中输入任意的 SQL 表达式,这些表达式的计算结果为文本数据类型,例如CONCAT(column1, " ",
CAST(numericColumn as CHAR))
。
列和聚合函数(选择)
在该SELECT
行中,您可以指定要使用的列和函数。在列字段中,您可以编写任意表达式来代替列名,例如column1 * column2 /
column3
。
如果使用聚合函数,则必须对结果集进行分组。GROUP BY time
如果您添加聚合函数,编辑器将自动添加。
您可以通过选择加号按钮并Column
从菜单中进行选择来添加更多值列。多个值列将在图表面板中绘制为单独的序列。
筛选数据(哪里)
要添加筛选条件,请选择WHERE
条件右侧的加号图标。您可以通过在过滤器上进行选择并选择来移除过滤器Remove
。当前所选时间范围的筛选器将自动添加到新查询中。
分组依据
要按时间或任何其他列进行分组,请选择 GROUP BY 行末尾的加号图标。建议下拉列表将仅显示您当前所选表格的文本列,但您可以手动输入任何列。您可以通过在项目上进行选择然后选择来删除该组Remove
。
如果添加任何分组,则所有选定的列都必须应用聚合函数。当您添加分组时,查询生成器将自动向所有列添加聚合函数,而不使用聚合函数。
填补空白
当您按时间分组时,Grafana 可以填充缺失值。时间函数接受两个参数。第一个参数是你要分组的时间窗口,第二个参数是你希望 Grafana 填充缺失物品的值。
文本编辑器模式(原始)
您可以通过选择汉堡图标并选择切换编辑器模式或在查询下方选择 “编辑 SQL” 来切换到原始查询编辑器模式。
注意
如果您使用原始查询编辑器,请确保您的查询至少包含返回的时间范围,ORDER BY time
并对返回的时间范围进行过滤。
宏
为了简化语法并允许使用动态部分,例如日期范围筛选器,查询可以包含宏。
宏示例 | 描述 |
---|---|
$__time(dateColumn)
|
将替换为转换为 UNIX 时间戳的表达式并将该列重命名为time_sec ;例如,UNI X_TIMESTAMP (DateColumn) 为 time_sec。 |
$__timeEpoch(dateColumn)
|
将替换为转换为 UNIX 时间戳的表达式并将该列重命名为time_sec ;例如,UNI X_TIMESTAMP (DateColumn) 为 time_sec。 |
$__timeFilter(dateColumn)
|
将替换为使用指定列名的时间范围筛选器。例如,介于 FROM_UNIXTIME (1494410783) 和 FROM_UNIXTIME (1494410983) 之间的 date Column。 |
$__timeFrom()
|
将替换为当前活动时间选择的开头。例如,FROM_UNIXTIME (1494410783)。 |
$__timeTo()
|
将被当前活动时间选择的结尾所取代。例如,FROM_UNIXTIME (1494410983)。 |
$__timeGroup(dateColumn,'5m')
|
将替换为 GROUP BY 子句中可用的表达式。例如,演员阵容(签名为 UNIX_TIMESTAMP (DateColumn)/(300))300),* |
$__timeGroup(dateColumn,'5m', 0)
|
与上一行相同,但使用填充参数,因此该系列中的缺失点将由 grafana 添加,0 将用作值。 |
$__timeGroup(dateColumn,'5m', NULL)
|
与上面相同,但将使用 NULL 作为缺失点的值。 |
$__timeGroup(dateColumn,'5m', previous)
|
与上面相同,但如果尚未看到任何值,则将使用该系列中的先前值作为填充值(仅在 Grafana 5.3+ 中可用)。 |
$__timeGroupAlias(dateColumn,'5m')
|
将被替换为相同$__timeGroup 但增加了列别名(仅在 Grafana 5.3+ 中可用)。 |
$__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 时间戳的时间相同(仅在 Grafana 5.3+ 版本中可用)。 |
$__unixEpochGroupAlias(dateColumn,"5m",
[fillmode])` |
与上面相同,但也添加了列别名(仅在 Grafana 5.3+ 版本中可用)。 |
查询编辑器有一个 “生成的 SQL” 链接,该链接在查询运行后即显示在面板编辑模式下。选择它,它将展开并显示已运行的原始插值 SQL 字符串。
表格查询
如果将 “格式化为查询” 选项设置为 “表”,则基本上可以执行任何类型的 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)
您可以使用常规 as
SQL 列选择语法来控制 “表” 面板列的名称。
时间序列查询
例如,如果您将 “格式设置为时间序列”,以便在图表面板中使用,则查询必须返回一个名为的列,time
该列返回 SQL 日期时间或任何代表 Unix 时代的数字数据类型。除time
和之外的任何列metric
都被视为值列。您可以返回一个名为的列metric
,该列用作值列的指标名称。如果您返回多个值列和一个名为的列metric
,则此列将用作系列名称的前缀(仅在 Grafana 5.3+ 中可用)。
时间序列查询的结果集必须按时间排序。
以下代码示例显示了该metric
列。
SELECT $__timeGroup(time_date_time,'5m'), min(value_double), 'min' as metric FROM test_data WHERE $__timeFilter(time_date_time) GROUP BY time ORDER BY time
以下代码示例演示如何使用 $__TimeGroup 宏中的填充参数将空值转换为零。
SELECT $__timeGroup(createdAt,'5m',0), sum(value_double) as value, measurement FROM test_data WHERE $__timeFilter(createdAt) GROUP BY time, measurement ORDER BY time
以下代码示例显示了多列。
SELECT $__timeGroup(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
不支持基于时间范围和面板宽度按时间进行动态分组。
模板化
不必在指标查询中对服务器、应用程序和传感器名称等内容进行硬编码,而可以使用变量来代替它们。变量显示为仪表板顶部的下拉选择框。您可以使用这些下拉框来更改控制面板中显示的数据。
有关模板和模板变量的更多信息,请参阅模板。
查询变量
如果添加该类型的模板变量Query
,则可以编写一个 MySQL 查询,该查询可以返回显示为下拉选择框的测量名称、键名称或键值之类的内容。
例如,如果您在模板变量 Query 设置中指定这样的查询,则可以有一个包含表中hostname
列所有值的变量。
SELECT hostname FROM my_host
一个查询可以返回多列,Grafana 会自动根据这些列创建一个列表。例如,以下查询将返回一个包含hostname
和值的列表hostname2
。
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)
在查询中),必须将模板变量的刷新模式设置为 On T ime Range Ch ange。
SELECT event_name FROM event_log WHERE $__timeFilter(time_column)
另一种选择是可以创建键/值变量的查询。该查询应返回名为__text
和的两列__value
。__text
列值应该是唯一的(如果它不是唯一的,则使用第一个值)。下拉列表中的选项将具有文本和值,因此您可以将友好名称作为文本,将ID作为值。
以下代码示例显示了以文本hostname
为值的查询。id
SELECT hostname AS __text, id AS __value FROM my_host
您也可以创建嵌套变量。例如,如果你有另一个名为的变量region
。然后,您可以使用这样的查询让 hosts 变量仅显示来自当前选定区域的主机(如果region
是多值变量,则使用IN
比较运算符而不是与多个值=
进行匹配)。
SELECT hostname FROM my_host WHERE region IN($region)
__searchFilter
用于筛选查询变量中的结果
__searchFilter
在查询字段中使用将根据用户在下拉选择框中键入的内容筛选查询结果。当用户未输入任何内容时,的默认值__searchFilter
为%
。
注意
重要的是要在__searchFilter
表达式周围加上引号,因为 Grafana 不会为你做这件事。
以下示例说明了当用户在下拉选择框中键入内容hostname
时,如何将其__searchFilter
用作查询字段的一部分,以启用搜索。
SELECT hostname FROM my_host WHERE hostname LIKE '$__searchFilter'
在查询中使用变量
从 Grafana 4.3.0 到 4.6.0,模板变量总是自动引用的,因此,如果它是字符串值,请不要在 where 子句中用引号将它们括起来。
从 Grafana 4.7.0 开始,只有当模板变量为 a 时,才会引用模板变量值。multi-value
如果变量是多值变量,请使用IN
比较运算符,而不是与多个值=
进行匹配。
有两种语法:
$<varname>
使用名为的模板变量的示例hostname
:
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
:
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 会自动为多值变量创建带引号的、以逗号分隔的字符串。例如:如果选择server01
和server02
,则其格式将为:'server01', 'server02'
。要关闭引用,请对变量使用 csv 格式选项。
${servers:csv}
有关变量格式选项的更多信息,请参见高级变量格式选项。
注释
您可以使用注释将丰富的事件信息叠加在图表之上。您可以通过控制板菜单/注释视图添加注释查询。有关更多信息,请参阅 。
以下示例代码显示了使用带有纪元值的时间列的查询。
SELECT epoch_time as time, metric1 as text, CONCAT(tag1, ',', tag2) as tags FROM public.test_data WHERE $__unixEpochFilter(epoch_time)
以下示例代码显示了使用带有纪元值的时间和时间结束列的区域查询。
注意
仅在 Grafana 6.6+ 版本中可用。
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)
以下示例代码显示了使用本地 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 日期/时间数据类型或纪元值的列。 |
timeend
|
结束日期/时间字段的可选名称。可以是具有原生 SQL 日期/时间数据类型或纪元值的列。 |
text
|
事件描述字段。 |
tags
|
用于事件标签的可选字段名称,以逗号分隔的字符串形式。 |
提示
时间序列查询应在警报条件下起作用。警报规则条件尚不支持表格格式查询。