alert.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.db import models
  2. import os, errno
  3. from api.utils import SYSTEMPERFORMANCE, PROCESSPERFORMANCE
  4. from api.utils import *
  5. alertLever = [
  6. ('system', '系统级'),
  7. ('process', '进程级'),
  8. ]
  9. alertMetric = [
  10. ('cpu', 'cpu使用率'),
  11. ('mem', '内存占用'),
  12. ('disk', '硬盘占用')
  13. ]
  14. alertHandle = [
  15. ('noAction', '不做处理'),
  16. ('closeLatest', '关闭最新进程'),
  17. ('closeHighestCpu', '关闭CPU占用最高进程'),
  18. ('closeHighestMem', '关闭MEM占用最高进程'),
  19. ]
  20. alertState = [
  21. ('enable', '启用'),
  22. ('disable', '未启用'),
  23. ]
  24. class AlertManager(models.Manager):
  25. def checkAlert(self):
  26. triggeredAlert = []
  27. for alert in self.get_queryset().filter(state='enable'):
  28. print(SYSTEMPERFORMANCE)
  29. # 系统级检测
  30. if alert.level == 'system':
  31. if alert.metric == 'cpu' and alert.threshold <= float(SYSTEMPERFORMANCE['cpu']):
  32. triggeredAlert.append(alert)
  33. if alert.metric == 'mem' and alert.threshold <= float(SYSTEMPERFORMANCE['mem_used']):
  34. triggeredAlert.append(alert)
  35. if alert.metric == 'disk' and alert.threshold <= float(SYSTEMPERFORMANCE['disk_used']):
  36. triggeredAlert.append(alert)
  37. # 进程级检测,遍历所有活跃进程,检查性能占用
  38. if alert.level == 'process':
  39. # PROCESSPERFORMANCE结构应为:
  40. # cpu、mem_used
  41. for pid in PROCESSPERFORMANCE:
  42. if alert.metric == 'cpu' and alert.threshold <= float(PROCESSPERFORMANCE[pid]['cpu']):
  43. triggeredAlert.append(alert)
  44. if alert.metric == 'mem' and alert.threshold <= float(PROCESSPERFORMANCE[pid]['mem']):
  45. triggeredAlert.append(alert)
  46. return triggeredAlert
  47. class Alert(models.Model):
  48. create_time = models.DateTimeField(auto_now_add=True)
  49. update_time = models.DateTimeField(auto_now=True)
  50. name = models.CharField(default="未命名告警规则", max_length=64, unique=True)
  51. level = models.CharField(choices=alertLever, default='system', max_length=16)
  52. # 监控指标
  53. metric = models.CharField(choices=alertMetric, default='cpu', max_length=16)
  54. # 触发阈值
  55. threshold = models.FloatField()
  56. handle = models.CharField(choices=alertHandle, default='noAction', max_length=16)
  57. state = models.CharField(choices=alertState, default='disable', max_length=16)
  58. objects = AlertManager()
  59. class Meta:
  60. app_label = 'api'