setName('taskprocessing:task:stats') ->setDescription('get statistics for tasks') ->addOption( 'userIdFilter', 'u', InputOption::VALUE_OPTIONAL, 'only get the tasks for one user ID' ) ->addOption( 'type', 't', InputOption::VALUE_OPTIONAL, 'only get the tasks for one task type' ) ->addOption( 'customId', null, InputOption::VALUE_OPTIONAL, 'only get the tasks for one custom ID' ) ->addOption( 'status', 's', InputOption::VALUE_OPTIONAL, 'only get the tasks that have a specific status (STATUS_UNKNOWN=0, STATUS_SCHEDULED=1, STATUS_RUNNING=2, STATUS_SUCCESSFUL=3, STATUS_FAILED=4, STATUS_CANCELLED=5)' ) ->addOption( 'scheduledAfter', null, InputOption::VALUE_OPTIONAL, 'only get the tasks that were scheduled after a specific date (Unix timestamp)' ) ->addOption( 'endedBefore', null, InputOption::VALUE_OPTIONAL, 'only get the tasks that ended before a specific date (Unix timestamp)' ); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output): int { $userIdFilter = $input->getOption('userIdFilter'); if ($userIdFilter === null) { $userIdFilter = ''; } elseif ($userIdFilter === '') { $userIdFilter = null; } $type = $input->getOption('type'); $customId = $input->getOption('customId'); $status = $input->getOption('status'); $scheduledAfter = $input->getOption('scheduledAfter'); $endedBefore = $input->getOption('endedBefore'); $tasks = $this->taskProcessingManager->getTasks($userIdFilter, $type, $customId, $status, $scheduledAfter, $endedBefore); $stats = ['Number of tasks' => count($tasks)]; $maxRunningTime = 0; $totalRunningTime = 0; $runningTimeCount = 0; $maxQueuingTime = 0; $totalQueuingTime = 0; $queuingTimeCount = 0; $maxUserWaitingTime = 0; $totalUserWaitingTime = 0; $userWaitingTimeCount = 0; foreach ($tasks as $task) { // running time if ($task->getStartedAt() !== null && $task->getEndedAt() !== null) { $taskRunningTime = $task->getEndedAt() - $task->getStartedAt(); $totalRunningTime += $taskRunningTime; $runningTimeCount++; if ($taskRunningTime >= $maxRunningTime) { $maxRunningTime = $taskRunningTime; } } // queuing time if ($task->getScheduledAt() !== null && $task->getStartedAt() !== null) { $taskQueuingTime = $task->getStartedAt() - $task->getScheduledAt(); $totalQueuingTime += $taskQueuingTime; $queuingTimeCount++; if ($taskQueuingTime >= $maxQueuingTime) { $maxQueuingTime = $taskQueuingTime; } } // user waiting time if ($task->getScheduledAt() !== null && $task->getEndedAt() !== null) { $taskUserWaitingTime = $task->getEndedAt() - $task->getScheduledAt(); $totalUserWaitingTime += $taskUserWaitingTime; $userWaitingTimeCount++; if ($taskUserWaitingTime >= $maxUserWaitingTime) { $maxUserWaitingTime = $taskUserWaitingTime; } } } if ($runningTimeCount > 0) { $stats['Max running time'] = $maxRunningTime; $averageRunningTime = (int)($totalRunningTime / $runningTimeCount); $stats['Average running time'] = $averageRunningTime; $stats['Running time count'] = $runningTimeCount; } if ($queuingTimeCount > 0) { $stats['Max queuing time'] = $maxQueuingTime; $averageQueuingTime = (int)($totalQueuingTime / $queuingTimeCount); $stats['Average queuing time'] = $averageQueuingTime; $stats['Queuing time count'] = $queuingTimeCount; } if ($userWaitingTimeCount > 0) { $stats['Max user waiting time'] = $maxUserWaitingTime; $averageUserWaitingTime = (int)($totalUserWaitingTime / $userWaitingTimeCount); $stats['Average user waiting time'] = $averageUserWaitingTime; $stats['User waiting time count'] = $userWaitingTimeCount; } $this->writeArrayInOutputFormat($input, $output, $stats); return 0; } }