import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useQuery } from '@tanstack/react-query'; import { ipc } from '@/ipc/manager'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useToast } from '@/components/ui/use-toast'; import { StatCard } from '@/components/usage/StatCard'; import { TrafficLogTable } from './TrafficLogTable'; import { Loader2, Zap, Clock, AlertTriangle, Network, HardDrive } from 'lucide-react'; export const MonitorTab: React.FC = () => { const { t } = useTranslation(); const { toast } = useToast(); const [direction, setDirection] = useState('all'); const { data: metricsData, isLoading: metricsLoading } = useQuery({ queryKey: ['proxyAdvanced', 'metrics'], queryFn: () => ipc.client.proxyAdvanced.getProxyMetrics(), refetchInterval: 30000, }); const { data: cbData, isLoading: cbLoading } = useQuery({ queryKey: ['proxyAdvanced', 'circuitBreaker'], queryFn: () => ipc.client.proxyAdvanced.getCircuitBreakerStatus(), refetchInterval: 30000, }); const { data: logsData, isLoading: logsLoading } = useQuery({ queryKey: ['proxyAdvanced', 'logs', direction], queryFn: () => ipc.client.proxyAdvanced.getRecentTrafficLogs({ limit: 50, direction: direction === 'all' ? undefined : direction, }), refetchInterval: 30000, }); const { data: statsData } = useQuery({ queryKey: ['proxyAdvanced', 'stats'], queryFn: () => ipc.client.proxyAdvanced.getTrafficLogStats(), refetchInterval: 30000, }); const metrics = metricsData?.success ? metricsData.data : undefined; const circuitBreakers = cbData?.success ? cbData.data : undefined; const logs = logsData?.success ? (logsData.data || []).map((log) => ({ ...log, model: log.metadata?.model as string | undefined, tokensPrompt: log.metadata?.tokensPrompt as number | undefined, tokensCompletion: log.metadata?.tokensCompletion as number | undefined, tokensTotal: ((log.metadata?.tokensPrompt as number) || 0) + ((log.metadata?.tokensCompletion as number) || 0) || undefined, })) : []; const stats = statsData?.success ? statsData.data : undefined; const handleExport = async (format: 'json' | 'csv') => { const result = await ipc.client.proxyAdvanced.exportTrafficLogs({ format }); if (result.success && result.data) { navigator.clipboard.writeText(result.data); toast({ title: t('proxy.advanced.tools.copyConfig') }); } else { toast({ title: t('common.error'), description: result.error }); } }; const getCircuitBadgeVariant = (state: string): React.ComponentProps['variant'] => { if (state === 'closed') return 'default'; if (state === 'open') return 'destructive'; return 'secondary'; }; return (
{/* Metrics */}
{/* Circuit Breakers */}

{t('proxy.advanced.circuitBreaker.title')}

{cbLoading ? (
) : !circuitBreakers ? (

No data

) : (
{Object.entries(circuitBreakers.states).map(([api, state]) => (
{api} {state.state}
{t('proxy.advanced.circuitBreaker.failures')}: {state.failures}
{state.lastFailure && (
{t('proxy.advanced.circuitBreaker.lastFailure')}:{' '} {new Date(state.lastFailure).toLocaleString()}
)}
))}
)}
{/* Traffic Logs */}

{t('proxy.advanced.trafficLog.title')}

{stats && Total: {stats.total}}
); };