From d76eae358faa416fe360418329f4596a6f2359c7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 15 Sep 2022 10:42:27 -0700 Subject: [PATCH] Show queues and runtime instead of start time --- bookwyrm/templates/settings/celery.html | 63 +++++++++++++++++++++---- bookwyrm/templatetags/celery_tags.py | 8 ++-- bookwyrm/views/admin/celery_status.py | 37 ++++++++++++++- 3 files changed, 92 insertions(+), 16 deletions(-) diff --git a/bookwyrm/templates/settings/celery.html b/bookwyrm/templates/settings/celery.html index 5996b73fc..737bb6b03 100644 --- a/bookwyrm/templates/settings/celery.html +++ b/bookwyrm/templates/settings/celery.html @@ -9,19 +9,41 @@ {% block panel %} -{% if stats %} +{% if queues %}
-

{% trans "Workers" %}

- - {% for worker_name, worker in stats.items %} -
-

{{ worker_name }}

- {% trans "Uptime:" %} {{ worker.uptime|uptime }} +

{% trans "Queues" %}

+
+
+
+

{% trans "Low priority" %}

+

{{ queues.low_priority|intcomma }}

+
+
+
+
+

{% trans "Medium priority" %}

+

{{ queues.medium_priority|intcomma }}

+
+
+
+
+

{% trans "High priority" %}

+

{{ queues.high_priority|intcomma }}

+
+
- {% endfor %}
+{% else %} +
+ + + {% trans "Could not connect to Redis broker" %} + +
+{% endif %} +{% if stats %}

{% trans "Active Tasks" %}

{% for worker in active_tasks.values %} @@ -30,14 +52,14 @@ {% trans "ID" %} {% trans "Task name" %} - {% trans "Start time" %} + {% trans "Run time" %} {% trans "Priority" %} {% for task in worker %} {{ task.id }} {{ task.name|shortname }} - {{ task.time_start|datestamp }} (UTC) + {{ task.time_start|runtime }} {{ task.delivery_info.routing_key }} {% endfor %} @@ -46,6 +68,17 @@ {% endfor %}
+
+

{% trans "Workers" %}

+ + {% for worker_name, worker in stats.items %} +
+

{{ worker_name }}

+ {% trans "Uptime:" %} {{ worker.uptime|uptime }} +
+ {% endfor %} +
+ {% else %}
@@ -56,4 +89,14 @@
{% endif %} +{% if errors %} +
+

{% trans "Errors" %}

+ {% for error in errors %} +
{{ error }}
+{% endfor %} + +
+{% endif %} + {% endblock %} diff --git a/bookwyrm/templatetags/celery_tags.py b/bookwyrm/templatetags/celery_tags.py index d9296247a..6168d048e 100644 --- a/bookwyrm/templatetags/celery_tags.py +++ b/bookwyrm/templatetags/celery_tags.py @@ -12,10 +12,10 @@ def uptime(seconds): return str(datetime.timedelta(seconds=seconds)) -@register.filter(name="datestamp") -def get_date(timestamp): - """Go from a string timestamp to a date object""" - return datetime.datetime.fromtimestamp(timestamp) +@register.filter(name="runtime") +def runtime(timestamp): + """How long has it been?""" + return datetime.datetime.now() - datetime.datetime.fromtimestamp(timestamp) @register.filter(name="shortname") diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index 75780d8d4..7da148a06 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -3,9 +3,17 @@ from django.contrib.auth.decorators import login_required, permission_required from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View +import redis +from celerywyrm import settings from bookwyrm.tasks import app as celery +r = redis.Redis( + host=settings.REDIS_BROKER_HOST, + port=settings.REDIS_BROKER_PORT, + password=settings.REDIS_BROKER_PASSWORD, + db=settings.REDIS_BROKER_DB_INDEX, +) # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @@ -18,6 +26,31 @@ class CeleryStatus(View): def get(self, request): """See workers and active tasks""" - inspect = celery.control.inspect() - data = {"stats": inspect.stats(), "active_tasks": inspect.active()} + errors = [] + try: + inspect = celery.control.inspect() + stats = inspect.stats() + active_tasks = inspect.active() + # pylint: disable=broad-except + except Exception as err: + stats = active_tasks = None + errors.append(err) + + try: + queues = { + "low_priority": r.llen("low_priority"), + "medium_priority": r.llen("medium_priority"), + "high_priority": r.llen("high_priority"), + } + # pylint: disable=broad-except + except Exception as err: + queues = None + errors.append(err) + + data = { + "stats": stats, + "active_tasks": active_tasks, + "queues": queues, + "errors": errors, + } return TemplateResponse(request, "settings/celery.html", data)