;数据源;Microsoft SQL Server

在Grafana中使用Microsoft SQL Server

Grafana带有内置的Microsoft SQL Server (MS SQL)数据源插件,允许您查询和可视化来自任何Microsoft SQL Server 2005或更新版本的数据,包括Microsoft Azure SQL数据库。本主题解释特定于MS SQL数据源的选项、变量、查询和其他选项。指添加数据源获取如何向Grafana添加数据源的说明。只有具有组织管理员角色的用户才能添加数据源。

数据源选项

要访问数据源设置,请将鼠标悬停在配置(齿轮)图标,然后点击数据源,然后单击数据源。

的名字 描述
的名字 数据源名称。这就是在面板和查询中引用数据源的方式。
默认的 默认数据源意味着将为新面板预先选择它。
宿主 MS SQL实例的IP地址/主机名和可选端口。如果忽略端口,则使用驱动程序默认值(0)。您可以指定多个连接属性,如ApplicationIntent,使用';'字符分隔每个属性。
数据库 MS SQL数据库的名称。
身份验证 身份验证模式。使用SQL Server身份验证或Windows身份验证(Windows用户的单点登录)。
用户 数据库用户登录名/用户名
密码 数据库用户密码
加密 默认情况下,此选项决定是否与服务器协商安全SSL TCP/IP连接,或者协商到何种程度
马克斯开放 到数据库的最大打开连接数,默认值无限的
马克斯闲置 空闲连接池中的最大连接数,默认值2
马克思一生 连接可重用的最大时间(以秒为单位),默认值14400/ 4小时。

最小时间间隔

的下限__interval美元而且__interval_ms美元变量。建议设置为写频,例如1米如果数据每分钟都被写入。也可以在仪表板面板中数据源选项下重写/配置此选项。需要注意的是,这个值需要被格式化为一个数字,后面跟着一个有效的时间标识符。1米(1分钟)或30年代(30秒)。支持以下时间标识符:

标识符 描述
y 一年
w
d 一天
h 小时
一分钟
年代 第二个
女士 毫秒

数据库用户权限

在添加数据源时指定的数据库用户应该只被授予要查询的指定数据库和表的SELECT权限。Grafana不验证查询是否安全。查询可以包括任何SQL语句。例如,像这样的语句删除用户而且删除表用户会被处决。为了防止这种情况发生高度建议您创建一个权限受限的特定MS SQL用户。

例子:

CREATE USER grafanareader WITH PASSWORD ' PASSWORD 'YourTable3给grafanreader

确保用户没有从公共角色获得任何不必要的特权。

已知的问题

如果你使用的是旧版本的Microsoft SQL Server,比如2008和2008R2,你可能需要禁用加密才能连接。如果可能,我们建议您使用最新的服务包以获得最佳兼容性。

查询构建器

在使用MS SQL数据源编辑面板时,可以使用MS SQL查询构建器。键可以运行所构建的查询运行查询按钮在编辑器的右上角。

格式

来自MS SQL的响应可以格式化为表格或时间序列。要使用时间序列格式,必须为其中一列命名时间

数据集和表选择

在“数据集”下拉菜单中,选择要查询的MS SQL数据库。下拉列表将填充用户可以访问的数据库。选择数据集时,将用可用的表填充表下拉列表。

列和聚合函数(SELECT)

使用下拉菜单,选择要包含在数据中的列。您还可以指定一个可选的聚合函数。

通过单击加号按钮添加更多的值列,将出现另一个列下拉菜单。

过滤数据(WHERE)

若要添加筛选器,请翻转编辑器顶部的开关。使用第一个下拉菜单,选择是否所有过滤器都需要匹配(AND),或者如果只有一个过滤器需要匹配(or)。

要添加更多的列以筛选使用加号按钮。

集团

若要按列对结果进行分组,请翻转编辑器顶部的分组开关。然后,您可以选择按哪个列对结果进行分组。通过按X按钮可以删除group by子句。

预览

通过翻转编辑器顶部的预览开关,可以预览查询构建器生成的SQL查询。

