Files
ospab.host/ospabhost/METRICS_GUIDE.md
2025-11-23 14:35:16 +03:00

309 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Система статистики и мониторинга серверов
## 📊 Что добавлено
### Backend (API):
1. **Новая модель Prisma**: `ServerMetric`
- Хранит историю метрик каждого сервера
- Поля: CPU, Memory, Disk, Network, Status, Uptime
- Автоматическое удаление при удалении сервера (CASCADE)
2. **3 новых API endpoint'а**:
- `GET /api/server/:id/metrics` - Получить текущие метрики (+ сохранение в БД)
- `GET /api/server/:id/metrics/history?period=24h` - История за период (1h, 6h, 24h, 7d, 30d)
- `GET /api/server/:id/metrics/summary` - Сводка за 24 часа (средние, макс, мин)
3. **Автоматическое сохранение**:
- При каждом запросе текущих метрик данные сохраняются в БД
- Создаётся точка для графиков
### Frontend (React):
1. **Компонент `ServerMetrics.tsx`**:
- 4 карточки с текущими показателями (CPU, RAM, Disk, Network)
- Цветовая индикация нагрузки (зелёный/жёлтый/красный)
- Фильтр периода (1 час, 6 часов, 24 часа, 7 дней, 30 дней)
- 3 интерактивных графика (Recharts):
- CPU Usage (Area Chart)
- Memory + Disk (Line Chart)
- Network Traffic (Area Chart)
- Автообновление каждую минуту
2. **Интеграция**:
- Встроен в панель управления сервером
- Вкладка "Мониторинг" теперь показывает реальные данные
## 🚀 Установка
### 1. SQL миграция:
```bash
cd /var/www/ospab-host/backend
mysql -u root -p ospabhost < prisma/migrations/add_server_metrics.sql
```
### 2. Обновление Prisma:
```bash
cd /var/www/ospab-host/backend
npx prisma generate
```
### 3. Сборка backend:
```bash
npm run build
pm2 restart ospab-backend
```
### 4. Сборка frontend:
```bash
cd /var/www/ospab-host/frontend
npm install recharts
npm run build
# Деплой dist/
```
## 📈 Как работает
### Сбор данных:
1. Frontend запрашивает `/api/server/:id/metrics`
2. Backend получает данные от Proxmox API
3. Данные сохраняются в таблицу `server_metrics`
4. Возвращаются пользователю
### Графики:
1. Frontend запрашивает историю за период
2. Backend агрегирует данные с интервалами:
- 1h → каждую минуту
- 6h → каждые 5 минут
- 24h → каждые 15 минут
- 7d → каждый час
- 30d → каждые 6 часов
3. Recharts строит интерактивные графики
### Автоочистка (рекомендуется):
Добавьте cron-задачу для удаления старых метрик:
```sql
-- Удалять метрики старше 30 дней
DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);
```
Или в crontab:
```bash
0 2 * * * mysql -u root -pПАРОЛЬ ospabhost -e "DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);"
```
## 🎨 Внешний вид
### Карточки метрик:
- **CPU**: Процент загрузки с цветовой индикацией
- **Память**: Процент + используемый объём / всего
- **Диск**: Процент + используемый объём / всего
- **Сеть**: Входящий/исходящий трафик + Uptime
### Графики:
- **CPU**: Плавная заливка оранжевым
- **Memory/Disk**: Двойной линейный график (синий/зелёный)
- **Network**: Двойная заливка (фиолетовый/розовый)
## 🔧 API примеры
### Получить текущие метрики:
```bash
curl -H "Authorization: Bearer TOKEN" \
http://localhost:5000/api/server/1/metrics
```
Ответ:
```json
{
"status": "success",
"data": {
"vmid": 105,
"status": "running",
"uptime": 3600,
"cpu": 0.15,
"memory": {
"used": 536870912,
"max": 1073741824,
"usage": 50.0
},
"disk": {
"used": 2147483648,
"max": 10737418240,
"usage": 20.0
},
"network": {
"in": 1048576,
"out": 524288
}
}
}
```
### Получить историю:
```bash
curl -H "Authorization: Bearer TOKEN" \
"http://localhost:5000/api/server/1/metrics/history?period=24h"
```
Ответ:
```json
{
"status": "success",
"period": "24h",
"data": [
{
"timestamp": "2025-11-01T10:00:00.000Z",
"cpuUsage": 15.2,
"memoryUsage": 48.5,
"diskUsage": 20.1,
"networkIn": 1048576,
"networkOut": 524288,
"status": "running"
}
],
"total": 96
}
```
### Получить сводку:
```bash
curl -H "Authorization: Bearer TOKEN" \
http://localhost:5000/api/server/1/metrics/summary
```
Ответ:
```json
{
"status": "success",
"data": {
"cpu": { "avg": 12.5, "max": 45.2, "min": 2.1 },
"memory": { "avg": 48.3, "max": 72.1, "min": 35.2 },
"disk": { "avg": 20.0, "max": 21.5, "min": 19.8 },
"network": {
"totalIn": 104857600,
"totalOut": 52428800
},
"uptime": 86400
}
}
```
## 🔒 Безопасность
-Все endpoints требуют авторизации (authMiddleware)
- ✅ Пользователь видит только метрики своих серверов
- ✅ CASCADE DELETE - метрики удаляются вместе с сервером
- ✅ Нет лимитов на количество запросов (можно добавить rate limiting)
## 📊 База данных
Структура таблицы:
```sql
CREATE TABLE `server_metrics` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`serverId` INT NOT NULL,
`cpuUsage` DOUBLE DEFAULT 0,
`memoryUsage` DOUBLE DEFAULT 0,
`memoryUsed` BIGINT DEFAULT 0,
`memoryMax` BIGINT DEFAULT 0,
`diskUsage` DOUBLE DEFAULT 0,
`diskUsed` BIGINT DEFAULT 0,
`diskMax` BIGINT DEFAULT 0,
`networkIn` BIGINT DEFAULT 0,
`networkOut` BIGINT DEFAULT 0,
`status` VARCHAR(191) DEFAULT 'unknown',
`uptime` BIGINT DEFAULT 0,
`timestamp` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
INDEX `server_metrics_serverId_timestamp_idx` (`serverId`, `timestamp`),
FOREIGN KEY (`serverId`) REFERENCES `server`(`id`) ON DELETE CASCADE
);
```
Размер записи: ~100 байт
При частоте 1 метрика/минуту: ~144 KB/день/сервер
## 🎯 Рекомендации
1. **Cron для сбора метрик**:
Создайте задачу, которая каждые 5 минут запрашивает метрики всех серверов:
```javascript
// backend/src/cron/collectMetrics.ts
import { PrismaClient } from '@prisma/client';
import { getContainerStats } from './modules/server/proxmoxApi';
const prisma = new PrismaClient();
async function collectAllMetrics() {
const servers = await prisma.server.findMany({
where: { status: 'running' }
});
for (const server of servers) {
if (!server.proxmoxId) continue;
try {
const stats = await getContainerStats(server.proxmoxId);
if (stats.status === 'success' && stats.data) {
await prisma.serverMetric.create({ /* ... */ });
}
} catch (err) {
console.error(`Ошибка сбора метрик для сервера ${server.id}:`, err);
}
}
}
// Запускать каждые 5 минут
setInterval(collectAllMetrics, 5 * 60 * 1000);
```
2. **Партиционирование таблицы** (для высоких нагрузок):
```sql
ALTER TABLE server_metrics
PARTITION BY RANGE (YEAR(timestamp) * 100 + MONTH(timestamp)) (
PARTITION p202511 VALUES LESS THAN (202512),
PARTITION p202512 VALUES LESS THAN (202601),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
```
3. **Кэширование**:
Добавьте Redis для кэширования текущих метрик (TTL 30 секунд).
## 📝 Changelog
**1 ноября 2025**:
- ✅ Добавлена модель ServerMetric в Prisma
- ✅ Созданы 3 API endpoint'а для метрик
- ✅ Реализован компонент ServerMetrics с графиками
- ✅ Интегрирован в панель управления сервером
- ✅ Установлена библиотека Recharts для графиков
- ✅ Добавлена SQL миграция
## 🐛 Troubleshooting
**Проблема**: Графики не отображаются
- Проверьте консоль браузера на ошибки API
- Убедитесь, что сервер запущен и метрики собираются
- Проверьте, что таблица `server_metrics` создана
**Проблема**: "Cannot read property 'cpu' of undefined"
- Сервер ещё не имеет метрик в БД
- Подождите 1-2 минуты после создания сервера
- Вручную запросите `/api/server/:id/metrics`
**Проблема**: Слишком большая база данных
- Настройте автоочистку старых метрик (см. выше)
- Уменьшите частоту сбора данных
- Используйте партиционирование
## 🎉 Готово!
Теперь у вас полноценная система мониторинга с:
- ✅ Реал-тайм метриками
- ✅ Интерактивными графиками
- ✅ Историей данных
- ✅ Красивым интерфейсом
- ✅ Автоматическим обновлением
Пользователи могут отслеживать нагрузку на свои серверы в режиме реального времени! 🚀