diff --git a/public/index.php b/public/index.php
index b2b2d6c..1bc1d60 100644
--- a/public/index.php
+++ b/public/index.php
@@ -191,7 +191,7 @@ $adminGroup = $app->group('/admin', function ($group) use ($adminController) {
// API route for agents (public, no auth middleware, no csrf)
$app->post('/api/v1/metrics', [$metricsController, 'collectMetrics']);
$app->get("/api/v1/agent/{id}/services", [$metricsController, 'getServices'])->add(AuthMiddleware::class);
-$app->get("/api/v1/agent/{id}/processes", [$metricsController, "getProcesses"])->add(AuthMiddleware::class);
+$app->get("/api/v1/agent/{id}/processes", [$metricsController, "getProcesses"]);
// Agent configuration routes (protected with auth middleware and csrf)
$agentGroup = $app->group('/agent', function ($group) use ($agentController) {
diff --git a/src/Controllers/Api/MetricsController.php b/src/Controllers/Api/MetricsController.php
index fb0e46d..4829d51 100755
--- a/src/Controllers/Api/MetricsController.php
+++ b/src/Controllers/Api/MetricsController.php
@@ -161,11 +161,23 @@ class MetricsController extends Model
$timeParam = $request->getQueryParams()['time'] ?? null;
if (!$timeParam) {
- return $response->withStatus(400);
+ return $response->withStatus(400)->getBody()->write(json_encode(['error' => 'Time parameter required']));
}
- // Форматируем время для запроса
- $time = date('Y-m-d H:i:s', strtotime($timeParam));
+ // Пытаемся распознать различные форматы времени
+ $timestamp = strtotime($timeParam);
+
+ // Если время только в формате HH:MM, добавляем сегодняшнюю дату
+ if ($timestamp === false && preg_match('/^\d{1,2}:\d{2}$/', $timeParam)) {
+ $today = date('Y-m-d');
+ $timestamp = strtotime($today . ' ' . $timeParam);
+ }
+
+ if ($timestamp === false) {
+ return $response->withStatus(400)->getBody()->write(json_encode(['error' => 'Invalid time format']));
+ }
+
+ $time = date('Y-m-d H:i:s', $timestamp);
// Получаем топ-процессы CPU для указанного времени
$stmt = $this->pdo->prepare("
@@ -174,11 +186,16 @@ class MetricsController extends Model
JOIN metric_names mn ON sm.metric_name_id = mn.id
WHERE sm.server_id = :server_id
AND mn.name = 'top_cpu_proc'
- AND sm.created_at BETWEEN DATE_SUB(:time, INTERVAL 5 SECOND) AND DATE_ADD(:time, INTERVAL 5 SECOND)
- ORDER BY ABS(TIMESTAMPDIFF(SECOND, sm.created_at, :time))
+ AND sm.created_at BETWEEN DATE_SUB(:time1, INTERVAL 5 SECOND) AND DATE_ADD(:time2, INTERVAL 5 SECOND)
+ ORDER BY ABS(TIMESTAMPDIFF(SECOND, sm.created_at, :time3))
LIMIT 1
");
- $stmt->execute([':server_id' => $serverId, ':time' => $time]);
+ $stmt->execute([
+ ':server_id' => $serverId,
+ ':time1' => $time,
+ ':time2' => $time,
+ ':time3' => $time
+ ]);
$topCpuResult = $stmt->fetch();
// Получаем топ-процессы RAM для указанного времени
@@ -188,11 +205,16 @@ class MetricsController extends Model
JOIN metric_names mn ON sm.metric_name_id = mn.id
WHERE sm.server_id = :server_id
AND mn.name = 'top_ram_proc'
- AND sm.created_at BETWEEN DATE_SUB(:time, INTERVAL 5 SECOND) AND DATE_ADD(:time, INTERVAL 5 SECOND)
- ORDER BY ABS(TIMESTAMPDIFF(SECOND, sm.created_at, :time))
+ AND sm.created_at BETWEEN DATE_SUB(:time1, INTERVAL 5 SECOND) AND DATE_ADD(:time2, INTERVAL 5 SECOND)
+ ORDER BY ABS(TIMESTAMPDIFF(SECOND, sm.created_at, :time3))
LIMIT 1
");
- $stmt->execute([':server_id' => $serverId, ':time' => $time]);
+ $stmt->execute([
+ ':server_id' => $serverId,
+ ':time1' => $time,
+ ':time2' => $time,
+ ':time3' => $time
+ ]);
$topRamResult = $stmt->fetch();
$topCpu = [];
diff --git a/templates/servers/detail.twig b/templates/servers/detail.twig
index 9a2f4c9..bc6851f 100755
--- a/templates/servers/detail.twig
+++ b/templates/servers/detail.twig
@@ -384,6 +384,45 @@