244 lines
12 KiB
Diff
244 lines
12 KiB
Diff
|
|
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
|
|||
|
|
|