Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
d421b00
Fix mutex crash on app exit (fixes #89)
erikdarlingdata Feb 19, 2026
440fab9
Merge pull request #158 from erikdarlingdata/feature/fix-mutex-crash
erikdarlingdata Feb 19, 2026
209f2e3
DuckDB checkpoint optimization and timing accuracy fix
erikdarlingdata Feb 19, 2026
2b54d43
Merge pull request #159 from erikdarlingdata/feature/duckdb-checkpoin…
erikdarlingdata Feb 19, 2026
eb3c06d
Parquet archive visibility and scheduled database compaction (#160, #…
erikdarlingdata Feb 19, 2026
98fcbff
Merge pull request #162 from erikdarlingdata/feature/parquet-archive-…
erikdarlingdata Feb 19, 2026
e567b76
Expand Lite database config collector to 28 sys.databases columns (#1…
erikdarlingdata Feb 19, 2026
03033ae
Fix DuckDB IO errors from concurrent file access (#164)
erikdarlingdata Feb 19, 2026
6ccdf9a
Raise wait stats cap from 20 to 30/50 so poison waits are never dropp…
erikdarlingdata Feb 19, 2026
cda05b5
Show Trends tab first in Locking section (#171) (#173)
erikdarlingdata Feb 19, 2026
f3c338a
Fix NOC deadlock severity using extended events timestamp (#170) (#174)
erikdarlingdata Feb 19, 2026
66d4048
Move Default Trace tabs from Resource Metrics to Overview section (#1…
erikdarlingdata Feb 19, 2026
fe658a7
Fix Query Trace Patterns showing empty despite data existing (#168) (…
erikdarlingdata Feb 19, 2026
340ae0c
Fix unreliable chart tooltips - use X-axis proximity (#167) (#177)
erikdarlingdata Feb 19, 2026
0b80ea0
Fix squished drill-down charts - use proportional sizing (#166) (#178)
erikdarlingdata Feb 19, 2026
31bb939
Add 7-day time filter to drill-down queries (#165) (#179)
erikdarlingdata Feb 19, 2026
09a58e4
Add current configuration view to Dashboard Overview (#143) (#180)
erikdarlingdata Feb 20, 2026
62cd3f2
Add Physical Memory, SQL Server Memory, Target Memory to Memory Overv…
erikdarlingdata Feb 20, 2026
bf06536
Add alert badge/count to Alerts button in sidebar (#109) (#182)
erikdarlingdata Feb 20, 2026
a252245
Fix drill-down windows: remove inline plan XML, add time range filter…
erikdarlingdata Feb 20, 2026
5ba5c01
Fix row clipping in Default Trace and Current Configuration grids (fi…
erikdarlingdata Feb 20, 2026
200ed3f
Fix sidebar alert badge not clearing on acknowledge (fixes #186)
erikdarlingdata Feb 20, 2026
bacbe61
Merge pull request #191 from erikdarlingdata/fix/alert-badge-clear-186
erikdarlingdata Feb 20, 2026
3de1549
Fix NOC deadlock/blocking showing "just now" for stale events (fixes …
erikdarlingdata Feb 20, 2026
55e9378
Merge pull request #196 from erikdarlingdata/fix/noc-deadlock-timesta…
erikdarlingdata Feb 20, 2026
2d672bc
Add missing poison wait defaults to wait stats picker (fixes #188)
erikdarlingdata Feb 20, 2026
da68f68
Merge pull request #198 from erikdarlingdata/fix/poison-wait-defaults…
erikdarlingdata Feb 20, 2026
be28f41
Fix newly added servers not appearing on Overview until restart (fixe…
erikdarlingdata Feb 20, 2026
83e50ce
Merge pull request #202 from erikdarlingdata/fix/landing-page-server-…
erikdarlingdata Feb 20, 2026
03b8287
Fix double-click on column header triggering row drill-down (fixes #195)
erikdarlingdata Feb 20, 2026
9a7665e
Merge pull request #203 from erikdarlingdata/fix/header-doubleclick-195
erikdarlingdata Feb 20, 2026
d529ae3
Fix DBNull cast error in Lite database_config collector on SQL 2016 E…
erikdarlingdata Feb 20, 2026
0962746
Merge pull request #204 from erikdarlingdata/fix/lite-dbconfig-dbnull…
erikdarlingdata Feb 20, 2026
8bf4af3
Rename misleading "Total Executions" label in drill-down summaries (f…
erikdarlingdata Feb 20, 2026
f2705b4
Merge pull request #205 from erikdarlingdata/fix/execution-label-194
erikdarlingdata Feb 20, 2026
6d7a5f7
Fix numeric filter negative range parsing and MCP shutdown deadlock risk
erikdarlingdata Feb 20, 2026
2a4eb01
Exclude WAITFOR sessions from long-running query alerts
erikdarlingdata Feb 20, 2026
527d009
Replace TextBox-in-header filters with popup filter buttons
erikdarlingdata Feb 20, 2026
85475db
Merge pull request #207 from erikdarlingdata/fix/quick-wins-113-112
erikdarlingdata Feb 20, 2026
e68b3cc
Merge pull request #208 from erikdarlingdata/fix/exclude-cdc-long-run…
erikdarlingdata Feb 20, 2026
05cc68c
Merge pull request #211 from erikdarlingdata/fix/filter-consistency-200
erikdarlingdata Feb 20, 2026
78723c7
Fix settings default time range dropdown to match dashboard buttons (…
erikdarlingdata Feb 20, 2026
8793a3a
Merge pull request #212 from erikdarlingdata/fix/settings-time-range-210
erikdarlingdata Feb 20, 2026
82d1521
Add popup column filters and context menus to drill-down history wind…
erikdarlingdata Feb 20, 2026
7cc54b9
Merge pull request #213 from erikdarlingdata/feature/drill-down-filte…
erikdarlingdata Feb 20, 2026
d3194f6
Fix sidebar alert badge not updating when sub-tab alerts are dismissed
erikdarlingdata Feb 20, 2026
94ab820
Merge pull request #214 from erikdarlingdata/feature/alert-badge-sync
erikdarlingdata Feb 20, 2026
fe6c6bd
Bump version to 1.3.0, fix deadlock XML timezone bug, add changelog
erikdarlingdata Feb 20, 2026
3d85995
Merge pull request #215 from erikdarlingdata/release/v1.3.0
erikdarlingdata Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,83 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.3.0] - 2026-02-20

### Important

- **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.

### Added

- Physical Memory, SQL Server Memory, and Target Memory columns in Memory Overview ([#140])
- Current Configuration view (Server Config, Database Config, Trace Flags) in Dashboard Overview ([#143])
- Popup column filters and right-click context menus in all drill-down history windows ([#206])
- Consistent popup column filters across all Dashboard grids — replaced remaining TextBox-in-header filters and added filters to Trace Flags ([#200])
- 7-day time filter option in drill-down queries ([#165])
- Alert badge/count on sidebar Alerts button ([#109])
- Missing poison wait defaults in wait stats picker ([#188])

### Changed

- Default Trace tabs moved from Resource Metrics to Overview section ([#169])
- Trends tab shown first in Locking section ([#171])
- Wait stats cap raised from 20 to 30 (Dashboard) / 50 (Lite) so poison waits are never dropped ([#139])
- Settings time range dropdown now matches dashboard button options ([#210])
- "Total Executions" label in drill-down summaries renamed to clarify meaning ([#194])
- WAITFOR sessions excluded from long-running query alerts ([#151])

### Fixed

- Deadlock XML processor timezone mismatch — sp_BlitzLock returning 0 results because UTC dates were passed instead of local time
- Sidebar alert badge not updating when alerts dismissed from server sub-tabs ([#214])
- Sidebar alert badge not clearing on acknowledge ([#186])
- NOC deadlock/blocking showing "just now" for stale events instead of actual timestamp ([#187])
- NOC deadlock severity using extended events timestamp ([#170])
- Newly added servers not appearing on Overview until app restart ([#199])
- Double-click on column header incorrectly triggering row drill-down ([#195])
- Squished drill-down charts — now use proportional sizing ([#166])
- Unreliable chart tooltips — now use X-axis proximity matching ([#167])
- Query Trace Patterns showing empty despite data existing ([#168])
- Drill-down windows: removed inline plan XML, added time range filtering, aggregated by collection_time ([#189])
- Row clipping in Default Trace and Current Configuration grids ([#183], [#184])
- Numeric filter negative range parsing ([#113])
- MCP shutdown deadlock risk ([#112])
- Lite DBNull cast error in database_config collector on SQL 2016 Express ([#192])
- DuckDB concurrent file access IO errors ([#164])

## [1.2.0] - 2026-02-15

### Added

- Alert types, alerts history view, column filtering, and dismiss/hide for alerts ([#52], [#56])
- Average ms per wait chart toggle in both apps ([#22])
- Collection Health tab in Lite UI ([#39])
- Collector performance diagnostics in Lite UI ([#40])
- Hover tooltips on all Dashboard charts ([#70])
- Minimize-to-tray setting added to Lite ([#53])
- Persist dismissed alerts across app restarts ([#44])
- Locale-aware date/time formatting throughout UI ([#41])
- 24-hour format in time range picker ([#41])
- CI pipelines for build validation, SQL install testing, and DuckDB schema tests
- Expanded Lite database config collector to 28 sys.databases columns ([#142])
- Parquet archive visibility and scheduled DuckDB database compaction ([#160], [#161])
- DuckDB checkpoint optimization and collection timing accuracy
- Installer `--reset-schedule` flag to reset collection schedule on re-install

### Fixed

- Deadlock charts not populating data ([#73])
- Chart X-axis double-converting custom range to server time ([#49])
- query_cost overflow in memory grant collector ([#47])
- XE ring buffer query timeouts on large buffers ([#37])
- Dashboard sub-tab badge state and DuckDB migration for dismissed column
- Lite duplicate blocking/deadlock events from missing WHERE clause ([#61])
- Procedure_stats_collector truncation on DDL triggers ([#69])
- DataGrid row height increased from 25 to 28 to fix text clipping
- Skip offline servers during Lite collection and reduce connection timeout ([#90])
- Mutex crash on Lite app exit ([#89])
- Permission denied errors handled gracefully in collector health ([#150])

## [1.1.0] - 2026-02-13

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

[1.3.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.2.0...v1.3.0
[1.2.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/erikdarlingdata/PerformanceMonitor/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/erikdarlingdata/PerformanceMonitor/releases/tag/v1.0.0
[#1]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/1
Expand All @@ -54,5 +133,57 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#18]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/18
[#20]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/20
[#21]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/21
[#22]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/22
[#23]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/23
[#25]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/25
[#37]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/37
[#39]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/39
[#40]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/40
[#41]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/41
[#44]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/44
[#47]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/47
[#49]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/49
[#52]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/52
[#53]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/53
[#56]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/56
[#61]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/61
[#69]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/69
[#70]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/70
[#73]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/73
[#85]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/85
[#86]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/86
[#89]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/89
[#90]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/90
[#109]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/109
[#112]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/112
[#113]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/113
[#139]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/139
[#140]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/140
[#142]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/142
[#143]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/143
[#150]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/150
[#151]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/151
[#160]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/160
[#161]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/161
[#164]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/164
[#165]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/165
[#166]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/166
[#167]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/167
[#168]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/168
[#169]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/169
[#170]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/170
[#171]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/171
[#183]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/183
[#184]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/184
[#186]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/186
[#187]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/187
[#188]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/188
[#189]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/189
[#192]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/192
[#194]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/194
[#195]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/195
[#199]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/199
[#200]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/200
[#206]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/206
[#210]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/210
[#214]: https://github.com/erikdarlingdata/PerformanceMonitor/issues/214
11 changes: 7 additions & 4 deletions Dashboard/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ public partial class App : Application
{
private const string MutexName = "PerformanceMonitorDashboard_SingleInstance";
private Mutex? _singleInstanceMutex;
private bool _ownsMutex;

protected override void OnStartup(StartupEventArgs e)
{
// Check for existing instance
_singleInstanceMutex = new Mutex(true, MutexName, out bool isNewInstance);
_singleInstanceMutex = new Mutex(true, MutexName, out _ownsMutex);

if (!isNewInstance)
if (!_ownsMutex)
{
// Another instance is already running - activate it and exit
NativeMethods.BroadcastShowMessage();
Expand Down Expand Up @@ -58,8 +59,10 @@ protected override void OnExit(ExitEventArgs e)
mainWin.ExitApplication();
}

// Release the mutex
_singleInstanceMutex?.ReleaseMutex();
if (_ownsMutex)
{
_singleInstanceMutex?.ReleaseMutex();
}
_singleInstanceMutex?.Dispose();

base.OnExit(e);
Expand Down
4 changes: 4 additions & 0 deletions Dashboard/Controls/AlertsHistoryContent.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ namespace PerformanceMonitorDashboard.Controls
{
public partial class AlertsHistoryContent : UserControl
{
public event EventHandler? AlertsDismissed;

private List<AlertHistoryDisplayItem> _allAlerts = new();

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

service.HideAlerts(keys);
LoadAlerts();
AlertsDismissed?.Invoke(this, EventArgs.Empty);
}

private void DismissAll_Click(object sender, RoutedEventArgs e)
Expand Down Expand Up @@ -247,6 +250,7 @@ private void DismissAll_Click(object sender, RoutedEventArgs e)

service.HideAllAlerts(hoursBack > 0 ? hoursBack : 8760, serverName);
LoadAlerts();
AlertsDismissed?.Invoke(this, EventArgs.Empty);
}

#endregion
Expand Down
Loading