代码编辑器

要进行高级查询,请单击切换到代码编辑器代码在编辑器的右上角。代码编辑器支持自动完成表,列,SQL关键字,标准SQL函数,Grafana模板变量和Grafana宏。在指定表之前不能完成列。

单击,可以展开代码编辑器雪佛龙公司指向代码编辑器的右下角。

CTRL/CMD +返回作为键盘快捷键运行查询。

为了简化语法并允许动态部分(如日期范围过滤器),查询可以包含宏。

宏的例子 描述
__time美元(dateColumn) 将被一个要将列重命名为时间.例如,dateColumn作为时间
__timeEpoch美元(dateColumn) 将被一个表达式所取代,将DATETIME列类型转换为Unix时间戳并将其重命名为时间
例如,DATEDIFF(second, ' 1970-01-01 ', dateColumn) AS时间
__timeFilter美元(dateColumn) 将由使用指定列名的时间范围筛选器替换。
例如,数据列在“2017-04-21T05:01:17Z”和“2017-04-21T05:06:17Z”之间
$ __timeFrom () 将被当前活动时间选择的开始所取代。例如,2017 - 04 - 21 - t05:01:17z
$ __timeTo () 将被当前活动时间选择的结束所取代。例如,2017 - 04 - 21 - t05:06:17z
__timeGroup美元(dateColumn, 5 m [, fillvalue]) 将被GROUP by子句中可用的表达式替换。提供一个fillValue浮动值将自动在时间范围内用该值填充空序列。
例如,CAST(ROUND(DATEDIFF(second, ' 1970-01-01 ', time_column)/ 300.0,0) as bigint)*300
美元__timeGroup (dateColumn 5米,0) 与上面相同,但有一个填充参数,因此该系列中的缺失点将由grafana添加,0将被用作值。
美元__timeGroup (dateColumn 5米,NULL) 与上述相同,但NULL将被用作缺失点的值。
美元__timeGroup (dateColumn, 5米,之前) 与上述相同,但该系列中的前一个值将被用作填充值,如果还没有看到任何值,将使用NULL(仅在Grafana 5.3+中可用)。
美元__timeGroupAlias (dateColumn 5米) 将被替换为与$__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 5米,[fillmode]) 与$__timeGroup相同,但时间存储为Unix时间戳(仅在Grafana 5.3+中可用)。
美元__unixEpochGroupAlias (dateColumn 5米,[fillmode]) 与上面相同,但也添加了列别名(仅在Grafana 5.3+中可用)。

我们计划添加更多的宏。如果你对你想看到的宏有建议,请打开一个问题在我们的GitHub回购。

查询编辑器有一个名为生成的SQL在执行查询后,在面板编辑模式下显示。单击它,它将展开并显示执行的原始插值SQL字符串。

表查询

如果格式查询选项设置为表格那么你基本上可以做任何类型的SQL查询。表面板将自动显示查询返回的任何列和行的结果。

数据库表示例:

CREATE TABLE [event] (time_sec bigint, description nvarchar(100), tags nvarchar(100),)
CREATE TABLE [mssql_types] (c_bit bit, c_tinyint tinyint, c_smallint smallint, c_bigint bigint, c_money money, c_smallmoney smallmoney, c_numeric numeric(10,5), c_real real, c_decimal decimal(10,2), c_float float, c_char char(10), c_varchar varchar(10), c_text text, c_nchar nchar(12), c_nvarchar nvarchar(12), c_ntext ntext, c_datetime datetime, c_datetime2 datetime2, c_smalldatetime smalldatetime, c_date date, c_time time, c_time time,c_datetimeoffset datetimeoffset) INSERT INTO [mssql_types] SELECT 1,5,20020,980300,1420070400, '$20000.15', '£2.15',12345.12,1.11,2.22,3.33,'char10', 'varchar10', 'text', N'☺nchar12☺',N'☺nvarchar12☺',N'☺text☺',GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS datetimeoffset), '-07:00')

查询编辑器示例查询:

查询:

