Skip to Content

Django-RQ Monitoring

Comprehensive monitoring and management guide for Django-RQ in django-cfg, including Django Admin, REST API, Prometheus metrics, and CLI tools.


Monitoring Overview

Django-cfg provides multiple ways to monitor Django-RQ:

MethodUse CaseReal-timeProduction
Django AdminManual monitoring and management✅ Yes✅ Yes
REST APIProgrammatic access, dashboards✅ Yes✅ Yes
PrometheusMetrics and alerting✅ Yes✅ Yes
CLI CommandsQuick checks, debugging✅ Yes⚠️ Limited
Web DashboardVisual monitoring (django-rq)✅ Yes✅ Yes

Django Admin Interface

Access

Navigate to /admin/django_rq/ in your Django admin:

http://localhost:8000/admin/django_rq/

Features

Queue Management:

  • View all queues and their job counts
  • See queue statistics (queued, started, finished, failed)
  • Empty queues
  • Clear finished/failed jobs

Job Management:

  • Browse all jobs with filtering
  • View job details (status, args, result, error)
  • Cancel running jobs
  • Requeue failed jobs
  • Delete jobs

Worker Monitoring:

  • See active workers
  • Check worker status and health
  • View worker statistics

Configuration

Enable admin link in config:

django_rq: DjangoRQConfig = DjangoRQConfig( enabled=True, show_admin_link=True, # Show link in admin )

REST API

Endpoints

Django-cfg provides comprehensive REST API for monitoring:

GET /api/cfg/rq/monitor/ - Health check and system info GET /api/cfg/rq/monitor/health/ - System health status GET /api/cfg/rq/monitor/config/ - RQ configuration GET /api/cfg/rq/queues/ - List all queues GET /api/cfg/rq/queues/{name}/ - Queue details POST /api/cfg/rq/queues/{name}/empty/ - Empty queue GET /api/cfg/rq/workers/ - List all workers GET /api/cfg/rq/workers/{name}/ - Worker details GET /api/cfg/rq/jobs/ - List all jobs GET /api/cfg/rq/jobs/{id}/ - Job details POST /api/cfg/rq/jobs/{id}/cancel/ - Cancel job POST /api/cfg/rq/jobs/{id}/requeue/ - Requeue job DELETE /api/cfg/rq/jobs/{id}/ - Delete job GET /api/cfg/rq/schedules/ - List scheduled jobs

Examples

Get System Health:

curl http://localhost:8000/api/cfg/rq/monitor/health/

Response:

{ "healthy": true, "queues": { "default": {"count": 5, "workers": 2}, "high": {"count": 0, "workers": 1} }, "total_jobs": 5, "total_workers": 3 }

List Queues:

curl http://localhost:8000/api/cfg/rq/queues/

Response:

[ { "name": "default", "count": 5, "queued_jobs": 5, "started_jobs": 0, "finished_jobs": 42, "failed_jobs": 3, "workers": 2 } ]

Get Job Details:

curl http://localhost:8000/api/cfg/rq/jobs/{job-id}/

Response:

{ "id": "abc123", "func_name": "apps.crypto.tasks.update_coin_prices", "status": "finished", "queue": "default", "created_at": "2025-01-15T10:30:00Z", "started_at": "2025-01-15T10:30:05Z", "ended_at": "2025-01-15T10:30:15Z", "result": {"success": true, "updated": 50}, "args": [], "kwargs": {"limit": 50, "verbosity": 1} }

Cancel Job:

curl -X POST http://localhost:8000/api/cfg/rq/jobs/{job-id}/cancel/

Prometheus Metrics

Enable Metrics

django_rq: DjangoRQConfig = DjangoRQConfig( enabled=True, prometheus_enabled=True, )

Access Metrics

http://localhost:8000/django-rq/metrics/

Available Metrics

# Job counts by queue and status rq_jobs_total{queue="default",status="finished"} 12450 rq_jobs_total{queue="default",status="failed"} 125 # Current queue length rq_queue_length{queue="default"} 42 # Worker counts rq_workers_total{queue="default"} 2 # Job duration rq_job_duration_seconds{queue="default"} 1.5

Prometheus Configuration

# prometheus.yml scrape_configs: - job_name: 'django-rq' static_configs: - targets: ['localhost:8000'] metrics_path: '/django-rq/metrics/'

Grafana Dashboard

Example queries for Grafana:

# Jobs per minute rate(rq_jobs_total[1m]) # Failed jobs percentage rate(rq_jobs_total{status="failed"}[5m]) / rate(rq_jobs_total[5m]) * 100 # Queue depth rq_queue_length # Average job duration rate(rq_job_duration_seconds_sum[5m]) / rate(rq_job_duration_seconds_count[5m])

CLI Commands

rqstats

View queue statistics:

# Basic stats python manage.py rqstats # Real-time monitoring (refresh every 1 second) python manage.py rqstats --interval 1 # Specific queue python manage.py rqstats --queue default

Output:

default |██████████████████ | 42 0 0 high |█ | 1 0 0 low | | 0 0 0 queued: 43 workers: 3

Worker Management

# Start single worker python manage.py rqworker default # Start worker pool (4 workers) python manage.py rqworker-pool default --num-workers 4 # Start worker for multiple queues (priority) python manage.py rqworker high default low # Start with verbose logging python manage.py rqworker default --verbose

Scheduler Management

# Start scheduler python manage.py rqscheduler # Scheduler with verbose logging python manage.py rqscheduler --verbose

Web Dashboard

Django-RQ includes built-in web dashboard:

http://localhost:8000/django-rq/

Features

  • Queues Overview: See all queues at a glance
  • Job Browser: Browse and filter jobs
  • Worker Status: Monitor active workers
  • Statistics: Charts and graphs
  • Actions: Cancel, requeue, delete jobs

Monitoring Best Practices

1. Set Up Alerting

# Monitor queue depth if queue.count > 1000: send_alert("Queue depth too high") # Monitor failed jobs failed_rate = failed_jobs / total_jobs if failed_rate > 0.1: # 10% send_alert("High failure rate") # Monitor worker health if active_workers == 0: send_alert("No active workers")

2. Track Key Metrics

  • Queue depth: Number of pending jobs
  • Processing rate: Jobs per second
  • Failure rate: Failed jobs percentage
  • Average duration: Job execution time
  • Worker count: Active workers

3. Monitor Redis Health

# Check Redis memory usage redis-cli info memory # Check Redis keyspace redis-cli info keyspace # Monitor Redis connections redis-cli info clients

4. Use Logging

import logging logger = logging.getLogger('rq.jobs') def my_task(): logger.info("Task started") # ... logger.info("Task completed")

5. Implement Health Checks

def health_check_task(): """Periodic health check task.""" import django_rq # Check queues for queue_name in ['default', 'high', 'low']: queue = django_rq.get_queue(queue_name) # Check queue depth if queue.count > 1000: logger.warning(f"Queue {queue_name} depth: {queue.count}") # Check failed jobs failed_count = len(queue.failed_job_registry) if failed_count > 100: logger.warning(f"Queue {queue_name} failed jobs: {failed_count}") # Check workers workers = django_rq.get_workers() if len(workers) == 0: logger.error("No active workers!") return {"healthy": True, "queues": len(queues), "workers": len(workers)} # Schedule health check RQScheduleConfig( func="apps.monitoring.tasks.health_check_task", interval=60, # Every minute queue="high", )

Troubleshooting

Issue: Jobs Not Processing

Check:

  1. Are workers running? ps aux | grep rqworker
  2. Is Redis running? redis-cli ping
  3. Check worker logs
  4. Check queue: python manage.py rqstats

Solution:

# Start workers python manage.py rqworker default

Issue: High Memory Usage

Check:

  1. Redis memory: redis-cli info memory
  2. Worker memory: ps aux | grep rqworker

Solution:

# Set result TTL to expire old results RQQueueConfig( queue="default", default_result_ttl=500, # 8 minutes )

Issue: Failed Jobs Accumulating

Check:

# View failed jobs curl http://localhost:8000/api/cfg/rq/jobs/?status=failed

Solution:

# Requeue all failed jobs curl -X POST http://localhost:8000/api/cfg/rq/jobs/registries/failed/requeue-all/?queue=default # Or clear failed jobs curl -X POST http://localhost:8000/api/cfg/rq/jobs/registries/failed/clear/?queue=default

See Also

Documentation

Tools