From c9f62e01f09a56743ccc3e470f273875ab22ac5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> Date: Wed, 9 Oct 2024 16:19:52 +0800 Subject: [PATCH] fix config relative some issues --- .../sentryPlugins/ai_block_io/README.md | 1 - .../sentryPlugins/ai_block_io/ai_block_io.py | 21 +++++----- .../ai_block_io/config_parser.py | 42 +++++++++---------- .../sentryPlugins/ai_block_io/detector.py | 2 +- .../ai_block_io/sliding_window.py | 8 ++-- .../sentryPlugins/ai_block_io/threshold.py | 6 +-- 6 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/python/sentryPlugins/ai_block_io/README.md b/src/python/sentryPlugins/ai_block_io/README.md index f9b8388..95c1111 100644 --- a/src/python/sentryPlugins/ai_block_io/README.md +++ b/src/python/sentryPlugins/ai_block_io/README.md @@ -1,2 +1 @@ # slow_io_detection - diff --git a/src/python/sentryPlugins/ai_block_io/ai_block_io.py b/src/python/sentryPlugins/ai_block_io/ai_block_io.py index 31b8a97..3b00ef3 100644 --- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py +++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py @@ -16,8 +16,7 @@ import logging from .detector import Detector from .threshold import ThresholdFactory, AbsoluteThreshold from .sliding_window import SlidingWindowFactory -from .utils import (get_threshold_type_enum, get_sliding_window_type_enum, get_data_queue_size_and_update_size, - get_log_level) +from .utils import get_data_queue_size_and_update_size from .config_parser import ConfigParser from .data_access import get_io_data_from_collect_plug, check_collect_valid from .io_data import MetricName @@ -45,25 +44,25 @@ class SlowIODetection: def __init_detector_name_list(self): self._disk_list = check_collect_valid(self._config_parser.get_slow_io_detect_frequency()) + logging.info(f"ai_block_io plug has found disks: {self._disk_list}") disks_to_detection: list = self._config_parser.get_disks_to_detection() # 情况1:None,则启用所有磁盘检测 # 情况2:is not None and len = 0,则不启动任何磁盘检测 # 情况3:len != 0,则取交集 if disks_to_detection is None: + logging.warning("you not specify any disk or use default, so ai_block_io will enable all available disk.") for disk in self._disk_list: self._detector_name_list.append(MetricName(disk, "bio", "read", "latency")) self._detector_name_list.append(MetricName(disk, "bio", "write", "latency")) elif len(disks_to_detection) == 0: - logging.warning('please attention: conf file not specify any disk to detection, ' - 'so it will not start ai block io.') + logging.warning('please attention: conf file not specify any disk to detection, so it will not start ai block io.') else: - disks_name_to_detection = [] - for disk_name_to_detection in disks_to_detection: - disks_name_to_detection.append(disk_name_to_detection.get_disk_name()) - disk_intersection = [disk for disk in self._disk_list if disk in disks_name_to_detection] - for disk in disk_intersection: - self._detector_name_list.append(MetricName(disk, "bio", "read", "latency")) - self._detector_name_list.append(MetricName(disk, "bio", "write", "latency")) + for disk_to_detection in disks_to_detection: + if disk_to_detection in self._disk_list: + self._detector_name_list.append(MetricName(disk_to_detection, "bio", "read", "latency")) + self._detector_name_list.append(MetricName(disk_to_detection, "bio", "write", "latency")) + else: + logging.warning(f"disk:[{disk_to_detection}] not in available disk list, so it will be ignored.") logging.info(f'start to detection follow disk and it\'s metric: {self._detector_name_list}') def __init_detector(self): diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py index 632391d..354c122 100644 --- a/src/python/sentryPlugins/ai_block_io/config_parser.py +++ b/src/python/sentryPlugins/ai_block_io/config_parser.py @@ -10,18 +10,19 @@ # See the Mulan PSL v2 for more details. import configparser -import json import logging -from .io_data import MetricName from .threshold import ThresholdType from .utils import get_threshold_type_enum, get_sliding_window_type_enum, get_log_level + LOG_FORMAT = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" def init_log_format(log_level: str): - logging.basicConfig(level=get_log_level(log_level), format=LOG_FORMAT) + logging.basicConfig(level=get_log_level(log_level.lower()), format=LOG_FORMAT) + if log_level.lower() not in ('info', 'warning', 'error', 'debug'): + logging.warning(f'the log_level: {log_level} you set is invalid, use default value: info.') class ConfigParser: @@ -43,7 +44,7 @@ class ConfigParser: self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY self.__log_level = ConfigParser.DEFAULT_LOG_LEVEL - self.__disks_to_detection: list = [] + self.__disks_to_detection = None self.__algorithm_type = ConfigParser.DEFAULT_ALGORITHM_TYPE self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION @@ -83,26 +84,20 @@ class ConfigParser: logging.warning(f'slow_io_detect_frequency type conversion has error, use default value: {self.__slow_io_detect_frequency}.') def __read__disks_to_detect(self, items_common: dict): - disks_to_detection = items_common.get('disks_to_detect') + disks_to_detection = items_common.get('disk') if disks_to_detection is None: - logging.warning(f'config of disks_to_detect not found, the default value be used.') + logging.warning(f'config of disk not found, the default value will be used.') self.__disks_to_detection = None return - try: - disks_to_detection_list = json.loads(disks_to_detection) - for disk_to_detection in disks_to_detection_list: - disk_name = disk_to_detection.get('disk_name', None) - stage_name = disk_to_detection.get('stage_name', None) - io_access_type_name = disk_to_detection.get('io_access_type_name', None) - metric_name = disk_to_detection.get('metric_name', None) - if not (disk_name is None or stage_name is None or io_access_type_name is None or metric_name is None): - metric_name_object = MetricName(disk_name, stage_name, io_access_type_name, metric_name) - self.__disks_to_detection.append(metric_name_object) - else: - logging.warning(f'config of disks_to_detect\'s some part has some error: {disk_to_detection}, it will be ignored.') - except json.decoder.JSONDecodeError as e: - logging.warning(f'config of disks_to_detect is error: {e}, it will be ignored and default value be used.') + disk_list = disks_to_detection.split(',') + if len(disk_list) == 0 or (len(disk_list) == 1 and disk_list[0] == ''): + logging.warning("you don't specify any disk.") + self.__disks_to_detection = [] + return + if len(disk_list) == 1 and disk_list[0] == 'default': self.__disks_to_detection = None + return + self.__disks_to_detection = disk_list def __read__train_data_duration(self, items_algorithm: dict): try: @@ -189,7 +184,12 @@ class ConfigParser: def read_config_from_file(self): con = configparser.ConfigParser() - con.read(self.__config_file_name, encoding='utf-8') + try: + con.read(self.__config_file_name, encoding='utf-8') + except configparser.Error as e: + init_log_format(self.__log_level) + logging.critical(f'config file read error: {e}, ai_block_io plug will exit.') + exit(1) if con.has_section('common'): items_common = dict(con.items('common')) diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py index bcf62cb..a48144f 100644 --- a/src/python/sentryPlugins/ai_block_io/detector.py +++ b/src/python/sentryPlugins/ai_block_io/detector.py @@ -50,6 +50,6 @@ class Detector: def __repr__(self): return (f'disk_name: {self._metric_name.get_disk_name()}, stage_name: {self._metric_name.get_stage_name()},' - f' access_type_name: {self._metric_name.get_io_access_type_name()},' + f' io_type_name: {self._metric_name.get_io_access_type_name()},' f' metric_name: {self._metric_name.get_metric_name()}, threshold_type: {self._threshold},' f' sliding_window_type: {self._slidingWindow}') diff --git a/src/python/sentryPlugins/ai_block_io/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py index d395d48..89191e5 100644 --- a/src/python/sentryPlugins/ai_block_io/sliding_window.py +++ b/src/python/sentryPlugins/ai_block_io/sliding_window.py @@ -52,7 +52,7 @@ class SlidingWindow: return False, None, None def __repr__(self): - return "SlidingWindow" + return "[SlidingWindow]" class NotContinuousSlidingWindow(SlidingWindow): @@ -65,7 +65,7 @@ class NotContinuousSlidingWindow(SlidingWindow): return False, self._io_data_queue, self._ai_threshold def __repr__(self): - return "NotContinuousSlidingWindow" + return f"[NotContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" class ContinuousSlidingWindow(SlidingWindow): @@ -84,7 +84,7 @@ class ContinuousSlidingWindow(SlidingWindow): return False, self._io_data_queue, self._ai_threshold def __repr__(self): - return "ContinuousSlidingWindow" + return f"[ContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" class MedianSlidingWindow(SlidingWindow): @@ -98,7 +98,7 @@ class MedianSlidingWindow(SlidingWindow): return False, self._io_data_queue, self._ai_threshold def __repr__(self): - return "MedianSlidingWindow" + return f"[MedianSlidingWindow, window size: {self._queue_length}]" class SlidingWindowFactory: diff --git a/src/python/sentryPlugins/ai_block_io/threshold.py b/src/python/sentryPlugins/ai_block_io/threshold.py index ff85d85..3b7a5a8 100644 --- a/src/python/sentryPlugins/ai_block_io/threshold.py +++ b/src/python/sentryPlugins/ai_block_io/threshold.py @@ -75,7 +75,7 @@ class AbsoluteThreshold(Threshold): pass def __repr__(self): - return "AbsoluteThreshold" + return "[AbsoluteThreshold]" class BoxplotThreshold(Threshold): @@ -109,7 +109,7 @@ class BoxplotThreshold(Threshold): self.new_data_size = 0 def __repr__(self): - return "BoxplotThreshold" + return f"[BoxplotThreshold, param is: {self.parameter}]" class NSigmaThreshold(Threshold): @@ -142,7 +142,7 @@ class NSigmaThreshold(Threshold): self.new_data_size = 0 def __repr__(self): - return "NSigmaThreshold" + return f"[NSigmaThreshold, param is: {self.parameter}]" class ThresholdType(Enum): -- 2.23.0