diff --git a/Lite/Database/Schema.cs b/Lite/Database/Schema.cs index 1672e19..f2a603c 100644 --- a/Lite/Database/Schema.cs +++ b/Lite/Database/Schema.cs @@ -348,7 +348,7 @@ internal_object_reserved_mb DECIMAL(18,2), version_store_reserved_mb DECIMAL(18,2), total_reserved_mb DECIMAL(18,2), unallocated_mb DECIMAL(18,2), - total_sessions_using_tempdb INTEGER, + total_sessions_using_tempdb BIGINT, top_session_id INTEGER, top_session_tempdb_mb DECIMAL(18,2) )"; @@ -652,7 +652,7 @@ CREATE TABLE IF NOT EXISTS session_stats ( server_id INTEGER NOT NULL, server_name VARCHAR NOT NULL, program_name VARCHAR NOT NULL, - connection_count INTEGER NOT NULL, + connection_count BIGINT NOT NULL, running_count INTEGER NOT NULL, sleeping_count INTEGER NOT NULL, dormant_count INTEGER NOT NULL, diff --git a/Lite/Services/RemoteCollectorService.SessionStats.cs b/Lite/Services/RemoteCollectorService.SessionStats.cs index 3eade6e..a7e7e1d 100644 --- a/Lite/Services/RemoteCollectorService.SessionStats.cs +++ b/Lite/Services/RemoteCollectorService.SessionStats.cs @@ -107,7 +107,7 @@ ORDER BY while (await reader.ReadAsync(cancellationToken)) { var programName = reader.GetString(0); - var connectionCount = Convert.ToInt32(reader.GetValue(1)); + var connectionCount = Convert.ToInt64(reader.GetValue(1)); var runningCount = Convert.ToInt32(reader.GetValue(2)); var sleepingCount = Convert.ToInt32(reader.GetValue(3)); var dormantCount = Convert.ToInt32(reader.GetValue(4)); diff --git a/Lite/Services/RemoteCollectorService.TempDb.cs b/Lite/Services/RemoteCollectorService.TempDb.cs index d36c8da..e430587 100644 --- a/Lite/Services/RemoteCollectorService.TempDb.cs +++ b/Lite/Services/RemoteCollectorService.TempDb.cs @@ -57,7 +57,8 @@ ORDER BY (ssu.user_objects_alloc_page_count + ssu.internal_objects_alloc_page_co using var reader = await command.ExecuteReaderAsync(cancellationToken); decimal userObjMb = 0, internalObjMb = 0, versionStoreMb = 0, totalReservedMb = 0, unallocatedMb = 0; - int topSessionId = 0, totalSessions = 0; + int topSessionId = 0; + long totalSessions = 0; decimal topSessionMb = 0; if (await reader.ReadAsync(cancellationToken)) @@ -73,7 +74,7 @@ ORDER BY (ssu.user_objects_alloc_page_count + ssu.internal_objects_alloc_page_co { topSessionId = reader.IsDBNull(0) ? 0 : Convert.ToInt32(reader.GetValue(0)); topSessionMb = reader.IsDBNull(1) ? 0m : reader.GetDecimal(1); - totalSessions = reader.IsDBNull(2) ? 0 : (int)reader.GetInt64(2); + totalSessions = reader.IsDBNull(2) ? 0L : reader.GetInt64(2); } sqlSw.Stop(); diff --git a/install/02_create_tables.sql b/install/02_create_tables.sql index 83fd676..7e28078 100644 --- a/install/02_create_tables.sql +++ b/install/02_create_tables.sql @@ -818,13 +818,13 @@ BEGIN scheduler_count integer NULL, cpu_count integer NULL, total_runnable_tasks_count integer NULL, - total_work_queue_count integer NULL, + total_work_queue_count bigint NULL, total_current_workers_count integer NULL, avg_runnable_tasks_count decimal(38,2) NULL, total_active_request_count integer NULL, total_queued_request_count integer NULL, total_blocked_task_count integer NULL, - total_active_parallel_thread_count integer NULL, + total_active_parallel_thread_count bigint NULL, runnable_request_count integer NULL, total_request_count integer NULL, runnable_percent decimal(38,2) NULL, @@ -836,7 +836,7 @@ BEGIN /*OS Memory metrics from sys.dm_os_sys_memory*/ total_physical_memory_kb bigint NULL, available_physical_memory_kb bigint NULL, - system_memory_state_desc nvarchar(120) NULL, + system_memory_state_desc nvarchar(256) NULL, physical_memory_pressure_warning bit NULL, /*NUMA node metrics from sys.dm_os_nodes*/ total_node_count integer NULL, @@ -1346,7 +1346,7 @@ BEGIN wait_type nvarchar(60) NOT NULL, wait_duration_ms bigint NOT NULL, blocking_session_id integer NOT NULL, - resource_description nvarchar(1000) NULL, + resource_description nvarchar(3072) NULL, database_id integer NULL, database_name sysname NULL, query_text nvarchar(max) NULL, @@ -1427,10 +1427,10 @@ BEGIN used_size_mb decimal(19,2) NULL, auto_growth_mb decimal(19,2) NULL, max_size_mb decimal(19,2) NULL, - recovery_model_desc nvarchar(12) NULL, + recovery_model_desc nvarchar(60) NULL, compatibility_level integer NULL, state_desc nvarchar(60) NULL, - volume_mount_point nvarchar(256) NULL, + volume_mount_point nvarchar(512) NULL, volume_total_mb decimal(19,2) NULL, volume_free_mb decimal(19,2) NULL, /*Analysis helpers - computed columns*/ diff --git a/install/06_ensure_collection_table.sql b/install/06_ensure_collection_table.sql index ca7c9f8..b04b9f6 100644 --- a/install/06_ensure_collection_table.sql +++ b/install/06_ensure_collection_table.sql @@ -713,13 +713,13 @@ BEGIN scheduler_count integer NULL, cpu_count integer NULL, total_runnable_tasks_count integer NULL, - total_work_queue_count integer NULL, + total_work_queue_count bigint NULL, total_current_workers_count integer NULL, avg_runnable_tasks_count decimal(38,2) NULL, total_active_request_count integer NULL, total_queued_request_count integer NULL, total_blocked_task_count integer NULL, - total_active_parallel_thread_count integer NULL, + total_active_parallel_thread_count bigint NULL, runnable_request_count integer NULL, total_request_count integer NULL, runnable_percent decimal(38,2) NULL, @@ -731,7 +731,7 @@ BEGIN /*OS Memory metrics from sys.dm_os_sys_memory*/ total_physical_memory_kb bigint NULL, available_physical_memory_kb bigint NULL, - system_memory_state_desc nvarchar(120) NULL, + system_memory_state_desc nvarchar(256) NULL, physical_memory_pressure_warning bit NULL, /*NUMA node metrics from sys.dm_os_nodes*/ total_node_count integer NULL, @@ -1037,7 +1037,7 @@ BEGIN wait_type nvarchar(60) NOT NULL, wait_duration_ms bigint NOT NULL, blocking_session_id integer NOT NULL, - resource_description nvarchar(1000) NULL, + resource_description nvarchar(3072) NULL, database_id integer NULL, database_name sysname NULL, query_text nvarchar(max) NULL, @@ -1107,10 +1107,10 @@ BEGIN used_size_mb decimal(19,2) NULL, auto_growth_mb decimal(19,2) NULL, max_size_mb decimal(19,2) NULL, - recovery_model_desc nvarchar(12) NULL, + recovery_model_desc nvarchar(60) NULL, compatibility_level integer NULL, state_desc nvarchar(60) NULL, - volume_mount_point nvarchar(256) NULL, + volume_mount_point nvarchar(512) NULL, volume_total_mb decimal(19,2) NULL, volume_free_mb decimal(19,2) NULL, free_space_mb AS diff --git a/install/52_collect_database_size_stats.sql b/install/52_collect_database_size_stats.sql index ffadf54..bc9857f 100644 --- a/install/52_collect_database_size_stats.sql +++ b/install/52_collect_database_size_stats.sql @@ -148,7 +148,7 @@ BEGIN ELSE CONVERT(decimal(19,2), df.max_size * 8.0 / 1024.0) END, recovery_model_desc = - CONVERT(nvarchar(12), DATABASEPROPERTYEX(DB_NAME(), N'Recovery')), + CONVERT(nvarchar(60), DATABASEPROPERTYEX(DB_NAME(), N'Recovery')), compatibility_level = NULL, state_desc = N'ONLINE', volume_mount_point = NULL, diff --git a/upgrades/2.2.0-to-2.3.0/02_widen_audit_columns.sql b/upgrades/2.2.0-to-2.3.0/02_widen_audit_columns.sql new file mode 100644 index 0000000..b7beb2e --- /dev/null +++ b/upgrades/2.2.0-to-2.3.0/02_widen_audit_columns.sql @@ -0,0 +1,156 @@ +/* +Copyright 2026 Darling Data, LLC +https://www.erikdarling.com/ + +Upgrade from 2.2.0 to 2.3.0 +Widens collector table columns to match DMV documentation: + +cpu_scheduler_stats: + - total_work_queue_count: integer -> bigint (dm_os_schedulers.work_queue_count is bigint) + - total_active_parallel_thread_count: integer -> bigint (dm_resource_governor_workload_groups.active_parallel_thread_count is bigint) + - system_memory_state_desc: nvarchar(120) -> nvarchar(256) (dm_os_sys_memory documents nvarchar(256)) + +waiting_tasks: + - resource_description: nvarchar(1000) -> nvarchar(3072) (dm_os_waiting_tasks documents nvarchar(3072)) + +database_size_stats: + - recovery_model_desc: nvarchar(12) -> nvarchar(60) (sys.databases documents nvarchar(60)) + - volume_mount_point: nvarchar(256) -> nvarchar(512) (dm_os_volume_stats documents nvarchar(512)) +*/ + +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; +SET NUMERIC_ROUNDABORT OFF; +SET IMPLICIT_TRANSACTIONS OFF; +SET STATISTICS TIME, IO OFF; +GO + +USE PerformanceMonitor; +GO + +/* +cpu_scheduler_stats: widen integer columns to bigint +*/ +IF OBJECT_ID(N'collect.cpu_scheduler_stats', N'U') IS NOT NULL +BEGIN + PRINT 'Checking collect.cpu_scheduler_stats columns...'; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'cpu_scheduler_stats' + AND COLUMN_NAME = N'total_work_queue_count' + AND DATA_TYPE = N'int' + ) + BEGIN + ALTER TABLE collect.cpu_scheduler_stats ALTER COLUMN total_work_queue_count bigint NULL; + PRINT ' total_work_queue_count: int -> bigint'; + END; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'cpu_scheduler_stats' + AND COLUMN_NAME = N'total_active_parallel_thread_count' + AND DATA_TYPE = N'int' + ) + BEGIN + ALTER TABLE collect.cpu_scheduler_stats ALTER COLUMN total_active_parallel_thread_count bigint NULL; + PRINT ' total_active_parallel_thread_count: int -> bigint'; + END; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'cpu_scheduler_stats' + AND COLUMN_NAME = N'system_memory_state_desc' + AND CHARACTER_MAXIMUM_LENGTH = 120 + ) + BEGIN + ALTER TABLE collect.cpu_scheduler_stats ALTER COLUMN system_memory_state_desc nvarchar(256) NULL; + PRINT ' system_memory_state_desc: nvarchar(120) -> nvarchar(256)'; + END; + + PRINT 'cpu_scheduler_stats complete.'; +END; +GO + +/* +waiting_tasks: widen resource_description +*/ +IF OBJECT_ID(N'collect.waiting_tasks', N'U') IS NOT NULL +BEGIN + PRINT 'Checking collect.waiting_tasks columns...'; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'waiting_tasks' + AND COLUMN_NAME = N'resource_description' + AND CHARACTER_MAXIMUM_LENGTH = 1000 + ) + BEGIN + ALTER TABLE collect.waiting_tasks ALTER COLUMN resource_description nvarchar(3072) NULL; + PRINT ' resource_description: nvarchar(1000) -> nvarchar(3072)'; + END; + + PRINT 'waiting_tasks complete.'; +END; +GO + +/* +database_size_stats: widen string columns +*/ +IF OBJECT_ID(N'collect.database_size_stats', N'U') IS NOT NULL +BEGIN + PRINT 'Checking collect.database_size_stats columns...'; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'database_size_stats' + AND COLUMN_NAME = N'recovery_model_desc' + AND CHARACTER_MAXIMUM_LENGTH = 12 + ) + BEGIN + ALTER TABLE collect.database_size_stats ALTER COLUMN recovery_model_desc nvarchar(60) NULL; + PRINT ' recovery_model_desc: nvarchar(12) -> nvarchar(60)'; + END; + + IF EXISTS + ( + SELECT + 1/0 + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = N'collect' + AND TABLE_NAME = N'database_size_stats' + AND COLUMN_NAME = N'volume_mount_point' + AND CHARACTER_MAXIMUM_LENGTH = 256 + ) + BEGIN + ALTER TABLE collect.database_size_stats ALTER COLUMN volume_mount_point nvarchar(512) NULL; + PRINT ' volume_mount_point: nvarchar(256) -> nvarchar(512)'; + END; + + PRINT 'database_size_stats complete.'; +END; +GO diff --git a/upgrades/2.2.0-to-2.3.0/upgrade.txt b/upgrades/2.2.0-to-2.3.0/upgrade.txt index f5596a0..6b1089e 100644 --- a/upgrades/2.2.0-to-2.3.0/upgrade.txt +++ b/upgrades/2.2.0-to-2.3.0/upgrade.txt @@ -1 +1,2 @@ 01_widen_query_stats_columns.sql +02_widen_audit_columns.sql