From 6ee1376673a2079ebdd07d1b605a10caccf3a003 Mon Sep 17 00:00:00 2001 From: tanjiro <56165694+NANDINI-star@users.noreply.github.com> Date: Sat, 14 Jun 2025 06:31:49 +0900 Subject: [PATCH] Add Live Tail Feature to Logs View (#11712) * add live tail feature * improve time interval * auto-refresh every 15 seconds * remove last 1 minute option --- .../src/components/view_logs/index.tsx | 88 ++++++++++++++++--- .../src/components/view_logs/logs_utils.tsx | 12 +-- 2 files changed, 83 insertions(+), 17 deletions(-) diff --git a/ui/litellm-dashboard/src/components/view_logs/index.tsx b/ui/litellm-dashboard/src/components/view_logs/index.tsx index c6654a0b229..b90b46ec013 100644 --- a/ui/litellm-dashboard/src/components/view_logs/index.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/index.tsx @@ -80,7 +80,6 @@ export default function SpendLogsTable({ moment().format("YYYY-MM-DDTHH:mm") ); - // Add these new state variables at the top with other useState declarations const [isCustomDate, setIsCustomDate] = useState(false); const [quickSelectOpen, setQuickSelectOpen] = useState(false); const [tempTeamId, setTempTeamId] = useState(""); @@ -101,6 +100,13 @@ export default function SpendLogsTable({ const queryClient = useQueryClient(); + const [isLiveTail, setIsLiveTail] = useState(true); // Default to true + + const [selectedTimeInterval, setSelectedTimeInterval] = useState<{ value: number; unit: string }>({ + value: 24, + unit: "hours" + }); + useEffect(() => { const fetchKeyInfo = async () => { if (selectedKeyIdInfoView && accessToken) { @@ -152,6 +158,23 @@ export default function SpendLogsTable({ } }, [userRole]); + const LiveTailControls = () => { + return ( +
+ +
+ ); + }; + const logs = useQuery({ queryKey: [ "logs", @@ -222,7 +245,7 @@ export default function SpendLogsTable({ return response; }, enabled: !!accessToken && !!token && !!userRole && !!userID && activeTab === "request logs", - refetchInterval: 5000, + refetchInterval: isLiveTail ? 15000 : false, refetchIntervalInBackground: true, }); @@ -440,6 +463,32 @@ export default function SpendLogsTable({ ); } + const formatTimeUnit = (value: number, unit: string) => { + if (value === 1) { + if (unit === 'minutes') return 'minute'; + if (unit === 'hours') return 'hour'; + if (unit === 'days') return 'day'; + } + return unit; + }; + + const quickSelectOptions = [ + { label: "Last 15 Minutes", value: 15, unit: "minutes" }, + { label: "Last Hour", value: 1, unit: "hours" }, + { label: "Last 4 Hours", value: 4, unit: "hours" }, + { label: "Last 24 Hours", value: 24, unit: "hours" }, + { label: "Last 7 Days", value: 7, unit: "days" }, + ]; + + const selectedOption = quickSelectOptions.find( + (option) => + option.value === selectedTimeInterval.value && option.unit === selectedTimeInterval.unit + ); + + const displayLabel = isCustomDate + ? getTimeRangeDisplay(isCustomDate, startTime, endTime) + : selectedOption?.label; + return (
setActiveTab(index === 0 ? "request logs" : "audit logs")}> @@ -531,23 +580,17 @@ export default function SpendLogsTable({ d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /> - {getTimeRangeDisplay(isCustomDate, startTime, endTime)} + {displayLabel} {quickSelectOpen && (
- {[ - { label: "Last 15 Minutes", value: 15, unit: "minutes" }, - { label: "Last Hour", value: 1, unit: "hours" }, - { label: "Last 4 Hours", value: 4, unit: "hours" }, - { label: "Last 24 Hours", value: 24, unit: "hours" }, - { label: "Last 7 Days", value: 7, unit: "days" }, - ].map((option) => ( + {quickSelectOptions.map((option) => (
+ +
+ {isLiveTail && ( +
+
+ + + + + Auto-refreshing every 15 seconds + +
+ +
+ )} = 0 && diffMinutes < 2) return 'Last 1 Minute'; + if (diffMinutes >= 2 && diffMinutes < 16) return 'Last 15 Minutes'; + if (diffMinutes >= 16 && diffMinutes < 61) return 'Last Hour'; const diffHours = now.diff(start, 'hours'); - if (diffHours <= 4) return 'Last 4 Hours'; - if (diffHours <= 24) return 'Last 24 Hours'; - if (diffHours <= 168) return 'Last 7 Days'; + if (diffHours >= 1 && diffHours < 5) return 'Last 4 Hours'; + if (diffHours >= 5 && diffHours < 25) return 'Last 24 Hours'; + if (diffHours >= 25 && diffHours < 169) return 'Last 7 Days'; return `${start.format('MMM D')} - ${now.format('MMM D')}`; }; \ No newline at end of file