automated_task_monitor/monitor/models.py

121 lines
5.6 KiB
Python
Raw Normal View History

from django.db import models
from django.utils import timezone
class BaseProcessMonitor(models.Model):
"""基础进程监控模型"""
pid = models.IntegerField(verbose_name='进程ID')
process_name = models.CharField(max_length=255, verbose_name='进程名称')
is_active = models.BooleanField(default=True, verbose_name='是否活跃')
status = models.IntegerField(default=1, verbose_name='进程状态') # 1: 运行中, 0: 已终止
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
log_file = models.CharField(max_length=255, null=True, blank=True, verbose_name='日志文件路径')
class Meta:
abstract = True
class HighCPUProcess(BaseProcessMonitor):
"""CPU高占用进程监控"""
cpu_usage = models.FloatField(default=0, verbose_name='CPU使用率')
cpu_cores = models.IntegerField(default=0, verbose_name='CPU核心数')
class Meta:
verbose_name = 'CPU高占用进程'
verbose_name_plural = verbose_name
class HighGPUProcess(BaseProcessMonitor):
"""GPU高占用进程监控"""
gpu_usage = models.FloatField(default=0, verbose_name='GPU使用率')
gpu_memory = models.FloatField(default=0, verbose_name='GPU显存使用量(MB)')
gpu_index = models.IntegerField(default=0, verbose_name='GPU设备索引')
class Meta:
verbose_name = 'GPU高占用进程'
verbose_name_plural = verbose_name
class HighMemoryProcess(BaseProcessMonitor):
"""内存高占用进程监控"""
memory_usage = models.FloatField(default=0, verbose_name='内存使用量(GB)')
memory_percent = models.FloatField(default=0, verbose_name='内存使用率')
virtual_memory = models.FloatField(default=0, verbose_name='虚拟内存使用量(GB)')
swap_usage = models.FloatField(default=0, verbose_name='交换内存使用量(GB)')
class Meta:
verbose_name = '内存高占用进程'
verbose_name_plural = verbose_name
class AllResourceProcess(models.Model):
"""所有资源统计"""
pid = models.IntegerField('进程ID')
process_name = models.CharField('进程名称', max_length=100)
# CPU 相关
cpu_usage = models.FloatField('CPU使用率', default=0)
cpu_user_time = models.FloatField('用户态CPU时间', default=0)
cpu_system_time = models.FloatField('系统态CPU时间', default=0)
# 内存相关
memory_usage = models.FloatField('内存使用量(MB)', default=0)
memory_percent = models.FloatField('内存使用率', default=0)
virtual_memory = models.FloatField('虚拟内存(MB)', default=0)
# GPU 相关
gpu_usage = models.FloatField('GPU使用率', default=0)
gpu_memory = models.FloatField('GPU内存使用量(MB)', default=0)
# 网络相关
net_io_sent = models.FloatField('网络发送量(MB)', default=0)
net_io_recv = models.FloatField('网络接收量(MB)', default=0)
# 状态相关
is_active = models.BooleanField('是否活跃', default=True)
status = models.IntegerField('状态', default=1) # 1:运行中, 0:已终止
log_file = models.CharField('日志文件路径', max_length=255, null=True)
created_at = models.DateTimeField('创建时间', auto_now_add=True)
updated_at = models.DateTimeField('更新时间', auto_now=True)
class Meta:
db_table = 'all_resource_process'
verbose_name = '全资源监控'
verbose_name_plural = verbose_name
class TiktokUserVideos(models.Model):
"""TikTok用户视频信息"""
sec_user_id = models.CharField(max_length=255, unique=True, verbose_name="安全用户ID")
unique_id = models.CharField(max_length=255, blank=True, null=True, verbose_name="唯一标识符")
nickname = models.CharField(max_length=255, blank=True, null=True, verbose_name="昵称")
signature = models.TextField(blank=True, null=True, verbose_name="签名")
# 用户统计数据
follower_count = models.IntegerField(default=0, verbose_name="粉丝数")
following_count = models.IntegerField(default=0, verbose_name="关注数")
video_count = models.IntegerField(default=0, verbose_name="视频数")
total_favorited = models.IntegerField(default=0, verbose_name="获赞总数")
# 用户资料信息
avatar_url = models.TextField(blank=True, null=True, verbose_name="头像URL")
verified = models.BooleanField(default=False, verbose_name="是否认证")
private_account = models.BooleanField(default=False, verbose_name="是否私密账号")
# 视频存储相关
videos_folder = models.CharField(max_length=255, verbose_name="视频文件夹")
# 时间记录
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
verbose_name = 'TikTok用户视频'
verbose_name_plural = 'TikTok用户视频'
indexes = [
models.Index(fields=['unique_id']),
]
def __str__(self):
display_name = self.nickname if self.nickname else self.unique_id if self.unique_id else self.sec_user_id
return f"{display_name} ({self.sec_user_id[:8]}...)"
def get_stats_summary(self):
"""获取用户统计数据摘要"""
return {
'followers': self.follower_count,
'following': self.following_count,
'videos': self.video_count,
'likes': self.total_favorited,
}