Procházet zdrojové kódy

add: 自定义函数指标注册

yq před 5 měsíci
rodič
revize
5a73ddb63f

+ 1 - 1
commom/user_exceptions.py

@@ -13,4 +13,4 @@ class GeneralException(Exception):
         self.result_codes_enum = result_codes_enum
 
     def __str__(self):
-        return f"{self.result_codes_enum.code} {self.result_codes_enum.message} {self.message}"
+        return f"codes: {self.result_codes_enum.code} {self.result_codes_enum.message} message: {self.message}"

+ 11 - 1
metric_test.py

@@ -5,10 +5,20 @@
 @desc: 
 """
 from data import DataLoaderMysql
-from entitys import DbConfigEntity
+from entitys import DbConfigEntity, MetricFucEntity
+from metrics import MetricBase, f_register_metric_func
 from monitor import MonitorMetric
 
+
+class A(MetricBase):
+
+    def calculate(self, *args, **kwargs) -> MetricFucEntity:
+        return MetricFucEntity(table=None, value='1', image_path='./cache/t1.png')
+
+
 if __name__ == "__main__":
+    # f_register_metric_func(A)
+
     db_config = DbConfigEntity.from_config("./config/mysql_config.json")
     data_loader = DataLoaderMysql(db_config)
     # metric_clzz = MetricBySqlGeneral()

+ 27 - 7
metrics/__init__.py

@@ -4,22 +4,42 @@
 @time: 2022/10/24
 @desc: 指标计算相关
 """
-from typing import Dict
 
-from commom import f_get_clazz_in_module
+import threading
+
+from commom import f_get_clazz_in_module, GeneralException
+from enums import ResultCodesEnum
 from .metric_base import MetricBase
 from .metric_by_sql_general import MetricBySqlGeneral
 
-__all__ = ['f_get_metric_clazz_dict', 'MetricBase', 'MetricBySqlGeneral']
+__all__ = ['f_get_metric_clazz_dict', 'f_register_metric_func', 'MetricBase', 'MetricBySqlGeneral']
+
+lock = threading.Lock()
+metric_clazz_dict = {}
+
+
+def _update_metric_clazz_dict(key, value):
+    with lock:
+        if key in metric_clazz_dict.keys():
+            raise GeneralException(ResultCodesEnum.ILLEGAL_PARAMS, message=f"自定义指标函数【{key}】已注册或出现重名")
+        metric_clazz_dict[key] = value
+
+
+def f_register_metric_func(clazz: MetricBase):
+    if not hasattr(clazz, '_symbol') or not clazz._symbol == MetricBase._symbol:
+        raise GeneralException(ResultCodesEnum.ILLEGAL_PARAMS, message=f"自定义指标函数没有继承类【MetricBase】")
+    _update_metric_clazz_dict(clazz.__name__, clazz)
 
 
 def f_get_metric_clazz_dict():
-    all_classes = f_get_clazz_in_module(__import__(__name__))
-    metric_clazz_dict = {}
-    for cls in all_classes:
-        metric_clazz_dict[cls.__name__] = cls
     return metric_clazz_dict
 
 
+all_classes = f_get_clazz_in_module(__import__(__name__))
+for clazz in all_classes:
+    if not hasattr(clazz, '_symbol') or not clazz._symbol == MetricBase._symbol:
+        continue
+    f_register_metric_func(clazz)
+
 if __name__ == "__main__":
     pass

+ 4 - 0
metrics/metric_base.py

@@ -12,6 +12,10 @@ from entitys import MetricFucEntity
 
 
 class MetricBase(metaclass=abc.ABCMeta):
+    _symbol = "MetricBase"
+
+    def __init__(self, *args, **kwargs):
+        pass
 
     def _get_image_path(self, file_name: str) -> str:
         image_path = os.path.join(BaseConfig.image_path, file_name)

+ 1 - 1
metrics/metric_by_sql_general.py

@@ -30,4 +30,4 @@ class MetricBySqlGeneral(MetricBase):
         return data
 
     def calculate(self, *args, **kwargs) -> MetricFucEntity:
-        return MetricFucEntity(table=self._load_data(*args, **kwargs), value='0', image_path='./cache/t1.png')
+        return MetricFucEntity(table=self._load_data(*args, **kwargs))