Esempio n. 1
0
 /**
  * Display usefull stats about the workers.
  *
  * Note: The workers status is conveniently stored by ResqueStatus.
  *
  * @return void
  * @see ResqueStatus\ResqueStatus::isSchedulerWorker()
  * @see ResqueStatus\ResqueStatus::getPausedWorker()
  */
 public function stats()
 {
     $ResqueStatus = $this->ResqueStatus;
     $workers = CakeResque::getWorkers();
     // List of all queues
     $queues = array_unique(CakeResque::getQueues());
     // List of queues monitored by a worker
     $activeQueues = [];
     foreach ($workers as $worker) {
         $workerParams = explode(':', $worker);
         $activeQueues = array_merge($activeQueues, explode(',', array_pop($workerParams)));
     }
     $this->out("\n");
     $this->out('<info>' . __d('cake_resque', 'Resque Statistics') . '</info>');
     $this->hr();
     $this->out("\n");
     $this->out('<info>' . __d('cake_resque', 'Jobs Stats') . '</info>');
     $this->out('   ' . __d('cake_resque', 'Processed Jobs : {0}', number_format(Resque_Stat::get('processed'))));
     $this->out('   <warning>' . __d('cake_resque', 'Failed Jobs    : {0}', number_format(Resque_Stat::get('failed'))) . '</warning>');
     if (Configure::read('CakeResque.Scheduler.enabled') === true) {
         $this->out('   ' . __d('cake_resque', 'Scheduled Jobs : {0}', number_format(Stat::get())));
     }
     $this->out("\n");
     $count = [];
     $this->out('<info>' . __d('cake_resque', 'Queues Stats') . '</info>');
     for ($i = count($queues) - 1; $i >= 0; --$i) {
         $count[$queues[$i]] = CakeResque::getQueueSize($queues[$i]);
         if (!in_array($queues[$i], $activeQueues) && $count[$queues[$i]] == 0) {
             unset($queues[$i]);
         }
     }
     $this->out('   ' . __d('cake_resque', 'Queues count : {0}', count($queues)));
     foreach ($queues as $queue) {
         $this->out(sprintf("\t- %-15s : %12s %s", $queue, number_format($count[$queue]), __dn('cake_resque', 'pending job', 'pending jobs', $count[$queue]) . (!in_array($queue, $activeQueues) ? " <error>(unmonitored queue)</error>" : '')));
     }
     $this->out("\n");
     $this->out('<info>' . __d('cake_resque', 'Workers Stats') . '</info>');
     $this->out('   ' . __d('cake_resque', 'Workers count : {0}', count($workers)));
     $pausedWorkers = $ResqueStatus->getPausedWorker();
     $schedulerWorkers = [];
     if (!empty($workers)) {
         $this->out("\t<info>" . strtoupper(__d('cake_resque', 'regular workers')) . "</info>");
         foreach ($workers as $worker) {
             if (Configure::read('CakeResque.Scheduler.enabled') === true && $ResqueStatus->isSchedulerWorker($worker)) {
                 $schedulerWorkers[] = $worker;
                 continue;
             }
             $this->out("\t* <bold>" . (string) $worker . '</bold>' . (in_array((string) $worker, $pausedWorkers) ? ' <warning>(' . __d('cake_resque', 'paused') . ')</warning>' : ''));
             $this->out("\t   - " . __d('cake_resque', 'Started on') . "     : " . CakeResque::getWorkerStartDate($worker));
             $this->out("\t   - " . __d('cake_resque', 'Processed Jobs') . " : " . $worker->getStat('processed'));
             $worker->getStat('failed') == 0 ? $this->out("\t   - " . __d('cake_resque', 'Failed Jobs') . "    : " . $worker->getStat('failed')) : $this->out("\t   - <warning>" . __d('cake_resque', 'Failed Jobs') . "    : " . $worker->getStat('failed') . "</warning>");
         }
     }
     $this->out("\n");
     if (!empty($schedulerWorkers)) {
         $this->out("\t<info>" . strtoupper(__d('cake_resque', 'scheduler worker')) . "</info>" . (in_array((string) $schedulerWorkers[0], $pausedWorkers) ? ' <warning>(' . __d('cake_resque', 'paused') . ')</warning>' : ''));
         foreach ($schedulerWorkers as $worker) {
             $schedulerWorker = new ResqueScheduler();
             $delayedJobCount = $schedulerWorker->getDelayedQueueScheduleSize();
             $this->out("\t   - " . __d('cake_resque', 'Started on') . "     : " . CakeResque::getWorkerStartDate($worker));
             $this->out("\t   - " . __d('cake_resque', 'Delayed Jobs') . "   : " . $delayedJobCount);
             if ($delayedJobCount > 0) {
                 $this->out("\t   - " . __d('cake_resque', 'Next Job on') . "    : " . strftime('%a %b %d %H:%M:%S %Z %Y', $schedulerWorker->nextDelayedTimestamp()));
             }
         }
         $this->out("\n");
     } elseif (Configure::read('CakeResque.Scheduler.enabled') === true) {
         $jobsCount = ResqueScheduler::getDelayedQueueScheduleSize();
         if ($jobsCount > 0) {
             $this->out("\t<error>************ " . __d('cake_resque', 'Alert') . " ************</error>");
             $this->out("\t<bold>" . __d('cake_resque', 'The Scheduler Worker is not running') . "</bold>");
             $this->out("\t" . __d('cake_resque', 'But there is still <bold>{0}</bold> scheduled jobs left in its queue', $jobsCount));
             $this->out("\t<error>********************************</error>");
             $this->out("\n");
         }
     }
 }