mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 11:11:16 -05:00
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.
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
"""
|
|
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
|