diff --git a/ui/litellm-dashboard/src/components/PerformanceDashboard/PerformanceDashboardView.tsx b/ui/litellm-dashboard/src/components/PerformanceDashboard/PerformanceDashboardView.tsx index 07f7082b27b..11d9e29d85d 100644 --- a/ui/litellm-dashboard/src/components/PerformanceDashboard/PerformanceDashboardView.tsx +++ b/ui/litellm-dashboard/src/components/PerformanceDashboard/PerformanceDashboardView.tsx @@ -1,11 +1,12 @@ "use client"; import React, { useCallback, useRef, useState, useEffect } from "react"; -import { Collapse, Select, Spin, Tabs, Tag } from "antd"; +import { Collapse, Select, Spin, Tabs, Tag, Tooltip } from "antd"; import { CheckCircleOutlined, CloseCircleOutlined, DashboardOutlined, + InfoCircleOutlined, PlayCircleOutlined, } from "@ant-design/icons"; import { LineChart, Card } from "@tremor/react"; @@ -68,28 +69,50 @@ async function runTestRequest(accessToken: string, model: string, messages: { ro }; } -// Postman-style waterfall row -function WaterfallRow({ label, startMs, durationMs, totalMs, color }: { - label: string; +// OTEL-style trace span row +function WaterfallRow({ label, startMs, durationMs, totalMs, color, tooltip }: { + label: React.ReactNode; startMs: number; durationMs: number; totalMs: number; color: string; + tooltip?: string; }) { const startPct = totalMs > 0 ? (startMs / totalMs) * 100 : 0; const widthPct = totalMs > 0 ? (durationMs / totalMs) * 100 : 0; + const isWide = widthPct > 12; return ( -
Response Time Breakdown
-| Total | -- - | -{testResult.wallMs}ms | -
Response Time Breakdown
+ + {/* Time axis */} +| Total | +
+
+ {[25, 50, 75].map((pct) => (
+
+ ))}
+
+
+ |
+ {testResult.wallMs}ms | +
- LiteLLM overhead is {overheadPctTest}% of total response time + LiteLLM overhead:{" "} + 20 ? "text-orange-500 font-medium" : "text-gray-600 font-medium"}> + {overheadPctTest}% of total + {overheadPctTest > 20 && — higher than expected} + {testResult.overheadMs === null && ( + — overhead header not returned (check proxy version) + )}
)}