Add message queue length and per-queue clear buttons to Debugger page.

This commit is contained in:
Buster "Silver Eagle" Neece 2020-12-06 11:23:40 -06:00
parent 0a8c41542d
commit 97e1fab14e
No known key found for this signature in database
GPG Key ID: 6D9E12FF03411F4E
7 changed files with 74 additions and 15 deletions

View File

@ -108,7 +108,7 @@ return function (Application $console) {
)->setDescription(__('Process the message queue.'));
$console->command(
'queue:clear',
'queue:clear [queue]',
Command\MessageQueue\ClearCommand::class
)->setDescription(__('Clear the contents of the message queue.'));

View File

@ -19,7 +19,8 @@ return function (App $app) {
$group->get('/clear-cache', Controller\Admin\DebugController::class . ':clearCacheAction')
->setName('admin:debug:clear-cache');
$group->get('/clear-queue', Controller\Admin\DebugController::class . ':clearQueueAction')
$group->get('/clear-queue[/{queue}]',
Controller\Admin\DebugController::class . ':clearQueueAction')
->setName('admin:debug:clear-queue');
$group->get('/sync/{type}', Controller\Admin\DebugController::class . ':syncAction')

View File

@ -31,6 +31,8 @@ class Application extends \Silly\Edition\PhpDi\Application
$result_output = stream_get_contents($temp_stream);
fclose($temp_stream);
$result_output = trim($result_output);
return [
$result_code,
$result_output,

View File

@ -10,14 +10,27 @@ class ClearCommand extends CommandAbstract
{
public function __invoke(
SymfonyStyle $io,
QueueManager $queueManager
QueueManager $queueManager,
?string $queue = null
): int {
$connections = $queueManager->getConnections();
foreach ($connections as $connection) {
$connection->cleanup();
$allQueues = QueueManager::getAllQueues();
if (!empty($queue)) {
if (in_array($queue, $allQueues, true)) {
$queueManager->clearQueue($queue);
$io->success(sprintf('Message queue "%s" cleared.', $queue));
} else {
$io->error(sprintf('Message queue "%s" does not exist.', $queue));
return 1;
}
} else {
foreach ($allQueues as $queueName) {
$queueManager->clearQueue($queueName);
}
$io->success('All message queues cleared.');
}
$io->success('Message queue cleared.');
return 0;
}
}

View File

@ -9,6 +9,7 @@ use App\File;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Message\RunSyncTaskMessage;
use App\MessageQueue\QueueManager;
use App\Radio\AutoDJ;
use App\Radio\Backend\Liquidsoap;
use App\Session\Flash;
@ -42,10 +43,19 @@ class DebugController extends AbstractLogViewerController
ServerRequest $request,
Response $response,
Entity\Repository\StationRepository $stationRepo,
Runner $sync
Runner $sync,
QueueManager $queueManager
): ResponseInterface {
$queues = QueueManager::getAllQueues();
$queueTotals = [];
foreach ($queues as $queue) {
$queueTotals[$queue] = $queueManager->getQueueCount($queue);
}
return $request->getView()->renderToResponse($response, 'admin/debug/index', [
'sync_times' => $sync->getSyncTimes(),
'queue_totals' => $queueTotals,
'stations' => $stationRepo->fetchArray(),
]);
}
@ -152,11 +162,15 @@ class DebugController extends AbstractLogViewerController
public function clearQueueAction(
ServerRequest $request,
Response $response
Response $response,
?string $queue = null
): ResponseInterface {
[$resultCode, $resultOutput] = $this->console->runCommandWithArgs(
'queue:clear'
);
$args = [];
if (!empty($queue)) {
$args['queue'] = $queue;
}
[$resultCode, $resultOutput] = $this->console->runCommandWithArgs('queue:clear', $args);
// Flash an update to ensure the session is recreated.
$request->getFlash()->addMessage($resultOutput, Flash::SUCCESS);

View File

@ -62,6 +62,7 @@ class QueueManager implements SendersLocatorInterface
'delete_after_ack' => true,
'redeliver_timeout' => 43200,
'claim_interval' => 86400,
'dbindex' => $this->redis->getDbNum(),
],
array_filter([
'host' => $this->redis->getHost(),
@ -115,6 +116,11 @@ class QueueManager implements SendersLocatorInterface
$connection->setup();
}
public function getQueueCount(string $queueName): int
{
return $this->redis->xLen('messages_' . $queueName);
}
/**
* @return string[]
*/

View File

@ -26,13 +26,13 @@ $this->layout('main', [
<div class="col-md-6">
<div class="card mb-3">
<div class="card-header bg-primary-dark">
<h2 class="card-title"><?=__('Clear Message Queue')?></h2>
<h2 class="card-title"><?=__('Clear All Message Queues')?></h2>
</div>
<div class="card-body">
<p><?=__('This will clear any pending unprocessed messages in the message queue.')?></p>
<p><?=__('This will clear any pending unprocessed messages in all message queues.')?></p>
<div class="buttons">
<a class="btn btn-sm btn-primary" role="button" href="<?=$router->named('admin:debug:clear-queue')?>">
<?=__('Clear Message Queue')?>
<?=__('Clear All Message Queues')?>
</a>
</div>
</div>
@ -63,6 +63,29 @@ $this->layout('main', [
</div>
</div>
<div class="card mb-3">
<div class="card-header bg-primary-dark">
<h2 class="card-title"><?=__('Message Queues')?></h2>
</div>
<div class="card-body">
<div class="row">
<?php foreach ($queue_totals as $queueType => $queueTotal): ?>
<div class="col">
<h5 class="mb-0"><?=$queueType?></h5>
<p><?=__('%d queued messages', $queueTotal)?></p>
<div class="buttons">
<a class="btn btn-sm btn-primary" role="button" href="<?=$router->named('admin:debug:clear-queue',
['queue' => $queueType])?>">
<?=__('Clear Queue')?>
</a>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<div class="card">
<div class="card-header bg-primary-dark">
<h2 class="card-title"><?=__('Station-Specific Debugging')?></h2>