SELECT * FROM [mssql_types]

可以使用regular来控制Table面板列的名称作为SQL列选择语法。例子:

SELECT c_bit as [columnn1], c_tinyint as [column2] FROM [mssql_types]

产生的表格面板:

时间序列查询

如果将格式设置为时间序列,则查询必须有一个名为time的列,该列返回SQL datetime或任何以秒为单位表示Unix epoch的数字数据类型。此外,时间序列查询的结果集必须按时间排序,以便面板正确地显示结果。

类型返回时间序列查询结果宽数据帧格式.在数据帧查询结果中,除时间或类型为字符串的任何列都转换为值字段。在数据帧查询结果中,任意字符串列转换为字段标签。

为了向后兼容,对于返回三个列(包括一个名为metric的字符串列)的查询,上面的规则有一个例外。它不是将度量列转换为字段标签,而是转换为字段名称,然后将系列名称格式化为度量列的值。请参阅下面带有度量列的示例。

若要自定义默认系列名称格式,请参阅标准选项定义

的例子度规专栏:

SELECT $__timeGroup(time_date_time, '5m')作为时间,min("value_double"), 'min'作为度量FROM test_data WHERE $__timeFilter(time_date_time) GROUP BY $__timeGroup(time_date_time, '5m') ORDER BY 1

数据帧结果:

+---------------------+-----------------+ | 名称:时间|名称:分钟| |标签:|标签:| |类型:[]。时间|类型:[]float64  | +---------------------+-----------------+ | 2020-01-02 03:05:00 | 3 | | 2020-01-02 03:10:00 | 6  | +---------------------+-----------------+

使用$__timeGroup宏中的fill参数将空值转换为零:

SELECT $__timeGroup(createdAt, '5m', 0)作为时间,sum(value)作为值,hostname FROM test_data WHERE $__timeFilter(createdAt) GROUP BY $__timeGroup(createdAt, '5m', 0), hostname ORDER BY 1

给定以下示例中的数据帧结果,并使用图形面板,您将得到两个名为价值10.0.1.1而且价值10.0.1.2.以呈现名称为的系列10.0.1.1而且10.0.1.2,使用标准选项定义显示名称值$ {__field.labels.hostname}

数据帧结果:

+---------------------+---------------------------+---------------------------+ | Name: value名称:时间| |名称:值| |标签:|标签:主机名= 10.0.1.1 |标签:主机名= 10.0.1.2 | |类型:[]。时间|类型:[]float64 |类型:[]float64  | +---------------------+---------------------------+---------------------------+ | 2020-01-02 03:05:00 | 3 | 4 | | 2020-01-02 03:10:00 | 6 | 7  | +---------------------+---------------------------+---------------------------+

包含多个列的示例:

SELECT $__timeGroup(time_date_time, '5m'), min(value_double)作为min_value, max(value_double)作为max_value FROM test_data WHERE $__timeFilter(time_date_time) GROUP BY $__timeGroup(time_date_time, '5m') ORDER BY 1

数据帧结果:

+---------------------+-----------------+-----------------+ | 名称:时间|名称:min_value |名称:max_value | |标签:|标签:|标签:| |类型:[]。时间|类型:[]float64 |类型:[]float64  | +---------------------+-----------------+-----------------+ | 2020-01-02 03:04:00 | 3 | 4 | | 2020-01-02 03:05:00 | 6 | 7  | +---------------------+-----------------+-----------------+

模板

而不是硬编码的东西,如服务器,应用程序和传感器名称在您的指标查询,你可以使用变量在他们的地方。变量显示为仪表板顶部的下拉选择框。这些下拉列表可以很容易地更改仪表板中显示的数据。

请查看模板介绍模板特性和不同类型的模板变量的文档。

查询变量

类型的模板变量查询,您可以编写一个MS SQL查询,它可以返回测量名称、键名或键值等内容,这些内容显示为下拉选择框。

属性的所有值都包含在一个变量中主机名如果在模板变量中指定了这样的查询,则表中的列查询设置。

选择主机名

