factory/apps/monitor/views.py

143 lines
4.4 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.shortcuts import render
import psutil
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ViewSet
from django.conf import settings
import os
from rest_framework import serializers, status
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework.exceptions import NotFound
from rest_framework.mixins import ListModelMixin
from apps.monitor.models import DrfRequestLog
from apps.monitor.errors import LOG_NOT_FONED
from apps.utils.viewsets import CustomGenericViewSet
# Create your views here.
def index(request):
return render(request, 'monitor/index.html')
def room(request, room_name):
return render(request, 'monitor/room.html', {
'room_name': room_name
})
def video(request):
return render(request, 'monitor/video.html')
class ServerInfoView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
"""
获取服务器当前状态
cpu/内存/硬盘
"""
ret = {'cpu': {}, 'memory': {}, 'disk': {}}
ret['cpu']['count'] = psutil.cpu_count()
ret['cpu']['lcount'] = psutil.cpu_count(logical=False)
ret['cpu']['percent'] = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
ret['memory']['total'] = round(memory.total/1024/1024/1024, 2)
ret['memory']['used'] = round(memory.used/1024/1024/1024, 2)
ret['memory']['percent'] = memory.percent
disk = psutil.disk_usage('/')
ret['disk']['total'] = round(disk.total/1024/1024/1024, 2)
ret['disk']['used'] = round(disk.used/1024/1024/1024, 2)
ret['disk']['percent'] = disk.percent
return Response(ret)
def get_file_list(file_path):
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
# 注意这里使用lambda表达式将文件按照最后修改时间顺序升序排列
# os.path.getmtime() 函数是获取文件最后修改时间
# os.path.getctime() 函数是获取文件最后创建时间
dir_list = sorted(dir_list, key=lambda x: os.path.getmtime(
os.path.join(file_path, x)), reverse=True)
# print(dir_list)
return dir_list
class LogView(APIView):
@swagger_auto_schema(manual_parameters=[
openapi.Parameter('name', openapi.IN_QUERY,
description='日志文件名', type=openapi.TYPE_STRING)
])
def get(self, request, *args, **kwargs):
"""
查看最近的日志列表
查看最近的日志列表
"""
logs = []
name = request.GET.get('name', None)
# for root, dirs, files in os.walk(settings.LOG_PATH):
# files.reverse()
for file in get_file_list(settings.LOG_PATH):
if len(logs) > 50:
break
filepath = os.path.join(settings.LOG_PATH, file)
if name:
if name in filepath:
fsize = os.path.getsize(filepath)
if fsize:
logs.append({
"name": file,
"filepath": filepath,
"size": round(fsize/1000, 1)
})
else:
fsize = os.path.getsize(filepath)
if fsize:
logs.append({
"name": file,
"filepath": filepath,
"size": round(fsize/1000, 1)
})
return Response(logs)
class LogDetailView(APIView):
def get(self, request, name):
"""
查看日志详情
查看日志详情
"""
try:
with open(os.path.join(settings.LOG_PATH, name)) as f:
data = f.read()
return Response(data)
except:
raise NotFound(**LOG_NOT_FONED)
class DrfRequestLogSerializer(serializers.ModelSerializer):
class Meta:
model = DrfRequestLog
fields = '__all__'
class DrfRequestLogViewSet(ListModelMixin, CustomGenericViewSet):
"""请求日志
请求日志
"""
perms_map = {'get':'requestlog.view'}
queryset = DrfRequestLog.objects.all()
list_serializer_class = DrfRequestLogSerializer
ordering = ['-requested_at']