You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Split out of #2475, which named it but is not the place to fix it.
The web dashboard's per-server page now carries twelve sub-tabs reaching 61 of the service's 82 /api/read/* handlers (#2477). Three groups of viewer data remain unreachable from a browser, and only one of them is web work:
(c) desktop-only by design — the plan viewer, query heatmap rendering, block-chain reconstruction, the interactive deadlock graph, and the grids' filter/export/repro/drill-down affordances. A standing product boundary, now stated in docs/uat-onboarding.md §3.4.
(b) — this issue. Data the WPF viewer reads that has no /api/read endpoint at all. No amount of front-end work reaches it, and it is invisible to the MCP surface too, so an agent asking about it gets nothing.
The list
Every one of these is a projection over data the store already holds — the viewer opens no connection to a monitored server and reads the same Postgres store the MCP tools do, so these are endpoints, not collectors. None needs new collection.
The one member of the system_health parse-on-read family with no get_health_parser_* twin — the other eight all have one, so this reads as an omission rather than a decision.
get_collection_health serves the 7-day per-collector rollup; the raw per-run log has no read. This is also what Duration Trends charts, so one endpoint covers two tabs.
get_daily_summary serves ONE date. The range read behind the month calendar has no endpoint, so the web page can only ever show today.
Adjacent, same category, lower priority
Several viewer charts are the trend form of a read that ships only as a snapshot. Same "endpoint over collected data" shape, and each would upgrade a tab #2477 currently ships as partial:
GetCpuSchedulerTrendAsync, GetPlanCacheTrendAsync, GetFileIoThroughputTrendAsync, GetTempDbFileIoTrendAsync, GetLatchStatsTrendAsync / GetSpinlockStatsTrendAsync, GetMemoryClerkTrendsByTypesAsync, and the session-count trend behind Session Stats.
And two are multi-series forms of reads that exist as single-series: GetWaitStatsTrendsByTypesAsync (vs get_wait_trend, one wait type) and GetPerfmonTrendsByCountersAsync (vs get_perfmon_trend, one counter). #2477 ships single-select pickers for both, which is a real reduction: you cannot compare two waits on one chart.
Why it is worth doing
These are not only web gaps. /api/read/* is machine-derived from the MCP read catalog, so an absent endpoint is absent from both surfaces — an agent asked "was this server blocking more last Tuesday than today" has get_blocking and get_blocking_trend but no duration distribution, and cannot see the collection log at all. The viewer is currently the only way to that data, on a Windows desktop.
Suggested order, by what a UAT user asks for first: the collection log (two tabs, and it is the diagnostic people reach for when collection looks wrong), then Blocking Stats and Current Waits, then Significant Waits (a one-line omission in an otherwise complete family), then the Performance Trends siblings, then Query Store Regressions and the heatmap.
Split out of #2475, which named it but is not the place to fix it.
The web dashboard's per-server page now carries twelve sub-tabs reaching 61 of the service's 82
/api/read/*handlers (#2477). Three groups of viewer data remain unreachable from a browser, and only one of them is web work:get_pg_*reads (blocked by the fleet payload carrying no target-engine discriminator),get_database_scoped_config(a nesteddatabases[].settings[]the table renderer cannot draw),get_store_metrics(store-wide, no per-server home). Front-end and payload work, tracked on The web dashboard serves 82 reads and shows 23: the server page is 7 panels where the viewer has 65 tabs #2475.docs/uat-onboarding.md§3.4./api/readendpoint at all. No amount of front-end work reaches it, and it is invisible to the MCP surface too, so an agent asking about it gets nothing.The list
Every one of these is a projection over data the store already holds — the viewer opens no connection to a monitored server and reads the same Postgres store the MCP tools do, so these are endpoints, not collectors. None needs new collection.
GetQueryStoreRegressionsAsync(ViewerDataService.QueryStoreRegressions.cs)query_store_stats. The only #2477 tab that is entirely unreachable rather than reduced.GetQueryHeatmapAsync(ViewerDataService.QueryHeatmap.cs)GetProcedureDurationTrendAsync,GetQueryStoreDurationTrendAsync,GetExecutionCountTrendAsync(ViewerDataService.QueryTrends.cs)get_query_duration_trendexists and ships; these three are its missing siblings, same shape.GetBlockingDurationStatsAsync,GetDeadlockSeverityStatsAsync(ViewerDataService.BlockingStats.cs)get_blocking/get_deadlocksalready return row-by-row.GetLockWaitTrendAsync(ViewerDataService.BlockingTrends.cs)get_wait_trendcan chart one LCK type; this is the aggregate lane.GetWaitingTaskTrendAsync,GetBlockedSessionTrendAsync(ViewerDataService.BlockingTrends.cs)get_waiting_tasksgives the snapshot rows, never the trend.GetSignificantWaitsAsync(ViewerDataService.SystemEvents.cs)system_healthparse-on-read family with noget_health_parser_*twin — the other eight all have one, so this reads as an omission rather than a decision.GetRecentCollectionLogAsync(ViewerDataService.CollectionHealth.cs)get_collection_healthserves the 7-day per-collector rollup; the raw per-run log has no read. This is also what Duration Trends charts, so one endpoint covers two tabs.GetDailySummaryRangeAsync(ViewerDataService.DailySummary.cs)get_daily_summaryserves ONE date. The range read behind the month calendar has no endpoint, so the web page can only ever show today.Adjacent, same category, lower priority
Several viewer charts are the trend form of a read that ships only as a snapshot. Same "endpoint over collected data" shape, and each would upgrade a tab #2477 currently ships as partial:
GetCpuSchedulerTrendAsync,GetPlanCacheTrendAsync,GetFileIoThroughputTrendAsync,GetTempDbFileIoTrendAsync,GetLatchStatsTrendAsync/GetSpinlockStatsTrendAsync,GetMemoryClerkTrendsByTypesAsync, and the session-count trend behind Session Stats.And two are multi-series forms of reads that exist as single-series:
GetWaitStatsTrendsByTypesAsync(vsget_wait_trend, one wait type) andGetPerfmonTrendsByCountersAsync(vsget_perfmon_trend, one counter). #2477 ships single-select pickers for both, which is a real reduction: you cannot compare two waits on one chart.Why it is worth doing
These are not only web gaps.
/api/read/*is machine-derived from the MCP read catalog, so an absent endpoint is absent from both surfaces — an agent asked "was this server blocking more last Tuesday than today" hasget_blockingandget_blocking_trendbut no duration distribution, and cannot see the collection log at all. The viewer is currently the only way to that data, on a Windows desktop.Suggested order, by what a UAT user asks for first: the collection log (two tabs, and it is the diagnostic people reach for when collection looks wrong), then Blocking Stats and Current Waits, then Significant Waits (a one-line omission in an otherwise complete family), then the Performance Trends siblings, then Query Store Regressions and the heatmap.