From 7629d8d2f4064771998fc4eb8a0e11436490ddf3 Mon Sep 17 00:00:00 2001 From: PouyaKhajavi Date: Sat, 8 Aug 2026 11:33:14 +0330 Subject: [PATCH] feat(core): implement system health check endpoint --- backend/config/settings.py | 2 +- backend/config/urls.py | 2 ++ backend/core/views.py | 41 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/backend/config/settings.py b/backend/config/settings.py index d2c1167..aa0f560 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -53,7 +53,7 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ - 'corsheaders.middleware.CorsMiddleware', # Place CORS middleware at the top + 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', diff --git a/backend/config/urls.py b/backend/config/urls.py index cc1daf2..a6e0d7a 100644 --- a/backend/config/urls.py +++ b/backend/config/urls.py @@ -16,9 +16,11 @@ Including another URLconf """ from django.contrib import admin from django.urls import path,include +from core.views import HealthCheckView urlpatterns = [ path('admin/', admin.site.urls), + path('api/health/', HealthCheckView.as_view(), name='health-check'), path('api/crawlers/', include('crawler.urls')), path('api/ads/', include('ads.urls')), ] diff --git a/backend/core/views.py b/backend/core/views.py index 91ea44a..7050432 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -1,3 +1,40 @@ -from django.shortcuts import render +from django.db import connection +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework import status +import os +import redis -# Create your views here. +class HealthCheckView(APIView): + """ + Endpoint to check system health (database connection and redis connection). + """ + authentication_classes = [] + permission_classes = [] + + def get(self, request): + db_status = "healthy" + redis_status = "healthy" + + # Check Database + try: + connection.ensure_connection() + except Exception as e: + db_status = f"unhealthy: {str(e)}" + + # Check Redis + try: + redis_url = os.getenv("REDIS_URL", "redis://localhost:6379/0") + r = redis.Redis.from_url(redis_url, socket_timeout=3) + r.ping() + except Exception as e: + redis_status = f"unhealthy: {str(e)}" + + is_healthy = db_status == "healthy" and redis_status == "healthy" + status_code = status.HTTP_200_OK if is_healthy else status.HTTP_503_SERVICE_UNAVAILABLE + + return Response({ + "status": "healthy" if is_healthy else "unhealthy", + "database": db_status, + "redis": redis_status + }, status=status_code)