Files
jabali-panel/app/Console/Commands/NotifyHighLoad.php
2026-01-24 19:36:46 +02:00

67 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Console\Commands;
use App\Services\AdminNotificationService;
use Illuminate\Console\Command;
class NotifyHighLoad extends Command
{
protected $signature = 'notify:high-load
{event : Event type (high|recovered)}
{load : Current load average}
{minutes : Minutes the load has been high}';
protected $description = 'Send notification for high server load events';
public function handle(): int
{
$event = $this->argument('event');
$load = (float) $this->argument('load');
$minutes = (int) $this->argument('minutes');
$result = match ($event) {
'high' => $this->notifyHighLoad($load, $minutes),
'recovered' => $this->notifyRecovered($load),
default => false,
};
return $result ? Command::SUCCESS : Command::FAILURE;
}
protected function notifyHighLoad(float $load, int $minutes): bool
{
$hostname = gethostname() ?: 'server';
$cpuCount = (int) shell_exec('nproc 2>/dev/null') ?: 1;
return AdminNotificationService::send(
'high_load',
"High Server Load: {$hostname}",
"The server load has been critically high for {$minutes} minutes. Current load: {$load} (CPU cores: {$cpuCount}). Please investigate immediately.",
[
'Load Average' => number_format($load, 2),
'Duration' => "{$minutes} minutes",
'CPU Cores' => $cpuCount,
'Load per Core' => number_format($load / $cpuCount, 2),
]
);
}
protected function notifyRecovered(float $load): bool
{
$hostname = gethostname() ?: 'server';
return AdminNotificationService::send(
'high_load',
"Server Load Recovered: {$hostname}",
"The server load has returned to normal levels. Current load: {$load}.",
[
'Load Average' => number_format($load, 2),
'Status' => 'Recovered',
]
);
}
}