Add API endpoint for top processes and DB dump update
This commit is contained in:
parent
400f9abd0d
commit
ce3ccf6fe9
|
|
@ -191,6 +191,7 @@ $adminGroup = $app->group('/admin', function ($group) use ($adminController) {
|
||||||
// API route for agents (public, no auth middleware, no csrf)
|
// API route for agents (public, no auth middleware, no csrf)
|
||||||
$app->post('/api/v1/metrics', [$metricsController, 'collectMetrics']);
|
$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}/services", [$metricsController, 'getServices'])->add(AuthMiddleware::class);
|
||||||
|
$app->get("/api/v1/agent/{id}/processes", [$metricsController, "getProcesses"])->add(AuthMiddleware::class);
|
||||||
|
|
||||||
// Agent configuration routes (protected with auth middleware and csrf)
|
// Agent configuration routes (protected with auth middleware and csrf)
|
||||||
$agentGroup = $app->group('/agent', function ($group) use ($agentController) {
|
$agentGroup = $app->group('/agent', function ($group) use ($agentController) {
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,66 @@ class MetricsController extends Model
|
||||||
return $response->withHeader('Content-Type', 'application/json');
|
return $response->withHeader('Content-Type', 'application/json');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getProcesses(Request $request, Response $response, $args)
|
||||||
|
{
|
||||||
|
$serverId = $args['id'];
|
||||||
|
$timeParam = $request->getQueryParams()['time'] ?? null;
|
||||||
|
|
||||||
|
if (!$timeParam) {
|
||||||
|
return $response->withStatus(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Форматируем время для запроса
|
||||||
|
$time = date('Y-m-d H:i:s', strtotime($timeParam));
|
||||||
|
|
||||||
|
// Получаем топ-процессы CPU для указанного времени
|
||||||
|
$stmt = $this->pdo->prepare("
|
||||||
|
SELECT value
|
||||||
|
FROM server_metrics sm
|
||||||
|
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))
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([':server_id' => $serverId, ':time' => $time]);
|
||||||
|
$topCpuResult = $stmt->fetch();
|
||||||
|
|
||||||
|
// Получаем топ-процессы RAM для указанного времени
|
||||||
|
$stmt = $this->pdo->prepare("
|
||||||
|
SELECT value
|
||||||
|
FROM server_metrics sm
|
||||||
|
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))
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
$stmt->execute([':server_id' => $serverId, ':time' => $time]);
|
||||||
|
$topRamResult = $stmt->fetch();
|
||||||
|
|
||||||
|
$topCpu = [];
|
||||||
|
$topRam = [];
|
||||||
|
|
||||||
|
if ($topCpuResult && !empty($topCpuResult['value'])) {
|
||||||
|
$topCpu = json_decode($topCpuResult['value'], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($topRamResult && !empty($topRamResult['value'])) {
|
||||||
|
$topRam = json_decode($topRamResult['value'], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$response->getBody()->write(json_encode([
|
||||||
|
'top_cpu' => $topCpu,
|
||||||
|
'top_ram' => $topRam,
|
||||||
|
'time' => $time
|
||||||
|
]));
|
||||||
|
|
||||||
|
return $response->withHeader('Content-Type', 'application/json');
|
||||||
|
}
|
||||||
|
|
||||||
private function checkThresholds($serverId, $metricId, $value, $metricName)
|
private function checkThresholds($serverId, $metricId, $value, $metricName)
|
||||||
{
|
{
|
||||||
// Получаем пороговые значения для этой метрики на этом сервере
|
// Получаем пороговые значения для этой метрики на этом сервере
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue