0
0
DjangoHow-ToBeginner · 4 min read

How to Monitor Celery Tasks in Django Efficiently

To monitor Celery tasks in Django, use the Flower tool for real-time task monitoring via a web UI. Additionally, you can integrate task status tracking in Django admin by storing task states in your database and querying them.
📐

Syntax

Monitoring Celery tasks involves running a monitoring tool and optionally tracking task states in Django. The main syntax includes:

  • celery -A your_project flower: Starts the Flower monitoring server.
  • Using Celery signals or task states to update task status in Django models.

Flower runs a web interface showing task progress, success, and failures.

bash
celery -A your_project flower
Output
Starting server at http://localhost:5555 Broker: redis://localhost:6379/0 Registered tasks: ...
💻

Example

This example shows how to start Flower and track task status in Django by saving task IDs and querying their states.

python
from celery import shared_task, states
from celery.result import AsyncResult
from django.db import models

# Django model to store task info
class TaskStatus(models.Model):
    task_id = models.CharField(max_length=255, unique=True)
    status = models.CharField(max_length=50, default='PENDING')

@shared_task(bind=True)
def add(self, x, y):
    # Update status to STARTED
    TaskStatus.objects.update_or_create(task_id=self.request.id, defaults={'status': states.STARTED})
    result = x + y
    # Update status to SUCCESS
    TaskStatus.objects.filter(task_id=self.request.id).update(status=states.SUCCESS)
    return result

# Starting a task and saving its ID
result = add.delay(4, 6)
TaskStatus.objects.create(task_id=result.id, status='PENDING')

# Checking task status later
async_result = AsyncResult(result.id)
print(f'Task status: {async_result.status}')
Output
Task status: SUCCESS
⚠️

Common Pitfalls

Common mistakes when monitoring Celery tasks include:

  • Not running the Flower server, so no monitoring UI is available.
  • Failing to configure the broker URL correctly, causing tasks or monitoring to fail.
  • Not saving task IDs in Django, making it hard to track task status programmatically.
  • Ignoring task states updates, so the database does not reflect real task progress.

Always ensure your Celery app and Django share the same broker and backend settings.

python
## Wrong: Not saving task ID
result = add.delay(4, 6)
# No record saved, so no tracking in Django

## Right: Save task ID for tracking
result = add.delay(4, 6)
TaskStatus.objects.create(task_id=result.id, status='PENDING')
📊

Quick Reference

Tips for monitoring Celery tasks in Django:

  • Run celery -A your_project flower to start the monitoring UI.
  • Use Redis or RabbitMQ as broker and result backend for reliable status tracking.
  • Store task IDs and update their status in Django models for admin visibility.
  • Use AsyncResult to query task status programmatically.
  • Check Flower UI at http://localhost:5555 for real-time task info.

Key Takeaways

Use Flower to get a real-time web UI for monitoring Celery tasks in Django.
Save Celery task IDs in Django models to track and display task status programmatically.
Ensure your Celery broker and backend are correctly configured for monitoring to work.
Use AsyncResult to check task status in your Django code.
Run Flower with 'celery -A your_project flower' and visit http://localhost:5555 to see task progress.