scripts/collector/sqlserver/sql/dbServerDmvPerfmon.sql (184 lines of code) (raw):

/* Copyright 2023 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ SET NOCOUNT ON; SET LANGUAGE us_english; SET QUOTED_IDENTIFIER ON; SET NUMERIC_ROUNDABORT OFF; SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET ARITHABORT ON; SET CONCAT_NULL_YIELDS_NULL ON; SET QUOTED_IDENTIFIER ON; DECLARE @PKEY AS VARCHAR(256) DECLARE @PRODUCT_VERSION AS INTEGER DECLARE @ASSESSMENT_DATABSE_NAME AS VARCHAR(256) DECLARE @DMA_SOURCE_ID AS VARCHAR(256) DECLARE @DMA_MANUAL_ID AS VARCHAR(256) SELECT @PKEY = N'$(pkey)'; SELECT @PRODUCT_VERSION = CONVERT(INTEGER, PARSENAME(CONVERT(NVARCHAR(255), SERVERPROPERTY('productversion')), 4)); SELECT @ASSESSMENT_DATABSE_NAME = N'$(database)'; SELECT @DMA_SOURCE_ID = N'$(dmaSourceId)'; SELECT @DMA_MANUAL_ID = N'$(dmaManualId)'; IF @ASSESSMENT_DATABSE_NAME = 'all' SELECT @ASSESSMENT_DATABSE_NAME = '%' BEGIN BEGIN TRY BEGIN exec(' DECLARE @ticksNow bigint, @ticksMs bigint; -- Calculate ticks to timestamp SELECT @ticksNow = OSI.cpu_ticks / CONVERT(float, OSI.cpu_ticks/ms_ticks) ,@ticksMs = cpu_ticks/ms_ticks FROM sys.dm_os_sys_info AS OSI; WITH util AS ( SELECT ''' + @PKEY + ''' AS PKEY, RBS.Rc.value(''(./Record/@id)[1]'', ''bigint'') AS RecordID, RBS.Rc.value(''(//SystemHealth/SystemIdle)[1]'', ''bigint'') AS SystemIdle, -- SystemIdle on Linux will be 0 RBS.Rc.value(''(//SystemHealth/ProcessUtilization)[1]'',''bigint'') AS ProcessUtil, RBS.Rc.value(''(//SystemHealth/MemoryUtilization)[1]'',''bigint'') AS MemoryUtil, RBS.Rc.value(''(//SystemHealth/PageFaults)[1]'', ''bigint'') AS PageFaults, RBS.Rc.value(''(//SystemHealth/UserModeTime)[1]'', ''bigint'') AS UserModeTime, RBS.Rc.value(''(//SystemHealth/KernelModeTime)[1]'', ''bigint'') AS KernelModeTime, RBS.EventStamp FROM ( SELECT ORB.[timestamp] AS EventStamp, CONVERT(XML, ORB.record) AS Rc FROM sys.dm_os_ring_buffers AS ORB WHERE ORB.ring_buffer_type = ''RING_BUFFER_SCHEDULER_MONITOR'' ) AS RBS ), sample_iops AS ( SELECT ''' + @PKEY + ''' AS PKEY, --mf.physical_name AS DISK_Drive, SUM(CONVERT(bigint,sample_ms)) as sample_ms, SUM(CONVERT(bigint,num_of_reads)) AS DISK_num_of_reads, SUM(CONVERT(bigint,io_stall_read_ms)) AS DISK_io_stall_read_ms, SUM(CONVERT(bigint,num_of_writes)) AS DISK_num_of_writes, SUM(CONVERT(bigint,io_stall_write_ms)) AS DISK_io_stall_write_ms, SUM(CONVERT(bigint,num_of_bytes_read)) AS DISK_num_of_bytes_read, SUM(CONVERT(bigint,num_of_bytes_written)) AS DISK_num_of_bytes_written, SUM(CONVERT(bigint,io_stall)) AS io_stall FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs INNER JOIN sys.database_files AS mf WITH (NOLOCK) ON vfs.database_id = (select db_id(DB_NAME())) AND vfs.file_id = mf.file_id --GROUP BY mf.physical_name ), dmv_perfmon_counter_data as ( SELECT CONVERT(NVARCHAR(255),(ROUND((CONVERT(FLOAT,[Buffer cache hit ratio]) * 1.0 / CONVERT(FLOAT,[Buffer cache hit ratio base])) * 100.0,0))) as buffer_cache_hit_ratio, CONVERT(NVARCHAR(255),[Checkpoint pages/sec]) as checkpoint_pages_sec, CONVERT(NVARCHAR(255),[Free list stalls/sec]) as free_list_stalls_sec, CONVERT(NVARCHAR(255),[Page life expectancy]) as page_life_expectancy, CONVERT(NVARCHAR(255),[Page lookups/sec]) as page_lookups_sec, CONVERT(NVARCHAR(255),[Page reads/sec]) as page_reads_sec, CONVERT(NVARCHAR(255),[Page writes/sec]) as page_writes_sec, CONVERT(NVARCHAR(255),[User Connections]) as user_connections, CONVERT(NVARCHAR(255),[Memory Grants Pending]) as memory_grants_pending, CONVERT(NVARCHAR(255),[Target Server Memory (KB)]) as target_server_memory_kb, CONVERT(NVARCHAR(255),[Total Server Memory (KB)]) as total_server_memory_kb, CONVERT(NVARCHAR(255),[Batch Requests/sec]) as batch_requests_sec FROM ( SELECT counter_name, cntr_value FROM sys.dm_os_performance_counters WHERE (object_name = ''SQLServer:Buffer Manager'' AND counter_name IN (''Buffer cache hit ratio'',''Checkpoint pages/sec'',''Free list stalls/sec'',''Page life expectancy'',''Page lookups/sec'',''Page reads/sec'',''Page writes/sec'',''Buffer cache hit ratio base'')) OR (object_name = ''SQLServer:General Statistics'' AND counter_name IN (''User Connections'')) OR (object_name = ''SQLServer:Memory Manager'' AND counter_name IN (''Memory Grants Pending'',''Target Server Memory (KB)'',''Total Server Memory (KB)'')) OR (object_name = ''SQLServer:SQL Statistics'' AND counter_name IN (''Batch Requests/sec'')) ) AS SourceTable PIVOT ( AVG(cntr_value) FOR counter_name IN ( [Buffer cache hit ratio], [Buffer cache hit ratio base], [Checkpoint pages/sec], [Free list stalls/sec], [Page life expectancy], [Page lookups/sec], [Page reads/sec], [Page writes/sec], [User Connections], [Memory Grants Pending], [Target Server Memory (KB)], [Total Server Memory (KB)], [Batch Requests/sec]) ) AS PivotTable ) SELECT ''"' + @PKEY + '"'' AS pkey, ''"'' + CONVERT(VARCHAR(23),CONVERT(datetime2(3),DATEADD(ms, -1 * (@ticksNow - UT.EventStamp), GETDATE())),121) + ''"'' AS collection_time, ''""'' AS available_mbytes, CASE WHEN DISK_num_of_reads = 0 THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),(DISK_num_of_bytes_read / DISK_num_of_reads)) + ''"'' END AS physicaldisk_avg_disk_bytes_read, CASE WHEN SI.DISK_io_stall_write_ms = 0 THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),(SI.DISK_num_of_bytes_written / SI.DISK_num_of_writes)) + ''"'' END AS physicaldisk_avg_disk_bytes_write, CASE WHEN SI.DISK_num_of_reads = 0 THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),(SI.DISK_io_stall_read_ms / SI.DISK_num_of_reads)) + ''"'' END AS physicaldisk_avg_disk_bytes_read_sec, CASE WHEN SI.DISK_io_stall_write_ms = 0 THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),(SI.DISK_io_stall_write_ms / SI.DISK_num_of_writes)) + ''"'' END AS physicaldisk_avg_disk_bytes_write_sec, CASE WHEN (SI.DISK_num_of_reads = 0) THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),((SI.DISK_num_of_reads /(SI.sample_ms / 1000)))) + ''"'' END AS physicaldisk_disk_reads_sec, CASE WHEN (SI.DISK_num_of_writes = 0) THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),((SI.DISK_num_of_writes /(SI.sample_ms / 1000)))) + ''"'' END AS physicaldisk_disk_writes_sec, CASE WHEN UT.SystemIdle = 0 THEN ''"'' + CONVERT(NVARCHAR(255),(100 - UT.ProcessUtil)) + ''"'' ELSE ''"'' + CONVERT(NVARCHAR(255),UT.SystemIdle) + ''"'' END AS processor_idle_time_pct, ''"'' + CONVERT(NVARCHAR(255),UT.ProcessUtil) + ''"'' AS processor_total_time_pct, ''""'' AS processor_frequency, ''""'' AS processor_queue_length, ''"'' + (SELECT CONVERT(NVARCHAR(255), buffer_cache_hit_ratio) FROM dmv_perfmon_counter_data) + ''"'' AS buffer_cache_hit_ratio, ''"'' + (SELECT CONVERT(NVARCHAR(255), checkpoint_pages_sec) FROM dmv_perfmon_counter_data) + ''"'' AS checkpoint_pages_sec, CASE WHEN (SI.DISK_num_of_reads = 0 AND SI.DISK_num_of_writes = 0) THEN ''"0"'' ELSE ''"'' + CONVERT(NVARCHAR(255),(SI.io_stall /(SI.DISK_num_of_reads + SI.DISK_num_of_writes))) + ''"'' END AS free_list_stalls_sec, ''"'' + (SELECT CONVERT(NVARCHAR(255), page_life_expectancy) FROM dmv_perfmon_counter_data) + ''"'' AS page_life_expectancy, ''"'' + (SELECT CONVERT(NVARCHAR(255), page_lookups_sec) FROM dmv_perfmon_counter_data) + ''"'' AS page_lookups_sec, ''"'' + (SELECT CONVERT(NVARCHAR(255), page_reads_sec) FROM dmv_perfmon_counter_data) + ''"'' AS page_reads_sec, ''"'' + (SELECT CONVERT(NVARCHAR(255), page_writes_sec) FROM dmv_perfmon_counter_data) + ''"'' AS page_writes_sec, ''"'' + (SELECT CONVERT(NVARCHAR(255), user_connections) FROM dmv_perfmon_counter_data) + ''"'' AS user_connection_count, ''"'' + (SELECT CONVERT(NVARCHAR(255), memory_grants_pending) FROM dmv_perfmon_counter_data) + ''"'' AS memory_grants_pending, ''"'' + (SELECT CONVERT(NVARCHAR(255), target_server_memory_kb) FROM dmv_perfmon_counter_data) + ''"'' AS target_server_memory_kb, ''"'' + (SELECT CONVERT(NVARCHAR(255), total_server_memory_kb) FROM dmv_perfmon_counter_data) + ''"'' AS total_server_memory_kb, ''"'' + (SELECT CONVERT(NVARCHAR(255), batch_requests_sec) FROM dmv_perfmon_counter_data) + ''"'' AS batch_requests_sec, ''"' + @DMA_SOURCE_ID + '"'' as dma_source_id, ''"' + @DMA_MANUAL_ID + '"'' as dma_manual_id FROM util AS UT JOIN sample_iops SI ON (UT.PKEY = SI.PKEY) ORDER BY 1 DESC '); END END TRY BEGIN CATCH BEGIN IF ERROR_NUMBER() = 208 AND ERROR_SEVERITY() = 16 AND ERROR_STATE() = 1 WAITFOR DELAY '00:00:00' ELSE SELECT host_name() as host_name, db_name() as database_name, 'dmvPerfmon' as module_name, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_NUMBER()),1,254) as error_number, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_SEVERITY()),1,254) as error_severity, SUBSTRING(CONVERT(NVARCHAR(255),ERROR_STATE()),1,254) as error_state, ERROR_MESSAGE() as error_message; END END CATCH END;