New sql server queries (on-prem) - refactoring and formatting (#8172)

This commit is contained in:
Giovanni Luisotto 2020-10-14 17:07:13 +02:00 committed by GitHub
parent aa0363eb84
commit 1d6172bd2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 463 additions and 432 deletions

View File

@ -138,7 +138,7 @@ func initQueries(s *SQLServer) error {
queries["AzureSQLDBMemoryClerks"] = Query{ScriptName: "AzureSQLDBMemoryClerks", Script: sqlAzureDBMemoryClerks, ResultByRow: false} queries["AzureSQLDBMemoryClerks"] = Query{ScriptName: "AzureSQLDBMemoryClerks", Script: sqlAzureDBMemoryClerks, ResultByRow: false}
queries["AzureSQLDBPerformanceCounters"] = Query{ScriptName: "AzureSQLDBPerformanceCounters", Script: sqlAzureDBPerformanceCounters, ResultByRow: false} queries["AzureSQLDBPerformanceCounters"] = Query{ScriptName: "AzureSQLDBPerformanceCounters", Script: sqlAzureDBPerformanceCounters, ResultByRow: false}
queries["AzureSQLDBRequests"] = Query{ScriptName: "AzureSQLDBRequests", Script: sqlAzureDBRequests, ResultByRow: false} queries["AzureSQLDBRequests"] = Query{ScriptName: "AzureSQLDBRequests", Script: sqlAzureDBRequests, ResultByRow: false}
queries["AzureSQLDBSchedulers"] = Query{ScriptName: "AzureSQLDBSchedulers", Script: sqlServerSchedulers, ResultByRow: false} queries["AzureSQLDBSchedulers"] = Query{ScriptName: "AzureSQLDBSchedulers", Script: sqlAzureDBSchedulers, ResultByRow: false}
} else if s.DatabaseType == "AzureSQLManagedInstance" { } else if s.DatabaseType == "AzureSQLManagedInstance" {
queries["AzureSQLMIResourceStats"] = Query{ScriptName: "AzureSQLMIResourceStats", Script: sqlAzureMIResourceStats, ResultByRow: false} queries["AzureSQLMIResourceStats"] = Query{ScriptName: "AzureSQLMIResourceStats", Script: sqlAzureMIResourceStats, ResultByRow: false}
queries["AzureSQLMIResourceGovernance"] = Query{ScriptName: "AzureSQLMIResourceGovernance", Script: sqlAzureMIResourceGovernance, ResultByRow: false} queries["AzureSQLMIResourceGovernance"] = Query{ScriptName: "AzureSQLMIResourceGovernance", Script: sqlAzureMIResourceGovernance, ResultByRow: false}
@ -148,7 +148,7 @@ func initQueries(s *SQLServer) error {
queries["AzureSQLMIMemoryClerks"] = Query{ScriptName: "AzureSQLMIMemoryClerks", Script: sqlAzureMIMemoryClerks, ResultByRow: false} queries["AzureSQLMIMemoryClerks"] = Query{ScriptName: "AzureSQLMIMemoryClerks", Script: sqlAzureMIMemoryClerks, ResultByRow: false}
queries["AzureSQLMIPerformanceCounters"] = Query{ScriptName: "AzureSQLMIPerformanceCounters", Script: sqlAzureMIPerformanceCounters, ResultByRow: false} queries["AzureSQLMIPerformanceCounters"] = Query{ScriptName: "AzureSQLMIPerformanceCounters", Script: sqlAzureMIPerformanceCounters, ResultByRow: false}
queries["AzureSQLMIRequests"] = Query{ScriptName: "AzureSQLMIRequests", Script: sqlAzureMIRequests, ResultByRow: false} queries["AzureSQLMIRequests"] = Query{ScriptName: "AzureSQLMIRequests", Script: sqlAzureMIRequests, ResultByRow: false}
queries["AzureSQLMISchedulers"] = Query{ScriptName: "AzureSQLMISchedulers", Script: sqlServerSchedulers, ResultByRow: false} queries["AzureSQLMISchedulers"] = Query{ScriptName: "AzureSQLMISchedulers", Script: sqlAzureMISchedulers, ResultByRow: false}
} else if s.DatabaseType == "SQLServer" { //These are still V2 queries and have not been refactored yet. } else if s.DatabaseType == "SQLServer" { //These are still V2 queries and have not been refactored yet.
queries["SQLServerPerformanceCounters"] = Query{ScriptName: "SQLServerPerformanceCounters", Script: sqlServerPerformanceCounters, ResultByRow: false} queries["SQLServerPerformanceCounters"] = Query{ScriptName: "SQLServerPerformanceCounters", Script: sqlServerPerformanceCounters, ResultByRow: false}
queries["SQLServerWaitStatsCategorized"] = Query{ScriptName: "SQLServerWaitStatsCategorized", Script: sqlServerWaitStatsCategorized, ResultByRow: false} queries["SQLServerWaitStatsCategorized"] = Query{ScriptName: "SQLServerWaitStatsCategorized", Script: sqlServerWaitStatsCategorized, ResultByRow: false}

View File

@ -4,29 +4,30 @@ import (
_ "github.com/denisenkom/go-mssqldb" // go-mssqldb initialization _ "github.com/denisenkom/go-mssqldb" // go-mssqldb initialization
) )
// Queries - V2 // The SQL scripts assemble the correct query based the version of SQL Server
// see https://sqlserverbuilds.blogspot.com/ for all the details about the version number of SQL Server
// Variable @MajorMinorVersion:
// - 1000 --> SQL Server 2008
// - 1050 --> SQL Server 2008 R2
// - 1011 --> SQL Server 2012
// - 1012 --> SQL Server 2014
// - 1013 --> SQL Server 2016
// - 1014 --> SQL Server 2017
// - 1015 --> SQL Server 2019
// Thanks Bob Ward (http://aka.ms/bobwardms) // Thanks Bob Ward (http://aka.ms/bobwardms)
// and the folks at Stack Overflow (https://github.com/opserver/Opserver/blob/9c89c7e9936b58ad237b30e6f4cc6cd59c406889/Opserver.Core/Data/SQL/SQLInstance.Memory.cs) // and the folks at Stack Overflow (https://github.com/opserver/Opserver/blob/9c89c7e9936b58ad237b30e6f4cc6cd59c406889/Opserver.Core/Data/SQL/SQLInstance.Memory.cs)
// for putting most of the memory clerk definitions online! // for putting most of the memory clerk definitions online!
/*
The SQL scripts use a series of IF and CASE statemens to choose the correct query based on edition and version of SQL Server, below the meaning of the numbers:
EngineEdition:
1 = Personal or Desktop Engine (Not available in SQL Server 2005 (9.x) and later versions.)
2 = Standard (This is returned for Standard, Web, and Business Intelligence.)
3 = Enterprise (This is returned for Evaluation, Developer, and Enterprise editions.)
4 = Express (This is returned for Express, Express with Tools, and Express with Advanced Services)
5 = SQL Database
6 = Microsoft Azure Synapse Analytics (formerly SQL Data Warehouse)
8 = Managed Instance
ProductVersion:
see https://sqlserverbuilds.blogspot.com/ for all the details about the version number of SQL Server
*/
const sqlServerMemoryClerks = ` const sqlServerMemoryClerks = `
IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
DECLARE DECLARE
@SqlStatement AS nvarchar(max) @SqlStatement AS nvarchar(max)
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int) ,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@Columns AS nvarchar(max) = '' ,@Columns AS nvarchar(max) = ''
IF @MajorMinorVersion >= 1100 IF @MajorMinorVersion >= 1100
@ -137,26 +138,30 @@ EXEC(@SqlStatement)
` `
const sqlServerDatabaseIO = ` const sqlServerDatabaseIO = `
DECLARE SET DEADLOCK_PRIORITY -10;
@SqlStatement AS nvarchar(max) IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
,@EngineEdition AS tinyint = CAST(SERVERPROPERTY('EngineEdition') AS int) DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
DECLARE @MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int) * 100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int) RETURN
IF @EngineEdition IN (2,3,4) /*Standard,Enterpris,Express*/
BEGIN
DECLARE @Columns as nvarchar(max) = ''
DECLARE @Tables as nvarchar(max) = ''
IF @MajorMinorVersion >= 1050 BEGIN
/*in [volume_mount_point] any trailing "\" char will be removed by telegraf */
SET @Columns += N',[volume_mount_point]'
SET @Tables += N'CROSS APPLY sys.dm_os_volume_stats(vfs.[database_id], vfs.[file_id]) AS vs'
END END
DECLARE
@SqlStatement AS nvarchar(max)
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int) * 100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@Columns AS nvarchar(max) = ''
,@Tables AS nvarchar(max) = ''
IF @MajorMinorVersion >= 1050 BEGIN
/*in [volume_mount_point] any trailing "\" char will be automatically removed by telegraf */
SET @Columns += N'
,[volume_mount_point]'
SET @Tables += N'
CROSS APPLY sys.dm_os_volume_stats(vfs.[database_id], vfs.[file_id]) AS vs'
END
IF @MajorMinorVersion > 1100 BEGIN IF @MajorMinorVersion > 1100 BEGIN
SET @Columns += N' SET @Columns += N'
,vfs.io_stall_queued_read_ms AS [rg_read_stall_ms] ,vfs.[io_stall_queued_read_ms] AS [rg_read_stall_ms]
,vfs.io_stall_queued_write_ms AS [rg_write_stall_ms]' ,vfs.[io_stall_queued_write_ms] AS [rg_write_stall_ms]'
END END
SET @SqlStatement = N' SET @SqlStatement = N'
@ -176,71 +181,79 @@ DECLARE
+ @Columns + N' + @Columns + N'
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
INNER JOIN sys.master_files AS mf WITH (NOLOCK) INNER JOIN sys.master_files AS mf WITH (NOLOCK)
ON vfs.[database_id] = mf.[database_id] AND vfs.[file_id] = mf.[file_id] ON vfs.[database_id] = mf.[database_id] AND vfs.[file_id] = mf.[file_id]'
'
+ @Tables; + @Tables;
EXEC sp_executesql @SqlStatement EXEC sp_executesql @SqlStatement
END
` `
const sqlServerProperties = ` const sqlServerProperties = `
IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
DECLARE DECLARE
@SqlStatement AS nvarchar(max) = '' @SqlStatement AS nvarchar(max) = ''
,@EngineEdition AS tinyint = CAST(SERVERPROPERTY('EngineEdition') AS int) ,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@Columns AS nvarchar(MAX) = ''
IF @EngineEdition IN (2,3,4) /*Standard,Enterpris,Express*/
BEGIN
DECLARE @MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int)
DECLARE @Columns AS nvarchar(MAX) = ''
IF @MajorMinorVersion >= 1050 IF @MajorMinorVersion >= 1050
SET @Columns = N',CASE [virtual_machine_type_desc] SET @Columns = N'
,CASE [virtual_machine_type_desc]
WHEN ''NONE'' THEN ''PHYSICAL Machine'' WHEN ''NONE'' THEN ''PHYSICAL Machine''
ELSE [virtual_machine_type_desc] ELSE [virtual_machine_type_desc]
END AS [hardware_type]'; END AS [hardware_type]'
ELSE /*data not available*/
SET @Columns = N',''<n/a>'' AS [hardware_type]';
SET @SqlStatement = 'SELECT ''sqlserver_server_properties'' AS [measurement], SET @SqlStatement = '
REPLACE(@@SERVERNAME,''\'','':'') AS [sql_instance], SELECT
[cpu_count] ''sqlserver_server_properties'' AS [measurement]
,REPLACE(@@SERVERNAME,''\'','':'') AS [sql_instance]
,si.[cpu_count]
,(SELECT [total_physical_memory_kb] FROM sys.[dm_os_sys_memory]) AS [server_memory] ,(SELECT [total_physical_memory_kb] FROM sys.[dm_os_sys_memory]) AS [server_memory]
,CAST(SERVERPROPERTY(''Edition'') AS NVARCHAR) AS [sku] ,SERVERPROPERTY(''Edition'') AS [sku]
,@EngineEdition AS [engine_edition] ,CAST(SERVERPROPERTY(''EngineEdition'') AS int) AS [engine_edition]
,DATEDIFF(MINUTE,[sqlserver_start_time],GETDATE()) AS [uptime] ,DATEDIFF(MINUTE,si.[sqlserver_start_time],GETDATE()) AS [uptime]
' + @Columns + ', ,SERVERPROPERTY(''ProductVersion'') AS [sql_version]
SERVERPROPERTY(''ProductVersion'') AS sql_version, ,dbs.[db_online]
db_online, ,dbs.[db_restoring]
db_restoring, ,dbs.[db_recovering]
db_recovering, ,dbs.[db_recoveryPending]
db_recoveryPending, ,dbs.[db_suspect]
db_suspect, ,dbs.[db_offline]'
db_offline + @Columns + N'
FROM sys.[dm_os_sys_info] FROM sys.[dm_os_sys_info] AS si
CROSS APPLY CROSS APPLY (
( SELECT SUM( CASE WHEN state = 0 THEN 1 ELSE 0 END ) AS db_online, SELECT
SUM( CASE WHEN state = 1 THEN 1 ELSE 0 END ) AS db_restoring, SUM(CASE WHEN state = 0 THEN 1 ELSE 0 END) AS [db_online]
SUM( CASE WHEN state = 2 THEN 1 ELSE 0 END ) AS db_recovering, ,SUM(CASE WHEN state = 1 THEN 1 ELSE 0 END) AS [db_restoring]
SUM( CASE WHEN state = 3 THEN 1 ELSE 0 END ) AS db_recoveryPending, ,SUM(CASE WHEN state = 2 THEN 1 ELSE 0 END) AS [db_recovering]
SUM( CASE WHEN state = 4 THEN 1 ELSE 0 END ) AS db_suspect, ,SUM(CASE WHEN state = 3 THEN 1 ELSE 0 END) AS [db_recoveryPending]
SUM( CASE WHEN state = 6 or state = 10 THEN 1 ELSE 0 END ) AS db_offline ,SUM(CASE WHEN state = 4 THEN 1 ELSE 0 END) AS [db_suspect]
,SUM(CASE WHEN state IN(6, 10) THEN 1 ELSE 0 END) AS [db_offline]
FROM sys.databases FROM sys.databases
) AS dbs'; ) AS dbs
'
EXEC sp_executesql @SqlStatement , N'@EngineEdition smallint', @EngineEdition = @EngineEdition; EXEC sp_executesql @SqlStatement
END
` `
const sqlServerSchedulers string = ` const sqlServerSchedulers string = `
IF SERVERPROPERTY('EngineEdition') IN (2,3,4) /*Standard,Enterpris,Express*/ IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
BEGIN DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
DECLARE DECLARE
@SqlStatement AS nvarchar(max) @SqlStatement AS nvarchar(max)
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int) ,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@Columns AS nvarchar(MAX) = '' ,@Columns AS nvarchar(MAX) = ''
IF @MajorMinorVersion >= 1300 BEGIN IF @MajorMinorVersion >= 1300 BEGIN
SET @Columns += N',s.[total_cpu_usage_ms] SET @Columns += N'
,s.[total_cpu_usage_ms]
,s.[total_scheduler_delay_ms]' ,s.[total_scheduler_delay_ms]'
END END
@ -248,8 +261,8 @@ BEGIN
SELECT SELECT
''sqlserver_schedulers'' AS [measurement] ''sqlserver_schedulers'' AS [measurement]
,REPLACE(@@SERVERNAME, ''\'', '':'') AS [sql_instance] ,REPLACE(@@SERVERNAME, ''\'', '':'') AS [sql_instance]
,cast(s.[scheduler_id] AS VARCHAR(4)) AS [scheduler_id] ,CAST(s.[scheduler_id] AS VARCHAR(4)) AS [scheduler_id]
,cast(s.[cpu_id] AS VARCHAR(4)) AS [cpu_id] ,CAST(s.[cpu_id] AS VARCHAR(4)) AS [cpu_id]
,s.[is_online] ,s.[is_online]
,s.[is_idle] ,s.[is_idle]
,s.[preemptive_switches_count] ,s.[preemptive_switches_count]
@ -261,145 +274,148 @@ BEGIN
,s.[work_queue_count] ,s.[work_queue_count]
,s.[pending_disk_io_count] ,s.[pending_disk_io_count]
,s.[load_factor] ,s.[load_factor]
,s.[yield_count] ,s.[yield_count]'
' + @Columns + N' + @Columns + N'
FROM sys.dm_os_schedulers AS s' FROM sys.dm_os_schedulers AS s'
EXEC sp_executesql @SqlStatement EXEC sp_executesql @SqlStatement
END
` `
const sqlServerPerformanceCounters string = ` const sqlServerPerformanceCounters string = `
SET DEADLOCK_PRIORITY -10;
IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
DECLARE DECLARE
@SqlStatement AS nvarchar(max) @SqlStatement AS nvarchar(max)
,@EngineEdition AS tinyint = CAST(SERVERPROPERTY('EngineEdition') AS int) ,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int)
,@Columns AS nvarchar(MAX) = '' ,@Columns AS nvarchar(MAX) = ''
,@PivotColumns AS nvarchar(MAX) = '' ,@PivotColumns AS nvarchar(MAX) = ''
IF @EngineEdition IN (2,3,4) /*Standard,Enterpris,Express*/
BEGIN
DECLARE @PCounters TABLE DECLARE @PCounters TABLE
( (
object_name nvarchar(128), [object_name] nvarchar(128)
counter_name nvarchar(128), ,[counter_name] nvarchar(128)
instance_name nvarchar(128), ,[instance_name] nvarchar(128)
cntr_value bigint, ,[cntr_value] bigint
cntr_type INT, ,[cntr_type] int
Primary Key(object_name, counter_name, instance_name) PRIMARY KEY([object_name], [counter_name], [instance_name])
); );
SET @SqlStatement = N'SELECT DISTINCT SET @SqlStatement = N'
RTrim(spi.object_name) object_name, SELECT DISTINCT
RTrim(spi.counter_name) counter_name, RTRIM(spi.[object_name]) [object_name]
RTRIM(spi.instance_name) as instance_name, ,RTRIM(spi.[counter_name]) [counter_name]
CAST(spi.cntr_value AS BIGINT) AS cntr_value, ,RTRIM(spi.[instance_name]) AS [instance_name]
spi.cntr_type ,CAST(spi.[cntr_value] AS bigint) AS [cntr_value]
,spi.[cntr_type]
FROM sys.dm_os_performance_counters AS spi FROM sys.dm_os_performance_counters AS spi
WHERE ( WHERE
counter_name IN ( counter_name IN (
''SQL Compilations/sec'', ''SQL Compilations/sec''
''SQL Re-Compilations/sec'', ,''SQL Re-Compilations/sec''
''User Connections'', ,''User Connections''
''Batch Requests/sec'', ,''Batch Requests/sec''
''Logouts/sec'', ,''Logouts/sec''
''Logins/sec'', ,''Logins/sec''
''Processes blocked'', ,''Processes blocked''
''Latch Waits/sec'', ,''Latch Waits/sec''
''Full Scans/sec'', ,''Full Scans/sec''
''Index Searches/sec'', ,''Index Searches/sec''
''Page Splits/sec'', ,''Page Splits/sec''
''Page lookups/sec'', ,''Page lookups/sec''
''Page reads/sec'', ,''Page reads/sec''
''Page writes/sec'', ,''Page writes/sec''
''Readahead pages/sec'', ,''Readahead pages/sec''
''Lazy writes/sec'', ,''Lazy writes/sec''
''Checkpoint pages/sec'', ,''Checkpoint pages/sec''
''Page life expectancy'', ,''Page life expectancy''
''Log File(s) Size (KB)'', ,''Log File(s) Size (KB)''
''Log File(s) Used Size (KB)'', ,''Log File(s) Used Size (KB)''
''Data File(s) Size (KB)'', ,''Data File(s) Size (KB)''
''Transactions/sec'', ,''Transactions/sec''
''Write Transactions/sec'', ,''Write Transactions/sec''
''Active Temp Tables'', ,''Active Temp Tables''
''Temp Tables Creation Rate'', ,''Temp Tables Creation Rate''
''Temp Tables For Destruction'', ,''Temp Tables For Destruction''
''Free Space in tempdb (KB)'', ,''Free Space in tempdb (KB)''
''Version Store Size (KB)'', ,''Version Store Size (KB)''
''Memory Grants Pending'', ,''Memory Grants Pending''
''Memory Grants Outstanding'', ,''Memory Grants Outstanding''
''Free list stalls/sec'', ,''Free list stalls/sec''
''Buffer cache hit ratio'', ,''Buffer cache hit ratio''
''Buffer cache hit ratio base'', ,''Buffer cache hit ratio base''
''Backup/Restore Throughput/sec'', ,''Backup/Restore Throughput/sec''
''Total Server Memory (KB)'', ,''Total Server Memory (KB)''
''Target Server Memory (KB)'', ,''Target Server Memory (KB)''
''Log Flushes/sec'', ,''Log Flushes/sec''
''Log Flush Wait Time'', ,''Log Flush Wait Time''
''Memory broker clerk size'', ,''Memory broker clerk size''
''Log Bytes Flushed/sec'', ,''Log Bytes Flushed/sec''
''Bytes Sent to Replica/sec'', ,''Bytes Sent to Replica/sec''
''Log Send Queue'', ,''Log Send Queue''
''Bytes Sent to Transport/sec'', ,''Bytes Sent to Transport/sec''
''Sends to Replica/sec'', ,''Sends to Replica/sec''
''Bytes Sent to Transport/sec'', ,''Bytes Sent to Transport/sec''
''Sends to Transport/sec'', ,''Sends to Transport/sec''
''Bytes Received from Replica/sec'', ,''Bytes Received from Replica/sec''
''Receives from Replica/sec'', ,''Receives from Replica/sec''
''Flow Control Time (ms/sec)'', ,''Flow Control Time (ms/sec)''
''Flow Control/sec'', ,''Flow Control/sec''
''Resent Messages/sec'', ,''Resent Messages/sec''
''Redone Bytes/sec'', ,''Redone Bytes/sec''
''XTP Memory Used (KB)'', ,''XTP Memory Used (KB)''
''Transaction Delay'', ,''Transaction Delay''
''Log Bytes Received/sec'', ,''Log Bytes Received/sec''
''Log Apply Pending Queue'', ,''Log Apply Pending Queue''
''Redone Bytes/sec'', ,''Redone Bytes/sec''
''Recovery Queue'', ,''Recovery Queue''
''Log Apply Ready Queue'', ,''Log Apply Ready Queue''
''CPU usage %'', ,''CPU usage %''
''CPU usage % base'', ,''CPU usage % base''
''Queued requests'', ,''Queued requests''
''Requests completed/sec'', ,''Requests completed/sec''
''Blocked tasks'', ,''Blocked tasks''
''Active memory grant amount (KB)'', ,''Active memory grant amount (KB)''
''Disk Read Bytes/sec'', ,''Disk Read Bytes/sec''
''Disk Read IO Throttled/sec'', ,''Disk Read IO Throttled/sec''
''Disk Read IO/sec'', ,''Disk Read IO/sec''
''Disk Write Bytes/sec'', ,''Disk Write Bytes/sec''
''Disk Write IO Throttled/sec'', ,''Disk Write IO Throttled/sec''
''Disk Write IO/sec'', ,''Disk Write IO/sec''
''Used memory (KB)'', ,''Used memory (KB)''
''Forwarded Records/sec'', ,''Forwarded Records/sec''
''Background Writer pages/sec'', ,''Background Writer pages/sec''
''Percent Log Used'', ,''Percent Log Used''
''Log Send Queue KB'', ,''Log Send Queue KB''
''Redo Queue KB'', ,''Redo Queue KB''
''Mirrored Write Transactions/sec'', ,''Mirrored Write Transactions/sec''
''Group Commit Time'', ,''Group Commit Time''
''Group Commits/Sec'' ,''Group Commits/Sec''
)
) OR ( ) OR (
object_name LIKE ''%User Settable%'' spi.[object_name] LIKE ''%User Settable%''
OR object_name LIKE ''%SQL Errors%'' OR spi.[object_name] LIKE ''%SQL Errors%''
OR spi.[object_name] LIKE ''%Batch Resp Statistics%''
) OR ( ) OR (
object_name LIKE ''%Batch Resp Statistics%'' spi.[instance_name] IN (''_Total'')
) OR ( AND spi.[counter_name] IN (
instance_name IN (''_Total'') ''Lock Timeouts/sec''
AND counter_name IN ( ,''Lock Timeouts (timeout > 0)/sec''
''Lock Timeouts/sec'', ,''Number of Deadlocks/sec''
''Lock Timeouts (timeout > 0)/sec'', ,''Lock Waits/sec''
''Number of Deadlocks/sec'', ,''Latch Waits/sec''
''Lock Waits/sec'',
''Latch Waits/sec''
) )
) )
' '
INSERT INTO @PCounters
EXEC (@SqlStatement) INSERT INTO @PCounters EXEC(@SqlStatement)
IF @MajorMinorVersion >= 1300 BEGIN IF @MajorMinorVersion >= 1300 BEGIN
SET @Columns += N',rgwg.[total_cpu_usage_preemptive_ms] AS [Preemptive CPU Usage (time)]' SET @Columns += N'
,rgwg.[total_cpu_usage_preemptive_ms] AS [Preemptive CPU Usage (time)]'
SET @PivotColumns += N',[Preemptive CPU Usage (time)]' SET @PivotColumns += N',[Preemptive CPU Usage (time)]'
END END
@ -408,67 +424,70 @@ BEGIN
''SQLServer:Workload Group Stats'' AS [object] ''SQLServer:Workload Group Stats'' AS [object]
,[counter] ,[counter]
,[instance] ,[instance]
,CAST(vs.[value] AS BIGINT) AS [value] ,CAST(vs.[value] AS bigint) AS [value]
,1 ,1
FROM FROM
( (
SELECT SELECT
rgwg.name AS instance rgwg.[name] AS [instance]
,rgwg.total_request_count AS [Request Count] ,rgwg.[total_request_count] AS [Request Count]
,rgwg.total_queued_request_count AS [Queued Request Count] ,rgwg.[total_queued_request_count] AS [Queued Request Count]
,rgwg.total_cpu_limit_violation_count AS [CPU Limit Violation Count] ,rgwg.[total_cpu_limit_violation_count] AS [CPU Limit Violation Count]
,rgwg.total_cpu_usage_ms AS [CPU Usage (time)] ,rgwg.[total_cpu_usage_ms] AS [CPU Usage (time)]
,rgwg.total_lock_wait_count AS [Lock Wait Count] ,rgwg.[total_lock_wait_count] AS [Lock Wait Count]
,rgwg.total_lock_wait_time_ms AS [Lock Wait Time] ,rgwg.[total_lock_wait_time_ms] AS [Lock Wait Time]
,rgwg.total_reduced_memgrant_count AS [Reduced Memory Grant Count] ,rgwg.[total_reduced_memgrant_count] AS [Reduced Memory Grant Count]'
' + @Columns + N' + @Columns + N'
FROM sys.[dm_resource_governor_workload_groups] AS rgwg FROM sys.dm_resource_governor_workload_groups AS rgwg
INNER JOIN sys.[dm_resource_governor_resource_pools] AS rgrp INNER JOIN sys.dm_resource_governor_resource_pools AS rgrp /*No fields from this table. remove?*/
ON rgwg.[pool_id] = rgrp.[pool_id] ON rgwg.[pool_id] = rgrp.[pool_id]
) AS rg ) AS rg
UNPIVOT ( UNPIVOT (
value FOR counter IN ( [Request Count], [Queued Request Count], [CPU Limit Violation Count], [CPU Usage (time)], [Lock Wait Count], [Lock Wait Time], [Reduced Memory Grant Count] ' + @PivotColumns + N') [value] FOR [counter] IN ( [Request Count], [Queued Request Count], [CPU Limit Violation Count], [CPU Usage (time)], [Lock Wait Count], [Lock Wait Time], [Reduced Memory Grant Count] ' + @PivotColumns + N')
) AS vs' ) AS vs'
INSERT INTO @PCounters INSERT INTO @PCounters EXEC(@SqlStatement)
EXEC( @SqlStatement )
SELECT 'sqlserver_performance' AS [measurement], SELECT
REPLACE(@@SERVERNAME,'\',':') AS [sql_instance], 'sqlserver_performance' AS [measurement]
pc.object_name AS [object], ,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance]
pc.counter_name AS [counter], ,pc.[object_name] AS [object]
CASE pc.instance_name WHEN '_Total' THEN 'Total' ELSE ISNULL(pc.instance_name,'') END AS [instance], ,pc.[counter_name] AS [counter]
CAST(CASE WHEN pc.cntr_type = 537003264 AND pc1.cntr_value > 0 THEN (pc.cntr_value * 1.0) / (pc1.cntr_value * 1.0) * 100 ELSE pc.cntr_value END AS float(10)) AS [value], ,CASE pc.[instance_name] WHEN '_Total' THEN 'Total' ELSE ISNULL(pc.[instance_name],'') END AS [instance]
-- cast to string as TAG ,CAST(CASE WHEN pc.[cntr_type] = 537003264 AND pc1.[cntr_value] > 0 THEN (pc.[cntr_value] * 1.0) / (pc1.[cntr_value] * 1.0) * 100 ELSE pc.[cntr_value] END AS float(10)) AS [value]
cast(pc.cntr_type as varchar(25)) as [counter_type] ,CAST(pc.[cntr_type] AS varchar(25)) AS [counter_type]
FROM @PCounters AS pc FROM @PCounters AS pc
LEFT OUTER JOIN @PCounters AS pc1 LEFT OUTER JOIN @PCounters AS pc1
ON ( ON (
pc.counter_name = REPLACE(pc1.counter_name,' base','') pc.[counter_name] = REPLACE(pc1.[counter_name],' base','')
OR pc.counter_name = REPLACE(pc1.counter_name,' base',' (ms)') OR pc.[counter_name] = REPLACE(pc1.[counter_name],' base',' (ms)')
) )
AND pc.object_name = pc1.object_name AND pc.[object_name] = pc1.[object_name]
AND pc.instance_name = pc1.instance_name AND pc.[instance_name] = pc1.[instance_name]
AND pc1.counter_name LIKE '%base' AND pc1.[counter_name] LIKE '%base'
WHERE pc.counter_name NOT LIKE '% base' WHERE
OPTION(RECOMPILE); pc.[counter_name] NOT LIKE '% base'
END OPTION(RECOMPILE)
` `
const sqlServerWaitStatsCategorized string = ` const sqlServerWaitStatsCategorized string = `
IF SERVERPROPERTY('EngineEdition') IN (2,3,4) /*Standard,Enterpris,Express*/ IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
SELECT SELECT
'sqlserver_waitstats' AS [measurement], 'sqlserver_waitstats' AS [measurement]
REPLACE(@@SERVERNAME,'\',':') AS [sql_instance], ,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance]
ws.wait_type, ,ws.[wait_type]
wait_time_ms, ,ws.[wait_time_ms]
wait_time_ms - signal_wait_time_ms AS [resource_wait_ms], ,ws.[wait_time_ms] - ws.[signal_wait_time_ms] AS [resource_wait_ms]
signal_wait_time_ms, ,ws.[signal_wait_time_ms]
max_wait_time_ms, ,ws.[max_wait_time_ms]
waiting_tasks_count, ,ws.[waiting_tasks_count]
ISNULL(wc.wait_category,'OTHER') AS [wait_category] ,ISNULL(wc.[wait_category],'OTHER') AS [wait_category]
FROM FROM sys.dm_os_wait_stats AS ws WITH (NOLOCK)
sys.dm_os_wait_stats AS ws WITH (NOLOCK)
LEFT OUTER JOIN ( VALUES LEFT OUTER JOIN ( VALUES
('ASYNC_IO_COMPLETION','Other Disk IO'), ('ASYNC_IO_COMPLETION','Other Disk IO'),
('ASYNC_NETWORK_IO','Network IO'), ('ASYNC_NETWORK_IO','Network IO'),
@ -974,10 +993,11 @@ IF SERVERPROPERTY('EngineEdition') IN (2,3,4) /*Standard,Enterpris,Express*/
('XACTLOCKINFO','Transaction'), ('XACTLOCKINFO','Transaction'),
('XACTWORKSPACE_MUTEX','Transaction'), ('XACTWORKSPACE_MUTEX','Transaction'),
('XE_DISPATCHER_WAIT','Idle'), ('XE_DISPATCHER_WAIT','Idle'),
('XE_TIMER_EVENT','Idle')) AS wc(wait_type, wait_category) ('XE_TIMER_EVENT','Idle')
ON ws.wait_type = wc.wait_type ) AS wc([wait_type], [wait_category])
ON ws.[wait_type] = wc.[wait_type]
WHERE WHERE
ws.wait_type NOT IN ( ws.[wait_type] NOT IN (
N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP', N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR', N'BROKER_TASK_STOP',
N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE', N'BROKER_TO_FLUSH', N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',
N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE', N'CHKPT', N'CLR_AUTO_EVENT', N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',
@ -1010,122 +1030,132 @@ IF SERVERPROPERTY('EngineEdition') IN (2,3,4) /*Standard,Enterpris,Express*/
N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG', N'WAIT_XTP_CKPT_CLOSE',
N'XE_BUFFERMGR_ALLPROCESSED_EVENT', N'XE_DISPATCHER_JOIN', N'XE_BUFFERMGR_ALLPROCESSED_EVENT', N'XE_DISPATCHER_JOIN',
N'XE_DISPATCHER_WAIT', N'XE_LIVE_TARGET_TVF', N'XE_TIMER_EVENT', N'XE_DISPATCHER_WAIT', N'XE_LIVE_TARGET_TVF', N'XE_TIMER_EVENT',
N'SOS_WORK_DISPATCHER','RESERVED_MEMORY_ALLOCATION_EXT') N'SOS_WORK_DISPATCHER','RESERVED_MEMORY_ALLOCATION_EXT'
AND waiting_tasks_count > 0 )
AND wait_time_ms > 100; AND ws.[waiting_tasks_count] > 0
AND ws.[wait_time_ms] > 100
` `
const sqlServerRequests string = ` const sqlServerRequests string = `
SET NOCOUNT ON; IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
RAISERROR (@ErrorMessage,11,1)
RETURN
END
DECLARE DECLARE
@SqlStatement AS nvarchar(max) @SqlStatement AS nvarchar(max)
,@EngineEdition AS tinyint = CAST(SERVERPROPERTY('EngineEdition') AS int) ,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int) * 100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int) * 100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int) ,@Columns AS nvarchar(max) = ''
-- 2008R2 and before doesn't have open_transaction_count in sys.dm_exec_sessions IF @MajorMinorVersion >= 1200 BEGIN
DECLARE @Columns as nvarchar(max) = '' SET @Columns = '
DECLARE @DatabaseColumn as nvarchar(max) = '' ,DB_NAME(COALESCE(r.[database_id], s.[database_id])) AS [session_db_name]
IF @MajorMinorVersion >= 1200 ,COALESCE(r.[open_transaction_count], s.[open_transaction_count]) AS [open_transaction]'
BEGIN
SET @Columns = ',s.open_transaction_count as open_transaction '
SET @DatabaseColumn = ' , DB_NAME(s.database_id) as session_db_name '
END END
ELSE ELSE BEGIN
BEGIN SET @Columns = '
SET @Columns = ',r.open_transaction_count as open_transaction ' ,DB_NAME(r.[database_id]) AS [session_db_name]
SET @DatabaseColumn = ' , DB_NAME(r.database_id) as session_db_name ' ,r.[open_transaction_count] AS [open_transaction]'
END END
SET @SqlStatement = N' SET @SqlStatement = N'
SELECT blocking_session_id into #blockingSessions FROM sys.dm_exec_requests WHERE blocking_session_id != 0 SELECT [blocking_session_id] into #blockingSessions FROM sys.dm_exec_requests WHERE [blocking_session_id] != 0
create index ix_blockingSessions_1 on #blockingSessions (blocking_session_id) CREATE INDEX ix_blockingSessions_1 ON #blockingSessions ([blocking_session_id])
SELECT SELECT
''sqlserver_requests'' AS [measurement] ''sqlserver_requests'' AS [measurement]
,REPLACE(@@SERVERNAME,''\'','':'') AS [sql_instance] ,REPLACE(@@SERVERNAME,''\'','':'') AS [sql_instance]
, DB_NAME() as [database_name]
,s.session_id ,s.session_id
, ISNULL(r.request_id,0) as request_id ' ,ISNULL(r.[request_id], 0) AS [request_id]
+ @DatabaseColumn + ,COALESCE(r.[status], s.[status]) AS [status]
N' , COALESCE(r.status,s.status) AS status ,COALESCE(r.[cpu_time], s.[cpu_time]) AS [cpu_time_ms]
, COALESCE(r.cpu_time,s.cpu_time) AS cpu_time_ms ,COALESCE(r.[total_elapsed_time], s.total_elapsed_time) AS [total_elapsed_time_ms]
, COALESCE(r.total_elapsed_time,s.total_elapsed_time) AS total_elapsed_time_ms ,COALESCE(r.[logical_reads], s.[logical_reads]) AS [logical_reads]
, COALESCE(r.logical_reads,s.logical_reads) AS logical_reads ,COALESCE(r.[writes], s.[writes]) AS [writes]
, COALESCE(r.writes,s.writes) AS writes ,r.[command]
, r.command ,r.[wait_time] AS [wait_time_ms]
, r.wait_time as wait_time_ms ,r.[wait_type]
, r.wait_type ,r.[wait_resource]
, r.wait_resource ,r.[blocking_session_id]
, r.blocking_session_id ,s.[program_name]
, s.program_name ,s.[host_name]
, s.host_name ,s.[nt_user_name]
, s.nt_user_name ' ,LEFT (CASE COALESCE(r.[transaction_isolation_level], s.[transaction_isolation_level])
+ @Columns +
N', LEFT (CASE COALESCE(r.transaction_isolation_level, s.transaction_isolation_level)
WHEN 0 THEN ''0-Read Committed'' WHEN 0 THEN ''0-Read Committed''
WHEN 1 THEN ''1-Read Uncommitted (NOLOCK)'' WHEN 1 THEN ''1-Read Uncommitted (NOLOCK)''
WHEN 2 THEN ''2-Read Committed'' WHEN 2 THEN ''2-Read Committed''
WHEN 3 THEN ''3-Repeatable Read'' WHEN 3 THEN ''3-Repeatable Read''
WHEN 4 THEN ''4-Serializable'' WHEN 4 THEN ''4-Serializable''
WHEN 5 THEN ''5-Snapshot'' WHEN 5 THEN ''5-Snapshot''
ELSE CONVERT (varchar(30), r.transaction_isolation_level) + ''-UNKNOWN'' ELSE CONVERT (varchar(30), r.[transaction_isolation_level]) + ''-UNKNOWN''
END, 30) AS transaction_isolation_level END, 30) AS [transaction_isolation_level]
, r.granted_query_memory as granted_query_memory_pages ,r.[granted_query_memory] AS [granted_query_memory_pages]
, r.percent_complete ,r.[percent_complete]
,SUBSTRING( ,SUBSTRING(
qt.text, qt.[text],
r.statement_start_offset / 2 + 1, r.[statement_start_offset] / 2 + 1,
(CASE WHEN r.statement_end_offset = -1 (CASE WHEN r.[statement_end_offset] = -1
THEN DATALENGTH(qt.text) THEN DATALENGTH(qt.[text])
ELSE r.statement_end_offset ELSE r.[statement_end_offset]
END - r.statement_start_offset) / 2 + 1 END - r.[statement_start_offset]) / 2 + 1
) AS statement_text ) AS [statement_text]
, qt.objectid ,qt.[objectid]
, QUOTENAME(OBJECT_SCHEMA_NAME(qt.objectid,qt.dbid)) + ''.'' + QUOTENAME(OBJECT_NAME(qt.objectid,qt.dbid)) as stmt_object_name ,QUOTENAME(OBJECT_SCHEMA_NAME(qt.[objectid], qt.[dbid])) + ''.'' + QUOTENAME(OBJECT_NAME(qt.[objectid], qt.[dbid])) AS [stmt_object_name]
, DB_NAME(qt.dbid) stmt_db_name ,DB_NAME(qt.dbid) AS [stmt_db_name]
, CONVERT(varchar(20),[query_hash],1) as [query_hash] ,CONVERT(varchar(20),[query_hash],1) AS [query_hash]
, CONVERT(varchar(20),[query_plan_hash],1) as [query_plan_hash] ,CONVERT(varchar(20),[query_plan_hash],1) AS [query_plan_hash]'
+ @Columns + N'
FROM sys.dm_exec_sessions AS s FROM sys.dm_exec_sessions AS s
LEFT OUTER JOIN sys.dm_exec_requests AS r LEFT OUTER JOIN sys.dm_exec_requests AS r
ON s.session_id = r.session_id ON s.[session_id] = r.[session_id]
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS qt OUTER APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS qt
WHERE 1 = 1 WHERE
AND (r.session_id IS NOT NULL AND (s.is_user_process = 1 (s.[session_id] IN (SELECT blocking_session_id FROM #blockingSessions))
OR r.status COLLATE Latin1_General_BIN NOT IN (''background'', ''sleeping''))) OR (
OR (s.session_id IN (SELECT blocking_session_id FROM #blockingSessions)) r.[session_id] IS NOT NULL
AND (
s.is_user_process = 1
OR r.[status] COLLATE Latin1_General_BIN NOT IN (''background'', ''sleeping'')
)
)
OPTION(MAXDOP 1)' OPTION(MAXDOP 1)'
EXEC sp_executesql @SqlStatement EXEC sp_executesql @SqlStatement
` `
const sqlServerVolumeSpace string = ` const sqlServerVolumeSpace string = `
/* Only for on-prem version of SQL Server IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
Gets data about disk space, only for volumes used by SQL Server (data available form sql 2008R2 and later) DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
*/ RAISERROR (@ErrorMessage,11,1)
DECLARE RETURN
@EngineEdition AS tinyint = CAST(SERVERPROPERTY('EngineEdition') AS int) END
,@MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') as nvarchar),3) AS int)
IF @EngineEdition IN (2,3,4) AND @MajorMinorVersion >= 1050 DECLARE
BEGIN @MajorMinorVersion AS int = CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4) AS int)*100 + CAST(PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3) AS int)
IF @MajorMinorVersion >= 1050 BEGIN
SELECT DISTINCT SELECT DISTINCT
'sqlserver_volume_space' AS [measurement] 'sqlserver_volume_space' AS [measurement]
,SERVERPROPERTY('machinename') AS [server_name] ,SERVERPROPERTY('MachineName') AS [server_name]
,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance] ,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance]
/*in [volume_mount_point] any trailing "\" char will be removed by telegraf */ /*in [volume_mount_point] any trailing "\" char will be removed by telegraf */
,[volume_mount_point] ,vs.[volume_mount_point]
,vs.[total_bytes] AS [total_space_bytes] ,vs.[total_bytes] AS [total_space_bytes]
,vs.[available_bytes] AS [available_space_bytes] ,vs.[available_bytes] AS [available_space_bytes]
,vs.[total_bytes] - vs.[available_bytes] AS [used_space_bytes] ,vs.[total_bytes] - vs.[available_bytes] AS [used_space_bytes]
FROM FROM sys.master_files AS mf
sys.master_files as mf CROSS APPLY sys.dm_os_volume_stats(mf.[database_id], mf.[file_id]) AS vs
CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) as vs
END END
` `
const sqlServerRingBufferCpu string = ` const sqlServerRingBufferCpu string = `
/*The ring buffer has a new value every minute*/ IF SERVERPROPERTY('EngineEdition') NOT IN (2,3,4) BEGIN /*NOT IN Standard,Enterpris,Express*/
IF SERVERPROPERTY('EngineEdition') IN (2,3,4) /*Standard,Enterpris,Express*/ DECLARE @ErrorMessage AS nvarchar(500) = 'Telegraf - Connection string Server:'+ @@ServerName + ',Database:' + DB_NAME() +' is not a SQL Server Standard,Enterprise or Express. Check the database_type parameter in the telegraf configuration.';
BEGIN RAISERROR (@ErrorMessage,11,1)
RETURN
END
SELECT SELECT
'sqlserver_cpu' AS [measurement] 'sqlserver_cpu' AS [measurement]
,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance] ,REPLACE(@@SERVERNAME,'\',':') AS [sql_instance]
@ -1135,23 +1165,24 @@ SELECT
FROM ( FROM (
SELECT TOP 1 SELECT TOP 1
[record_id] [record_id]
/*,dateadd(ms, (y.[timestamp] - (SELECT CAST([ms_ticks] AS BIGINT) FROM sys.dm_os_sys_info)), GETDATE()) AS [EventTime] --use for check/debug purpose*/
,[SQLProcessUtilization] ,[SQLProcessUtilization]
,[SystemIdle] ,[SystemIdle]
FROM ( FROM (
SELECT record.value('(./Record/@id)[1]', 'int') AS [record_id] SELECT
record.value('(./Record/@id)[1]', 'int') AS [record_id]
,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle] ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle]
,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization] ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization]
,[TIMESTAMP] ,[TIMESTAMP]
FROM ( FROM (
SELECT [TIMESTAMP] SELECT
[TIMESTAMP]
,convert(XML, [record]) AS [record] ,convert(XML, [record]) AS [record]
FROM sys.dm_os_ring_buffers FROM sys.dm_os_ring_buffers
WHERE [ring_buffer_type] = N'RING_BUFFER_SCHEDULER_MONITOR' WHERE
[ring_buffer_type] = N'RING_BUFFER_SCHEDULER_MONITOR'
AND [record] LIKE '%<SystemHealth>%' AND [record] LIKE '%<SystemHealth>%'
) AS x ) AS x
) AS y ) AS y
ORDER BY record_id DESC ORDER BY [record_id] DESC
) as z ) AS z
END
` `