api_alert.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. from django.contrib import auth
  2. from rest_framework.views import APIView
  3. from django.core.exceptions import ValidationError
  4. from api.utils import *
  5. from api.models import Alert
  6. import requests
  7. import json
  8. class AlertAPI(APIView):
  9. # 获取告警列表
  10. def get(self, request):
  11. if not request.user.identity == 'admin':
  12. return failed(message="仅允许管理员访问")
  13. alerts = []
  14. for alert in Alert.objects.all():
  15. alerts.append({
  16. 'name': alert.name,
  17. 'level': alert.level,
  18. 'metric': alert.metric,
  19. 'threshold': alert.threshold,
  20. 'handle': alert.handle,
  21. })
  22. return success(data=alerts)
  23. def post(self, request):
  24. if not request.user.identity == 'admin':
  25. return failed(message="仅允许管理员访问")
  26. operation = request.data.get('operation')
  27. # 新建告警
  28. if operation == 'create':
  29. data = request.data
  30. try:
  31. alert = Alert.objects.create(
  32. name=data.get('name'),
  33. level=data.get('level'),
  34. metric=data.get('metric'),
  35. threshold=float(data.get('threshold')),
  36. handle=data.get('handle'),
  37. state='enable' # 目前创建的告警都将持续生效
  38. )
  39. # 创建成功返回新建告警的ID
  40. return success(message="告警规则创建成功", data={'id': alert.id})
  41. except ValidationError as error:
  42. return failed(message=f"参数验证失败: {error}")
  43. except Exception as error:
  44. # 处理其他异常(如 threshold 转换失败)
  45. return failed(message=f"创建失败: {str(error)}")
  46. # 删除告警
  47. if operation == 'delete':
  48. name = request.data.get('name')
  49. if not name:
  50. return failed(message="删除告警时未传递ID信息")
  51. try:
  52. alert = Alert.objects.get(name=str(name))
  53. except Alert.DoesNotExist:
  54. return failed(message=f"未找到名称为{name}的告警")
  55. alert.delete()
  56. return success(message="告警规则删除成功", data={'id': alert.id})
  57. # 开关告警
  58. if operation == 'switch':
  59. id = request.data.get('id')
  60. state = request.data.get('state')
  61. if not state in ['enable', 'disable']:
  62. return failed(message=f"传递状态值:{state}不被允许")
  63. if not id:
  64. return failed(message="开关告警时未传递ID信息")
  65. try:
  66. alert = Alert.objects.get(id=int(id))
  67. except Alert.DoesNotExist:
  68. return failed(message=f"未找到ID为{id}的告警")
  69. alert.state = state
  70. alert.save()
  71. return success(message="告警规则切换开关成功", data={'id': alert.id})
  72. class AlertCheck(APIView):
  73. # 检查是否有触发的告警
  74. def get(self, request):
  75. if not request.user.identity == 'admin':
  76. return failed(message="仅允许管理员访问")
  77. triggeredAlerts = [alert.id for alert in Alert.objects.checkAlert()]
  78. # 返回的仅为触发告警的ID
  79. return success(data=triggeredAlerts)