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()
 |