monitor_metric_config_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 entitys import MetricConfigEntity
  12. from enums import ResultCodesEnum
  13. from metrics import f_get_metric_clazz_dict, MetricBase
  14. class MonitorMetricConfigEntity():
  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 MonitorMetricConfigEntity(**j)
  53. if __name__ == "__main__":
  54. pass