新功能(服务监控API): 服务监控API

pull/21/head
李强 2021-04-21 00:24:25 +08:00
parent 9bfac232fe
commit f804d45bed
3 changed files with 91 additions and 23 deletions

View File

@ -13,7 +13,18 @@ class ServerSerializer(CustomModelSerializer):
class Meta: class Meta:
model = Server model = Server
fields = '__all__' fields = ("id", "ip", "name", "os", "remark")
class UpdateServerSerializer(CustomModelSerializer):
"""
服务器信息 简单序列化器
"""
class Meta:
model = Server
fields = ("name", "remark")
# ================================================= # # ================================================= #
# ************** 服务器监控信息 序列化器 ************** # # ************** 服务器监控信息 序列化器 ************** #

View File

@ -8,7 +8,8 @@ router.register(r'server', ServerModelViewSet)
router.register(r'monitor', MonitorModelViewSet) router.register(r'monitor', MonitorModelViewSet)
urlpatterns = [ urlpatterns = [
re_path('monitor/info/', MonitorModelViewSet.as_view({'get': 'get_monitor_info'})), re_path('monitor/info/(?P<pk>.*)/', MonitorModelViewSet.as_view({'get': 'get_monitor_info'})),
re_path('monitor/rate/(?P<pk>.*)/', MonitorModelViewSet.as_view({'get': 'get_rate_info'})),
re_path('monitor/enabled/', MonitorModelViewSet.as_view({'get': 'enabled_monitor_info'})), re_path('monitor/enabled/', MonitorModelViewSet.as_view({'get': 'enabled_monitor_info'})),
re_path('monitor/clean/', MonitorModelViewSet.as_view({'get': 'clean_all'})), re_path('monitor/clean/', MonitorModelViewSet.as_view({'get': 'clean_all'})),
] ]

View File

