Properly add process tooltip function

This commit is contained in:
mirivlad 2026-02-14 17:31:26 +00:00
parent 9474ddc45f
commit 3f3eacaefc
3 changed files with 71 additions and 10 deletions

View File

@ -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) {

View File

@ -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 = [];

View File

@ -384,6 +384,45 @@
<!-- Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
// Функция для получения топ-процессов для указанного времени
function fetchProcesses(serverId, time) {
return new Promise(function(resolve) {
// Добавляем сегодняшнюю дату к времени если его нет
var fullTime = time;
if (time && time.indexOf('-') === -1) {
var now = new Date();
var year = now.getFullYear();
var month = String(now.getMonth() + 1).padStart(2, '0');
var day = String(now.getDate()).padStart(2, '0');
fullTime = year + '-' + month + '-' + day + ' ' + time;
}
fetch('/api/v1/agent/' + serverId + '/processes?time=' + encodeURIComponent(fullTime))
.then(response => response.json())
.then(data => {
var lines = [];
if (data.top_cpu && data.top_cpu.length > 0) {
lines.push('');
lines.push('🏆 Топ CPU:');
data.top_cpu.forEach(function(proc) {
lines.push(' ' + proc.name + ': ' + proc.value + '%');
});
}
if (data.top_ram && data.top_ram.length > 0) {
lines.push('');
lines.push('💾 Топ RAM:');
data.top_ram.forEach(function(proc) {
lines.push(' ' + proc.name + ': ' + proc.value + '%');
});
}
resolve(lines);
})
.catch(function() {
resolve([]);
});
});
}
// Функция для получения топ-процессов для указанного времени
function fetchProcesses(serverId, time) {