一个查询可以返回多个列,Grafana会自动从这些列创建一个列表。例如,下面的查询将返回一个包含从的值的列表主机名而且hostname2

选择(主机)。(主机名),[other_host]。[hostname2] FROM host JOIN other_host ON [host]。[city] = [other_host].[city]

另一个选项是可以创建键/值变量的查询。查询应该返回两个已命名的列__text而且__value.的__text列值应该是唯一的(如果不是唯一的,则使用第一个值)。下拉菜单中的选项将有一个文本和值,允许您将一个友好的名称作为文本,将一个id作为值。使用主机名作为文本和id值为:

选择主机名__text, id __value FROM主机

您还可以创建嵌套变量。例如,如果您有另一个名为地区.然后,您可以让hosts变量只显示来自当前选定区域的主机,使用如下查询(如果地区是多值变量,则使用比较运算符而不是匹配多个值):

SELECT hostname FROM host WHERE region IN ($region)

查询中使用变量

从Grafana 4.3.0到4.6.0,模板变量总是自动加引号,所以如果它是一个字符串值,不要在where子句中用引号将它们括起来。

从Grafana 5.0.0开始,模板变量值仅在模板变量为多值

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

有两种语法:

$ < varname >模板变量名为主机名

在($hostname)中输入$__timeFilter(atimestamp)和hostname ($hostname

[[varname]]模板变量名为主机名

从表WHERE $__timeFilter(atimestamp)和hostname in([[hostname]]) ORDER BY atimestamp

禁用多值变量引用

Grafana会自动为多值变量创建带引号、逗号分隔的字符串。例如:如果server01而且server02则它将被格式化为:“server01”、“server02”.禁用引号,对变量使用csv格式选项:

${服务器:csv}

中有关可变格式设置选项的详细信息变量文档。

注释

注释允许您在图形之上覆盖丰富的事件信息。您可以通过Dashboard菜单/ Annotations视图添加注释查询。

列:

的名字 描述
时间 日期/时间字段的名称。可以是具有本机SQL日期/时间数据类型或epoch值的列。
timeend 结束日期/时间字段的可选名称。可以是具有本机SQL日期/时间数据类型或epoch值的列。(Grafana v6.6 +)
文本 事件描述字段。
标签 用于事件标记的可选字段名称,以逗号分隔的字符串。

数据库表示例:

CREATE TABLE [events] (time_sec bigint, description nvarchar(100), tags nvarchar(100),)

中定义的数据库表时间序列查询

使用带纪元值的时间列查询示例:

SELECT time_sec为时间,description为[text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1

使用带有纪元值的time和timeend列的区域查询示例:

仅在Grafana v6.6+中可用。

SELECT time_sec为时间,time_end_sec为时间结束,description为[text], tags FROM [events] WHERE $__unixEpochFilter(time_sec) ORDER BY 1

使用本地SQL日期/时间数据类型的时间列查询示例:

SELECT time, measurement as text, convert(varchar, valueOne) + ',' + convert(varchar, valueTwo) as tags FROM metric_values WHERE $__timeFilter(time_column) ORDER BY 1

存储过程支持

存储过程已经过验证,可以正常工作。但是,请注意,我们没有做任何特别的事情来支持它,所以可能会有一些边缘情况,在这些情况下它不能像您期望的那样工作。存储过程应该在表、时间序列和注释查询中得到支持,只要您使用相同的列命名并以相同的格式返回数据,就像上面在相应部分中描述的那样。

请注意,任何宏函数都不能在存储过程中工作。

例子

对于下面的示例,数据库表定义在时间序列查询.假设我们想要在图形面板中可视化四个系列,例如所有列的组合valueOnevalueTwo而且测量.右边的图形面板显示了我们想要实现的目标。为了解决这个问题,我们需要使用两个查询:

第一个查询:

SELECT $__timeGroup(time, '5m')作为时间,测量+ ' - value 1 '作为度量,avg(valueOne)作为valueOne FROM metric_values WHERE $__timeFilter(time) GROUP BY $__timeGroup(time, '5m'),测量ORDER BY 1

第二个查询:

SELECT $__timeGroup(time, '5m')作为时间,测量+ ' - value two'作为度量,avg(valueTwo)作为valueTwo FROM metric_values GROUP BY $__timeGroup(time, '5m'),测量ORDER BY 1

使用epoch格式的时间的存储过程

我们可以定义一个存储过程,它将返回我们在上面的图形面板中呈现4个系列所需的所有数据。在本例中,存储过程接受两个参数@from而且@toint数据类型,应该是epoch格式的时间范围(from-to),用于过滤从存储过程返回的数据。

我们在模仿__timeGroup美元(时间,5米)在选择和分组表达式,这就是为什么有很多冗长的表达式需要-这些可以提取到MS SQL函数,如果需要。

创建过程sp_test_epoch (@to @from int, int)开始选择演员(cast (DATEDIFF(第二,{d ' 1970-01-01 '},返回(第二,DATEDIFF(第二,获取当前日期(),GETUTCDATE()),时间))/ 600 int) * 600 int)随着时间,测量+“——价值”作为指标,avg (valueOne)作为返回值从metric_values时间> =(年代,@from, ' 1970-01-01 ')和返回时间< =(年代,@to, ' 1970-01-01 ')组的演员(cast (DATEDIFF(第二,{d ' 1970-01-01 '},返回(第二,DATEDIFF(第二,获取当前日期(),GETUTCDATE ()),)/600作为int)*600作为int),测量UNION ALL SELECT cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time) /600作为int)*600作为int)作为time, measurement + ' - value two'作为metric, avg(valueTwo)作为value FROM metric_values WHERE time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01') GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE())),time))/600作为int)*600作为int),测量顺序由1结束

