monitor_entity.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: yq
  4. @time: 2024/11/1
  5. @desc: 常用指标实体集合
  6. """
  7. import json
  8. import os
  9. from typing import List, Dict
  10. from commom import GeneralException
  11. from enums import ResultCodesEnum
  12. from metrics import f_get_metric_clazz_dict, MetricBase
  13. from .metric_entity import MetricConfigEntity
  14. class MonitorConfigEntity():
  15. def __init__(self, metric_config_list: List[MetricConfigEntity], template_path: str):
  16. self._template_path = template_path
  17. self._metric_clazz_dict = f_get_metric_clazz_dict()
  18. self._metric_dict: Dict[str, MetricBase] = self._init_metric(metric_config_list)
  19. @property
  20. def template_path(self):
  21. return self._template_path
  22. @property
  23. def metric_dict(self):
  24. return self._metric_dict
  25. def _init_metric(self, metric_config_list: List[MetricConfigEntity]) -> Dict[str, MetricBase]:
  26. metric_dict = {}
  27. for metric_config in metric_config_list:
  28. metric_func_name = metric_config.metric_func
  29. metric_code = metric_config.metric_code
  30. # 指标函数不存在
  31. if metric_func_name not in self._metric_clazz_dict.keys():
  32. raise GeneralException(ResultCodesEnum.NOT_FOUND, message=f"指标函数【{metric_func_name}】不存在")
  33. # 指标code不唯一
  34. if metric_code in metric_dict.keys():
  35. raise GeneralException(ResultCodesEnum.ILLEGAL_PARAMS, message=f"指标code【{metric_code}】不唯一")
  36. metric_clazz = self._metric_clazz_dict[metric_func_name]
  37. metric_dict[metric_code] = metric_clazz(*metric_config.args, **metric_config.kwargs)
  38. return metric_dict
  39. @staticmethod
  40. def from_config(config_path: str):
  41. """
  42. 从配置文件生成实体类
  43. """
  44. if os.path.exists(config_path):
  45. with open(config_path, mode="r", encoding="utf-8") as f:
  46. j = json.loads(f.read())
  47. else:
  48. raise GeneralException(ResultCodesEnum.NOT_FOUND, message=f"指标监控配置文件【{config_path}】不存在")
  49. metric_config_list = j.get("metric_config_list", [])
  50. metric_config_list = [MetricConfigEntity(**i) for i in metric_config_list]
  51. j["metric_config_list"] = metric_config_list
  52. return MonitorConfigEntity(**j)
  53. if __name__ == "__main__":
  54. pass