Properly add process tooltip function
This commit is contained in:
parent
9474ddc45f
commit
3f3eacaefc
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 = [];
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue