Show queues and runtime instead of start time

This commit is contained in:
Mouse Reeve 2022-09-15 10:42:27 -07:00
parent 3739bdbf81
commit d76eae358f
3 changed files with 92 additions and 16 deletions

View file

@ -9,19 +9,41 @@
{% block panel %}
{% if stats %}
{% if queues %}
<section class="block content">
<h2>{% trans "Workers" %}</h2>
{% for worker_name, worker in stats.items %}
<div class="box">
<h3>{{ worker_name }}</h3>
{% trans "Uptime:" %} {{ worker.uptime|uptime }}
<h2>{% trans "Queues" %}</h2>
<div class="columns has-text-centered">
<div class="column is-4">
<div class="notification">
<p class="header">{% trans "Low priority" %}</p>
<p class="title is-5">{{ queues.low_priority|intcomma }}</p>
</div>
</div>
<div class="column is-4">
<div class="notification">
<p class="header">{% trans "Medium priority" %}</p>
<p class="title is-5">{{ queues.medium_priority|intcomma }}</p>
</div>
</div>
<div class="column is-4">
<div class="notification">
<p class="header">{% trans "High priority" %}</p>
<p class="title is-5">{{ queues.high_priority|intcomma }}</p>
</div>
</div>
</div>
{% endfor %}
</section>
{% else %}
<div class="notification is-danger is-flex is-align-items-start">
<span class="icon icon-warning is-size-4 pr-3" aria-hidden="true"></span>
<span>
{% trans "Could not connect to Redis broker" %}
</span>
</div>
{% endif %}
{% if stats %}
<section class="block content">
<h2>{% trans "Active Tasks" %}</h2>
{% for worker in active_tasks.values %}
@ -30,14 +52,14 @@
<tr>
<th>{% trans "ID" %}</th>
<th>{% trans "Task name" %}</th>
<th>{% trans "Start time" %}</th>
<th>{% trans "Run time" %}</th>
<th>{% trans "Priority" %}</th>
</tr>
{% for task in worker %}
<tr>
<td>{{ task.id }}</td>
<td>{{ task.name|shortname }}</td>
<td>{{ task.time_start|datestamp }} (UTC)</td>
<td>{{ task.time_start|runtime }}</td>
<td>{{ task.delivery_info.routing_key }}</td>
</tr>
{% endfor %}
@ -46,6 +68,17 @@
{% endfor %}
</section>
<section class="block content">
<h2>{% trans "Workers" %}</h2>
{% for worker_name, worker in stats.items %}
<div class="box">
<h3>{{ worker_name }}</h3>
{% trans "Uptime:" %} {{ worker.uptime|uptime }}
</div>
{% endfor %}
</section>
{% else %}
<div class="notification is-danger is-flex is-align-items-start">
@ -56,4 +89,14 @@
</div>
{% endif %}
{% if errors %}
<div class="block content">
<h2>{% trans "Errors" %}</h2>
{% for error in errors %}
<pre>{{ error }}</pre>
{% endfor %}
</div>
{% endif %}
{% endblock %}

View file

@ -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")

View file

@ -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)