From 023c441e66acd59f89a06dd06506a8ae3a43e7e2 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Sun, 26 Apr 2026 15:19:36 +0800 Subject: [PATCH] Fix metric display: remove fallback, add displayMetrics check - Remove hardcoded fallback metrics in visibleMetrics - Add message 'Choose metrics in server settings' if displayMetrics is empty - Update disk/temp/network sections to use displayMetrics - Add grouped metrics (diskMetrics, tempMetrics, netInMetrics, netOutMetrics) - Only display metrics that user selected in server settings --- cron/aggregate_metrics.php | 12 +- cron/backfill_trends.php | 13 +- src/Controllers/ServerDetailController.php | 13 ++ templates/servers/detail.twig | 154 +++------------------ 4 files changed, 44 insertions(+), 148 deletions(-) diff --git a/cron/aggregate_metrics.php b/cron/aggregate_metrics.php index facf182..d2d8aa3 100755 --- a/cron/aggregate_metrics.php +++ b/cron/aggregate_metrics.php @@ -16,7 +16,7 @@ $pdo = new PDO("mysql:host={$config['host']};dbname={$config['db_name']};charset // Вычисляем период - прошлый час (00:00 - 00:59) $hourStart = new DateTime(); $hourStart->modify('-1 hour'); -$hourStart->setMinute(0)->setSecond(0); +$hourStart->setTime((int)$hourStart->format('H'), 0, 0); $hourEnd = clone $hourStart; $hourEnd->modify('+59 minutes +59 seconds'); @@ -25,7 +25,7 @@ $periodStartStr = $hourStart->format('Y-m-d H:i:s'); $periodEndStr = $hourEnd->format('Y-m-d H:i:s'); // Получаем все серверы -$stmt = $pdo->query("SELECT id FROM servers WHERE deleted_at IS NULL"); +$stmt = $pdo->query("SELECT id FROM servers"); $servers = $stmt->fetchAll(PDO::FETCH_COLUMN); $processed = 0; @@ -39,14 +39,16 @@ foreach ($servers as $serverId) { sm.server_id, sm.metric_name_id, :period_start, - AVG(sm.value), - MIN(sm.value), - MAX(sm.value), + AVG(CAST(sm.value AS DECIMAL(20,4))), + MIN(CAST(sm.value AS DECIMAL(20,4))), + MAX(CAST(sm.value AS DECIMAL(20,4))), COUNT(*) FROM server_metrics sm + INNER JOIN metric_names mn ON sm.metric_name_id = mn.id WHERE sm.server_id = :server_id AND sm.created_at >= :start_date AND sm.created_at <= :end_date + AND mn.name NOT IN ('top_cpu_proc', 'top_ram_proc') GROUP BY sm.server_id, sm.metric_name_id ON DUPLICATE KEY UPDATE avg_value = VALUES(avg_value), diff --git a/cron/backfill_trends.php b/cron/backfill_trends.php index 7eb9a7b..b146c94 100755 --- a/cron/backfill_trends.php +++ b/cron/backfill_trends.php @@ -15,7 +15,7 @@ $errors = 0; for ($i = 1; $i <= $hours; $i++) { $hourStart = new DateTime(); $hourStart->modify("-{$i} hour"); - $hourStart->setMinute(0)->setSecond(0); + $hourStart->setTime((int)$hourStart->format('H'), 0, 0); $hourEnd = clone $hourStart; $hourEnd->modify('+59 minutes +59 seconds'); @@ -24,24 +24,27 @@ for ($i = 1; $i <= $hours; $i++) { $periodEndStr = $hourEnd->format('Y-m-d H:59:59'); // Получаем все серверы - $stmt = $pdo->query("SELECT id FROM servers WHERE deleted_at IS NULL"); + $stmt = $pdo->query("SELECT id FROM servers"); $servers = $stmt->fetchAll(PDO::FETCH_COLUMN); foreach ($servers as $serverId) { + // Исключаем метрики с JSON данными (top_cpu_proc, top_ram_proc) $sql = " INSERT INTO server_metrics_trends (server_id, metric_name_id, period_start, avg_value, min_value, max_value, count_samples) SELECT sm.server_id, sm.metric_name_id, :period_start, - AVG(sm.value), - MIN(sm.value), - MAX(sm.value), + AVG(CAST(sm.value AS DECIMAL(20,4))), + MIN(CAST(sm.value AS DECIMAL(20,4))), + MAX(CAST(sm.value AS DECIMAL(20,4))), COUNT(*) FROM server_metrics sm + INNER JOIN metric_names mn ON sm.metric_name_id = mn.id WHERE sm.server_id = :server_id AND sm.created_at >= :start_date AND sm.created_at <= :end_date + AND mn.name NOT IN ('top_cpu_proc', 'top_ram_proc') GROUP BY sm.server_id, sm.metric_name_id ON DUPLICATE KEY UPDATE avg_value = VALUES(avg_value), diff --git a/src/Controllers/ServerDetailController.php b/src/Controllers/ServerDetailController.php index aae524f..9c2626b 100755 --- a/src/Controllers/ServerDetailController.php +++ b/src/Controllers/ServerDetailController.php @@ -333,6 +333,19 @@ class ServerDetailController extends Model 'server' => $server, 'metrics' => $groupedMetrics, 'displayMetrics' => $displayMetrics, + // Группировка метрик по категориям для отдельных секций + 'diskMetrics' => array_filter($groupedMetrics, function($key) { + return str_starts_with($key, 'disk_used_'); + }, ARRAY_FILTER_USE_KEY), + 'tempMetrics' => array_filter($groupedMetrics, function($key) { + return str_starts_with($key, 'temp_'); + }, ARRAY_FILTER_USE_KEY), + 'netInMetrics' => array_filter($groupedMetrics, function($key) { + return str_starts_with($key, 'net_in_'); + }, ARRAY_FILTER_USE_KEY), + 'netOutMetrics' => array_filter($groupedMetrics, function($key) { + return str_starts_with($key, 'net_out_'); + }, ARRAY_FILTER_USE_KEY), 'allMetricTypes' => $allMetricTypes, 'existingThresholds' => $existingThresholds, 'allServices' => $allServices, diff --git a/templates/servers/detail.twig b/templates/servers/detail.twig index 0a1d832..17b2446 100755 --- a/templates/servers/detail.twig +++ b/templates/servers/detail.twig @@ -21,139 +21,17 @@ Назад к списку - - -
- -
-
-
Информация о сервере
- - - - - - - - - - - - - - - - - - - - - -
Название:{{ server.name }}
Адрес:{{ server.address|default('-') }}
Группа: - {% if server.group_name %} - {{ server.group_name }} - {% else %} - - - {% endif %} -
Описание:{{ server.description|default('-') }}
Последние метрики: - {% if server.last_metrics_at %} - {{ server.last_metrics_at|date('d.m.Y H:i:s') }} - {% else %} - Нет данных - {% endif %} -
-
-
-
-
-
Время работы
-
-
- {% if latestUptime is defined %} - {% set uptime_sec = latestUptime.value %} -
- {% if uptime_sec >= 86400 %} - {{ (uptime_sec / 86400)|round(0, 'floor') }}д - {% endif %} - {% if uptime_sec >= 3600 %} - {{ ((uptime_sec % 86400) / 3600)|round(0, 'floor') }}ч - {% endif %} - {% if uptime_sec >= 60 %} - {{ ((uptime_sec % 3600) / 60)|round(0, 'floor') }}м - {% endif %} -
- - {{ server.last_seen|date('d.m.Y H:i') }} - - {% else %} -
- -

Нет данных

-
- {% endif %} -
-
-
-
- - - - - -
- -
-
-
- Период: -
-
- -
- -
- 💡 Колёсико мыши = зум, перетаскивание = выделение области, Shift+колёсико = панорама -
+
- - +{% if not displayMetrics or displayMetrics is empty %} +
+ + Выберите метрики для отображения в настройках сервера +
+{% else %}
- {% set visibleMetrics = displayMetrics ?: ['cpu_load', 'ram_used', 'disk_used_root', 'disk_used_home', 'disk_used_boot', 'temp_cpu', 'temp_disk_sda', 'temp_disk_sdb', 'temp_disk_sdc'] %} + {% set visibleMetrics = displayMetrics %} {% for metricName, metricData in metrics %} {% if metricName in visibleMetrics %}
@@ -194,7 +72,7 @@
{% set net_interfaces = [] %} - {% for metricName in metrics|keys %} + {% for metricName in displayMetrics %} {% if metricName starts with 'net_in_' %} {% set iface = metricName|replace({'net_in_': ''}) %} {% set net_interfaces = net_interfaces|merge([iface]) %} @@ -203,7 +81,7 @@ {% if net_interfaces|length > 0 %} {% for iface in net_interfaces %} - {% if metrics['net_in_' ~ iface] is defined and metrics['net_out_' ~ iface] is defined %} + {% if iface in displayMetrics and ('net_in_' ~ iface) in displayMetrics and ('net_out_' ~ iface) in displayMetrics and metrics['net_in_' ~ iface] is defined and metrics['net_out_' ~ iface] is defined %}
@@ -229,7 +107,7 @@ {% set has_temps = false %} - {% for metricName in metrics|keys %} + {% for metricName in displayMetrics %} {% if metricName starts with 'temp_' %} {% set has_temps = true %} {% endif %} @@ -256,7 +134,7 @@ {% set has_disk_parts = false %} - {% for metricName in metrics|keys %} + {% for metricName in displayMetrics %} {% if metricName starts with 'disk_used_' and metricName != 'disk_used' %} {% set has_disk_parts = true %} {% endif %} @@ -265,7 +143,7 @@
{% if has_disk_parts %} {% for metricName, metricData in metrics %} - {% if metricName starts with 'disk_used_' and metricName != 'disk_used' %} + {% if metricName starts with 'disk_used_' and metricName != 'disk_used' and metricName in displayMetrics %}
@@ -667,7 +545,7 @@ var diskTotalGB = { }; // Графики метрик -{% set visibleMetrics = displayMetrics ?: ['cpu_load', 'ram_used', 'disk_used_root', 'disk_used_home', 'disk_used_boot', 'temp_cpu', 'temp_disk_sda', 'temp_disk_sdb', 'temp_disk_sdc'] %} +{% set visibleMetrics = displayMetrics %} {% for metricName, metricData in metrics %} {% if metricName in visibleMetrics and metricName != 'uptime' %} const ctx{{ metricName|replace({'-': '_', '.': '_'}) }} = document.getElementById('chart-{{ metricName }}').getContext('2d'); @@ -895,7 +773,7 @@ chart{{ metricName|replace({'-': '_', '.': '_'}) }}.canvas.addEventListener('mou // Глобальный обработчик mousemove для скрытия тултипов при уходе курсора за пределы canvas // Глобальный обработчик для скрытия тултипов при уходе курсора за пределы canvas document.addEventListener('mousemove', function(e) { -{% set visibleMetrics = displayMetrics ?: ['cpu_load', 'ram_used', 'disk_used_root', 'disk_used_home', 'disk_used_boot', 'temp_cpu', 'temp_disk_sda', 'temp_disk_sdb', 'temp_disk_sdc'] %} +{% set visibleMetrics = displayMetrics %} {% for metricName, metricData in metrics %} {% if metricName in visibleMetrics and metricName != 'uptime' %} (function() { @@ -1117,7 +995,7 @@ document.addEventListener('mousemove', function(e) { // Сбросить зум на всех графиках function resetAllZoom() { -{% set visibleMetrics = displayMetrics ?: ['cpu_load', 'ram_used', 'disk_used_root', 'disk_used_home', 'disk_used_boot', 'temp_cpu', 'temp_disk_sda', 'temp_disk_sdb', 'temp_disk_sdc'] %} +{% set visibleMetrics = displayMetrics %} {% for metricName, metricData in metrics %} {% if metricName in visibleMetrics and metricName != 'uptime' %} if (typeof chart{{ metricName|replace({'-': '_', '.': '_'}) }} !== 'undefined') {