scheduler.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # your_app/scheduler.py
  2. import logging
  3. from apscheduler.schedulers.background import BackgroundScheduler
  4. from django_apscheduler.jobstores import DjangoJobStore
  5. from .models import Alert
  6. from .utils import SYSTEMPERFORMANCE, TRIGGEREDALERTS, BASE_FILE_PATH
  7. from django.db import DatabaseError
  8. from pathlib import Path
  9. logger = logging.getLogger("scheduler")
  10. def getUploadFolderSize():
  11. total_size = 0
  12. for path in Path(BASE_FILE_PATH).rglob('*'):
  13. if path.is_file():
  14. try:
  15. total_size += path.stat().st_size
  16. except (FileNotFoundError, PermissionError):
  17. pass
  18. # 返回值单位是B
  19. return total_size
  20. def checkAlert():
  21. # 计算用户上传文件总大小,存入系统性能信息
  22. SYSTEMPERFORMANCE['disk_used'] = getUploadFolderSize()
  23. # 获取所有开启的告警,存入触发告警列表
  24. TRIGGEREDALERTS.clear()
  25. TRIGGEREDALERTS.extend(Alert.objects.checkAlert())
  26. # 显示当前触发的告警
  27. if TRIGGEREDALERTS:
  28. try:
  29. # 获取所有告警对象
  30. if TRIGGEREDALERTS:
  31. # 生成制表符分隔的表格化输出
  32. alert_table = "\n".join([
  33. f"{alert.name}\t{alert.level}\t{alert.metric}\t{alert.threshold}"
  34. for alert in TRIGGEREDALERTS
  35. ])
  36. logger.warning(f"当前触发告警 (共{len(TRIGGEREDALERTS)}条):\n名称\t级别\t指标\t阈值\n{alert_table}")
  37. except DatabaseError as e:
  38. logger.error(f"获取告警数据失败: {str(e)}")
  39. # 初始化调度器
  40. scheduler = BackgroundScheduler()
  41. def start_scheduler():
  42. try:
  43. # 使用Django的JobStore
  44. scheduler.add_jobstore(DjangoJobStore(), "default")
  45. # 添加任务(避免重复添加)
  46. if not scheduler.get_job("5_seconds_job"):
  47. scheduler.add_job(
  48. checkAlert,
  49. 'interval',
  50. seconds=2,
  51. id="5_seconds_job",
  52. replace_existing=True,
  53. )
  54. logger.info("定时任务已启动")
  55. # 启动调度器
  56. if not scheduler.running:
  57. scheduler.start()
  58. except Exception as e:
  59. logger.error(f"调度器启动失败: {str(e)}")