diff --git a/agent.py b/agent.py index c8792d0..64dd166 100755 --- a/agent.py +++ b/agent.py @@ -166,6 +166,10 @@ def get_metrics(): } result.update(disk_metrics) + # Аптайм сервера (в секундах) + import time + result['uptime'] = int(time.time() - psutil.boot_time()) + # Метрики использования сети net_metrics = get_network_metrics() result.update(net_metrics) diff --git a/src/Controllers/DashboardController.php b/src/Controllers/DashboardController.php index 14d1784..5ab3d0f 100755 --- a/src/Controllers/DashboardController.php +++ b/src/Controllers/DashboardController.php @@ -20,24 +20,36 @@ class DashboardController public function index(Request $request, Response $response, $args) { - // Получаем статистику $stats = $this->serverModel->getStats(); - - // Получаем список серверов со статусами для цветных карточек $servers = $this->serverModel->getServersWithStatus(); - // Загружаем пороги для каждого сервера - foreach ($servers as &$server) { - $t = $this->serverModel->getThresholds($server['id']); - $server['thresholds'] = $t; - file_put_contents('/tmp/thresholds_debug.log', "Server {$server['id']}: " . json_encode($t) . "\n", FILE_APPEND); + $groups = []; + $noGroupServers = []; + + foreach ($servers as $server) { + if (empty($server['group_name'])) { + $noGroupServers[] = $server; + } else { + $groups[$server['group_name']]['name'] = $server['group_name']; + $groups[$server['group_name']]['color'] = $server['group_color'] ?? '#6c757d'; + $groups[$server['group_name']]['icon'] = $server['group_icon'] ?? 'fa-server'; + $groups[$server['group_name']]['servers'][] = $server; + } + } + + if (!empty($noGroupServers)) { + $groups['Без группы'] = [ + 'name' => 'Без группы', + 'color' => '#6c757d', + 'icon' => 'fa-server', + 'servers' => $noGroupServers + ]; } - unset($server); $templateData = [ 'title' => 'Дашборд мониторинга', 'stats' => $stats, - 'servers' => $servers + 'groups' => $groups ]; return $this->twig->render($response, 'dashboard.twig', $templateData); diff --git a/templates/dashboard.twig b/templates/dashboard.twig index 5351c3c..39238f0 100755 --- a/templates/dashboard.twig +++ b/templates/dashboard.twig @@ -1,275 +1,235 @@ {% extends "layout.twig" %} {% block content %} -
- +
-

Дашборд мониторинга

-
- - Добавить сервер - -
+

Дашборд

+ + Добавить +
- -
-
-
-
- -

{{ stats.total_servers }}

-

Всего серверов

+ +
+
+
+
+
+
+ Серверов +

{{ stats.total_servers }}

+
+ +
-
-
-
- -

{{ stats.servers_with_metrics }}

-

С метриками

+
+
+
+
+
+ Онлайн +

{{ stats.servers_with_metrics }}

+
+ +
-
-
-
- -

{{ stats.warnings }}

-

Предупреждения

+
+
+
+
+
+ Предупреждения +

{{ stats.warnings }}

+
+ +
-
-
-
- -

{{ stats.criticals }}

-

Критические

+
+
+
+
+
+ Критические +

{{ stats.criticals }}

+
+ +
- - -{% for s in servers %}{% endfor %} -
- {% for server in servers %} - - -
-
-
-
- {{ server.name }} -
-
- {% if server.status == 'online' %} - - Онлайн - - {% elseif server.status == 'warning' %} - - Внимание - - {% else %} - - Оффлайн - - {% endif %} -
-
-
- {% if server.group_name %} -
- - {{ server.group_name }} - -
- {% endif %} - - {% if server.description %} -

{{ server.description }}

- {% endif %} - -
Статус: {{ server.status }}
- - -{% for s in servers %}{% endfor %} -
- {% if server.latest_metrics['cpu_load'] is defined %} -
-
- CPU - {{ server.latest_metrics['cpu_load'].value }}{{ server.latest_metrics['cpu_load'].unit }} + +{% if groups is empty %} +
+
+ +

Серверы пока не добавлены

