From 49a6a88934beb8a42462344a439e5a1d4a8725c7 Mon Sep 17 00:00:00 2001 From: Ian Morland Date: Thu, 27 May 2021 19:17:16 +0100 Subject: [PATCH] Add redis queue status widget --- extend.php | 4 ++ js/src/admin/index.js | 19 +++++++++ src/Provider/QueueProvider.php | 73 ++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 src/Provider/QueueProvider.php diff --git a/extend.php b/extend.php index bd72804..0e9c940 100644 --- a/extend.php +++ b/extend.php @@ -13,6 +13,7 @@ namespace GlowingBlue\RedisSetup; use Flarum\Extend; use GlowingBlue\RedisSetup\Extend\EnableRedis; +use GlowingBlue\RedisSetup\Provider\QueueProvider; return [ (new Extend\Frontend('admin')) @@ -20,5 +21,8 @@ return [ new Extend\Locales(__DIR__.'/resources/locale'), + (new Extend\ServiceProvider()) + ->register(QueueProvider::class), + new EnableRedis() ]; diff --git a/js/src/admin/index.js b/js/src/admin/index.js index 670c9a1..73869b4 100644 --- a/js/src/admin/index.js +++ b/js/src/admin/index.js @@ -1,4 +1,6 @@ import app from 'flarum/admin/app'; +import { extend } from 'flarum/common/extend'; +import StatusWidget from 'flarum/admin/components/StatusWidget'; app.initializers.add('glowingblue-redis-setup', () => { app.extensionData @@ -20,4 +22,21 @@ app.initializers.add('glowingblue-redis-setup', () => { type: 'boolean', label: app.translator.trans('glowingblue-redis-setup.admin.settings.enable_queue'), }); + + extend(StatusWidget.prototype, 'items', (items) => { + const loads = app.data.blomstraQueuesLoad; + + if (loads === undefined) { + return; + } + + for (let queue of app.data.blomstraQueuesSeen) { + const load = loads[queue] || null; + items.add('blomstra-queue-size-' + queue, [ + Queue {queue}, +
, + load || '0', + ]); + } + }); }); diff --git a/src/Provider/QueueProvider.php b/src/Provider/QueueProvider.php new file mode 100644 index 0000000..a257a29 --- /dev/null +++ b/src/Provider/QueueProvider.php @@ -0,0 +1,73 @@ +get('glowingblue-redis.enableQueue', false)) { + return; + } + + /** @var ExtensionManager $extensions */ + $extensions = resolve(ExtensionManager::class); + + (new Frontend('admin')) + ->content([$this, 'adminWidgetAttributes']) + ->extend($this->container, $extensions->getExtension('glowingblue-redis-setup')); + + /** @var Dispatcher $dispatcher */ + $dispatcher = $this->container->make(Dispatcher::class); + $dispatcher->listen(Looping::class, [$this, 'trackQueues']); + } + + public function adminWidgetAttributes(Document $document) + { + /** @var Store $cache */ + $cache = resolve('cache.store'); + /** @var QueueContract $queue */ + $queue = resolve(QueueContract::class); + + $queues = $cache->get('blomstra.queue.queues-seen') ?? []; + + if ($queue instanceof RedisQueue) { + $load = []; + + foreach ($queues as $name) { + $load[$name] = $queue->getRedis() + ->connection($this->connection) + ->llen('queues:' . $name); + } + } + + $document->payload['blomstraQueuesSeen'] = $queues; + $document->payload['blomstraQueuesLoad'] = $load ?? null; + } + + public function trackQueues(Looping $event) + { + /** @var Store $cache */ + $cache = resolve('cache.store'); + + $queues = $cache->get('blomstra.queue.queues-seen') ?? []; + $queues = array_merge($queues, (array) explode(',', $event->queue)); + $cache->put('blomstra.queue.queues-seen', array_unique($queues), 60); + } +}