{% extends "admin/base_site.html" %} {% load static %} {% block extrastyle %} {{ block.super }} {% endblock extrastyle %} {% block breadcrumbs %} {% endblock breadcrumbs %} {% block content_title %}{% endblock content_title %} {% block content %}

operator view

dj_queue dashboard

Watch queue pressure, process freshness, and control-plane state for the selected backend without leaving Django admin. Switch backend context here, then drill into queues or raw changelists only when the overview is not enough.

Jobs come from the selected backend. Processes, pauses, recurring tasks, and semaphores come from that backend's queue database.

{% for fact in backend_facts %}
{{ fact.label }}
{{ fact.value }}
{% endfor %}
{% for card in summary_cards %}

{{ card.label }}

{{ card.value }}

{% if card.detail_parts %} {% for part in card.detail_parts %} {% if part.url %} {{ part.label }} {% else %} {{ part.label }} {% endif %} {% endfor %} {% else %} {{ card.detail }} {% endif %}

{% endfor %}

queues

Live queue pressure, pause state, and first-line controls for this backend.{% if shared_queue_section.total_count %} Shared pause or recurring-only queues are available in a separate section below.{% endif %}

{% if queue_section.rows %}
{% for header in queue_section.headers %} {% endfor %} {% for queue in queue_section.rows %} {% endfor %}
{% if header.sortable and header.sorted %}
{% if queue_section.num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %}
{% endif %}
Controls
{{ queue.name }} {{ queue.ready_count }} {{ queue.claimed_count }} {{ queue.scheduled_count }} {{ queue.blocked_count }} {{ queue.failed_count }} {{ queue.finished_count }} {{ queue.paused|yesno:"yes,no" }} {% if queue.latency_seconds != None %}{{ queue.latency_seconds|floatformat:1 }}s{% else %}-{% endif %} {{ queue.live_worker_count }} {{ queue.oldest_scheduled_at|date:"Y-m-d H:i:s"|default:"-" }} {{ queue.oldest_blocked_at|date:"Y-m-d H:i:s"|default:"-" }}
{% csrf_token %}
{% csrf_token %}
{% else %}

No queues found for this backend.

{% endif %}

processes

Supervisor-first runtime topology so workers, dispatchers, and schedulers read as one grouped runtime.

{% if process_section.rows %}
{% for header in process_section.headers %} {% endfor %} {% for process in process_section.rows %} {% endfor %}
{% if header.sortable and header.sorted %}
{% if process_section.num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %}
{% endif %}
{{ process.name }} {% if process.is_child %}under {{ process.group_parent_name }}{% endif %} {{ process.kind }} {% if process.is_live %}live{% else %}stale{% endif %} {{ process.last_heartbeat_at|date:"Y-m-d H:i:s" }} ({{ process.heartbeat_age_seconds|floatformat:1 }}s ago) {{ process.hostname }} {{ process.pid }}
{% else %}

No registered processes.

{% endif %}

recurring tasks

Scheduled work defined for this queue database, with next-fire context for operators.

{% if recurring_section.rows %}
{% for header in recurring_section.headers %} {% endfor %} {% for task in recurring_section.rows %} {% endfor %}
{% if header.sortable and header.sorted %}
{% if recurring_section.num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %}
{% endif %}
{{ task.key }} {{ task.task_path }} {{ task.queue_name }} {{ task.schedule }} {% if task.static %}static{% else %}dynamic{% endif %} {{ task.last_run_at|default:"-" }} {{ task.next_run_at|default:"-" }}
{% else %}

No recurring tasks configured.

{% endif %}

semaphores

Concurrency state for hot keys, including waiters and expiry windows.

{% if semaphore_section.rows %}
{% for header in semaphore_section.headers %} {% endfor %} {% for semaphore in semaphore_section.rows %} {% endfor %}
{% if header.sortable and header.sorted %}
{% if semaphore_section.num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %}
{% endif %}
{{ semaphore.key }} {{ semaphore.available_slots }} {{ semaphore.limit }} {{ semaphore.blocked_waiters }} {{ semaphore.expires_at|date:"Y-m-d H:i:s" }}
{% else %}

No active semaphores.

{% endif %}
{% if shared_queue_section.total_count %}

shared queues

These queues have no jobs for backend {{ backend_alias }} and are shown separately because pause and recurring-task rows are shared on queue database {{ queue_database_alias }}.

{% for header in shared_queue_section.headers %} {% endfor %} {% for queue in shared_queue_section.rows %} {% endfor %}
{% if header.sortable and header.sorted %}
{% if shared_queue_section.num_sorted_fields > 1 %}{{ header.sort_priority }}{% endif %}
{% endif %}
Controls
{{ queue.name }}
{% for source in queue.shared_sources %} {{ source }} {% endfor %}
{{ queue.paused|yesno:"yes,no" }}
{% csrf_token %}
{% endif %}

inspect raw rows

Use the model changelists for exhaustive filtering, lower-level debugging, and record-by-record inspection.

queue data

Job-centric rows scoped to the selected backend where possible.

runtime data

Control-plane rows scoped by the selected backend's queue database alias.

{% endblock content %}