diff --git a/frontend/src/components/debug/ResourceDebugOverlay.tsx b/frontend/src/components/debug/ResourceDebugOverlay.tsx index b37eb453..da09a6c2 100644 --- a/frontend/src/components/debug/ResourceDebugOverlay.tsx +++ b/frontend/src/components/debug/ResourceDebugOverlay.tsx @@ -137,13 +137,18 @@ export default function ResourceDebugOverlay({ enabled }: ResourceDebugOverlayPr }); if (response.ok) { - const data = await response.json(); + const responseData = await response.json(); + // Extract data from unified API response format: {success: true, data: {...}} + const data = responseData?.data || responseData; // Only log in debug mode to reduce console noise if (import.meta.env.DEV) { console.debug('Fetched metrics for request:', requestId, data); } - metricsRef.current = [...metricsRef.current, data]; - setMetrics([...metricsRef.current]); + // Validate data structure before adding + if (data && typeof data === 'object' && data.request_id) { + metricsRef.current = [...metricsRef.current, data]; + setMetrics([...metricsRef.current]); + } } else if (response.status === 401) { // Token might be expired - try to refresh and retry once try { @@ -160,9 +165,14 @@ export default function ResourceDebugOverlay({ enabled }: ResourceDebugOverlayPr credentials: 'include', }); if (retryResponse.ok) { - const data = await retryResponse.json(); - metricsRef.current = [...metricsRef.current, data]; - setMetrics([...metricsRef.current]); + const responseData = await retryResponse.json(); + // Extract data from unified API response format: {success: true, data: {...}} + const data = responseData?.data || responseData; + // Validate data structure before adding + if (data && typeof data === 'object' && data.request_id) { + metricsRef.current = [...metricsRef.current, data]; + setMetrics([...metricsRef.current]); + } return; } } @@ -191,14 +201,23 @@ export default function ResourceDebugOverlay({ enabled }: ResourceDebugOverlayPr // Calculate page load time const pageLoadTime = pageLoadStart ? performance.now() - pageLoadStart : null; - // Calculate totals - const totals = metrics.reduce((acc, m) => ({ - elapsed_time_ms: acc.elapsed_time_ms + m.elapsed_time_ms, - cpu_total_ms: acc.cpu_total_ms + m.cpu.total_time_ms, - memory_delta_mb: acc.memory_delta_mb + m.memory.delta_mb, - io_read_mb: acc.io_read_mb + m.io.read_mb, - io_write_mb: acc.io_write_mb + m.io.write_mb, - }), { + // Calculate totals - with null safety checks + const totals = metrics.reduce((acc, m) => { + // Safely access nested properties with defaults + const elapsed = m?.elapsed_time_ms || 0; + const cpuTotal = m?.cpu?.total_time_ms || 0; + const memoryDelta = m?.memory?.delta_mb || 0; + const ioRead = m?.io?.read_mb || 0; + const ioWrite = m?.io?.write_mb || 0; + + return { + elapsed_time_ms: acc.elapsed_time_ms + elapsed, + cpu_total_ms: acc.cpu_total_ms + cpuTotal, + memory_delta_mb: acc.memory_delta_mb + memoryDelta, + io_read_mb: acc.io_read_mb + ioRead, + io_write_mb: acc.io_write_mb + ioWrite, + }; + }, { elapsed_time_ms: 0, cpu_total_ms: 0, memory_delta_mb: 0, @@ -206,25 +225,31 @@ export default function ResourceDebugOverlay({ enabled }: ResourceDebugOverlayPr io_write_mb: 0, }); - // Find the slowest request + // Find the slowest request - with null safety const slowestRequest = metrics.length > 0 - ? metrics.reduce((prev, current) => - (current.elapsed_time_ms > prev.elapsed_time_ms) ? current : prev - ) + ? metrics.reduce((prev, current) => { + const prevTime = prev?.elapsed_time_ms || 0; + const currentTime = current?.elapsed_time_ms || 0; + return (currentTime > prevTime) ? current : prev; + }) : null; - // Find the request with highest CPU usage + // Find the request with highest CPU usage - with null safety const highestCpuRequest = metrics.length > 0 - ? metrics.reduce((prev, current) => - (current.cpu.total_time_ms > prev.cpu.total_time_ms) ? current : prev - ) + ? metrics.reduce((prev, current) => { + const prevCpu = prev?.cpu?.total_time_ms || 0; + const currentCpu = current?.cpu?.total_time_ms || 0; + return (currentCpu > prevCpu) ? current : prev; + }) : null; - // Find the request with highest memory usage + // Find the request with highest memory usage - with null safety const highestMemoryRequest = metrics.length > 0 - ? metrics.reduce((prev, current) => - (current.memory.delta_mb > prev.memory.delta_mb) ? current : prev - ) + ? metrics.reduce((prev, current) => { + const prevMemory = prev?.memory?.delta_mb || 0; + const currentMemory = current?.memory?.delta_mb || 0; + return (currentMemory > prevMemory) ? current : prev; + }) : null; if (!enabled || !isAdminOrDeveloper) return null; @@ -272,23 +297,23 @@ export default function ResourceDebugOverlay({ enabled }: ResourceDebugOverlayPr