Django middlewares to monitor your application with Prometheus.io
—
Monitor Django cache operations (get/hit/miss/fail) through instrumented cache backends for various cache systems. Provides visibility into cache performance and usage patterns.
Django-prometheus provides instrumented versions of Django's cache backends that automatically collect metrics on cache operations.
# File-based cache backend
django_prometheus.cache.backends.filebased.FileBasedCache
# Local memory cache backend
django_prometheus.cache.backends.locmem.LocMemCache
# Memcached backends
django_prometheus.cache.backends.memcached.PyMemcacheCache
django_prometheus.cache.backends.memcached.PyLibMCCache
# Redis cache backends
django_prometheus.cache.backends.redis.RedisCache
django_prometheus.cache.backends.redis.NativeRedisCache
# Django Memcached Consul backend
django_prometheus.cache.backends.django_memcached_consul.MemcachedCacheThe instrumented backends automatically track cache operations through method interception:
class CacheBackendMixin:
"""
Mixin that adds Prometheus monitoring to Django cache backends.
Automatically applied to all instrumented cache backends.
"""
def get(self, key, default=None, version=None):
"""
Instrumented cache get operation.
Tracks get attempts, hits, and misses.
Parameters:
- key: cache key
- default: default value if key not found
- version: cache key version
Returns:
Cached value or default
"""
def set(self, key, value, timeout=None, version=None):
"""
Instrumented cache set operation.
Parameters:
- key: cache key
- value: value to cache
- timeout: cache timeout in seconds
- version: cache key version
"""
def delete(self, key, version=None):
"""
Instrumented cache delete operation.
Parameters:
- key: cache key to delete
- version: cache key version
"""django_cache_get_total: Total get requests on cache by backenddjango_cache_get_hits_total: Total cache hits by backenddjango_cache_get_misses_total: Total cache misses by backenddjango_cache_get_fail_total: Total get request failures by backendConfigure cache backends in Django settings:
# settings.py
CACHES = {
'default': {
'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache', # Instead of 'django.core.cache.backends.redis.RedisCache'
'LOCATION': 'redis://127.0.0.1:6379/1',
},
'memcached': {
'BACKEND': 'django_prometheus.cache.backends.memcached.PyMemcacheCache', # Instead of 'django.core.cache.backends.memcached.PyMemcacheCache'
'LOCATION': '127.0.0.1:11211',
},
'file_cache': {
'BACKEND': 'django_prometheus.cache.backends.filebased.FileBasedCache', # Instead of 'django.core.cache.backends.filebased.FileBasedCache'
'LOCATION': '/var/tmp/django_cache',
},
'local_mem': {
'BACKEND': 'django_prometheus.cache.backends.locmem.LocMemCache', # Instead of 'django.core.cache.backends.locmem.LocMemCache'
'LOCATION': 'unique-snowflake',
}
}CACHES = {
'default': {
'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
},
'sessions': {
'BACKEND': 'django_prometheus.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
},
'api_cache': {
'BACKEND': 'django_prometheus.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
}
}
# Each cache backend will be tracked separately with its backend name as a labelfrom django.core.cache import cache
# These operations will be automatically tracked in cache metrics:
cache.set('user:123', user_data, timeout=300) # Cache set (not directly tracked)
user_data = cache.get('user:123') # Cache get - tracked as hit if found, miss if not
cache.delete('user:123') # Cache delete (not directly tracked)
# Get with default
user_data = cache.get('user:456', default={}) # Tracked as hit/missfrom django.core.cache import caches
# Use specific cache backends
default_cache = caches['default']
session_cache = caches['sessions']
api_cache = caches['api_cache']
# Each will be tracked separately by backend
default_cache.get('key1') # Tracked under 'redis' backend
session_cache.get('session:abc') # Tracked under 'redis' backend
api_cache.get('api:endpoint:123') # Tracked under 'memcached' backendfrom django.views.decorators.cache import cache_page
from django.core.cache import cache
@cache_page(60 * 15) # Cache for 15 minutes
def my_view(request):
# View caching will be tracked in cache metrics
return HttpResponse("Cached content")
# Manual caching in views
def api_view(request):
cache_key = f"api:data:{request.user.id}"
data = cache.get(cache_key) # Tracked as hit/miss
if data is None:
data = expensive_computation()
cache.set(cache_key, data, timeout=300)
return JsonResponse(data)<!-- Template fragment caching is also tracked -->
{% load cache %}
{% cache 500 my_cache_key user.id %}
<!-- Expensive template rendering -->
{% for item in expensive_queryset %}
<div>{{ item.name }}</div>
{% endfor %}
{% endcache %}All cache metrics include the following label:
backend: Cache backend type (e.g., 'redis', 'memcached', 'filebased', 'locmem')Use the metrics to calculate cache hit rates:
# Hit rate calculation:
# hit_rate = django_cache_get_hits_total / django_cache_get_total
# Miss rate calculation:
# miss_rate = django_cache_get_misses_total / django_cache_get_total
# Failure rate calculation:
# failure_rate = django_cache_get_fail_total / django_cache_get_totalInstall with Tessl CLI
npx tessl i tessl/pypi-django-prometheus