Skip to content

Commit fe6c6bd

Browse files
Bump version to 1.3.0, fix deadlock XML timezone bug, add changelog
- Version bump all 4 csproj files from 1.2.0 to 1.3.0 - Fix UTC timezone mismatch in process_deadlock_xml: sp_BlitzLock expects local time dates but was receiving UTC, causing 0 parsed results on any server not in UTC. Convert dates to local time before passing to sp_BlitzLock. - Add CHANGELOG entries for both 1.2.0 (previously missing) and 1.3.0 - 1.3.0 includes schema upgrade warning for large memory_stats tables Tested: deployed fix to sql2016/2017/2019/2022, verified 192 stuck unprocessed deadlock XML events parsed successfully on sql2022. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 94ab820 commit fe6c6bd

6 files changed

Lines changed: 169 additions & 17 deletions

File tree

CHANGELOG.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,83 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.3.0] - 2026-02-20
9+
10+
### Important
11+
12+
- **Schema upgrade**: The `collect.memory_stats` table gains two new columns (`total_physical_memory_mb`, `committed_target_memory_mb`). The upgrade script runs automatically via the CLI/GUI installer and uses `IF NOT EXISTS` checks, so it is safe to re-run. On servers with very large `memory_stats` tables this ALTER may take a moment.
13+
14+
### Added
15+
16+
- Physical Memory, SQL Server Memory, and Target Memory columns in Memory Overview ([#140])
17+
- Current Configuration view (Server Config, Database Config, Trace Flags) in Dashboard Overview ([#143])
18+
- Popup column filters and right-click context menus in all drill-down history windows ([#206])
19+
- Consistent popup column filters across all Dashboard grids — replaced remaining TextBox-in-header filters and added filters to Trace Flags ([#200])
20+
- 7-day time filter option in drill-down queries ([#165])
21+
- Alert badge/count on sidebar Alerts button ([#109])
22+
- Missing poison wait defaults in wait stats picker ([#188])
23+
24+
### Changed
25+
26+
- Default Trace tabs moved from Resource Metrics to Overview section ([#169])
27+
- Trends tab shown first in Locking section ([#171])
28+
- Wait stats cap raised from 20 to 30 (Dashboard) / 50 (Lite) so poison waits are never dropped ([#139])
29+
- Settings time range dropdown now matches dashboard button options ([#210])
30+
- "Total Executions" label in drill-down summaries renamed to clarify meaning ([#194])
31+
- WAITFOR sessions excluded from long-running query alerts ([#151])
32+
33+
### Fixed
34+
35+
- Deadlock XML processor timezone mismatch — sp_BlitzLock returning 0 results because UTC dates were passed instead of local time
36+
- Sidebar alert badge not updating when alerts dismissed from server sub-tabs ([#214])
37+
- Sidebar alert badge not clearing on acknowledge ([#186])
38+
- NOC deadlock/blocking showing "just now" for stale events instead of actual timestamp ([#187])
39+
- NOC deadlock severity using extended events timestamp ([#170])
40+
- Newly added servers not appearing on Overview until app restart ([#199])
41+
- Double-click on column header incorrectly triggering row drill-down ([#195])
42+
- Squished drill-down charts — now use proportional sizing ([#166])
43+
- Unreliable chart tooltips — now use X-axis proximity matching ([#167])
44+
- Query Trace Patterns showing empty despite data existing ([#168])
45+
- Drill-down windows: removed inline plan XML, added time range filtering, aggregated by collection_time ([#189])
46+
- Row clipping in Default Trace and Current Configuration grids ([#183], [#184])
47+
- Numeric filter negative range parsing ([#113])
48+
- MCP shutdown deadlock risk ([#112])
49+
- Lite DBNull cast error in database_config collector on SQL 2016 Express ([#192])
50+
- DuckDB concurrent file access IO errors ([#164])
51+
52+
## [1.2.0] - 2026-02-15
53+
54+
### Added
55+
56+
- Alert types, alerts history view, column filtering, and dismiss/hide for alerts ([#52], [#56])
57+
- Average ms per wait chart toggle in both apps ([#22])
58+
- Collection Health tab in Lite UI ([#39])
59+
- Collector performance diagnostics in Lite UI ([#40])
60+
- Hover tooltips on all Dashboard charts ([#70])
61+
- Minimize-to-tray setting added to Lite ([#53])
62+
- Persist dismissed alerts across app restarts ([#44])
63+
- Locale-aware date/time formatting throughout UI ([#41])
64+
- 24-hour format in time range picker ([#41])
65+
- CI pipelines for build validation, SQL install testing, and DuckDB schema tests
66+
- Expanded Lite database config collector to 28 sys.databases columns ([#142])
67+
- Parquet archive visibility and scheduled DuckDB database compaction ([#160], [#161])
68+
- DuckDB checkpoint optimization and collection timing accuracy
69+
- Installer `--reset-schedule` flag to reset collection schedule on re-install
70+
71+
### Fixed
72+
73+
- Deadlock charts not populating data ([#73])
74+
- Chart X-axis double-converting custom range to server time ([#49])
75+
- query_cost overflow in memory grant collector ([#47])
76+
- XE ring buffer query timeouts on large buffers ([#37])
77+
- Dashboard sub-tab badge state and DuckDB migration for dismissed column
78+
- Lite duplicate blocking/deadlock events from missing WHERE clause ([#61])
79+
- Procedure_stats_collector truncation on DDL triggers ([#69])
80+
- DataGrid row height increased from 25 to 28 to fix text clipping
81+
- Skip offline servers during Lite collection and reduce connection timeout ([#90])
82+
- Mutex crash on Lite app exit ([#89])
83+
- Permission denied errors handled gracefully in collector health ([#150])
84+
885
## [1.1.0] - 2026-02-13
986

1087
### Added
@@ -42,6 +119,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
42119
- Delta normalization for per-second rate calculations
43120
- Dark theme UI
44121

122+
[1.3.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.2.0...v1.3.0
123+
[1.2.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.1.0...v1.2.0
45124
[1.1.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.0.0...v1.1.0
46125
[1.0.0]: https://github.com/erikdarlingdata/PerformanceMonitor/releases/tag/v1.0.0
47126
[#1]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/1
@@ -54,5 +133,57 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
54133
[#18]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/18
55134
[#20]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/20
56135
[#21]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/21
136+
[#22]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/22
57137
[#23]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/23
58138
[#25]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/25
139+
[#37]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/37
140+
[#39]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/39
141+
[#40]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/40
142+
[#41]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/41
143+
[#44]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/44
144+
[#47]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/47
145+
[#49]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/49
146+
[#52]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/52
147+
[#53]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/53
148+
[#56]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/56
149+
[#61]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/61
150+
[#69]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/69
151+
[#70]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/70
152+
[#73]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/73
153+
[#85]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/85
154+
[#86]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/86
155+
[#89]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/89
156+
[#90]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/90
157+
[#109]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/109
158+
[#112]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/112
159+
[#113]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/113
160+
[#139]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/139
161+
[#140]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/140
162+
[#142]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/142
163+
[#143]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/143
164+
[#150]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/150
165+
[#151]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/151
166+
[#160]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/160
167+
[#161]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/161
168+
[#164]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/164
169+
[#165]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/165
170+
[#166]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/166
171+
[#167]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/167
172+
[#168]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/168
173+
[#169]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/169
174+
[#170]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/170
175+
[#171]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/171
176+
[#183]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/183
177+
[#184]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/184
178+
[#186]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/186
179+
[#187]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/187
180+
[#188]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/188
181+
[#189]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/189
182+
[#192]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/192
183+
[#194]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/194
184+
[#195]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/195
185+
[#199]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/199
186+
[#200]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/200
187+
[#206]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/206
188+
[#210]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/210
189+
[#214]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/214

Dashboard/Dashboard.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<UseWPF>true</UseWPF>
77
<AssemblyName>PerformanceMonitorDashboard</AssemblyName>
88
<Product>SQL Server Performance Monitor Dashboard</Product>
9-
<Version>1.2.0</Version>
9+
<Version>1.3.0</Version>
1010
<Company>Darling Data, LLC</Company>
1111
<Copyright>Copyright © 2026 Darling Data, LLC</Copyright>
1212
<ApplicationIcon>EDD.ico</ApplicationIcon>

Installer/PerformanceMonitorInstaller.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
<!-- Application metadata -->
2121
<AssemblyName>PerformanceMonitorInstaller</AssemblyName>
2222
<Product>SQL Server Performance Monitor Installer</Product>
23-
<Version>1.2.0</Version>
24-
<AssemblyVersion>1.2.0.0</AssemblyVersion>
25-
<FileVersion>1.2.0.0</FileVersion>
26-
<InformationalVersion>1.2.0</InformationalVersion>
23+
<Version>1.3.0</Version>
24+
<AssemblyVersion>1.3.0.0</AssemblyVersion>
25+
<FileVersion>1.3.0.0</FileVersion>
26+
<InformationalVersion>1.3.0</InformationalVersion>
2727
<Company>Darling Data, LLC</Company>
2828
<Copyright>Copyright © 2026 Darling Data, LLC</Copyright>
2929
<Description>Installation utility for SQL Server Performance Monitor - Supports SQL Server 2016-2025</Description>

InstallerGui/InstallerGui.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<AssemblyName>PerformanceMonitorInstallerGui</AssemblyName>
99
<RootNamespace>PerformanceMonitorInstallerGui</RootNamespace>
1010
<Product>SQL Server Performance Monitor Installer</Product>
11-
<Version>1.2.0</Version>
11+
<Version>1.3.0</Version>
1212
<Company>Darling Data, LLC</Company>
1313
<Copyright>Copyright © 2026 Darling Data, LLC</Copyright>
1414
<ApplicationIcon>EDD.ico</ApplicationIcon>

Lite/PerformanceMonitorLite.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<AssemblyName>PerformanceMonitorLite</AssemblyName>
88
<RootNamespace>PerformanceMonitorLite</RootNamespace>
99
<Product>SQL Server Performance Monitor Lite</Product>
10-
<Version>1.2.0</Version>
10+
<Version>1.3.0</Version>
1111
<Company>Darling Data, LLC</Company>
1212
<Copyright>Copyright © 2026 Darling Data, LLC</Copyright>
1313
<Description>Lightweight SQL Server performance monitoring - no installation required on target servers</Description>

install/25_process_deadlock_xml.sql

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ BEGIN
5555
@error_number integer,
5656
@blitzlock_database sysname = NULL,
5757
@sql nvarchar(max) = N'',
58-
@debug_msg nvarchar(500) = N'';
58+
@debug_msg nvarchar(500) = N'',
59+
@utc_offset_minutes integer = DATEDIFF(MINUTE, SYSUTCDATETIME(), SYSDATETIME()),
60+
@start_date_local datetime2(7) = NULL,
61+
@end_date_local datetime2(7) = NULL;
5962

6063
BEGIN TRY
6164
BEGIN TRANSACTION;
@@ -142,16 +145,33 @@ BEGIN
142145
END;
143146
END;
144147

148+
/*
149+
Convert UTC dates to local time for sp_BlitzLock and comparison
150+
with collect.deadlocks.event_date (which sp_BlitzLock stores in local time).
151+
event_time in collect.deadlock_xml stores UTC (from XE timestamps).
152+
sp_BlitzLock converts @StartDate/@EndDate from local time to UTC internally.
153+
*/
154+
SELECT
155+
@start_date_local = DATEADD(MINUTE, @utc_offset_minutes, @start_date),
156+
@end_date_local = DATEADD(MINUTE, @utc_offset_minutes, @end_date);
157+
158+
IF @debug = 1
159+
BEGIN
160+
SET @debug_msg = N'UTC offset: ' + CAST(@utc_offset_minutes AS nvarchar(10)) + N' minutes. Local dates: ' + ISNULL(CONVERT(nvarchar(30), @start_date_local, 121), N'NULL') + N' to ' + ISNULL(CONVERT(nvarchar(30), @end_date_local, 121), N'NULL');
161+
RAISERROR(@debug_msg, 0, 1) WITH NOWAIT;
162+
END;
163+
145164
/*
146165
Delete existing parsed deadlocks for the time range to prevent duplicates
147166
sp_BlitzLock will re-insert fresh parsed data
167+
Uses local-time dates because sp_BlitzLock stores event_date in local time
148168
*/
149169
IF @start_date IS NOT NULL AND @end_date IS NOT NULL
150170
BEGIN
151171
DELETE d
152172
FROM collect.deadlocks AS d
153-
WHERE d.event_date >= @start_date
154-
AND d.event_date <= @end_date;
173+
WHERE d.event_date >= @start_date_local
174+
AND d.event_date <= @end_date_local;
155175

156176
SELECT
157177
@rows_deleted = ROWCOUNT_BIG();
@@ -175,29 +195,30 @@ BEGIN
175195
@TargetTableName = N''deadlock_xml'',
176196
@TargetColumnName = N''deadlock_xml'',
177197
@TargetTimestampColumnName = N''event_time'',
178-
@StartDate = @start_date,
179-
@EndDate = @end_date,
198+
@StartDate = @start_date_local,
199+
@EndDate = @end_date_local,
180200
@OutputDatabaseName = N''PerformanceMonitor'',
181201
@OutputSchemaName = N''collect'',
182202
@OutputTableName = N''deadlocks'',
183203
@Debug = @debug;';
184204

185205
EXECUTE sys.sp_executesql
186206
@sql,
187-
N'@start_date datetime2(7), @end_date datetime2(7), @debug bit',
188-
@start_date = @start_date,
189-
@end_date = @end_date,
207+
N'@start_date_local datetime2(7), @end_date_local datetime2(7), @debug bit',
208+
@start_date_local = @start_date_local,
209+
@end_date_local = @end_date_local,
190210
@debug = @debug;
191211

192212
/*
193213
Verify sp_BlitzLock produced parsed results before marking rows as processed
194214
If no results were inserted, leave rows unprocessed so they are retried next run
215+
Uses local-time dates because sp_BlitzLock stores event_date in local time
195216
*/
196217
SELECT
197218
@rows_parsed = COUNT_BIG(*)
198219
FROM collect.deadlocks AS d
199-
WHERE d.event_date >= @start_date
200-
AND d.event_date <= @end_date
220+
WHERE d.event_date >= @start_date_local
221+
AND d.event_date <= @end_date_local
201222
OPTION(RECOMPILE);
202223

203224
IF @rows_parsed > 0

0 commit comments

Comments
 (0)