2022-01-27 01:46:26 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
|
|
|
|
use App\Utils\CacheKey;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
use Illuminate\Support\Facades\Http;
|
2022-07-29 16:20:01 +08:00
|
|
|
use Laravel\Horizon\Contracts\JobRepository;
|
2022-01-27 01:46:26 +08:00
|
|
|
use Laravel\Horizon\Contracts\MasterSupervisorRepository;
|
2022-07-29 16:20:01 +08:00
|
|
|
use Laravel\Horizon\Contracts\MetricsRepository;
|
|
|
|
use Laravel\Horizon\Contracts\SupervisorRepository;
|
|
|
|
use Laravel\Horizon\Contracts\WorkloadRepository;
|
|
|
|
use Laravel\Horizon\WaitTimeCalculator;
|
2023-06-05 03:43:34 +08:00
|
|
|
use App\Models\Log as LogModel;
|
2022-01-27 01:46:26 +08:00
|
|
|
|
|
|
|
class SystemController extends Controller
|
|
|
|
{
|
2022-07-20 03:09:06 +08:00
|
|
|
public function getSystemStatus()
|
2022-01-27 01:46:26 +08:00
|
|
|
{
|
|
|
|
return response([
|
|
|
|
'data' => [
|
|
|
|
'schedule' => $this->getScheduleStatus(),
|
2023-05-20 20:50:53 +08:00
|
|
|
'horizon' => $this->getHorizonStatus(),
|
|
|
|
'schedule_last_runtime' => Cache::get(CacheKey::get('SCHEDULE_LAST_CHECK_AT', null))
|
2022-01-27 01:46:26 +08:00
|
|
|
]
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2022-07-29 16:20:01 +08:00
|
|
|
public function getQueueWorkload(WorkloadRepository $workload)
|
2022-07-20 03:09:06 +08:00
|
|
|
{
|
2022-07-29 16:20:01 +08:00
|
|
|
return response([
|
|
|
|
'data' => collect($workload->get())->sortBy('name')->values()->toArray()
|
|
|
|
]);
|
2022-07-20 03:09:06 +08:00
|
|
|
}
|
|
|
|
|
2022-01-27 01:46:26 +08:00
|
|
|
protected function getScheduleStatus():bool
|
|
|
|
{
|
|
|
|
return (time() - 120) < Cache::get(CacheKey::get('SCHEDULE_LAST_CHECK_AT', null));
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getHorizonStatus():bool
|
|
|
|
{
|
|
|
|
if (! $masters = app(MasterSupervisorRepository::class)->all()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return collect($masters)->contains(function ($master) {
|
|
|
|
return $master->status === 'paused';
|
|
|
|
}) ? false : true;
|
|
|
|
}
|
2022-07-29 16:20:01 +08:00
|
|
|
|
|
|
|
public function getQueueStats()
|
|
|
|
{
|
|
|
|
return response([
|
|
|
|
'data' => [
|
|
|
|
'failedJobs' => app(JobRepository::class)->countRecentlyFailed(),
|
|
|
|
'jobsPerMinute' => app(MetricsRepository::class)->jobsProcessedPerMinute(),
|
|
|
|
'pausedMasters' => $this->totalPausedMasters(),
|
|
|
|
'periods' => [
|
|
|
|
'failedJobs' => config('horizon.trim.recent_failed', config('horizon.trim.failed')),
|
|
|
|
'recentJobs' => config('horizon.trim.recent'),
|
|
|
|
],
|
|
|
|
'processes' => $this->totalProcessCount(),
|
|
|
|
'queueWithMaxRuntime' => app(MetricsRepository::class)->queueWithMaximumRuntime(),
|
|
|
|
'queueWithMaxThroughput' => app(MetricsRepository::class)->queueWithMaximumThroughput(),
|
|
|
|
'recentJobs' => app(JobRepository::class)->countRecent(),
|
|
|
|
'status' => $this->getHorizonStatus(),
|
|
|
|
'wait' => collect(app(WaitTimeCalculator::class)->calculate())->take(1),
|
|
|
|
]
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the total process count across all supervisors.
|
|
|
|
*
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
protected function totalProcessCount()
|
|
|
|
{
|
|
|
|
$supervisors = app(SupervisorRepository::class)->all();
|
|
|
|
|
|
|
|
return collect($supervisors)->reduce(function ($carry, $supervisor) {
|
|
|
|
return $carry + collect($supervisor->processes)->sum();
|
|
|
|
}, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the number of master supervisors that are currently paused.
|
|
|
|
*
|
|
|
|
* @return int
|
|
|
|
*/
|
|
|
|
protected function totalPausedMasters()
|
|
|
|
{
|
|
|
|
if (! $masters = app(MasterSupervisorRepository::class)->all()) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return collect($masters)->filter(function ($master) {
|
|
|
|
return $master->status === 'paused';
|
|
|
|
})->count();
|
|
|
|
}
|
2022-01-27 01:46:26 +08:00
|
|
|
|
2023-06-05 03:43:34 +08:00
|
|
|
public function getSystemLog(Request $request) {
|
|
|
|
$current = $request->input('current') ? $request->input('current') : 1;
|
|
|
|
$pageSize = $request->input('page_size') >= 10 ? $request->input('page_size') : 10;
|
|
|
|
$builder = LogModel::orderBy('created_at', 'DESC')
|
|
|
|
->setFilterAllowKeys('level');
|
|
|
|
$total = $builder->count();
|
|
|
|
$res = $builder->forPage($current, $pageSize)
|
|
|
|
->get();
|
|
|
|
return response([
|
|
|
|
'data' => $res,
|
|
|
|
'total' => $total
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|