import { useState, useEffect } from "react"; export default function App() { // Mock server data const initialServers = [ { id: 1, name: "Сервер 1 (API)", url: "api.example.com" }, { id: 2, name: "Сервер 2 (База данных)", url: "db.example.com" }, { id: 3, name: "Сервер 3 (Фронтенд)", url: "web.example.com" }, { id: 4, name: "Сервер 4 (Аутентификация)", url: "auth.example.com" }, { id: 5, name: "Сервер 5 (Хранилище)", url: "storage.example.com" }, ]; // State for server statuses const [serverStatuses, setServerStatuses] = useState( initialServers.map((server) => ({ id: server.id, delay: 0, statusCode: 0, statusText: "", lastChecked: new Date(), })) ); // Simulate server monitoring updates useEffect(() => { const interval = setInterval(() => { setServerStatuses((prev) => prev.map((status) => { // Simulate random response times (20-300ms) const delay = Math.floor(Math.random() * 280) + 20; // Simulate status codes (mostly 200, occasionally errors) let statusCode; if (Math.random() > 0.15) { statusCode = 200; } else { statusCode = [404, 500, 503][Math.floor(Math.random() * 3)]; } // Determine status text let statusText = ""; switch (statusCode) { case 200: statusText = "OK"; break; case 404: statusText = "Не найден"; break; case 500: statusText = "Внутренняя ошибка"; break; case 503: statusText = "Недоступен"; break; default: statusText = "Неизвестно"; } return { ...status, delay, statusCode, statusText, lastChecked: new Date(), }; }) ); }, 2000); return () => clearInterval(interval); }, []); // Get status color based on HTTP code const getStatusColor = (code) => { if (code === 200) return "bg-green-100 text-green-800"; if (code >= 400 && code < 500) return "bg-orange-100 text-orange-800"; if (code >= 500) return "bg-red-100 text-red-800"; return "bg-gray-100 text-gray-800"; }; // Format date to HH:mm:ss const formatTime = (date) => { return date.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit", second: "2-digit", }); }; return (
{/* Header with logo */}
Sell Kit
Панель мониторинга серверов
{/* Main content */}

Панель мониторинга серверов

В реальном времени отслеживайте состояние серверов, время отклика и HTTP-статусы

{/* Left Panel - Server List */}

Список серверов

{initialServers.map((server) => { const status = serverStatuses.find(s => s.id === server.id); const isHealthy = status?.statusCode === 200; return (

{server.name}

{server.url}

{isHealthy ? "Онлайн" : "Проблемы"}
Последняя проверка: {status ? formatTime(status.lastChecked) : "—"}
); })}
{/* Right Panel - Metrics */}
⏱️

Метрики отклика

{initialServers.map((server) => { const status = serverStatuses.find(s => s.id === server.id); if (!status) return null; return (

{server.name}

{status.statusCode} {status.statusText}
Время задержки {status.delay} мс
Последняя проверка: {formatTime(status.lastChecked)}
{status.statusCode === 200 ? "Стабильно" : "Требует внимания"}
); })}
i

Как интерпретировать метрики

  • 🟢 Задержка < 100 мс: Отличная производительность
  • 🟡 Задержка 100-200 мс: Удовлетворительная производительность
  • 🔴 Задержка > 200 мс: Проблемы с производительностью
  • Коды 2xx: Нормальная работа сервера
  • Коды 4xx/5xx: Требуется вмешательство

Данные обновляются в реальном времени • Имитация мониторинга для демонстрации

); }