55 lines
1.8 KiB
PHP
55 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Events\MetricsTicked;
|
|
use App\Models\Server;
|
|
use App\Services\FleetService;
|
|
use Illuminate\Console\Command;
|
|
use Throwable;
|
|
|
|
/**
|
|
* Replaces the dev mock emitter: polls REAL CPU/MEM/disk over SSH for every
|
|
* server that has a stored credential, persists the values onto the Server row,
|
|
* and broadcasts MetricsTicked so the dashboard chart moves with real data.
|
|
* Unreachable servers are flagged offline; the loop never dies on one failure.
|
|
*/
|
|
class PollMetrics extends Command
|
|
{
|
|
protected $signature = 'clusev:poll-metrics
|
|
{--interval=15 : Seconds between polls}
|
|
{--once : Poll a single round and exit}';
|
|
|
|
protected $description = 'Poll real metrics over SSH for credentialed servers, persist + broadcast';
|
|
|
|
public function handle(FleetService $fleet): int
|
|
{
|
|
$interval = max(2, (int) $this->option('interval'));
|
|
|
|
do {
|
|
$servers = Server::has('credential')->get();
|
|
|
|
if ($servers->isEmpty()) {
|
|
$this->warn('Keine Server mit Credential — nichts zu pollen.');
|
|
}
|
|
|
|
foreach ($servers as $server) {
|
|
try {
|
|
$m = $fleet->refresh($server);
|
|
broadcast(new MetricsTicked($m['cpu'], $m['mem'], $server->name));
|
|
$this->line("ok {$server->name} cpu={$m['cpu']} mem={$m['mem']} disk={$m['disk']} load={$m['load']}");
|
|
} catch (Throwable $e) {
|
|
$server->forceFill(['status' => 'offline'])->save();
|
|
$this->warn("offline {$server->name}: ".$e->getMessage());
|
|
}
|
|
}
|
|
|
|
if ($this->option('once')) {
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
sleep($interval);
|
|
} while (true);
|
|
}
|
|
}
|