From 574332ad8532e9e73bf0694fecddf8288b76690b Mon Sep 17 00:00:00 2001 From: Erik Darling <2136037+erikdarlingdata@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:59:20 -0400 Subject: [PATCH] Add drill-down to Overview, Locking, and remaining Memory charts Extends drill-down coverage to: - Overview: all 4 Resource Overview charts (CPU, Memory, I/O, Waits) - Locking: Lock Wait Stats, Current Waits Duration/Blocked - Memory: Grant Sizing, Grant Activity, Clerks, Pressure Events Also fixes navigation to Active Queries (was Performance Trends). Skipped Resource Metrics detail charts and Query Performance Trends pending #689/#691 view consolidation. Co-Authored-By: Claude Opus 4.6 (1M context) --- Dashboard/ServerTab.xaml.cs | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/Dashboard/ServerTab.xaml.cs b/Dashboard/ServerTab.xaml.cs index 0a47dfe..af1aebe 100644 --- a/Dashboard/ServerTab.xaml.cs +++ b/Dashboard/ServerTab.xaml.cs @@ -522,13 +522,16 @@ e.OriginalSource is not System.Windows.Controls.TextBox && private void SetupChartContextMenus() { // Resource Overview charts - Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewCpuChart, "CPU_Utilization", "collect.cpu_utilization_stats"); - Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewMemoryChart, "Memory_Utilization", "collect.memory_stats"); - Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewIoChart, "IO_Latency", "collect.file_io_stats"); - Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewWaitChart, "Wait_Stats", "collect.wait_stats"); + var overviewCpuMenu = Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewCpuChart, "CPU_Utilization", "collect.cpu_utilization_stats"); + AddChartDrillDownMenuItem(ResourceOverviewCpuChart, overviewCpuMenu, _resourceOverviewCpuHover, "Show Active Queries at This Time", OnQueryDrillDown); + var overviewMemMenu = Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewMemoryChart, "Memory_Utilization", "collect.memory_stats"); + AddChartDrillDownMenuItem(ResourceOverviewMemoryChart, overviewMemMenu, _resourceOverviewMemoryHover, "Show Active Queries at This Time", OnQueryDrillDown); + var overviewIoMenu = Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewIoChart, "IO_Latency", "collect.file_io_stats"); + AddChartDrillDownMenuItem(ResourceOverviewIoChart, overviewIoMenu, _resourceOverviewIoHover, "Show Active Queries at This Time", OnQueryDrillDown); + var overviewWaitMenu = Helpers.TabHelpers.SetupChartContextMenu(ResourceOverviewWaitChart, "Wait_Stats", "collect.wait_stats"); + AddChartDrillDownMenuItem(ResourceOverviewWaitChart, overviewWaitMenu, _resourceOverviewWaitHover, "Show Active Queries at This Time", OnQueryDrillDown); // Blocking Stats charts - Helpers.TabHelpers.SetupChartContextMenu(LockWaitStatsChart, "Lock_Wait_Stats", "collect.wait_stats"); var blockingEventsMenu = Helpers.TabHelpers.SetupChartContextMenu(BlockingStatsBlockingEventsChart, "Blocking_Events", "collect.blocking_deadlock_stats"); AddChartDrillDownMenuItem(BlockingStatsBlockingEventsChart, blockingEventsMenu, _blockingEventsHover, "Show Blocking at This Time", OnBlockingChartDrillDown); var blockingDurationMenu = Helpers.TabHelpers.SetupChartContextMenu(BlockingStatsDurationChart, "Blocking_Duration", "collect.blocking_deadlock_stats"); @@ -538,9 +541,15 @@ private void SetupChartContextMenus() var deadlockWaitMenu = Helpers.TabHelpers.SetupChartContextMenu(BlockingStatsDeadlockWaitTimeChart, "Deadlock_Wait_Time", "collect.blocking_deadlock_stats"); AddChartDrillDownMenuItem(BlockingStatsDeadlockWaitTimeChart, deadlockWaitMenu, _deadlockWaitTimeHover, "Show Deadlocks at This Time", OnDeadlockChartDrillDown); + // Lock Wait Stats chart + var lockWaitMenu = Helpers.TabHelpers.SetupChartContextMenu(LockWaitStatsChart, "Lock_Wait_Stats", "collect.wait_stats"); + AddChartDrillDownMenuItem(LockWaitStatsChart, lockWaitMenu, _lockWaitStatsHover, "Show Blocking at This Time", OnBlockingChartDrillDown); + // Current Waits charts - Helpers.TabHelpers.SetupChartContextMenu(CurrentWaitsDurationChart, "Current_Waits_Duration", "collect.waiting_tasks"); - Helpers.TabHelpers.SetupChartContextMenu(CurrentWaitsBlockedChart, "Current_Waits_Blocked", "collect.waiting_tasks"); + var cwDurationMenu = Helpers.TabHelpers.SetupChartContextMenu(CurrentWaitsDurationChart, "Current_Waits_Duration", "collect.waiting_tasks"); + AddChartDrillDownMenuItem(CurrentWaitsDurationChart, cwDurationMenu, _currentWaitsDurationHover, "Show Active Queries at This Time", OnQueryDrillDown); + var cwBlockedMenu = Helpers.TabHelpers.SetupChartContextMenu(CurrentWaitsBlockedChart, "Current_Waits_Blocked", "collect.waiting_tasks"); + AddChartDrillDownMenuItem(CurrentWaitsBlockedChart, cwBlockedMenu, _currentWaitsBlockedHover, "Show Active Queries at This Time", OnQueryDrillDown); // Query Performance Trends charts now handled by QueryPerformanceContent UserControl @@ -1508,6 +1517,20 @@ private async void OnDeadlockChartDrillDown(DateTime time) await RefreshLockingTabAsync(); } + private async void OnQueryDrillDown(DateTime time) + { + var from = time.AddMinutes(-30); + var to = time.AddMinutes(30); + SetDrillDownGlobalRange(from, to); + + QueriesTabItem.IsSelected = true; + PerformanceTab.SelectSubTab(1); // Active Queries + PerformanceTab.SetTimeRange(0, from, to); + PerformanceTab.IsRefreshing = true; + try { await RefreshQueriesTabAsync(); } + finally { PerformanceTab.IsRefreshing = false; } + } + private async void OnChildChartDrillDown(string chartType, DateTime time) { var from = time.AddMinutes(-30);