SystemController.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Models\ServerShadowsocks;
  4. use App\Models\ServerTrojan;
  5. use App\Services\ServerService;
  6. use App\Utils\CacheKey;
  7. use Illuminate\Http\Request;
  8. use App\Http\Controllers\Controller;
  9. use App\Models\ServerGroup;
  10. use App\Models\ServerV2ray;
  11. use App\Models\Plan;
  12. use App\Models\User;
  13. use App\Models\Ticket;
  14. use App\Models\Order;
  15. use App\Models\StatOrder;
  16. use App\Models\StatServer;
  17. use Illuminate\Support\Facades\Cache;
  18. use Illuminate\Support\Facades\DB;
  19. use Illuminate\Support\Facades\Http;
  20. use Laravel\Horizon\Contracts\JobRepository;
  21. use Laravel\Horizon\Contracts\MasterSupervisorRepository;
  22. use Laravel\Horizon\Contracts\MetricsRepository;
  23. use Laravel\Horizon\Contracts\SupervisorRepository;
  24. use Laravel\Horizon\Contracts\WorkloadRepository;
  25. use Laravel\Horizon\WaitTimeCalculator;
  26. class SystemController extends Controller
  27. {
  28. public function getSystemStatus()
  29. {
  30. return response([
  31. 'data' => [
  32. 'schedule' => $this->getScheduleStatus(),
  33. 'horizon' => $this->getHorizonStatus()
  34. ]
  35. ]);
  36. }
  37. public function getQueueWorkload(WorkloadRepository $workload)
  38. {
  39. return response([
  40. 'data' => collect($workload->get())->sortBy('name')->values()->toArray()
  41. ]);
  42. }
  43. protected function getScheduleStatus():bool
  44. {
  45. return (time() - 120) < Cache::get(CacheKey::get('SCHEDULE_LAST_CHECK_AT', null));
  46. }
  47. protected function getHorizonStatus():bool
  48. {
  49. if (! $masters = app(MasterSupervisorRepository::class)->all()) {
  50. return false;
  51. }
  52. return collect($masters)->contains(function ($master) {
  53. return $master->status === 'paused';
  54. }) ? false : true;
  55. }
  56. public function getQueueStats()
  57. {
  58. return response([
  59. 'data' => [
  60. 'failedJobs' => app(JobRepository::class)->countRecentlyFailed(),
  61. 'jobsPerMinute' => app(MetricsRepository::class)->jobsProcessedPerMinute(),
  62. 'pausedMasters' => $this->totalPausedMasters(),
  63. 'periods' => [
  64. 'failedJobs' => config('horizon.trim.recent_failed', config('horizon.trim.failed')),
  65. 'recentJobs' => config('horizon.trim.recent'),
  66. ],
  67. 'processes' => $this->totalProcessCount(),
  68. 'queueWithMaxRuntime' => app(MetricsRepository::class)->queueWithMaximumRuntime(),
  69. 'queueWithMaxThroughput' => app(MetricsRepository::class)->queueWithMaximumThroughput(),
  70. 'recentJobs' => app(JobRepository::class)->countRecent(),
  71. 'status' => $this->getHorizonStatus(),
  72. 'wait' => collect(app(WaitTimeCalculator::class)->calculate())->take(1),
  73. ]
  74. ]);
  75. }
  76. /**
  77. * Get the total process count across all supervisors.
  78. *
  79. * @return int
  80. */
  81. protected function totalProcessCount()
  82. {
  83. $supervisors = app(SupervisorRepository::class)->all();
  84. return collect($supervisors)->reduce(function ($carry, $supervisor) {
  85. return $carry + collect($supervisor->processes)->sum();
  86. }, 0);
  87. }
  88. /**
  89. * Get the number of master supervisors that are currently paused.
  90. *
  91. * @return int
  92. */
  93. protected function totalPausedMasters()
  94. {
  95. if (! $masters = app(MasterSupervisorRepository::class)->all()) {
  96. return 0;
  97. }
  98. return collect($masters)->filter(function ($master) {
  99. return $master->status === 'paused';
  100. })->count();
  101. }
  102. }