Releases: erikdarlingdata/PerformanceMonitor
Nightly Build (2.10.0-nightly.20260516)
Automated nightly build from dev branch.
Version: 2.10.0-nightly.20260516
Commit: b4aa8de
Built: 2026-05-16 07:05 UTC
These builds include the latest changes and may be unstable.
For production use, download the latest stable release.
v2.10.0 - All Travels, Foreign and Domestic
Planes and Plans
This week I'm off to Pass Summit East in Chicago, and SQLDay in Wroclaw, Poland. One after the other. Last week I was in Florida for Data Saturday Jacksonville. Hopefully that explains why this week's release is a) early and b) pretty light on changes. It will also hopefully explain why there won't be a release next week. I can see, hear, smell, and feel your hearts breaking on that news.
So while I'm off spending all my Zlotys on Okocim and Kielbasa, you can just imagine that the CPU spikes you see in this here monitoring tool is about what my blood pressure and cholesterol are doing.
Fixed
- Memory tab tooltip stops working after switching away and returning to the tab. Both Dashboard and Lite Memory tab crosshair tooltip handlers now reattach correctly on tab re-entry; the same popup-wedge fix is also applied to
CorrelatedCrosshairManager(#916) - FinOps memory recommendation now bases sizing on a 7-day P95 of memory samples instead of a single snapshot, so recommendations no longer swing based on instantaneous workload state. Applied in both Dashboard and Lite (#917)
Changed
- Per-database grants for FinOps Index Analysis documented in the README — sp_IndexCleanup-backed Index Analysis requires per-database
EXECUTEgrants on each user database you want to analyze (#915)
See CHANGELOG.md for full details.
v2.9.0 - Get Some Exercise
Very Nearly Three
I seem to recall there being some super-shifting feature getting added for 2.0 and 2.5 versions. As we approach 3.0, I don't quite have one of those ready.
I'm also starting to wonder if the weekly releases are still necessary. That's a bit of a relief, to be honest. For a bit it felt like I was shipping big fixes and changes at a frantic pace. Now I'm half-tempted to start labeling things "stable" or "LTS" or "dude-trust-me".
Anyway, changelog and all that is below.
If you want to chime in on the future of Full/Lite dashboards, check out this discussion.
If you want to report an issue, request a feature, or pitch in some code, head over here.
Highlights
- Per-database collector exclusions — exclude noisy databases from per-database collectors. Full Edition adds
config.collector_database_exclusions(8 collectors filtered); Lite addsExcludedDatabasesper server (9 collectors filtered). (#887) - Resume gap detection —
query_stats,procedure_stats, andquery_storeskip the historical sweep on first run after an Off preset, Agent stoppage, or server reboot, preventing tempdb blowouts. (#892) - Total non-idle CPU on Lite Overview — headline shows total CPU with SQL-only alongside; new alert mode toggle (Total / SqlOnly). (#899)
- Purge Now action in Manage Servers (Full) with mode picker and reworked
config.data_retentionsemantics —@retention_days = NULLrespects per-collector retention,0truncates every table,N > 0overrides every table to N days. (#900) Offcollection preset —config.apply_collection_preset @preset_name = N'Off'disables every collector in one call. (#888)- Right-click View Plan on Dashboard BPR + Deadlocks grids and Lite Deadlocks grid. (#880)
- Open Log Folder sidebar button in Lite. (#873)
- Installed Version column in Manage Servers (both editions).
- Lite-style server card indicators back-ported to Full.
Dependency bumps
Microsoft.Data.SqlClient6.1.4 → 7.0.1 (with newExtensions.Azure 1.0.0for Entra)ModelContextProtocol0.7.0-preview.1 → 1.2.0 (off the preview tag)DuckDB.NET1.5.0 → 1.5.2 in Lite
See CHANGELOG.md for the full list.
v2.8.0 - Having A Nice Time©️
Welcome friends to another release!
I do hope you're enjoying these as much as I am. Providing the SQL Server community with a high quality, free, and easy to use monitoring tool has not made me rich beyond my mildest dreams, but it has been fun.
The last week gave me an opportunity to add some new stuff, and scrutinize the code a little bit more closely for weird issues that I would occasionally notice. Hopefully never to be noticed again, and all that.
As always, if you run into anything, file an issue on GitHub.
Likewise, there are a few open issues that have the Help Wanted sign on them, if you feel like contributing code.
Highlights
Faster Dashboard grids on large installations
New nonclustered indexes on collect.query_stats, procedure_stats, and query_store_data eliminate the Eager Index Spool that previously formed against the entire table when Dashboard looked up query/procedure/plan details. On big installations that spool could take minutes. The upgrade script uses ONLINE = ON on Enterprise/Developer/Azure editions and falls back to offline on Standard/Web. (#835)
Memory Pressure Events in Lite
The memory pressure events collector, chart, and get_memory_pressure_events MCP tool that previously lived only in the Full Edition now ship in Lite. Same RING_BUFFER_RESOURCE_MONITOR data source, same interpretation guidance for LLMs, 5-minute default cadence. (#865)
Grid auto-scrolling
Lite and Dashboard grids now auto-scroll when the mouse approaches the edges during drag or scrub. Community contribution from @ClaudioESSilva. (#843)
Azure SQL DB collector hardening
Several fixes rolled up under #857 for Azure SQL Database targets:
- Single-database fallback when
masteris inaccessible (elastic pools, contained users) - Query snapshots scoped to the current database
- Snapshot requests pre-filtered into
#tempbefore joining DMVs — works around Azure-specific plan blow-ups - Live query plans skipped gracefully instead of erroring
memory_statscollector dropssys.dm_os_schedulerswhich elastic-pool contained users cannot query- Non-transient permission denials now stop the collector retry loop instead of hammering forever
Webhook URL encryption (Dashboard)
Dashboard webhook URLs are now stored via DPAPI in Windows Credential Manager instead of plaintext settings. Existing plaintext entries are migrated on first Settings open. Lite webhook URLs remain in plaintext for now — parity port is tracked separately.
Performance polish
- Query/Procedure/Query Store stats refactored to a phased DECOMPRESS approach and capped to TOP 500 results
- Server tabs lazy-load — only the visible tab is populated at startup; others load on first open
- DuckDB query paths parameterized, escape-hardened, and the
IsArchivingrace fixed - Lite chart axes and sub-tab styling polished, then ported to Dashboard
Other notable fixes
- Memory Pressure Events chart filter no longer drops valid rows (#865)
- FinOps recommendation severity sort order in Lite and Dashboard (#872)
- Overview crosshair no longer disappears after tab switches or layout passes
- Blocked process report plan lookup returns the correct plan (#867)
- FinOps TDE recommendation no longer flagged on SQL Server 2019+ where TDE is free on Standard (#854)
See CHANGELOG.md for the complete list.
v2.7.0 - Stability Is A State Of Mind
Notable New Features:
- Host OS column in Server Inventory
- Offline community script support for air-gapped installs
- MultiSubnetFailover for Always On AG listeners
Notable Fixes
- Dashboard UI hangs on auto-refresh
- Deadlock count resets
- Lite auto-refresh skipping
- upgrade filter patch version handling
- memory leaks on tab close
- MCP query optimization for large databases
- PlanAnalyzer sync from PerformanceStudio
What's Changed
- Fix duplicate release builds: trigger on published only by @erikdarlingdata in #811
- Sync PlanAnalyzer + ShowPlanParser from PerformanceStudio (#816) by @erikdarlingdata in #818
- Fix upgrade filter skipping patch versions (#817) by @erikdarlingdata in #819
- Fix deadlock count not resetting between collections (#803) by @erikdarlingdata in #820
- Add MultiSubnetFailover connection option (#813) by @erikdarlingdata in #821
- Add offline community script support via community/ directory (#814) by @erikdarlingdata in #822
- Add Host OS column to Server Inventory (#748) by @erikdarlingdata in #823
- Fix Lite auto-refresh silently skipping every tick (#824) by @erikdarlingdata in #825
- Improve Add Server dialog UX by @erikdarlingdata in #827
- Fix upgrade script executing against master instead of PerformanceMonitor by @erikdarlingdata in #829
- Optimize MCP query tools for large databases by @erikdarlingdata in #830
- Fix Dashboard auto-refresh silently stalling by @erikdarlingdata in #833
- Fix Dashboard auto-refresh stalling with stop/start timer by @erikdarlingdata in #834
- Fix Dashboard memory leaks on tab close (#835) by @erikdarlingdata in #836
- Release v2.7.0 by @erikdarlingdata in #838
- Fix Dashboard auto-refresh: async loop, tab close, legend duplication by @erikdarlingdata in #839
- Fix legend duplication on tab switch by @erikdarlingdata in #841
- Release v2.7.0 by @erikdarlingdata in #842
Full Changelog: v2.6.0...v2.7.0
v2.6.0 - EGOT
You Can't Beat Someone Who's Having Fun
The main goal of this release was to improve data presentation. Obviously some other stuff came up along the way, and thanks to everyone who submitted issues and ideas over the last week. I'm thrilled by the community response and feedback here.
Anyway, one of the big changes was to re-do some of the overview information in the dashboards so you can see all of what's going on across a variety of resources at once.
I've also added a compare button (not available in all tabs just yet) so you can see what things looked like at different intervals. You can use it on the above view, as well as the query views. It's not very interesting on my local test servers, but in testing it on client servers, it shows very interesting things.
There's also a query heatmap, which people seem to like. The resolution here looks a bit off because of how I'm remoting in, but you should get the idea:
Look, colors! How nice.
What's Changed
- README: add shields.io badge flair by @erikdarlingdata in #770
- Enable upgrade detection in Edit Server dialog by @erikdarlingdata in #773
- Fix embedded resource upgrade discovery and add server version UX by @erikdarlingdata in #774
- Fix Lite FinOps Enterprise features query for missing database_id column by @erikdarlingdata in #778
- Fix Overview tab showing Memory Grant as 0 for all timestamps by @erikdarlingdata in #779
- Bring existing window to foreground on second launch instead of error by @erikdarlingdata in #781
- Fix FinOps Enterprise feature detection: query all databases, filter to TDE only by @erikdarlingdata in #782
- Fix Lite long-running query alerts firing on stale DuckDB snapshots by @erikdarlingdata in #783
- Add trust-cert and encryption prompts to CLI installer interactive mode by @erikdarlingdata in #785
- Fix CLI installer argument parsing treating flags as positional args by @erikdarlingdata in #787
- Add plans/ directory to .gitignore by @erikdarlingdata in #789
- Show nonclustered index count on modification operators (#788) by @erikdarlingdata in #790
- Correlated timeline lanes for Overview/Server Trends (#688) by @erikdarlingdata in #791
- Fix archive compaction OOM on large parquet groups by @erikdarlingdata in #792
- Port baseline engine and anomaly detection to Dashboard by @erikdarlingdata in #793
- Port warning rule improvements from PerformanceStudio by @erikdarlingdata in #795
- Refine Rule 3: TRIVIAL, 0ms elapsed, severity demotion by @erikdarlingdata in #797
- Fix Rule 3: CouldNotGenerateValidParallelPlan stays Warning by @erikdarlingdata in #799
- Expand Rule 3 to cover all NonParallelPlanReason values by @erikdarlingdata in #800
- Add before/after comparison mode for query grids (#687) by @erikdarlingdata in #798
- Switch to SignPath release-signing by @erikdarlingdata in #801
- Fix CSV and clipboard exports writing StackPanel type name as column headers (#805) by @erikdarlingdata in #806
- Fix broken SignPath sponsor logo by @erikdarlingdata in #807
- Release v2.6.0: version bumps, changelog, bug fixes by @erikdarlingdata in #808
- Fix SignPath logo (correct image) by @erikdarlingdata in #809
- Release v2.6.0 by @erikdarlingdata in #810
Full Changelog: v2.5.0...v2.6.0
v2.5.0 - Before The Fool's Day
Better Than Yours
Contributors: @tnguyen7s, @jakemorgangit, @kontrago, @dphugo, @HannahVernon
This release represents the most powerful and capable release since the last release. Game changer. Literally transformative. It will rock you to your very core.
Well but really, some fun things got added, some necessary things got fixed, and I have finally fully ascended to spiritual Product Manager enlightenment by killing a product (sort of).
The GUI installer has been removed as a standalone executable, and folded into the Full Dashboard. It makes more sense there. You go to add a server, and if the PerformanceMonitor database isn't there (or if it needs updating), you install/update from there. Having a whole separate thing to deal with was not fun, when I'm already juggling two dashboards that need maintaining. It also may not be totally clear to people that they need to run that to update the guts to use new Full Dashboard versions.
We now support Webhooks, thanks to @jakemorgangit! I don't have any webs to hook into, but Jake does. Now if you want to have this thing send send messages to things that accept hooking and webs, you can do that. I'm psyched on this, because it's a cool thing that a lot of people rely on for getting alerts. Email is so 2003.
Alerting got a whole lot more mute-able! thanks to @HannahVernon. Hannah has been working a ton on improving the alert system, and I appreciate it because it's the kind of thing I have a real hard time getting myself to sit down and test and whatnot.
So what did I do this time around? Well, @rferraton has been doing some incredible visual work on Performance Studio, and it has made quite an impression on me. I've been trying to get similarly helpful things added in here:
- Time slicers so you can easily filter grid results to resource spikes
- A heat map that shows you when queries really had a tough time
- Right click > Show Active Queries to charts and graphs (coverage is a WIP, but I'm getting there).
The goal here is to make this not only a monitoring tool, but a help-you-figure-out-problems tool. I'm going to build more on that over the next couple releases.
Anyway, that's enough.
What's Changed
- Fix CPU metrics mixed for different Azure SQL databases on same server by @tnguyen7s in #680
- Fix CREATE DATABASE failure when model DB has large files (#676) by @erikdarlingdata in #678
- Fix slicer time ranges, add Blocking/Deadlock slicers (#681) by @erikdarlingdata in #697
- Dashboard: fix slicer time ranges, add Blocking/Deadlock/Default Trace slicers (#681) by @erikdarlingdata in #698
- Lite: grid-to-slicer overlay for query/procedure/Query Store (#683) by @erikdarlingdata in #699
- Dashboard: grid-to-slicer overlay for query/procedure/Query Store (#683) by @erikdarlingdata in #700
- Preserve overlay through Dashboard auto-refresh (#683) by @erikdarlingdata in #701
- Add Investigate button to Critical Issues (#684) by @erikdarlingdata in #702
- Lite: chart drill-down for CPU, Memory, TempDB, Blocking, Deadlocks (#682) by @erikdarlingdata in #705
- Fix Memory drill-down to Active Queries (#682) by @erikdarlingdata in #706
- Fix slicer custom range display and cascading refresh (#704) by @erikdarlingdata in #707
- Widen drill-down window to ±30 minutes (#682) by @erikdarlingdata in #708
- Dashboard: chart drill-down for CPU, Memory, TempDB, Blocking, Deadlocks (#682) by @erikdarlingdata in #709
- Fix drill-down menu disabled on CPU/TempDB/Memory charts (#682) by @erikdarlingdata in #711
- Fix drill-down: Active Queries target, add to all charts (#682) by @erikdarlingdata in #714
- Extend drill-down to Overview, Locking, Memory charts (#682) by @erikdarlingdata in #717
- LITE Fix - Remove blur on graph lines and graph legend text by @dphugo in #710
- Lite: Add Overview tab with resource chart grid (#689) by @erikdarlingdata in #719
- Widen installation_history version columns to nvarchar(512) (#712) by @erikdarlingdata in #722
- Add per-server collector schedule intervals by @erikdarlingdata in #724
- Add diagnostics for Alert Dismissal by @HannahVernon in #721
- feature/Add Teams and Slack webhook notifications by @jakemorgangit in #725
- Fix webhook alert recording and delivery tracking by @erikdarlingdata in #726
- Port read-only intent support from Lite to Dashboard by @erikdarlingdata in #728
- Add source column to distinguish live vs archived alerts (#718) by @HannahVernon in #729
- fix/numeric columns sorting as text instead of numbers by @jakemorgangit in #732
- Add dismissed_archive_alerts sidecar table for parquet-aware dismissal (#718) by @HannahVernon in #730
- feat: structured telemetry, post-dismiss verify, stale-data indicator, archival warning (#718) by @HannahVernon in #734
- Fix FinOps CPU right-sizing for Azure SQL Database (#735) by @kontrago in #736
- Add Query Heatmap sub-tab to Lite by @erikdarlingdata in #739
- Add Query Heatmap sub-tab to Dashboard by @erikdarlingdata in #743
- feat: Dismiss Selected in context menu + View Log sidebar button by @HannahVernon in #740
- Fix drill-down navigation bugs in Dashboard and Lite by @erikdarlingdata in #744
- Fix heatmap colorbar stacking on refresh by @erikdarlingdata in #746
- Fix drill-down timezone mismatches and slicer state by @erikdarlingdata in #747
- Fix drill-down timezone and picker display issues by @erikdarlingdata in #750
- Make custom range pickers respect display mode by @erikdarlingdata in #751
- fix: dismiss reliability - write lock, batched UPDATE, transaction, timeout (#718) by @HannahVernon in #733
- Add GitHub Sponsors funding link by @erikdarlingdata in #752
- Fix doomed transaction error handling (#756) by @erikdarlingdata in #757
- Add XACT_STATE check after third-party proc calls (#695) by @erikdarlingdata in #759
- Fix Lite memory leaks: delta cache, event handlers, chart helpers (#758) by @erikdarlingdata in #760
- Extract Installer.Core shared library and refactor CLI (#755) by @erikdarlingdata in #761
- Cap DuckDB compaction memory at 2 GB (#758) by @erikdarlingdata in #762
- Integrate installation into Dashboard Add Server dialog (#755 Phase 2) by @erikdarlingdata in #763
- Retire InstallerGui from solution and build pipeline (#755 Phase 3) by @erikdarlingdata in #764
- Fix Rule 2: eager table spools no longer flagged as eager index spools by @erikdarlingdata in #765
- Release v2.5.0: version bumps, bug fixes, changelog by @erikdarlingdata in #766
- Release v2.5.0 by @erikdarlingdata in #767
New Contributors
- @tnguyen7s made their first contribution in #680
- @jakemorgangit made their first contribution in #725
- @kontrago made their first contribution in #736
Full Changelog: v2.4.1...v2.5.0
v2.4.1
v2.4.1
Patch release with UX improvements and a pipeline fix.
- Check for Updates is now a proper button instead of a hyperlink in both Dashboard and Lite About windows
- Collector health clears stale error counts when a server is removed — status bar no longer shows errors for deleted servers
- Velopack pipeline split into separate upload steps so Dashboard and Lite artifacts don't conflict
v2.4.0
Contributors: @HannahVernon, @MisterZeus, @ad-mca-mk — thank you!
Highlights
🔄 Auto-Update (Windows) — Both Dashboard and Lite now support automatic updates via Velopack. Install once via Setup.exe, and future updates are detected on startup with one-click download + apply. Existing zip distribution continues to work. (#635)
📊 Per-Tab Time Range Slicers — Query tabs in both Dashboard and Lite now have interactive time range slicers. Narrow down to a specific window without changing the global time range. (#655, #662)
🕐 Time Display Picker — Toggle between Local, UTC, and Server time directly from the toolbar. (#646)
Important
- Lite data directory moved: All data (config, DuckDB, archives, logs) now lives in
%LOCALAPPDATA%\PerformanceMonitorLite\instead of alongside the executable. This enables auto-update support. Users upgrading from the zip should use Import Settings + Import Data to bring over configuration and historical data.
Added
- Velopack auto-update for Dashboard and Lite — startup notification, download + apply from About window with confirmation dialog (#635)
- Per-tab time range slicers on Dashboard and Lite query tabs (#655, #662)
- Time display picker (Local/UTC/Server) in toolbars (#646)
- Import Settings — expanded from "Import Connections" to also copy alert thresholds, SMTP config, schedules, and wait exclusions
- Alert muting improvements — pre-fill database, query, wait type, and job name from alert detail; configurable default expiration for new mute rules (@HannahVernon) (#642)
- Missing date columns on Query Stats and Procedure Stats tabs (#649, #651, #654)
- Trace pattern drill-down with CollectionTime and NtUserName columns (#663)
- DataGrid sort preservation across auto-refresh (#659)
- CLI installer: colored output and version check on startup
- GUI installer: version check on startup
- Growth rate and VLF count columns in Database Sizes (upgrade script for servers that missed it in 2.3.0) (#567)
llms.txtandCITATION.cfffor discoverability (#630)
Changed
- Lite data directory moved to
%LOCALAPPDATA%\PerformanceMonitorLite\ - Delta gap detection on all cumulative-counter collectors — prevents chart spikes after app restart (#633)
- File I/O NULL fallbacks when
sys.master_filesis inaccessible — usesDB_NAME()andFile_{id}(#633) - Running jobs collector skipped gracefully when login lacks msdb access (#656)
- NuGet packages updated to latest minor versions (@MisterZeus) (#653)
Fixed
- Installer reporting SUCCESS when files fail — removed false-positive workaround from both CLI and GUI
- Query stats collector SQL dumps on passive mirror servers — removed
dm_exec_plan_attributes, uses temp table of ONLINE database IDs (#632) - Trigger name extraction fails when comment contains " ON " (#666)
- FinOps expensive queries DuckDB error for missing column
- Imported parquet files not recognized by archive compaction
Download
| File | Description |
|---|---|
PerformanceMonitorDashboard-dashboard-Setup.exe |
New! One-click Dashboard installer with auto-update |
PerformanceMonitorLite-lite-Setup.exe |
New! One-click Lite installer with auto-update |
PerformanceMonitorDashboard-2.4.1.zip |
Dashboard (portable zip) |
PerformanceMonitorLite-2.4.1.zip |
Lite (portable zip) |
PerformanceMonitorInstaller-2.4.1.zip |
SQL Server installer (CLI + GUI + scripts) |
v2.4.0
Note: v2.4.1 is the recommended release. It includes a Check for Updates button fix, collector health cleanup, and a Velopack pipeline fix. Download v2.4.1 instead.
See CHANGELOG.md for the full 2.4.0 changelog.
v2.3.0
See CHANGELOG.md for full release notes.
Highlights
- ErikAI analysis engine — rule-based inference for Lite and Dashboard with anomaly detection, bad actor scoring, and CPU spike detection
- FinOps cost optimization — Phase 1-4 recommendations (enterprise feature audit, CPU/memory right-sizing, compression savings, VM right-sizing, reserved capacity)
- Azure SQL DB fixes — all FinOps collectors now query each database individually
- Server unreachable email alerts — tray + email on offline/online transitions
- Lite data import from previous install for seamless upgrades
- SQL Server version check in both installers (rejects 2014 and earlier)
- 35 installer adversarial tests covering upgrade failures, data survival, idempotency
- Full MCP tool coverage — Dashboard 57 tools, Lite 51 tools
- Growth rate and VLF count columns in Database Sizes
- Column filters on all FinOps DataGrids
- Per-server Utility Database setting for community procs
- Numerous bug fixes including the #538 installer data-loss fix