feat: ops添加celery状态监控

This commit is contained in:
caoqianming 2025-02-08 17:31:49 +08:00
parent 0eb0100e60
commit 239692cbd6
3 changed files with 60 additions and 2 deletions

View File

@ -1,4 +1,6 @@
import psutil import psutil
from server.celery import celery_inspect
from django_redis import get_redis_connection
class ServerService: class ServerService:
@classmethod @classmethod
@ -30,3 +32,34 @@ class ServerService:
@classmethod @classmethod
def get_full(cls): def get_full(cls):
return {'cpu': cls.get_cpu_dict(), 'memory': cls.get_memory_dict(), 'disk': cls.get_disk_dict()} return {'cpu': cls.get_cpu_dict(), 'memory': cls.get_memory_dict(), 'disk': cls.get_disk_dict()}
class CeleryMonitor:
@classmethod
def get_info(cls):
count_active_task = 0
count_scheduled_task = 0
count_registered_task = 0
active_tasks = celery_inspect.active()
if active_tasks:
_, first_value = active_tasks.popitem()
count_active_task = len(first_value)
scheduled_tasks = celery_inspect.scheduled()
if scheduled_tasks:
_, first_value = scheduled_tasks.popitem()
count_scheduled_task = len(first_value)
registered_tasks = celery_inspect.registered()
if registered_tasks:
_, first_value = registered_tasks.popitem()
count_registered_task = len(first_value)
return {
'count_active_task': count_active_task,
'count_scheduled_task': count_scheduled_task,
'count_registered_task': count_registered_task,
}
class RedisMonitor:
@classmethod
def get_info(cls):
conn = get_redis_connection()
return conn.info()

View File

@ -2,7 +2,7 @@ from django.urls import path
from apps.ops.views import (DrfRequestLogViewSet, CpuView, MemoryView, DiskView, DbBackupDeleteView, from apps.ops.views import (DrfRequestLogViewSet, CpuView, MemoryView, DiskView, DbBackupDeleteView,
LogView, LogDetailView, LogView, LogDetailView,
DbBackupView, ReloadClientGit, ReloadServerGit, ReloadServerOnly, DbBackupView, ReloadClientGit, ReloadServerGit, ReloadServerOnly,
BackupDatabase, BackupMedia, TlogViewSet) BackupDatabase, BackupMedia, TlogViewSet, CeleryInfoView, RedisInfoView)
API_BASE_URL = 'api/ops/' API_BASE_URL = 'api/ops/'
HTML_BASE_URL = 'ops/' HTML_BASE_URL = 'ops/'
@ -19,6 +19,8 @@ urlpatterns = [
path(API_BASE_URL + 'server/cpu/', CpuView.as_view()), path(API_BASE_URL + 'server/cpu/', CpuView.as_view()),
path(API_BASE_URL + 'server/memory/', MemoryView.as_view()), path(API_BASE_URL + 'server/memory/', MemoryView.as_view()),
path(API_BASE_URL + 'server/disk/', DiskView.as_view()), path(API_BASE_URL + 'server/disk/', DiskView.as_view()),
path(API_BASE_URL + 'celery/', CeleryInfoView.as_view()),
path(API_BASE_URL + 'redis/', RedisInfoView.as_view()),
path(API_BASE_URL + 'request_log/', path(API_BASE_URL + 'request_log/',
DrfRequestLogViewSet.as_view({'get': 'list'}), name='requestlog_view'), DrfRequestLogViewSet.as_view({'get': 'list'}), name='requestlog_view'),
path(API_BASE_URL + 'tlog/', path(API_BASE_URL + 'tlog/',

View File

@ -17,7 +17,7 @@ from rest_framework.exceptions import APIException
from apps.ops.tasks import reload_server_git, reload_server_only, reload_web_git, backup_database, backup_media from apps.ops.tasks import reload_server_git, reload_server_only, reload_web_git, backup_database, backup_media
from rest_framework.permissions import IsAdminUser from rest_framework.permissions import IsAdminUser
from drf_yasg.utils import swagger_auto_schema from drf_yasg.utils import swagger_auto_schema
from apps.ops.service import ServerService from apps.ops.service import ServerService, CeleryMonitor, RedisMonitor
from server.settings import BACKUP_PATH from server.settings import BACKUP_PATH
# Create your views here. # Create your views here.
@ -253,3 +253,26 @@ class TlogViewSet(ListModelMixin, CustomGenericViewSet):
ordering = ['-requested_at'] ordering = ['-requested_at']
filterset_class = TlogFilterSet filterset_class = TlogFilterSet
search_fields = ['path'] search_fields = ['path']
class CeleryInfoView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
"""
获取celery状态信息
获取celery状态信息
"""
return Response(CeleryMonitor.get_info())
class RedisInfoView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
"""
获取redis状态信息
获取redis状态信息
"""
return Response(RedisMonitor.get_info())