diff --git a/Lite/Controls/ServerTab.xaml b/Lite/Controls/ServerTab.xaml
index 144f662a..54c51ed7 100644
--- a/Lite/Controls/ServerTab.xaml
+++ b/Lite/Controls/ServerTab.xaml
@@ -971,6 +971,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Lite/Controls/ServerTab.xaml.cs b/Lite/Controls/ServerTab.xaml.cs
index 6c0c7cdd..f89a517b 100644
--- a/Lite/Controls/ServerTab.xaml.cs
+++ b/Lite/Controls/ServerTab.xaml.cs
@@ -58,6 +58,7 @@ public partial class ServerTab : UserControl
private DataGridFilterManager? _databaseConfigFilterMgr;
private DataGridFilterManager? _dbScopedConfigFilterMgr;
private DataGridFilterManager? _traceFlagsFilterMgr;
+ private DataGridFilterManager? _collectionHealthFilterMgr;
private static readonly HashSet _defaultPerfmonCounters = new(StringComparer.OrdinalIgnoreCase)
{
@@ -444,6 +445,7 @@ private async System.Threading.Tasks.Task RefreshAllDataAsync()
var databaseScopedConfigTask = SafeQueryAsync(() => _dataService.GetLatestDatabaseScopedConfigAsync(_serverId));
var traceFlagsTask = SafeQueryAsync(() => _dataService.GetLatestTraceFlagsAsync(_serverId));
var runningJobsTask = SafeQueryAsync(() => _dataService.GetRunningJobsAsync(_serverId));
+ var collectionHealthTask = SafeQueryAsync(() => _dataService.GetCollectionHealthAsync(_serverId));
/* Core data tasks */
await System.Threading.Tasks.Task.WhenAll(
snapshotsTask, cpuTask, memoryTask, memoryTrendTask,
@@ -451,7 +453,7 @@ await System.Threading.Tasks.Task.WhenAll(
deadlockTask, blockedProcessTask, waitTypesTask, perfmonCountersTask,
queryStoreTask, memoryGrantTrendTask,
serverConfigTask, databaseConfigTask, databaseScopedConfigTask, traceFlagsTask,
- runningJobsTask);
+ runningJobsTask, collectionHealthTask);
/* Trend chart tasks - run separately so failures don't kill the whole refresh */
var blockingTrendTask = SafeQueryAsync(() => _dataService.GetBlockingTrendAsync(_serverId, hoursBack, fromDate, toDate));
@@ -488,6 +490,7 @@ await System.Threading.Tasks.Task.WhenAll(
_dbScopedConfigFilterMgr!.UpdateData(databaseScopedConfigTask.Result);
_traceFlagsFilterMgr!.UpdateData(traceFlagsTask.Result);
_runningJobsFilterMgr!.UpdateData(runningJobsTask.Result);
+ _collectionHealthFilterMgr!.UpdateData(collectionHealthTask.Result);
/* Update memory summary */
UpdateMemorySummary(memoryTask.Result);
@@ -1864,6 +1867,7 @@ private void InitializeFilterManagers()
_databaseConfigFilterMgr = new DataGridFilterManager(DatabaseConfigGrid);
_dbScopedConfigFilterMgr = new DataGridFilterManager(DatabaseScopedConfigGrid);
_traceFlagsFilterMgr = new DataGridFilterManager(TraceFlagsGrid);
+ _collectionHealthFilterMgr = new DataGridFilterManager(CollectionHealthGrid);
_filterManagers[QuerySnapshotsGrid] = _querySnapshotsFilterMgr;
_filterManagers[QueryStatsGrid] = _queryStatsFilterMgr;
@@ -1876,6 +1880,7 @@ private void InitializeFilterManagers()
_filterManagers[DatabaseConfigGrid] = _databaseConfigFilterMgr;
_filterManagers[DatabaseScopedConfigGrid] = _dbScopedConfigFilterMgr;
_filterManagers[TraceFlagsGrid] = _traceFlagsFilterMgr;
+ _filterManagers[CollectionHealthGrid] = _collectionHealthFilterMgr;
}
private void EnsureFilterPopup()
diff --git a/Lite/Services/LocalDataService.CollectionHealth.cs b/Lite/Services/LocalDataService.CollectionHealth.cs
index 46c85a10..5ba3a7a3 100644
--- a/Lite/Services/LocalDataService.CollectionHealth.cs
+++ b/Lite/Services/LocalDataService.CollectionHealth.cs
@@ -94,5 +94,13 @@ public string HealthStatus
public string AvgDurationFormatted => AvgDurationMs < 1000
? $"{AvgDurationMs:F0} ms"
: $"{AvgDurationMs / 1000:F1} s";
+
+ public string LastSuccessFormatted => LastSuccessTime.HasValue
+ ? LastSuccessTime.Value.ToLocalTime().ToString("MM/dd HH:mm:ss")
+ : "Never";
+
+ public string LastRunFormatted => LastRunTime.HasValue
+ ? LastRunTime.Value.ToLocalTime().ToString("MM/dd HH:mm:ss")
+ : "Never";
}