import { useAuth } from "@/hooks/useAuth";
import { useLocation } from "wouter";
import { useEffect, useState } from "react";
import { useQuery } from "@tanstack/react-query";
import Header from "@/components/layout/Header";
import Sidebar from "@/components/layout/Sidebar";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Progress } from "@/components/ui/progress";
import {
BarChart,
Bar,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
LineChart,
Line,
AreaChart,
Area
} from "recharts";
import {
Activity,
Server,
Database,
Zap,
Clock,
BarChart3,
AlertTriangle,
CheckCircle,
Users,
Mic,
Brain,
TrendingUp,
Monitor,
Cpu,
HardDrive
} from "lucide-react";
export default function SystemMonitoringPage() {
const { user, isLoading } = useAuth();
const [, setLocation] = useLocation();
const [timeframe, setTimeframe] = useState<'day' | 'week' | 'month'>('day');
const [refreshInterval, setRefreshInterval] = useState(30000); // 30 seconds
useEffect(() => {
if (!isLoading && !user) {
setLocation("/login");
}
}, [user, isLoading, setLocation]);
useEffect(() => {
if (user && (user.role !== "admin" && user.role !== "pro")) {
setLocation("/dashboard");
}
}, [user, setLocation]);
// Real-time system metrics
const { data: systemMetrics, isLoading: metricsLoading } = useQuery({
queryKey: ["/api/admin/metrics"],
refetchInterval: refreshInterval,
enabled: user?.role === "admin"
});
// Performance data
const { data: performanceData, isLoading: performanceLoading } = useQuery({
queryKey: ["/api/admin/performance"],
refetchInterval: refreshInterval,
enabled: user?.role === "admin" || user?.role === "pro"
});
// Usage analytics
const { data: analyticsData, isLoading: analyticsLoading } = useQuery({
queryKey: ["/api/admin/analytics", timeframe],
refetchInterval: 60000, // 1 minute for analytics
enabled: user?.role === "admin"
});
// Health check
const { data: healthCheck, isLoading: healthLoading } = useQuery({
queryKey: ["/health"],
refetchInterval: 15000, // 15 seconds
enabled: true
});
if (isLoading) {
return (
Loading monitoring dashboard...
);
}
if (!user || (user.role !== "admin" && user.role !== "pro")) {
return null;
}
const getStatusColor = (status: string) => {
switch (status) {
case 'healthy': return 'text-green-600 bg-green-100 dark:bg-green-900/20 dark:text-green-400';
case 'degraded': return 'text-yellow-600 bg-yellow-100 dark:bg-yellow-900/20 dark:text-yellow-400';
case 'unhealthy': return 'text-red-600 bg-red-100 dark:bg-red-900/20 dark:text-red-400';
default: return 'text-gray-600 bg-gray-100 dark:bg-gray-900/20 dark:text-gray-400';
}
};
const formatUptime = (seconds: number) => {
const days = Math.floor(seconds / 86400);
const hours = Math.floor((seconds % 86400) / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
return `${days}d ${hours}h ${minutes}m`;
};
const formatBytes = (bytes: number) => {
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
if (bytes === 0) return '0 Bytes';
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i];
};
return (
{/* Header */}
System Monitoring
Real-time system health and performance metrics
Auto-refresh
{/* System Health Overview */}
System Status
{healthCheck?.status === 'healthy' ? (
) : (
)}
{healthCheck?.status || 'Unknown'}
Uptime
{healthCheck?.metrics?.uptime ? formatUptime(healthCheck.metrics.uptime) : 'N/A'}
Response Time
{performanceData?.responseTime ? `${Math.round(performanceData.responseTime)}ms` : 'N/A'}
Memory Usage
{healthCheck?.metrics?.memory ? formatBytes(healthCheck.metrics.memory.heapUsed) : 'N/A'}
{/* Services Status */}
Service Health
{healthCheck?.services && Object.entries(healthCheck.services).map(([service, status]) => (
{service}
{status as string}
))}
Performance
Analytics
System Resources
{/* Performance Metrics */}
Performance Overview
Response Time
{performanceData?.responseTime ? `${Math.round(performanceData.responseTime)}ms` : 'N/A'}
Error Rate
{performanceData?.errorRate ? `${performanceData.errorRate.toFixed(2)}%` : 'N/A'}
Throughput
{performanceData?.throughput ? `${Math.round(performanceData.throughput)} req/s` : 'N/A'}
{/* Memory Usage Chart */}
Memory Usage
{healthCheck?.metrics?.memory && (
Heap Used
{formatBytes(healthCheck.metrics.memory.heapUsed)}
Heap Total
{formatBytes(healthCheck.metrics.memory.heapTotal)}
External
{formatBytes(healthCheck.metrics.memory.external)}
RSS
{formatBytes(healthCheck.metrics.memory.rss)}
)}
{user.role === "admin" && (
<>
Usage Analytics
Total Users
{analyticsData?.totalUsers || 0}
Voice Commands
{analyticsData?.voiceCommands || 0}
AI Interactions
{analyticsData?.aiInteractions || 0}
Tasks Created
{analyticsData?.totalTasks || 0}
{analyticsData?.chartData && (
Usage Trends
)}
>
)}
Cache Statistics
{systemMetrics?.cacheStats && (
Cache Type
{systemMetrics.cacheStats.type}
Redis Connected
{systemMetrics.cacheStats.redisConnected ? 'Yes' : 'No'}
Memory Cache Size
{systemMetrics.cacheStats.memoryCacheSize} items
)}
System Metrics
User Count
{systemMetrics?.userCount || 0}
Active Users
{systemMetrics?.activeUsers || 0}
Total Tasks
{systemMetrics?.tasksCount || 0}
Financial Records
{systemMetrics?.financialRecordsCount || 0}
);
}