Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
250 commits
Select commit Hold shift + click to select a range
66ae3f2
Fix #1135: Lite index_object_stats collector times out as all-or-noth…
erikdarlingdata Jun 17, 2026
ba56cfd
Merge pull request #1137 from erikdarlingdata/feature/1135-index-obje…
erikdarlingdata Jun 17, 2026
b4b5882
Grade Volume Free Space alert severity WARNING/CRITICAL (#1136)
erikdarlingdata Jun 17, 2026
979aca2
Merge pull request #1139 from erikdarlingdata/feature/1136-volume-fre…
erikdarlingdata Jun 17, 2026
db59034
#1140: shared dedup-fingerprint foundation (model, hashing, rendering…
erikdarlingdata Jun 17, 2026
f97a140
#1140/#1141: shared blocking + deadlock incident groupers
erikdarlingdata Jun 17, 2026
da88fea
#1140/#1141: wire dedup fingerprint into Lite live alert builders
erikdarlingdata Jun 17, 2026
1e20c82
#1140: wire dedup fingerprint into Dashboard live alert builders (par…
erikdarlingdata Jun 17, 2026
2c4e55b
#1140: Lite collector changes — blocking contentious_object + LRQ que…
erikdarlingdata Jun 17, 2026
932c8c9
Merge pull request #1142 from erikdarlingdata/feature/1140-alert-dedu…
erikdarlingdata Jun 17, 2026
fb3071f
#1140: wire dedup fingerprints into the anomaly/finding alert path (b…
erikdarlingdata Jun 17, 2026
d2c0066
Merge pull request #1143 from erikdarlingdata/feature/1140-finding-pa…
erikdarlingdata Jun 17, 2026
80ada70
#1141: per-event notification mode for deadlock/blocking alerts (glob…
erikdarlingdata Jun 18, 2026
6244947
Merge pull request #1144 from erikdarlingdata/feature/1141-per-event-…
erikdarlingdata Jun 18, 2026
a56b10d
#1141: fix per-event cards losing forensic detail + Current Value (go…
erikdarlingdata Jun 18, 2026
fad047d
Merge pull request #1146 from erikdarlingdata/feature/1141-per-event-…
erikdarlingdata Jun 18, 2026
41aa9cd
Fix #1145: Webhook alerts re-fire after an app restart
erikdarlingdata Jun 18, 2026
8ae9dbf
Merge pull request #1147 from erikdarlingdata/feature/1145-restart-re…
erikdarlingdata Jun 18, 2026
3fb2997
Single-instance upgrade handoff: close the stale instance instead of …
erikdarlingdata Jun 19, 2026
6ad367c
Merge pull request #1148 from erikdarlingdata/feature/single-instance…
erikdarlingdata Jun 19, 2026
a4945f4
Bump minor/patch NuGet dependencies
erikdarlingdata Jun 19, 2026
e040dda
Merge pull request #1149 from erikdarlingdata/feature/minor-dependenc…
erikdarlingdata Jun 19, 2026
37cfb10
Bump Velopack 0.0.1298 -> 1.2.0 and pin the vpk CLI to match
erikdarlingdata Jun 19, 2026
4d9d2c7
Merge pull request #1150 from erikdarlingdata/feature/velopack-1.2.0
erikdarlingdata Jun 19, 2026
91b7873
Remove dead FakeExecutor.UnforceFunc test seam (CS0649)
erikdarlingdata Jun 19, 2026
7feb54c
Merge pull request #1151 from erikdarlingdata/feature/build-health-cl…
erikdarlingdata Jun 19, 2026
56dd068
Harden .gitattributes: force LF for shell scripts
erikdarlingdata Jun 19, 2026
f34d96c
Merge pull request #1152 from erikdarlingdata/feature/gitattributes-eol
erikdarlingdata Jun 19, 2026
4aefa41
Fix two Dashboard analysis bugs that drifted from Lite
erikdarlingdata Jun 19, 2026
4f181ac
Fix #1154: key the alert delivery cooldown on the #1140 incident fing…
erikdarlingdata Jun 19, 2026
e0208cd
Merge pull request #1156 from erikdarlingdata/feature/1154-cooldown-f…
erikdarlingdata Jun 19, 2026
2911d57
Fingerprint failed-job alerts so distinct failures don't coalesce (#1…
erikdarlingdata Jun 19, 2026
5866557
Merge pull request #1157 from erikdarlingdata/feature/failed-job-fing…
erikdarlingdata Jun 19, 2026
e9063dd
Merge remote-tracking branch 'origin/dev' into feature/baseline-anoma…
erikdarlingdata Jun 19, 2026
5a40c60
Merge pull request #1155 from erikdarlingdata/feature/baseline-anomal…
erikdarlingdata Jun 19, 2026
df9fe90
Share ServerIdHelper + MfaAuthenticationHelper across Lite/Dashboard
erikdarlingdata Jun 19, 2026
8a1b6c4
Merge pull request #1158 from erikdarlingdata/feature/sharing-first-w…
erikdarlingdata Jun 19, 2026
c7e5541
Share FactCollector pure helpers across Lite/Dashboard
erikdarlingdata Jun 19, 2026
860b145
Merge pull request #1159 from erikdarlingdata/feature/sharing-batch2-…
erikdarlingdata Jun 19, 2026
602fa8c
Stop integration tests from leaking orphaned Agent jobs on real insta…
erikdarlingdata Jun 19, 2026
c7aaf5e
Merge pull request #1160 from erikdarlingdata/feature/release-tests-o…
erikdarlingdata Jun 19, 2026
f0cf256
Share ServerConnectionStatus across Lite/Dashboard
erikdarlingdata Jun 19, 2026
6a9fdc3
Merge pull request #1161 from erikdarlingdata/feature/sharing-batch3-…
erikdarlingdata Jun 19, 2026
a5c1f5e
Share DataGrid column-filter matcher across Lite/Dashboard
erikdarlingdata Jun 19, 2026
f112ded
Merge pull request #1162 from erikdarlingdata/feature/sharing-batch4-…
erikdarlingdata Jun 19, 2026
e668634
Share MCP plan-analysis JSON formatter across Lite/Dashboard
erikdarlingdata Jun 19, 2026
e22b0bf
Merge pull request #1163 from erikdarlingdata/feature/sharing-mcpplan…
erikdarlingdata Jun 19, 2026
c8d174e
Share DataGridFilterManager across Lite/Dashboard (→ Ui)
erikdarlingdata Jun 19, 2026
38bf614
Merge pull request #1164 from erikdarlingdata/feature/sharing-datagri…
erikdarlingdata Jun 19, 2026
bf51c4f
Share ReproScriptBuilder across Lite/Dashboard (→ PlanAnalysis)
erikdarlingdata Jun 19, 2026
5badb3d
Merge pull request #1165 from erikdarlingdata/feature/sharing-reprosc…
erikdarlingdata Jun 19, 2026
cdd7b0a
Share PlanIconMapper + PlanIcons across Lite/Dashboard (→ Ui)
erikdarlingdata Jun 19, 2026
2bf84a6
Move misfiled ServerTimeHelper into its own file (Lite)
erikdarlingdata Jun 19, 2026
5b08826
Merge pull request #1167 from erikdarlingdata/feature/lite-servertime…
erikdarlingdata Jun 19, 2026
5f5117d
Split DatabaseService.ResourceMetrics.cs into per-family partials
erikdarlingdata Jun 19, 2026
64f62ec
Merge pull request #1168 from erikdarlingdata/feature/split-resourcem…
erikdarlingdata Jun 19, 2026
4428607
Split Lite ServerTab.xaml.cs into per-concern partials
erikdarlingdata Jun 19, 2026
e1e36f0
Merge pull request #1169 from erikdarlingdata/feature/split-lite-serv…
erikdarlingdata Jun 19, 2026
ff6e24d
Merge pull request #1166 from erikdarlingdata/feature/sharing-planico…
erikdarlingdata Jun 19, 2026
32a319b
Split FinOpsContent.xaml.cs into per-concern partials
erikdarlingdata Jun 19, 2026
06aa56f
Merge pull request #1170 from erikdarlingdata/feature/split-finopscon…
erikdarlingdata Jun 19, 2026
8adcb55
Split HealthParser data access out of DatabaseService.SystemEvents.cs
erikdarlingdata Jun 19, 2026
61c9fee
Merge pull request #1171 from erikdarlingdata/feature/split-systemevents
erikdarlingdata Jun 19, 2026
272a12e
Split QueryPerformance.cs base into PlanXml/Heatmap/Comparison partials
erikdarlingdata Jun 19, 2026
dcb7c64
Merge pull request #1172 from erikdarlingdata/feature/split-queryperf
erikdarlingdata Jun 19, 2026
21e519c
Persist failed-job tray watermark across restart (both apps)
erikdarlingdata Jun 19, 2026
59da155
Merge pull request #1173 from erikdarlingdata/feature/failed-job-wate…
erikdarlingdata Jun 19, 2026
142ee7b
Split SqlServerFactCollector into per-domain partials
erikdarlingdata Jun 19, 2026
6778a45
Merge pull request #1174 from erikdarlingdata/feature/split-factcolle…
erikdarlingdata Jun 19, 2026
86c24a3
Split DuckDbFactCollector into per-domain partials (Lite parity)
erikdarlingdata Jun 19, 2026
b2fcd96
Merge pull request #1175 from erikdarlingdata/feature/split-duckdbfac…
erikdarlingdata Jun 19, 2026
6c3a939
Split the Independent Alert Engine region out of Dashboard MainWindow
erikdarlingdata Jun 19, 2026
1d3465e
Merge pull request #1176 from erikdarlingdata/feature/split-dashboard…
erikdarlingdata Jun 19, 2026
e80712a
Split the alert engine out of Lite MainWindow
erikdarlingdata Jun 19, 2026
ba98b0e
Merge pull request #1177 from erikdarlingdata/feature/split-lite-main…
erikdarlingdata Jun 19, 2026
a7d12b4
Split SqlServerDrillDownCollector + Lite DrillDownCollector into per-…
erikdarlingdata Jun 20, 2026
5a9cbdc
Merge pull request #1178 from erikdarlingdata/feature/split-drilldown
erikdarlingdata Jun 20, 2026
292a478
Fix FinOps Database Sizes empty until manual refresh (init-order race)
erikdarlingdata Jun 20, 2026
258bd91
Merge pull request #1179 from erikdarlingdata/feature/finops-dbsizes-…
erikdarlingdata Jun 20, 2026
64a928f
Add always-on per-section profiling to every Dashboard server tab
erikdarlingdata Jun 20, 2026
f5fb7e0
Mirror always-on per-section profiling into Lite (parity)
erikdarlingdata Jun 20, 2026
752cef4
Merge pull request #1180 from erikdarlingdata/feature/per-tab-profili…
erikdarlingdata Jun 20, 2026
efa1178
Fix in-app plan viewing for query drill-downs; defer QueryStats plan …
erikdarlingdata Jun 20, 2026
9351351
Merge pull request #1181 from erikdarlingdata/feature/defer-querystat…
erikdarlingdata Jun 20, 2026
3260388
Lazy-load the heavy Queries sub-tab grids so the tab opens fast
erikdarlingdata Jun 20, 2026
c64afd6
Reduce Query/Proc/Query-Store grids from TOP 500 to TOP 50
erikdarlingdata Jun 20, 2026
a1be7e2
Merge pull request #1182 from erikdarlingdata/feature/queries-lazy-su…
erikdarlingdata Jun 20, 2026
3af0f03
Refresh Active Queries sub-tab on view; guard the drill-down race
erikdarlingdata Jun 20, 2026
5d12b16
Merge remote-tracking branch 'origin/dev' into feature/active-queries…
erikdarlingdata Jun 20, 2026
e6ddde9
Merge pull request #1183 from erikdarlingdata/feature/active-queries-…
erikdarlingdata Jun 20, 2026
b4661cf
Add in-app query-plan navigation to every query-identifying surface (…
erikdarlingdata Jun 20, 2026
d6a2b76
Merge pull request #1184 from erikdarlingdata/feature/in-app-plan-nav…
erikdarlingdata Jun 20, 2026
b97000c
Remove dead PERFMON_PLE rule — PLE is never collected
erikdarlingdata Jun 20, 2026
124ad0b
Style resolved/cleared tray toasts to match condition cards
erikdarlingdata Jun 20, 2026
b1bcf4f
Merge pull request #1186 from erikdarlingdata/feature/resolved-toast-…
erikdarlingdata Jun 20, 2026
8e9da0f
Merge pull request #1185 from erikdarlingdata/feature/rec-engine-remo…
erikdarlingdata Jun 20, 2026
5e2e9c3
Fix MAXDOP recommendation: topology-based, not edition-based
erikdarlingdata Jun 20, 2026
f34691a
Merge pull request #1187 from erikdarlingdata/feature/rec-engine-maxd…
erikdarlingdata Jun 20, 2026
d1a2cd3
Workload-aware THREADPOOL advice: attribute parallel vs blocking
erikdarlingdata Jun 21, 2026
630ce2d
Compose advice from facts: state actual MAXDOP/CTFP, retrospective fr…
erikdarlingdata Jun 21, 2026
51e1997
Dashboard: faster tab loads, blocking plan viewing, slicer/range fixes
erikdarlingdata Jun 21, 2026
2be57e2
Merge remote-tracking branch 'origin/dev' into feature/defer-locking-…
erikdarlingdata Jun 21, 2026
a238826
Merge pull request #1190 from erikdarlingdata/feature/defer-locking-g…
erikdarlingdata Jun 21, 2026
dde6c44
Extract shared chart chrome into ChartStyle (Phase A.0, step 1: no-op…
erikdarlingdata Jun 20, 2026
c6afe27
Reconcile drifted chart-theme copies onto ChartStyle (Phase A.0, step 2)
erikdarlingdata Jun 20, 2026
d5e58f7
Add ChartPalette color-identity foundation in Common (Phase A.3, step 1)
erikdarlingdata Jun 20, 2026
abbea18
Wire plan-viewer wait coloring to ChartPalette (Phase A.3, step 2; D2)
erikdarlingdata Jun 20, 2026
2482c26
Refine wait categorization per expert + SQLskills audit (Phase A.3)
erikdarlingdata Jun 20, 2026
563a8bd
Migrate fixed-meaning series to ChartPalette.SeriesColor (Phase A.3, …
erikdarlingdata Jun 20, 2026
aa80342
Single-source the cycling palette from ChartPalette (Phase A.3, step …
erikdarlingdata Jun 20, 2026
7aa352c
Migrate threshold/pressure-zone accents to ChartPalette.AccentColor (…
erikdarlingdata Jun 20, 2026
cc59da4
Migrate blocking/deadlock series to ChartPalette.SeriesColor (Phase A…
erikdarlingdata Jun 20, 2026
ca55f90
Route ALL remaining chart series/accent colors through ChartPalette (…
erikdarlingdata Jun 20, 2026
b52d893
Route remaining straggler chart colors through ChartPalette
erikdarlingdata Jun 20, 2026
c898253
A.1 line polish: ChartStyle.StyleScatter applied across both apps
erikdarlingdata Jun 20, 2026
ecbc774
A.4 slicer parity: unify height + wire handle-hover affordance (both …
erikdarlingdata Jun 20, 2026
227e51d
A.5 (part 1): shared BarChartCell control in .Ui
erikdarlingdata Jun 20, 2026
a9aaa49
A.5 (part 2): wire BarChartCell into the top-queries grids (both apps)
erikdarlingdata Jun 21, 2026
dd6c1bb
A.6: per-database CPU bar-cards (both apps)
erikdarlingdata Jun 21, 2026
a03e2a5
Merge pull request #1189 from erikdarlingdata/feature/maxdop-ctfp-wor…
erikdarlingdata Jun 21, 2026
7979d24
Merge pull request #1191 from erikdarlingdata/feature/chart-port-a0-s…
erikdarlingdata Jun 21, 2026
a81b0a5
Fix RootFactValue/LeafFactValue carrying severity instead of the fact…
erikdarlingdata Jun 21, 2026
ff0da67
Merge pull request #1192 from erikdarlingdata/feature/rootfactvalue-n…
erikdarlingdata Jun 21, 2026
98d8a2d
Lite: deadlock-graph parsing off UI thread + View Plan parity
erikdarlingdata Jun 21, 2026
aef28d7
Merge pull request #1193 from erikdarlingdata/feature/lite-ui-respons…
erikdarlingdata Jun 21, 2026
0646e17
Advice: fix 5 sourced-wrong claims + retrospective-reframe kill survi…
erikdarlingdata Jun 21, 2026
794908a
Merge pull request #1194 from erikdarlingdata/feature/advice-correctn…
erikdarlingdata Jun 21, 2026
3d6a4c7
Lite: remove dead RefreshAllTabsAsync (full-refresh path)
erikdarlingdata Jun 21, 2026
f610c46
Merge pull request #1195 from erikdarlingdata/feature/lite-dead-code-…
erikdarlingdata Jun 21, 2026
fab0b2d
Advice: state actual MAXDOP/CTFP in the parallelism wait blocks (B1)
erikdarlingdata Jun 21, 2026
fd8a7b7
Merge pull request #1196 from erikdarlingdata/feature/advice-composer…
erikdarlingdata Jun 21, 2026
20aec68
Advice: state actual max server memory in the memory blocks (B2)
erikdarlingdata Jun 21, 2026
7bcdb18
Merge pull request #1197 from erikdarlingdata/feature/advice-composer…
erikdarlingdata Jun 21, 2026
8140a23
Advice: state the RCSI-off database count in BLOCKING_EVENTS/DEADLOCK…
erikdarlingdata Jun 22, 2026
39c8d63
Merge pull request #1198 from erikdarlingdata/feature/advice-composer…
erikdarlingdata Jun 22, 2026
37275fe
Prettier charts: bolder area-filled lines + slicer quick-range chips
erikdarlingdata Jun 22, 2026
7bce030
Merge pull request #1199 from erikdarlingdata/feature/chart-port-a0-s…
erikdarlingdata Jun 22, 2026
2506ec0
Gradient area fill anchored to each series' own data range
erikdarlingdata Jun 22, 2026
c844dab
Merge pull request #1200 from erikdarlingdata/feature/chart-port-a0-s…
erikdarlingdata Jun 22, 2026
b0c1937
Fix crash: skip gradient fill on flat/empty series
erikdarlingdata Jun 22, 2026
859b1e8
Merge pull request #1201 from erikdarlingdata/feature/chart-port-a0-s…
erikdarlingdata Jun 22, 2026
7b5b520
Lite: offload sync DuckDB calls on interactive UI paths to Task.Run
erikdarlingdata Jun 22, 2026
a12a7a5
Merge pull request #1202 from erikdarlingdata/feature/lite-offload-ui…
erikdarlingdata Jun 22, 2026
2f32d3b
Advice: SOS runnable-queue nuance + per-database MAXDOP awareness (re…
erikdarlingdata Jun 22, 2026
ac0af85
Merge pull request #1203 from erikdarlingdata/feature/advice-review-n…
erikdarlingdata Jun 22, 2026
b42a3c9
TempDB Stats: drop Unallocated band, add allocated-size trend chart
erikdarlingdata Jun 22, 2026
697d5b5
Merge pull request #1204 from erikdarlingdata/feature/chart-port-a0-s…
erikdarlingdata Jun 22, 2026
085794f
Share PlanViewerControl across both apps via PerformanceMonitor.Ui
erikdarlingdata Jun 22, 2026
bd6b4fc
Changelog: note the shared PlanViewerControl + Dashboard row-count fix
erikdarlingdata Jun 22, 2026
d806350
Update Lite.Tests lock file for the .Ui -> .PlanAnalysis reference
erikdarlingdata Jun 22, 2026
9ac17ea
Correlate-and-focus slice 1: "what else fired in this window" cross-r…
erikdarlingdata Jun 22, 2026
3359946
Merge pull request #1206 from erikdarlingdata/feature/cofired-what-el…
erikdarlingdata Jun 22, 2026
090086e
Merge pull request #1205 from erikdarlingdata/feature/plan-viewer-sha…
erikdarlingdata Jun 22, 2026
f2eb430
Block-chain viewer (PR #1): shared apex->victim chain visualizer in b…
erikdarlingdata Jun 22, 2026
b89862f
Wire "Show Active Queries at This Time" drill-down across all resourc…
erikdarlingdata Jun 22, 2026
f5fc0b0
Changelog: note the chart drill-down extension + dead-wiring/parity f…
erikdarlingdata Jun 22, 2026
5ee101e
Merge pull request #1208 from erikdarlingdata/feature/chart-active-qu…
erikdarlingdata Jun 22, 2026
fc84117
Batch picker-chart trend queries to fix N+1 query loops (Lite)
erikdarlingdata Jun 22, 2026
889563c
Merge pull request #1209 from erikdarlingdata/feature/lite-batch-pick…
erikdarlingdata Jun 22, 2026
b3aee75
Fold in code-review findings (block-chain viewer)
erikdarlingdata Jun 22, 2026
ec5576f
Add the Active Queries drill-down to the Overview correlated-timeline…
erikdarlingdata Jun 22, 2026
dee4524
Fold in UI-design review findings (block-chain viewer)
erikdarlingdata Jun 22, 2026
5b79351
Changelog: Overview correlated-lanes Active Queries drill-down (#1210)
erikdarlingdata Jun 22, 2026
4ea70ca
Merge pull request #1210 from erikdarlingdata/feature/lanes-active-qu…
erikdarlingdata Jun 22, 2026
d09e162
Make apex border theme-aware (block-chain viewer)
erikdarlingdata Jun 22, 2026
706a707
Merge pull request #1207 from erikdarlingdata/feature/block-chain-viewer
erikdarlingdata Jun 22, 2026
f81d02f
Correlate-and-focus slice 2: persist a trackable incident_id on findings
erikdarlingdata Jun 22, 2026
46a2ea4
Merge pull request #1211 from erikdarlingdata/feature/incident-id-per…
erikdarlingdata Jun 22, 2026
bad977a
Correlate-and-focus slice 3a: expose incident_id in the MCP findings
erikdarlingdata Jun 22, 2026
dafe7b2
Merge pull request #1212 from erikdarlingdata/feature/incident-id-mcp
erikdarlingdata Jun 22, 2026
37ba480
Correlate-and-focus: cluster findings into incidents by graph-connect…
erikdarlingdata Jun 22, 2026
5047fa8
Merge pull request #1213 from erikdarlingdata/feature/incident-graph-…
erikdarlingdata Jun 22, 2026
5366080
Correlate-and-focus slice 3b: collapsible incident groups on the Reco…
erikdarlingdata Jun 23, 2026
96ce2f5
Merge pull request #1214 from erikdarlingdata/feature/incident-groupe…
erikdarlingdata Jun 23, 2026
aa353c1
Redesign block-chain viewer: row-scoped single chain, identity cards
erikdarlingdata Jun 23, 2026
d4cbc2e
Deadlock graph viewer: cycle view of the waits-for graph (both apps)
erikdarlingdata Jun 23, 2026
b9b4bab
Block-chain viewer: edge-precise chain pick + event-time window
erikdarlingdata Jun 23, 2026
9cd6869
Merge pull request #1216 from erikdarlingdata/feature/deadlock-viewer
erikdarlingdata Jun 23, 2026
6c52cf4
Merge pull request #1215 from erikdarlingdata/feature/blockchain-laun…
erikdarlingdata Jun 23, 2026
643efbd
Block-chain viewer: resolve the Dashboard apex's login/host/app
erikdarlingdata Jun 23, 2026
a6d0abe
Review fixes: column-alias style + document the unordered viewer result
erikdarlingdata Jun 23, 2026
90f3cc5
Merge pull request #1218 from erikdarlingdata/feature/block-chain-vie…
erikdarlingdata Jun 23, 2026
671d3c1
Deadlock viewer: drop victim strikethrough + open details card on load
erikdarlingdata Jun 23, 2026
21e6342
Merge pull request #1219 from erikdarlingdata/feature/deadlock-viewer…
erikdarlingdata Jun 23, 2026
f3eef2f
Block-chain viewer: show the contended object + fix Lite resolution t…
erikdarlingdata Jun 23, 2026
772d88f
Merge pull request #1220 from erikdarlingdata/feature/blockchain-view…
erikdarlingdata Jun 23, 2026
6e6c0d6
Deadlock viewer: resolve contended object on nodes + box independent …
erikdarlingdata Jun 23, 2026
2771b3b
Merge pull request #1221 from erikdarlingdata/feature/deadlock-object…
erikdarlingdata Jun 23, 2026
ffc0b0c
Block-chain viewer: open the chain when the lead-blocker row is clicked
erikdarlingdata Jun 23, 2026
7657d8e
Merge pull request #1222 from erikdarlingdata/feature/blockchain-apex…
erikdarlingdata Jun 23, 2026
90be4e4
WIP: blocking-chain reconstruction keyed by (monitor_loop, spid, ecid)
erikdarlingdata Jun 24, 2026
cfb7fc9
Blocking-chain (monitor_loop,spid,ecid): Dashboard schema + install/u…
erikdarlingdata Jun 24, 2026
44f0143
Tests for (monitor_loop, spid, ecid) blocking-chain keying
erikdarlingdata Jun 24, 2026
a2b63b9
Merge pull request #1223 from erikdarlingdata/feature/blockchain-deep…
erikdarlingdata Jun 24, 2026
4daffdf
Structured status envelope for non-data MCP outcomes (Lite + Dashboard)
erikdarlingdata Jun 24, 2026
3a64179
Merge pull request #1224 from erikdarlingdata/feature/lite-mcp-status…
erikdarlingdata Jun 24, 2026
c4b1031
Exclude muted alerts from the sidebar Alert badge count (#1225)
erikdarlingdata Jun 24, 2026
dc5d4b7
Merge pull request #1226 from erikdarlingdata/feature/1225-muted-aler…
erikdarlingdata Jun 24, 2026
2f63c7b
Add always-on DMV blocking-snapshot fallback (both apps)
erikdarlingdata Jun 24, 2026
66a4e92
Bump Lite schema table-count test for dmv_blocking_snapshots (32 -> 33)
erikdarlingdata Jun 24, 2026
e7a2566
Merge pull request #1227 from erikdarlingdata/feature/blocking-dmv-fa…
erikdarlingdata Jun 24, 2026
288deab
Exclude resolved alerts from the badge; share the metric classifier (…
erikdarlingdata Jun 24, 2026
6059bbc
Merge pull request #1228 from erikdarlingdata/feature/1225-resolved-a…
erikdarlingdata Jun 24, 2026
5aadcee
Fix Capture Down / Failed Agent Job email severity; backfill #1225 ch…
erikdarlingdata Jun 24, 2026
f0747d0
Add CHANGELOG entry for the Capture Down / Failed Agent Job severity …
erikdarlingdata Jun 24, 2026
e6b0a1a
Merge pull request #1229 from erikdarlingdata/feature/1225-alert-seve…
erikdarlingdata Jun 24, 2026
fdd7141
Polish the DMV blocking-snapshot grid (3 review nits)
erikdarlingdata Jun 24, 2026
f81e15b
Backfill CHANGELOG for the shipped alert fingerprint cluster (#1140/#…
erikdarlingdata Jun 24, 2026
cac125c
Merge pull request #1230 from erikdarlingdata/feature/blocking-dmv-nits
erikdarlingdata Jun 24, 2026
a925389
Merge pull request #1231 from erikdarlingdata/feature/changelog-backf…
erikdarlingdata Jun 24, 2026
6efa2ff
Lite: format Alert History Value/Threshold per metric (#1134)
erikdarlingdata Jun 24, 2026
2fc675a
Merge pull request #1232 from erikdarlingdata/feature/1134-lite-alert…
erikdarlingdata Jun 24, 2026
26e6775
Surface DMV blocking snapshot in the flat top-blocking drill-down (bo…
erikdarlingdata Jun 24, 2026
d4d4173
Merge pull request #1233 from erikdarlingdata/feature/blocking-dmv-dr…
erikdarlingdata Jun 24, 2026
de8deb8
Extend DMV blocking fallback to the count/aggregate surfaces (Bucket 2)
erikdarlingdata Jun 24, 2026
c2c8adc
Merge pull request #1234 from erikdarlingdata/feature/blocking-dmv-bu…
erikdarlingdata Jun 24, 2026
696295f
Blocking DMV collector: layered wait thresholds + RESOURCE_SEMAPHORE;…
erikdarlingdata Jun 25, 2026
b13b660
Merge pull request #1235 from erikdarlingdata/feature/blocking-dmv-th…
erikdarlingdata Jun 25, 2026
6527c16
#1138 Phase 1: object-growth heatmap + Storage Growth drill (both apps)
erikdarlingdata Jun 25, 2026
14dccfe
#1138 Phase 2: Locking color-scaled wait-type grid + DB selector + in…
erikdarlingdata Jun 25, 2026
d17c741
Merge pull request #1237 from erikdarlingdata/feature/1138-finops-hea…
erikdarlingdata Jun 25, 2026
6940196
Add per-server override for alert delivery mode (#1236)
erikdarlingdata Jun 26, 2026
fbe9780
Merge pull request #1239 from erikdarlingdata/feature/1236-per-server…
erikdarlingdata Jun 26, 2026
d0c45b1
Fix #1240: Lite seeds per-user ignored_wait_types.json on first run
erikdarlingdata Jun 26, 2026
46d6d3c
#1240: also filter ignored waits at display time (wait-stats tab)
erikdarlingdata Jun 26, 2026
7cc265f
Merge pull request #1241 from erikdarlingdata/fix/1240-lite-seed-igno…
erikdarlingdata Jun 26, 2026
77593ee
Add chart click-to-isolate on legend keys and series lines
erikdarlingdata Jun 27, 2026
f9768e3
Fix click-to-isolate restore fidelity + double-click handling (review)
erikdarlingdata Jun 27, 2026
0e9ea71
Merge pull request #1242 from erikdarlingdata/feature/chart-click-iso…
erikdarlingdata Jun 27, 2026
2838139
Make click-to-isolate dim-only (no Y auto-fit)
erikdarlingdata Jun 27, 2026
566f72a
Merge pull request #1243 from erikdarlingdata/feature/isolate-dim-only
erikdarlingdata Jun 27, 2026
1be9013
Release prep 3.1.0: version bump, changelog, README sync, upgrade-man…
erikdarlingdata Jun 27, 2026
6cbc5a5
Advice engine: compose all 56 blocks from facts; strip tool-names/hed…
erikdarlingdata Jun 27, 2026
a0efdb7
Merge pull request #1244 from erikdarlingdata/feature/advice-prose-au…
erikdarlingdata Jun 27, 2026
917e7fb
Complete 3.1.0 CHANGELOG: advice-engine overhaul + full post-3.0.0 re…
erikdarlingdata Jun 27, 2026
f834b4a
Remove lingering GUI-installer references
erikdarlingdata Jun 27, 2026
6383467
Merge remote-tracking branch 'origin/dev' into release/v3.1.0
erikdarlingdata Jun 27, 2026
b7e79e1
Overview lanes: render empty Blocking/Deadlocking lane as a live 0-1 …
erikdarlingdata Jun 28, 2026
0edf673
Merge pull request #1245 from erikdarlingdata/feature/blocking-lane-e…
erikdarlingdata Jun 28, 2026
d2feb63
CHANGELOG: add #1245 (empty Overview Blocking/Deadlocking lane) + set…
erikdarlingdata Jun 28, 2026
59482e3
Installer.Tests: cover the embedded-resource upgrade path (#772 / 3.1…
erikdarlingdata Jun 28, 2026
60923f6
Add "Collection Stopped" alert: warn when collector jobs are disabled
erikdarlingdata Jun 28, 2026
accd03d
Merge pull request #1246 from erikdarlingdata/feature/collection-stop…
erikdarlingdata Jun 28, 2026
186ab81
Docs: document #1246 "Collection Stopped" alert in CHANGELOG + README
erikdarlingdata Jun 28, 2026
a85dbd2
Dashboard: gate the Collection Health tab's collector-stopped check o…
erikdarlingdata Jun 28, 2026
8bd48de
Merge pull request #1247 from erikdarlingdata/feature/collection-stop…
erikdarlingdata Jun 28, 2026
4b4462f
Collection Health: count SKIPPED as a healthy run (no more false STAL…
erikdarlingdata Jun 28, 2026
8692f7e
Merge pull request #1248 from erikdarlingdata/feature/collection-heal…
erikdarlingdata Jun 28, 2026
0cdb12d
CHANGELOG: add #1248 (Collection Health SKIPPED-as-healthy fix)
erikdarlingdata Jun 28, 2026
71c63ea
Merge pull request #1249 from erikdarlingdata/release/v3.1.0
erikdarlingdata Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
* text=auto eol=crlf

# Shell scripts must stay LF (this repo uses Git Bash) — CRLF breaks them.
*.sh text eol=lf

# Explicit binary markers (prevent text mis-detection / corruption):
*.png binary
*.jpg binary
Expand Down
1 change: 0 additions & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ A clear description of the change and why it's being made.
- [ ] Lite Tests
- [ ] SQL collection scripts
- [ ] CLI Installer
- [ ] GUI Installer
- [ ] Documentation

## How was this tested?
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,9 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ steps.version.outputs.VERSION }}
run: |
dotnet tool install -g vpk
# Pin vpk to the Velopack library version (keep in sync with the Velopack
# PackageReference in Dashboard.csproj / PerformanceMonitorLite.csproj).
dotnet tool install -g vpk --version 1.2.0
New-Item -ItemType Directory -Force -Path releases/velopack-dashboard
New-Item -ItemType Directory -Force -Path releases/velopack-lite

Expand Down
102 changes: 102 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

46 changes: 46 additions & 0 deletions Dashboard.Tests/AlertDeliveryModeOverrideTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Performance Monitor Dashboard
* Copyright (c) 2026 Darling Data, LLC
* Licensed under the MIT License - see LICENSE file for details
*/

using System.Text.Json;
using PerformanceMonitor.Notifications;
using PerformanceMonitorDashboard.Models;
using Xunit;

namespace PerformanceMonitorDashboard.Tests;

/// <summary>
/// #1236 per-server alert delivery override persists on <see cref="ServerConnection"/> (servers.json,
/// same WriteIndented options ServerManager uses). A pre-#1236 file with no field inherits the global.
/// The shared precedence rule (<see cref="AlertDeliveryModeResolver"/>) is covered in Lite.Tests.
/// </summary>
public class AlertDeliveryModeOverrideTests
{
private static readonly JsonSerializerOptions s_jsonOptions = new() { WriteIndented = true };

[Fact]
public void Override_RoundTripsThroughJson()
{
var server = new ServerConnection { ServerName = "S1", AlertDeliveryModeOverride = AlertNotificationMode.PerEvent };
var back = JsonSerializer.Deserialize<ServerConnection>(JsonSerializer.Serialize(server, s_jsonOptions), s_jsonOptions);
Assert.Equal(AlertNotificationMode.PerEvent, back!.AlertDeliveryModeOverride);
}

[Fact]
public void NullOverride_RoundTripsAsNull()
{
var server = new ServerConnection { ServerName = "S1", AlertDeliveryModeOverride = null };
var back = JsonSerializer.Deserialize<ServerConnection>(JsonSerializer.Serialize(server, s_jsonOptions), s_jsonOptions);
Assert.Null(back!.AlertDeliveryModeOverride);
}

[Fact]
public void LegacyServersJson_WithoutField_InheritsGlobal()
{
// A servers.json written before #1236 has no AlertDeliveryModeOverride property -> null -> inherit.
var back = JsonSerializer.Deserialize<ServerConnection>("{\"ServerName\":\"S1\",\"DisplayName\":\"S1\"}", s_jsonOptions);
Assert.Null(back!.AlertDeliveryModeOverride);
}
}
80 changes: 80 additions & 0 deletions Dashboard.Tests/AlertMetricClassifierTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using PerformanceMonitor.Common;
using Xunit;

namespace PerformanceMonitorDashboard.Tests;

/// <summary>
/// #1225: the shared metric-name classifier that both apps' Alert History grids and the Dashboard
/// sidebar Alert badge rely on. Locks in the resolution suffix set (Cleared/Resolved/Restored) —
/// the "Restored" cases (Capture/Server Restored) are the ones the old duplicated inline copies
/// missed — plus the critical (Deadlock/Poison) and warning buckets, over the metric names the
/// alert engines actually emit.
/// </summary>
public class AlertMetricClassifierTests
{
[Theory]
[InlineData("Blocking Cleared")]
[InlineData("Deadlocks Cleared")]
[InlineData("Poison Waits Cleared")]
[InlineData("Long-Running Queries Cleared")]
[InlineData("Long-Running Jobs Cleared")]
[InlineData("CPU Resolved")]
[InlineData("TempDB Space Resolved")]
[InlineData("Volume Free Space Resolved")]
[InlineData("Capture Restored")]
[InlineData("Server Restored")]
public void IsResolution_True_ForEveryResolutionNotice(string metric)
{
Assert.True(AlertMetricClassifier.IsResolution(metric));
Assert.False(AlertMetricClassifier.IsWarning(metric)); // a resolution notice is never a warning
}

[Theory]
[InlineData("Blocking Detected")]
[InlineData("Deadlocks Detected")]
[InlineData("High CPU")]
[InlineData("Poison Wait")]
[InlineData("Long-Running Query")]
[InlineData("TempDB Space")]
[InlineData("Volume Free Space")]
[InlineData("Long-Running Job")]
[InlineData("Failed Agent Job")]
[InlineData("Capture Down")]
[InlineData("Server Unreachable")]
public void IsResolution_False_ForActionableAlerts(string metric)
{
Assert.False(AlertMetricClassifier.IsResolution(metric));
}

[Theory]
[InlineData("Deadlocks Detected")]
[InlineData("Poison Wait")]
public void IsCritical_True_ForDeadlockAndPoison(string metric)
{
Assert.True(AlertMetricClassifier.IsCritical(metric));
}

[Theory]
[InlineData("Blocking Detected")]
[InlineData("High CPU")]
[InlineData("Long-Running Query")]
public void IsWarning_True_ForOrdinaryActionableAlerts(string metric)
{
Assert.True(AlertMetricClassifier.IsWarning(metric));
Assert.False(AlertMetricClassifier.IsCritical(metric));
Assert.False(AlertMetricClassifier.IsResolution(metric));
}

[Fact]
public void Classifiers_AreFalse_ForNullOrEmpty()
{
Assert.False(AlertMetricClassifier.IsResolution(null));
Assert.False(AlertMetricClassifier.IsResolution(""));
Assert.False(AlertMetricClassifier.IsCritical(null));
Assert.False(AlertMetricClassifier.IsCritical(""));
// IsWarning is the complement of the two signals, so an absent name defaults to warning —
// matching the long-standing display behavior this classifier replaced.
Assert.True(AlertMetricClassifier.IsWarning(null));
Assert.True(AlertMetricClassifier.IsWarning(""));
}
}
127 changes: 127 additions & 0 deletions Dashboard.Tests/BlockingChainLayoutTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Linq;
using PerformanceMonitor.Common;
using Xunit;

namespace PerformanceMonitorDashboard.Tests;

/// <summary>
/// Pure unit tests for the shared <see cref="BlockingChainLayout"/> — determinism and no-overlap of the
/// left-to-right tree/forest placement. No WPF (a constant measure callback supplies node heights).
/// </summary>
public class BlockingChainLayoutTests
{
private const double H = 100.0;
private static double Measure(BlockingChainNode _) => H;

private static BlockingChainNode Node(int spid, params BlockingChainNode[] children) =>
new() { Spid = spid, Children = children.ToList() };

// A representative forest: a multi-level tree plus a second apex tree.
private static IReadOnlyList<BlockingChainNode> SampleForest() => new[]
{
Node(1,
Node(2, Node(4), Node(5)),
Node(3)),
Node(10,
Node(11),
Node(12, Node(13)))
};

private static IEnumerable<BlockingChainNode> Flatten(IReadOnlyList<BlockingChainNode> roots)
{
foreach (var r in roots)
foreach (var n in FlattenOne(r))
yield return n;
}

private static IEnumerable<BlockingChainNode> FlattenOne(BlockingChainNode n)
{
yield return n;
foreach (var c in n.Children)
foreach (var d in FlattenOne(c))
yield return d;
}

[Fact]
public void Layout_IsDeterministic_AcrossIdenticalForests()
{
var a = SampleForest();
var b = SampleForest();

BlockingChainLayout.Layout(a, Measure);
BlockingChainLayout.Layout(b, Measure);

var fa = Flatten(a).ToList();
var fb = Flatten(b).ToList();
Assert.Equal(fa.Count, fb.Count);
for (int i = 0; i < fa.Count; i++)
{
Assert.Equal(fa[i].Spid, fb[i].Spid);
Assert.Equal(fa[i].X, fb[i].X);
Assert.Equal(fa[i].Y, fb[i].Y);
}
}

[Fact]
public void Layout_PlacesDepthByColumn()
{
var roots = SampleForest();
BlockingChainLayout.Layout(roots, Measure);

double depth0 = BlockingChainLayout.Padding;
double depth1 = BlockingChainLayout.Padding + BlockingChainLayout.HorizontalSpacing;
double depth2 = BlockingChainLayout.Padding + 2 * BlockingChainLayout.HorizontalSpacing;

Assert.Equal(depth0, roots[0].X); // apex
Assert.Equal(depth1, roots[0].Children[0].X); // direct victim
Assert.Equal(depth2, roots[0].Children[0].Children[0].X); // grand-victim
}

[Fact]
public void Layout_ProducesNoOverlappingNodes()
{
var roots = SampleForest();
BlockingChainLayout.Layout(roots, Measure);

var nodes = Flatten(roots).ToList();
const double w = BlockingChainLayout.NodeWidth;
const double eps = 0.5;

for (int i = 0; i < nodes.Count; i++)
{
for (int j = i + 1; j < nodes.Count; j++)
{
var a = nodes[i];
var b = nodes[j];
bool overlapX = a.X < b.X + w - eps && b.X < a.X + w - eps;
bool overlapY = a.Y < b.Y + H - eps && b.Y < a.Y + H - eps;
Assert.False(overlapX && overlapY,
$"SPID {a.Spid} ({a.X},{a.Y}) overlaps SPID {b.Spid} ({b.X},{b.Y})");
}
}
}

[Fact]
public void Layout_ReturnsPositiveExtentCoveringAllNodes()
{
var roots = SampleForest();
var (width, height) = BlockingChainLayout.Layout(roots, Measure);

Assert.True(width > 0);
Assert.True(height > 0);

var nodes = Flatten(roots).ToList();
Assert.True(width >= nodes.Max(n => n.X) + BlockingChainLayout.NodeWidth);
Assert.True(height >= nodes.Max(n => n.Y) + H);
}

[Fact]
public void Layout_EmptyForest_ReturnsPaddingExtent()
{
var (width, height) = BlockingChainLayout.Layout(Array.Empty<BlockingChainNode>(), Measure);
Assert.True(width > 0); // padding only
Assert.True(height > 0);
}
}
Loading
Loading