Skip to content

Commit 1de2414

Browse files
Merge pull request #216 from erikdarlingdata/dev
Release v1.3.0
2 parents d03599b + 3d85995 commit 1de2414

85 files changed

Lines changed: 5082 additions & 1582 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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/App.xaml.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ public partial class App : Application
2020
{
2121
private const string MutexName = "PerformanceMonitorDashboard_SingleInstance";
2222
private Mutex? _singleInstanceMutex;
23+
private bool _ownsMutex;
2324

2425
protected override void OnStartup(StartupEventArgs e)
2526
{
2627
// Check for existing instance
27-
_singleInstanceMutex = new Mutex(true, MutexName, out bool isNewInstance);
28+
_singleInstanceMutex = new Mutex(true, MutexName, out _ownsMutex);
2829

29-
if (!isNewInstance)
30+
if (!_ownsMutex)
3031
{
3132
// Another instance is already running - activate it and exit
3233
NativeMethods.BroadcastShowMessage();
@@ -58,8 +59,10 @@ protected override void OnExit(ExitEventArgs e)
5859
mainWin.ExitApplication();
5960
}
6061

61-
// Release the mutex
62-
_singleInstanceMutex?.ReleaseMutex();
62+
if (_ownsMutex)
63+
{
64+
_singleInstanceMutex?.ReleaseMutex();
65+
}
6366
_singleInstanceMutex?.Dispose();
6467

6568
base.OnExit(e);

Dashboard/Controls/AlertsHistoryContent.xaml.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ namespace PerformanceMonitorDashboard.Controls
2323
{
2424
public partial class AlertsHistoryContent : UserControl
2525
{
26+
public event EventHandler? AlertsDismissed;
27+
2628
private List<AlertHistoryDisplayItem> _allAlerts = new();
2729

2830
/* Column filter state */
@@ -219,6 +221,7 @@ private void DismissSelected_Click(object sender, RoutedEventArgs e)
219221

220222
service.HideAlerts(keys);
221223
LoadAlerts();
224+
AlertsDismissed?.Invoke(this, EventArgs.Empty);
222225
}
223226

224227
private void DismissAll_Click(object sender, RoutedEventArgs e)
@@ -247,6 +250,7 @@ private void DismissAll_Click(object sender, RoutedEventArgs e)
247250

248251
service.HideAllAlerts(hoursBack > 0 ? hoursBack : 8760, serverName);
249252
LoadAlerts();
253+
AlertsDismissed?.Invoke(this, EventArgs.Empty);
250254
}
251255

252256
#endregion

0 commit comments

Comments
 (0)