136 lines
4.7 KiB
Python
136 lines
4.7 KiB
Python
import psutil
|
|
import redis
|
|
from apps.monitor.models import AuditLog
|
|
from apps.system.models import User
|
|
from datetime import datetime
|
|
from apps.utils.tools import compare_values
|
|
from apps.utils.models import get_model_info
|
|
from server.celery import celery_control, celery_inspect
|
|
from django_redis import get_redis_connection
|
|
|
|
|
|
def delete_auditlog(model, instance_id):
|
|
"""
|
|
删除其对应的审计记录
|
|
"""
|
|
model_name = get_model_info(model)
|
|
AuditLog.objects.filter(model_name=model_name,
|
|
instance_id=instance_id).delete()
|
|
|
|
|
|
def create_auditlog(action: str, instance, val_new: dict, val_old: dict = None, change_time: datetime = None, change_user: User = None, change_reason: str = '', ignore_fields: list = None):
|
|
"""
|
|
生成审计日志
|
|
action: create/update/delete/其他action
|
|
"""
|
|
app_label_model_name = get_model_info(instance)
|
|
if val_old is None:
|
|
val_old = {}
|
|
if ignore_fields is None:
|
|
ignore_fields = getattr(instance, 'audit_ignore_fields', [
|
|
'create_by', 'update_by', 'create_time', 'update_time', 'id'])
|
|
difference = []
|
|
has_changed = False
|
|
|
|
if action == 'create':
|
|
has_changed = True
|
|
change_user_l = change_user if change_user else instance.create_by
|
|
change_time_l = change_time if change_time else instance.create_time
|
|
elif action == 'delete':
|
|
has_changed = True
|
|
change_user_l = change_user if change_user else instance.update_by
|
|
change_time_l = change_time if change_time else instance.update_time
|
|
else:
|
|
if action == 'update':
|
|
change_user_l = change_user if change_user else instance.update_by
|
|
change_time_l = change_time if change_time else instance.update_time
|
|
else:
|
|
has_changed = True
|
|
change_user_l = change_user
|
|
change_time_l = change_time
|
|
for k, v in val_new.items():
|
|
if k not in ignore_fields:
|
|
if k not in val_old:
|
|
difference.append(
|
|
{'field': k, 'action': 'create', 'val_old': None, 'val_new': v})
|
|
elif not compare_values(val_new.get(k), val_old.get(k), ignore_order=True):
|
|
difference.append(
|
|
{'field': k, 'action': 'update', 'val_old': val_old[k], 'val_new': v})
|
|
if action == 'update' and difference:
|
|
has_changed = True
|
|
if has_changed:
|
|
AuditLog.objects.create(
|
|
action=action,
|
|
model_name=app_label_model_name,
|
|
instance_id=instance.id,
|
|
val_new=val_new,
|
|
difference=difference,
|
|
change_reason=change_reason,
|
|
change_user=change_user_l,
|
|
change_time=change_time_l
|
|
)
|
|
|
|
|
|
class ServerService:
|
|
@classmethod
|
|
def get_memory_dict(cls):
|
|
ret = {}
|
|
memory = psutil.virtual_memory()
|
|
ret['total'] = round(memory.total/1024/1024/1024, 2)
|
|
ret['used'] = round(memory.used/1024/1024/1024, 2)
|
|
ret['percent'] = memory.percent
|
|
return ret
|
|
|
|
@classmethod
|
|
def get_cpu_dict(cls):
|
|
ret = {}
|
|
ret['lcount'] = psutil.cpu_count()
|
|
ret['count'] = psutil.cpu_count(logical=False)
|
|
ret['percent'] = psutil.cpu_percent(interval=1)
|
|
return ret
|
|
|
|
@classmethod
|
|
def get_disk_dict(cls):
|
|
ret = {}
|
|
disk = psutil.disk_usage('/')
|
|
ret['total'] = round(disk.total/1024/1024/1024, 2)
|
|
ret['used'] = round(disk.used/1024/1024/1024, 2)
|
|
ret['percent'] = disk.percent
|
|
return ret
|
|
|
|
@classmethod
|
|
def get_full(cls):
|
|
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()
|