Grafana使用mysql作为数据源图文详解
grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。官网英文链接:https://grafana.com/docs/grafana/latest/。从官网和网上对mysql作为数据源的中文详细说明很少,笔者结合最近的项目,详细介绍mysql作为数据源的详细配置和技巧。
一,连接数据源
参数说明:
database:数据库名字
user:访问数据库的用户名
password:用户的密码
Max open
:可使用最大连接数
Max idle
:最大连接池连接数,默认值为2
从连接数据库processlist可以看到,grafana使用2个连接维持grafana和数据库的连接。
这里需要注意grafana并没有对查询语句进行安全性验证,所以我们最好需要创建一个用户并设置只读权限来保证数据库访问的安全性。例如:34Z
CREATE USER 'grafanaReader' IDENTIFIED BY 'password';
GRANT SELECT ON mydatabase.mytable TO 'grafanaReader';
二,创建dashboard和panel
grafana提供很多可视化panel单元,如图形、表格等,每个panel有一个查询编辑器配置数据提供给前端展示。在同一个dashboard中不同的panel是可以按拖拽方式排列放大或缩小。
三,查询和panel配置
以graph为例详细介绍一下查询器和panel配置。
graph分为三部分,右边为panel设置选项,包括panel名字和描述、显示属性、X与Y轴刻度单位、旋停配置等信息;下面为query设置选项,具体参数与我们选择的数据源有关系,提供了自动编译SQL语句、度量名字和宏等信息;上面为最终展示视图,将我们Query设置的查询数据和配置信息显示到该视图上面。
在query设置选项中,grafana的查询编辑器会自动选取具有时间戳或者日期的字段。
FROM字段可以选择配置数据库中的表也可以选择其他的数据库的表,但是需要手动指定数据库名字.表名的形式。
1,Time Column字段选择具有时间属性的字段进行分组,在我的项目中选择created_time作为时间进行分组,时间字段转换成UNIX时间戳按分钟进行分组。
例如:
SELECT
UNIX_TIMESTAMP(created_time) DIV 60 * 60 AS "time",
avg(pjfs) AS "pjfs"
FROM test
WHERE
created_time BETWEEN FROM_UNIXTIME(1605024000) AND FROM_UNIXTIME(1605110399)
GROUP BY 1
ORDER BY UNIX_TIMESTAMP(created_time) DIV 60 * 60
2,Metric column字段是可选字段,其含义为监控单元项,建议使用数据库表中的文本类型的字段。如果是其他类型字段,可以使用cast函数进行转换。
例如:
我们选择fcbm作为metric column,那么SQL语句就变为,
SELECT
UNIX_TIMESTAMP(created_time) DIV 60 * 60 AS "time",
fcbm AS metric,
avg(pjfs) AS "pjfs"
FROM test
WHERE
created_time BETWEEN FROM_UNIXTIME(1605024000) AND FROM_UNIXTIME(1605110399)
GROUP BY 1,2
ORDER BY UNIX_TIMESTAMP(created_time) DIV 60 * 60
将created_time和fcbm作为联合分组。
3,SELECT字段用于指定我们想要选择数据库表中的字段作为我们展示数据,这些字段可以使用表达式或在聚合函数。
在上例子中 ,
avg(pjfs) AS "pjfs"
我们使用avg均值聚合函数对pjfs求一分钟内的平均值。
4,WHERE字段用于指定选择条件或在过滤一些记录。
5,Group by 字段用于分组,query编辑器会自动将select的字段进行分组,如果需要可以手动添加用于分组的字段,grafana要求对于分组的字段都应该有聚合函数,如果没有将会自动添加上。
6,Gap Filling
当选择时间戳分组后,如果有缺失的数值,我们可以选择time函数处理缺失的数据,该函数有两个参数,第一个参数用于时间分组的窗口;第二个参数用于缺失值处理方式(null,0,previous)
配置完Query编辑器后,整个展示效果: