From 0c8ce0ce27cd6b1e7bbf10189c4fb7672a4e73ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Mon, 18 Dec 2023 18:14:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0celery.py=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=87=8D=E8=AF=95=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/application/celery.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/backend/application/celery.py b/backend/application/celery.py index dbf6fde..d57b92a 100644 --- a/backend/application/celery.py +++ b/backend/application/celery.py @@ -1,9 +1,11 @@ +import functools import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings') from django.conf import settings from celery import platforms + # 租户模式 if "django_tenants" in settings.INSTALLED_APPS: from tenant_schemas_celery.app import CeleryApp as TenantAwareCeleryApp @@ -16,3 +18,23 @@ else: app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) platforms.C_FORCE_ROOT = True + + +def retry_base_task_error(): + """ + celery 失败重试装饰器 + :return: + """ + + def wraps(func): + @app.task(bind=True, retry_delay=180, max_retries=3) + @functools.wraps(func) + def wrapper(self, *args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as exc: + raise self.retry(exc=exc) + + return wrapper + + return wraps From d1abc58b4009b8886c9f81890fc2397589925071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 19 Dec 2023 00:34:14 +0800 Subject: [PATCH 2/3] feat: add __init__.py --- backend/logs/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 backend/logs/__init__.py diff --git a/backend/logs/__init__.py b/backend/logs/__init__.py new file mode 100644 index 0000000..e69de29 From e8c64d6d111a48e6cfa2c15c7dd062eb11223b3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com> Date: Tue, 19 Dec 2023 00:50:42 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AD=98?= =?UTF-8?q?=E6=B4=BB=E6=A3=80=E6=B5=8B=E4=B8=AD=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/application/settings.py | 1 + backend/dvadmin/utils/middleware.py | 57 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/backend/application/settings.py b/backend/application/settings.py index 590c144..77837ee 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -63,6 +63,7 @@ INSTALLED_APPS = [ ] MIDDLEWARE = [ + "dvadmin.utils.middleware.HealthCheckMiddleware", "django.middleware.security.SecurityMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", diff --git a/backend/dvadmin/utils/middleware.py b/backend/dvadmin/utils/middleware.py index 5443d14..f4717a4 100644 --- a/backend/dvadmin/utils/middleware.py +++ b/backend/dvadmin/utils/middleware.py @@ -2,9 +2,11 @@ 日志 django中间件 """ import json +import logging from django.conf import settings from django.contrib.auth.models import AnonymousUser +from django.http import HttpResponse, HttpResponseServerError from django.utils.deprecation import MiddlewareMixin from dvadmin.system.models import OperationLog @@ -87,3 +89,58 @@ class ApiLoggingMiddleware(MiddlewareMixin): if self.methods == 'ALL' or request.method in self.methods: self.__handle_response(request, response) return response + +logger = logging.getLogger("healthz") +class HealthCheckMiddleware(object): + """ + 存活检查中间件 + """ + def __init__(self, get_response): + self.get_response = get_response + # One-time configuration and initialization. + + def __call__(self, request): + if request.method == "GET": + if request.path == "/readiness": + return self.readiness(request) + elif request.path == "/healthz": + return self.healthz(request) + return self.get_response(request) + + def healthz(self, request): + """ + Returns that the server is alive. + """ + return HttpResponse("OK") + + def readiness(self, request): + # Connect to each database and do a generic standard SQL query + # that doesn't write any data and doesn't depend on any tables + # being present. + try: + from django.db import connections + for name in connections: + cursor = connections[name].cursor() + cursor.execute("SELECT 1;") + row = cursor.fetchone() + if row is None: + return HttpResponseServerError("db: invalid response") + except Exception as e: + logger.exception(e) + return HttpResponseServerError("db: cannot connect to database.") + + # Call get_stats() to connect to each memcached instance and get it's stats. + # This can effectively check if each is online. + try: + from django.core.cache import caches + from django.core.cache.backends.memcached import BaseMemcachedCache + for cache in caches.all(): + if isinstance(cache, BaseMemcachedCache): + stats = cache._cache.get_stats() + if len(stats) != len(cache._servers): + return HttpResponseServerError("cache: cannot connect to cache.") + except Exception as e: + logger.exception(e) + return HttpResponseServerError("cache: cannot connect to cache.") + + return HttpResponse("OK")