"use client"; import { useState, useEffect } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { Separator } from '@/components/ui/separator'; import { Activity, Users, MessageSquare, DollarSign, TrendingUp, Clock, AlertCircle, BarChart3, PieChart, RefreshCw } from 'lucide-react'; import { ProtectedRoute } from '@/components/auth/ProtectedRoute' import { apiClient } from '@/lib/api-client' interface AnalyticsData { overview: { totalUsers: number; totalRequests: number; totalCost: number; averageResponseTime: number; }; usage: { requests: Array<{ date: string; count: number }>; models: Array<{ name: string; count: number; cost: number }>; endpoints: Array<{ path: string; count: number; avgTime: number }>; }; performance: { responseTime: Array<{ time: string; value: number }>; errorRate: number; uptime: number; }; costs: { daily: Array<{ date: string; amount: number }>; byModel: Array<{ model: string; cost: number; percentage: number }>; budget: { used: number; limit: number }; }; } export default function AnalyticsPage() { return ( ) } function AnalyticsPageContent() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [lastUpdated, setLastUpdated] = useState(new Date()); const fetchAnalytics = async () => { try { setLoading(true); // Fetch real analytics data from backend API via proxy const analyticsData = await apiClient.get('/api-internal/v1/analytics') as any; setData(analyticsData); setLastUpdated(new Date()); } catch (error) { console.error('Failed to fetch analytics:', error); // Set empty data structure on error setData({ overview: { totalUsers: 0, totalRequests: 0, totalCost: 0, averageResponseTime: 0 }, usage: { requests: [], models: [], endpoints: [] }, performance: { responseTime: [], errorRate: 0, uptime: 0 }, costs: { daily: [], byModel: [], budget: { used: 0, limit: 0 } } }); } finally { setLoading(false); } }; useEffect(() => { fetchAnalytics(); }, []); if (loading) { return (
); } if (!data) { return (

Failed to load analytics

Please try again later

); } return (

Analytics

Platform usage and performance insights

Last updated: {lastUpdated.toLocaleTimeString()}
{/* Overview Cards */}
Total Users
{data.overview.totalUsers}

{data.overview.totalUsers > 0 ? 'Active users' : 'No users yet'}

Total Requests
{data.overview.totalRequests.toLocaleString()}

{data.overview.totalRequests > 0 ? 'Total API requests' : 'No requests yet'}

Total Cost
${data.overview.totalCost.toFixed(2)}

{data.overview.totalCost > 0 ? 'Total spending' : 'No costs yet'}

Avg Response Time
{data.overview.averageResponseTime.toFixed(2)}s

{data.overview.averageResponseTime > 0 ? 'Average response time' : 'No data available'}

Usage Performance Costs
Model Usage Requests by AI model
{data.usage.models.map((model) => (
{model.name} {model.count.toLocaleString()} requests
${model.cost}
))}
Endpoint Performance API endpoint statistics
{data.usage.endpoints.map((endpoint) => (
{endpoint.path}
{endpoint.avgTime}s avg
{endpoint.count.toLocaleString()} requests
))}
System Health Platform performance metrics
Uptime
{data.performance.uptime}%
Error Rate
{(data.performance.errorRate * 100).toFixed(2)}%
Uptime {data.performance.uptime}%
Response Times 24-hour response time trend
{data.performance.responseTime.map((item) => (
{item.time}
{item.value}s
))}
Budget Status Current month spending
Used ${data.costs.budget.used} / ${data.costs.budget.limit}
${data.costs.budget.limit - data.costs.budget.used} remaining

{Math.round(((data.costs.budget.limit - data.costs.budget.used) / data.costs.budget.limit) * 100)}% of budget left

Cost by Model Spending distribution
{data.costs.byModel.map((model) => (
{model.model} ${model.cost}
{model.percentage}%
))}
); }