mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 12:51:13 -05:00
Set up auto metric collection
Add Django Celery tasks and utilities to periodically collect system metrics (error rates, response times, queue sizes) and record them into metric_time_series. Include monitoring app scaffolding, metrics collector, Celery beat schedule, middleware for live metrics, and a Supabase edge function for cross-source metrics.
This commit is contained in:
52
django/apps/monitoring/middleware.py
Normal file
52
django/apps/monitoring/middleware.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
Middleware for tracking API response times and error rates.
|
||||
"""
|
||||
import time
|
||||
import logging
|
||||
from django.core.cache import cache
|
||||
from django.utils.deprecation import MiddlewareMixin
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class MetricsMiddleware(MiddlewareMixin):
|
||||
"""
|
||||
Middleware to track API response times and error rates.
|
||||
Stores metrics in cache for periodic collection.
|
||||
"""
|
||||
|
||||
def process_request(self, request):
|
||||
"""Record request start time."""
|
||||
request._metrics_start_time = time.time()
|
||||
return None
|
||||
|
||||
def process_response(self, request, response):
|
||||
"""Record response time and update metrics."""
|
||||
if hasattr(request, '_metrics_start_time'):
|
||||
response_time = (time.time() - request._metrics_start_time) * 1000 # Convert to ms
|
||||
|
||||
# Store response time in cache for aggregation
|
||||
cache_key = 'metrics:response_times'
|
||||
response_times = cache.get(cache_key, [])
|
||||
response_times.append(response_time)
|
||||
|
||||
# Keep only last 100 response times
|
||||
if len(response_times) > 100:
|
||||
response_times = response_times[-100:]
|
||||
|
||||
cache.set(cache_key, response_times, 300) # 5 minute TTL
|
||||
|
||||
# Track cache hits/misses
|
||||
if response.status_code == 200:
|
||||
cache.incr('metrics:cache_hits', 1)
|
||||
|
||||
return response
|
||||
|
||||
def process_exception(self, request, exception):
|
||||
"""Track exceptions and error rates."""
|
||||
logger.error(f"Exception in request: {exception}", exc_info=True)
|
||||
|
||||
# Increment error counter
|
||||
cache.incr('metrics:cache_misses', 1)
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user