alert.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. # 系统级检测
  29. if alert.level == 'system':
  30. if alert.metric == 'cpu' and alert.threshold <= float(SYSTEMPERFORMANCE['cpu']):
  31. triggeredAlert.append(alert)
  32. if alert.metric == 'mem' and alert.threshold <= float(SYSTEMPERFORMANCE['mem_used']):
  33. triggeredAlert.append(alert)
  34. if alert.metric == 'disk' and alert.threshold <= float(SYSTEMPERFORMANCE['disk_used']):
  35. triggeredAlert.append(alert)
  36. # 进程级检测,遍历所有活跃进程,检查性能占用
  37. if alert.level == 'process':
  38. # PROCESSPERFORMANCE结构应为:
  39. # cpu、mem_used
  40. for pid in PROCESSPERFORMANCE:
  41. if alert.metric == 'cpu' and alert.threshold <= float(PROCESSPERFORMANCE[pid]['cpu']):
  42. triggeredAlert.append(alert)
  43. if alert.metric == 'mem' and alert.threshold <= float(PROCESSPERFORMANCE[pid]['mem']):
  44. triggeredAlert.append(alert)
  45. return triggeredAlert
  46. class Alert(models.Model):
  47. create_time = models.DateTimeField(auto_now_add=True)
  48. update_time = models.DateTimeField(auto_now=True)
  49. name = models.CharField(default="未命名告警规则", max_length=64, unique=True)
  50. level = models.CharField(choices=alertLever, default='system', max_length=16)
  51. # 监控指标
  52. metric = models.CharField(choices=alertMetric, default='cpu', max_length=16)
  53. # 触发阈值
  54. threshold = models.FloatField()
  55. handle = models.CharField(choices=alertHandle, default='noAction', max_length=16)
  56. state = models.CharField(choices=alertState, default='disable', max_length=16)
  57. objects = AlertManager()
  58. class Meta:
  59. app_label = 'api'