然后,我们可以对图形面板使用以下查询。

DECLARE @from int = $__unixEpochFrom(), @to int = $__unixEpochTo() EXEC dbo。Sp_test_epoch @from, @to

使用datetime格式的时间的存储过程

我们可以定义一个存储过程,它将返回我们在上面的图形面板中呈现4个系列所需的所有数据。在本例中,存储过程接受两个参数@from而且@todatetime数据类型,它应该是一个时间范围(from-to),用于过滤从存储过程返回的数据。

我们在模仿__timeGroup美元(时间,5米)在选择和组表达式,这就是为什么有很多冗长的表达式需要-这些可以提取到MS SQL函数,如果需要。

创建过程sp_test_datetime (@from datetime, @to datetime)作为开始选择演员(cast (DATEDIFF(第二,{d ' 1970-01-01 '},时间)/ 600 int) * 600 int)随着时间,测量+——价值的指标,从metric_values avg (valueOne)价值在时间> = @from和< = @to GROUP BY铸造(cast (DATEDIFF(第二,{d ' 1970-01-01 '},时间)/ 600 int) * 600 int),测量UNION ALL选择演员(cast (DATEDIFF(第二,{d ' 1970-01-01 '},时间)/ 600 int) * 600 int)随着时间的,测量+ ' - value 2 '作为度量,avg(valueTwo)作为value FROM metric_values WHERE time >= @from AND time <= @to GROUP BY cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int),测量ORDER BY 1 END

然后,我们可以对图形面板使用以下查询。

声明@from datetime = $__timeFrom(), @to datetime = $__timeTo() EXEC dbo。Sp_test_datetime @from, @to

报警

时间序列查询应该在警报条件下工作。警报规则条件中还不支持表格式的查询。

使用供应配置数据源

现在可以在Grafana的配置系统中使用配置文件配置数据源。您可以阅读更多关于它的工作原理以及可以为数据源设置的所有设置配置文档页面

下面是该数据源的一些配置示例。

apiVersion: 1数据源:-名称:MSSQL类型:MSSQL url: localhost:1433数据库:grafana用户:grafana jsonData: maxOpenConns: 0 # grafana v5.4+ maxIdleConns: 2 # grafana v5.4+ connMaxLifetime: 14400 # grafana v5.4+ secureJsonData: password: '密码!'