+ + Добавить сервер + +
+
+{% else %} +{% for groupName, group in groups %} +
+
+
+
+ + {{ groupName }} + {{ group.servers|length }} +
+ +
+
+
+
+
+ {% for server in group.servers %} +
+ +
+
+
+ {% if server.status == 'online' %} + + {% elseif server.status == 'warning' %} + + {% else %} + + {% endif %} + {{ server.name }} +
+ {% if server.active_alerts > 0 %} + {{ server.active_alerts }} + {% endif %} +
+
+ {% if server.latest_metrics['cpu_load'] is defined %} +
+ CPU +
+ {% set cpu_val = server.latest_metrics['cpu_load'].value %} + {% set cpu_color = cpu_val > 80 ? 'bg-danger' : (cpu_val > 60 ? 'bg-warning' : 'bg-success') %} +
+
+ {{ cpu_val }}% +
+ {% endif %} + {% if server.latest_metrics['ram_used'] is defined %} +
+ RAM +
+ {% set ram_val = server.latest_metrics['ram_used'].value %} + {% set ram_color = ram_val > 80 ? 'bg-danger' : (ram_val > 60 ? 'bg-warning' : 'bg-success') %} +
+
+ {{ ram_val }}% +
+ {% endif %} + {% set disk_metric = server.latest_metrics['disk_used_root'] ?? server.latest_metrics['disk_used'] ?? null %} + {% if disk_metric is not null %} +
+ DISK +
+ {% set disk_val = disk_metric.value %} + {% set disk_color = disk_val > 90 ? 'bg-danger' : (disk_val > 75 ? 'bg-warning' : 'bg-success') %} +
+
+ {{ disk_val }}% +
+ {% endif %} +
+ {% if server.latest_metrics['uptime'] is defined %} +
+ + {% set uptime_sec = server.latest_metrics['uptime'].value %} + {% if uptime_sec >= 86400 %} + {{ (uptime_sec / 86400)|round(0, 'floor') }}д {{ ((uptime_sec % 86400) / 3600)|round(0, 'floor') }}ч + {% elseif uptime_sec >= 3600 %} + {{ (uptime_sec / 3600)|round(0, 'floor') }}ч {{ ((uptime_sec % 3600) / 60)|round(0, 'floor') }}м + {% else %} + {{ (uptime_sec / 60)|round(0, 'floor') }}м + {% endif %} +
+ {% endif %}
- {% set cpu_t = server.thresholds['cpu_load']|default(null) %} - {% if cpu_t and server.latest_metrics['cpu_load'].value >= cpu_t.critical %} - {% set cpu_color = 'bg-danger' %} - {% elseif cpu_t and server.latest_metrics['cpu_load'].value >= cpu_t.warning %} - {% set cpu_color = 'bg-warning' %} - {% elseif server.latest_metrics['cpu_load'].value > 80 %} - {% set cpu_color = 'bg-danger' %} - {% elseif server.latest_metrics['cpu_load'].value > 60 %} - {% set cpu_color = 'bg-warning' %} - {% else %} - {% set cpu_color = 'bg-success' %} - {% endif %} -
-
-
-
- {% endif %} - - {% if server.latest_metrics['ram_used'] is defined %} -
-
- RAM - {{ server.latest_metrics['ram_used'].value }}{{ server.latest_metrics['ram_used'].unit }} -
- {% set ram_t = server.thresholds['ram_used']|default(null) %} - {% if ram_t and server.latest_metrics['ram_used'].value >= ram_t.critical %} - {% set ram_color = 'bg-danger' %} - {% elseif ram_t and server.latest_metrics['ram_used'].value >= ram_t.warning %} - {% set ram_color = 'bg-warning' %} - {% elseif server.latest_metrics['ram_used'].value > 80 %} - {% set ram_color = 'bg-danger' %} - {% elseif server.latest_metrics['ram_used'].value > 60 %} - {% set ram_color = 'bg-warning' %} - {% else %} - {% set ram_color = 'bg-success' %} - {% endif %} -
-
-
-
- {% endif %} - - {% set diskMetric = server.latest_metrics['disk_used_root'] is defined and server.latest_metrics['disk_used_root'] ? server.latest_metrics['disk_used_root'] : (server.latest_metrics['disk_used'] is defined and server.latest_metrics['disk_used'] ? server.latest_metrics['disk_used'] : null) %} - {% if diskMetric and diskMetric.value %} -
-
- Диск (/) - {{ diskMetric.value }}{{ diskMetric.unit|default('%') }} -
- {% set disk_t = server.thresholds['disk_used_root'] is defined ? server.thresholds['disk_used_root'] : null %} - {% if disk_t and diskMetric.value >= disk_t.critical %} - {% set disk_color = 'bg-danger' %} - {% elseif disk_t and diskMetric.value >= disk_t.warning %} - {% set disk_color = 'bg-warning' %} - {% elseif diskMetric.value > 80 %} - {% set disk_color = 'bg-danger' %} - {% elseif diskMetric.value > 60 %} - {% set disk_color = 'bg-warning' %} - {% else %} - {% set disk_color = 'bg-success' %} - {% endif %} -
-
-
-
- {% endif %} -
- - {% if server.active_alerts > 0 %} -
- - - Активных алертов: {{ server.active_alerts }} - -
- {% endif %} - - -
- - {% if server.last_metrics_at %} - Обновлено: {{ server.last_metrics_at|date('d.m.Y H:i:s') }} - {% else %} - Метрики не получены - {% endif %} -
-
-
- {% else %} -
-
-
- -

Серверы пока не добавлены

-

Добавьте первый сервер, чтобы начать мониторинг

- - Добавить первый сервер - -
-
-
- {% endfor %}
+{% endfor %} +{% endif %} - + - {% endblock %}