@ -2,9 +2,9 @@ from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSch
from rest_framework.request import Request from rest_framework.request import Request
from .filters import ServerFilter, MonitorFilter from .filters import ServerFilter, MonitorFilter
from .models import Server, Monitor from .models import Server, Monitor, SysFiles
from .serializers import ServerSerializer, MonitorSerializer from .serializers import ServerSerializer, MonitorSerializer, UpdateServerSerializer
from ..op_drf.response import SuccessResponse from ..op_drf.response import SuccessResponse, ErrorResponse
from ..op_drf.viewsets import CustomModelViewSet from ..op_drf.viewsets import CustomModelViewSet
from ..permission.permissions import CommonPermission from ..permission.permissions import CommonPermission
from ..system.models import ConfigSettings from ..system.models import ConfigSettings
@ -16,6 +16,7 @@ class ServerModelViewSet(CustomModelViewSet):
""" """
queryset = Server.objects.all() queryset = Server.objects.all()
serializer_class = ServerSerializer serializer_class = ServerSerializer
update_serializer_class = UpdateServerSerializer
# extra_filter_backends = [DataLevelPermissionsFilter] # extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = ServerFilter filter_class = ServerFilter
update_extra_permission_classes = (CommonPermission,) update_extra_permission_classes = (CommonPermission,)
@ -37,7 +38,80 @@ class MonitorModelViewSet(CustomModelViewSet):
create_extra_permission_classes = (CommonPermission,) create_extra_permission_classes = (CommonPermission,)
ordering = '-create_datetime' # 默认排序 ordering = '-create_datetime' # 默认排序
def get_rate_info(self, request: Request, *args, **kwargs):
"""
获取使用率 监控信息
:param request:
:param args:
:param kwargs:
:return:
"""
pk = kwargs.get("pk")
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(server__id=pk).order_by("-create_datetime")
# 间隔取值
queryset_count = queryset.count()
Interval_num = 1 if queryset_count < 200 else int(queryset_count / 100)
queryset = queryset.values('cpu_sys', 'mem_num', 'mem_sys')[::Interval_num][:100]
data = {
"cpu": [],
"memory": [],
}
for ele in queryset:
data["cpu"].append(float(ele.get('cpu_sys', 0)))
data["memory"].append(float(ele.get('mem_num', 0)) and round(float(ele.get('mem_sys', 0)) /
float(ele.get('mem_num', 0)), 4))
return SuccessResponse(data=data)
def get_monitor_info(self, request: Request, *args, **kwargs): def get_monitor_info(self, request: Request, *args, **kwargs):
"""
最新的服务器状态信息
:param request:
:param args:
:param kwargs:
:return:
"""
pk = kwargs.get("pk")
instance = Monitor.objects.filter(server__id=pk).order_by("-create_datetime").first()
if not instance:
return ErrorResponse(msg="未找到服务器信息id")
serializer = self.get_serializer(instance)
data = serializer.data
return SuccessResponse(data={
"cpu": {
"total": int(data.get('cpu_num'), 0),
"used": "", # cpu核心 可不传如指cpu当前主频该值可以传
"rate": float(data.get('cpu_sys', 0)),
"unit": "核心", # 默认单位 核心
},
"memory": {
"total": int(int(data.get('mem_num', 0)) / 1024),
"used": int(int(data.get('mem_sys', 0)) / 1024),
"rate": int(data.get('mem_num', 0)) and round(int(data.get('mem_sys', 0)) /
int(data.get('mem_num', 0)), 4),
"unit": "MB", # 默认单位 MB
},
"disk": [{
"dir_name": ele.get('dir_name'),
"total": int(int(ele.get('total', 0)) / 1024 / 1024 / 1024),
"used": int(int(ele.get('disk_sys', 0)) / 1024 / 1024 / 1024),
"rate": int(ele.get('total', 0)) and round(int(ele.get('disk_sys', 0)) / int(ele.get('total', 0)),
4),
"unit": "GB", # 默认单位 GB
} for ele in SysFiles.objects.filter(monitor=instance).values('dir_name', 'total', 'disk_sys')]
})
def enabled_monitor_info(self, request: Request, *args, **kwargs):
"""
更新和获取监控信息
:param request:
:param args:
:param kwargs:
:return:
"""
enabled = request.query_params.get('enabled', None)
save_days = request.query_params.get('save_days', None)
interval = request.query_params.get('interval', None)
# 定时获取系统监控信息 # 定时获取系统监控信息
periodictask_obj = PeriodicTask.objects.filter(task='apps.vadmin.monitor.tasks.get_monitor_info').first() periodictask_obj = PeriodicTask.objects.filter(task='apps.vadmin.monitor.tasks.get_monitor_info').first()
if not periodictask_obj: if not periodictask_obj:
@ -73,33 +147,15 @@ class MonitorModelViewSet(CustomModelViewSet):
config_obj.remark = "定时清理多余-系统监控信息默认30天" config_obj.remark = "定时清理多余-系统监控信息默认30天"
config_obj.save() config_obj.save()
# 获取保留天数
return SuccessResponse(data={
"enabled": periodictask_obj.enabled,
"interval": periodictask_obj.interval.every,
"save_days": config_obj.configValue if config_obj else "30",
})
def enabled_monitor_info(self, request: Request, *args, **kwargs):
enabled = request.query_params.get('enabled', None)
save_days = request.query_params.get('save_days', None)
interval = request.query_params.get('interval', None)
periodictask_obj = PeriodicTask.objects.filter(task='apps.vadmin.monitor.tasks.get_monitor_info').first()
if enabled: if enabled:
# 更新监控状态 # 更新监控状态
periodictask_obj.enabled = True if enabled == "1" else False periodictask_obj.enabled = True if enabled == "1" else False
periodictask_obj.save() periodictask_obj.save()
# 更新 定时清理多余 系统监控信息 状态 # 更新 定时清理多余 系统监控信息 状态
clean_task_obj = PeriodicTask.objects.filter(
task='apps.vadmin.monitor.tasks.clean_surplus_monitor_info').first()
clean_task_obj.enabled = True if enabled == "1" else False clean_task_obj.enabled = True if enabled == "1" else False
clean_task_obj.save() clean_task_obj.save()
# 更新保留天数 # 更新保留天数
config_obj = ConfigSettings.objects.filter(configKey='sys.monitor.info.save_days').first()
print(33, save_days)
print(22, config_obj)
if save_days and config_obj: if save_days and config_obj:
config_obj.configValue = save_days config_obj.configValue = save_days
config_obj.save() config_obj.save()