{% extends saladbar_base_template %} {% load static %} {% block title %}Salad Bar — Celery Dashboard{% endblock title %} {% block css %} {% endblock css %} {% block content %}

Salad Bar

Celery task monitoring, worker management, and queue analytics.

Periodic Tasks Task Logs {% if perms.saladbar.can_manage_saladbar %}
{% csrf_token %}
{% endif %}
Tasks (24h)
{{ total_24h }}
Success Rate (24h)
{{ success_rate_24h }}%
Failures (24h)
{{ failure_24h }}
Retries (24h)
{{ total_retries_24h }}
Avg Runtime
{{ avg_runtime_s }}s
Throughput
{{ throughput }}/m
Workers
{{ workers|length }}
Periodic Task Health (24h)
{{ periodic_on_schedule }}
On Schedule
{{ periodic_missed }}
Missed Window
{{ periodic_never_run }}
Never Run
{% if stale_tasks %}
Stale Tasks ({{ stale_tasks|length }})
{% for s in stale_tasks %} {% endfor %}
TaskReasonOverdueLast Run
{{ s.task.name }} {{ s.reason }} {% if s.overdue_hours %}{{ s.overdue_hours }}h overdue{% else %}—{% endif %} {% if s.task.last_run_at %}{{ s.task.last_run_at|timesince }} ago{% else %}Never{% endif %}
{% endif %}
Task Volume (24h)
{% if has_hourly_data %}
{% else %}

No task data in the last 24 hours

{% endif %}
Task Volume (7d)
{% if has_daily_data %}
{% else %}

No task data in the last 7 days

{% endif %}
Queued vs Completed (24h)
{% if has_queue_depth_data %}
{% else %}

No queue data in the last 24 hours

{% endif %}
24-Hour Schedule Timeline {{ schedule_timeline|length }} scheduled execution{{ schedule_timeline|length|pluralize }}
{% for h in timeline_hours %}
{{ h.label }}
{% for t in h.tasks %} {% if t.collapsed %} {{ t.freq_label }} {% else %} {% endif %} {% endfor %}
{% endfor %}
Scheduled task High-frequency task Current hour
{% if redis_info.connected %}
Redis v{{ redis_info.version }} {{ redis_info.used_memory_human }}{% if redis_info.memory_pct %} / {{ redis_info.maxmemory_human }} ({{ redis_info.memory_pct }}%){% endif %} Peak: {{ redis_info.used_memory_peak_human }} {{ redis_info.ops_per_sec }} ops/s {% if redis_info.hit_rate != None %}Hit rate: {{ redis_info.hit_rate }}%{% endif %} {{ redis_info.connected_clients }}{% if redis_info.maxclients %}/{{ redis_info.maxclients }}{% endif %} clients {{ redis_info.uptime_days }}d uptime {% if redis_info.evicted_keys %}{{ redis_info.evicted_keys }} evicted{% endif %} {% if redis_info.rejected_connections %}{{ redis_info.rejected_connections }} rejected conns{% endif %} {% for q_name, length in redis_info.queue_lengths.items %} {{ q_name }}: {{ length }} {% endfor %}
{% endif %}
Workers
{% for worker in workers %}
{{ worker.name }}
{% if worker.online %}online{% else %}offline{% endif %}
Active: {{ worker.active_tasks }} | Reserved: {{ worker.reserved_tasks }}{% if worker.concurrency %} | Concurrency: {{ worker.concurrency }}{% endif %}
{% if worker.concurrency %}
Pool {{ worker.utilization }}%
{% endif %}
{% empty %}

No workers responding.

{% endfor %}
{% if queue_summary %}
Queue Stats (24h)
{% for q in queue_summary %}
{{ q.name }} {{ q.total }} tasks
{{ q.success }} success {{ q.failure }} failed {{ q.success_rate }}% rate {{ q.avg_runtime }}s avg
{% endfor %}
{% endif %}
{% if active_tasks or reserved_tasks %}
In-Flight Tasks {{ active_tasks|length }} active {{ reserved_tasks|length }} reserved
{% if perms.saladbar.can_manage_saladbar %}{% endif %} {% for t in active_tasks %} {% if perms.saladbar.can_manage_saladbar %} {% endif %} {% endfor %} {% for t in reserved_tasks %} {% if perms.saladbar.can_manage_saladbar %} {% endif %} {% endfor %}
TaskIDWorkerStateElapsed
{{ t.name|default:t.type|truncatechars:50 }} {{ t.id|truncatechars:12 }} {{ t.worker_name|truncatechars:30 }} active {% if t.long_running %} slow {% endif %} {% if t.running_seconds %}{{ t.running_seconds }}s{% else %}—{% endif %}
{% csrf_token %}
{{ t.name|default:t.type|truncatechars:50 }} {{ t.id|truncatechars:12 }} {{ t.worker_name|truncatechars:30 }} reserved
{% csrf_token %}
{% endif %}
Most Active Tasks (24h)
{% for t in top_tasks %} {% empty %} {% endfor %}
TaskRunsFailuresTrend
{{ t.task_name|truncatechars:50 }} {{ t.count }} {% if t.failures > 0 %}{{ t.failures }}{% else %}0{% endif %} {% if t.trend == "improving" %} {% elif t.trend == "worsening" %} {% elif t.trend == "stable" %} {% else %} {% endif %}
No tasks in the last 24 hours.
Slowest Tasks (24h Avg)
{% for t in slowest_tasks %} {% empty %} {% endfor %}
TaskAvg RuntimeRuns
{{ t.task_name|truncatechars:50 }} {{ t.avg_seconds }}s {{ t.count }}
No data.
{% if error_groups %}
Errors by Type (24h)
{% for eg in error_groups %} {% endfor %}
ExceptionCountTasks Affected
{{ eg.exception|truncatechars:40 }} {{ eg.count }} {{ eg.affected_tasks }} {% if eg.latest_id %}{% endif %}
{% endif %} {% if retry_tasks %}
Tasks with Retries (24h)
{% for rt in retry_tasks %} {% endfor %}
TaskTotal RetriesExecutions
{{ rt.task_name|truncatechars:50 }} {{ rt.total_retries }} {{ rt.count }}
{% endif %}
Recent Failures
{% for f in recent_failures %} {% empty %} {% endfor %}
TaskWhenError
{{ f.task_name|truncatechars:40 }} {{ f.date_done|timesince }} ago {{ f.result|truncatechars:80 }}
No recent failures.
{% if failure_by_task %}
Failure Rates by Task (7d)
{% for t in failure_by_task %} {% endfor %}
TaskTotalFailuresRate
{{ t.task_name|truncatechars:40 }} {{ t.total }} {{ t.failures }} {% widthratio t.failures t.total 100 %}%
{% endif %}
{% endblock content %} {% block script-footer %} {% endblock script-footer %}