diff --git a/sysSentry-1.0.2/config/collector.conf b/sysSentry-1.0.2/config/collector.conf index 28ef024f086c520e5416ddc909e93c529e7b48c7..9baa08620ab711ab67945479a1cd602fdff7e9e0 100644 --- a/sysSentry-1.0.2/config/collector.conf +++ b/sysSentry-1.0.2/config/collector.conf @@ -2,6 +2,6 @@ modules=io [io] -period_time=5 +period_time=1 max_save=10 disk=default \ No newline at end of file diff --git a/sysSentry-1.0.2/src/python/plugins/avg_block_io/avg_block_io.py b/sysSentry-1.0.2/src/python/plugins/avg_block_io/avg_block_io.py index cfc11423f2997bf3047c44180e51f969cb5d3b7c..f14255090a0dd52082b31112819b0e45a950d986 100644 --- a/sysSentry-1.0.2/src/python/plugins/avg_block_io/avg_block_io.py +++ b/sysSentry-1.0.2/src/python/plugins/avg_block_io/avg_block_io.py @@ -77,7 +77,7 @@ def read_config_algorithm(config): if not (1 <= win_size <= 300): raise ValueError("Invalid win_size") win_threshold = int(config.get("algorithm", "win_threshold")) - if not (1 <= win_threshold <= 300): + if win_threshold < 1 or win_threshold > 300 or win_threshold > win_size: raise ValueError("Invalid win_threshold") except ValueError: report_alarm_fail("Invalid win_threshold or win_size") diff --git a/sysSentry-1.0.2/src/python/plugins/avg_block_io/module_conn.py b/sysSentry-1.0.2/src/python/plugins/avg_block_io/module_conn.py index 5f9ef357ba6c4b95fbde70d29f930e24729db4dd..0ff982d55fa587abdcc79fa527fd119874c3deb8 100644 --- a/sysSentry-1.0.2/src/python/plugins/avg_block_io/module_conn.py +++ b/sysSentry-1.0.2/src/python/plugins/avg_block_io/module_conn.py @@ -77,5 +77,5 @@ def process_report_data(disk_name, rw, io_data): for stage_name in kernel_stage: if is_abnormal((disk_name, stage_name, rw), io_data): logging.warning("{} - {} - {} report kernel".format(time.ctime(), disk_name, rw)) - + return logging.warning("{} - {} - {} report IO press".format(time.ctime(), disk_name, rw)) diff --git a/sysSentry-1.0.2/src/python/sentryCollector/collect_config.py b/sysSentry-1.0.2/src/python/sentryCollector/collect_config.py index 698e7c3f7a14d7cfd470e7e354dd1fbaa0800a3b..b6cc75c42bb2002c62521b7fe03efaa6328c0081 100644 --- a/sysSentry-1.0.2/src/python/sentryCollector/collect_config.py +++ b/sysSentry-1.0.2/src/python/sentryCollector/collect_config.py @@ -15,6 +15,7 @@ Read and save collector.conf value. import configparser import logging import os +import re COLLECT_CONF_PATH = "/etc/sysSentry/collector.conf" @@ -53,12 +54,18 @@ class CollectConfig: try: common_config = self.config[CONF_COMMON] - modules_list = common_config.get(CONF_MODULES, '').split(',') + modules_str = common_config[CONF_MODULES] + # remove space + modules_list = modules_str.replace(" ", "").split(',') except KeyError as e: logging.error("read config data failed, %s", e) return + pattern = r'^[a-zA-Z0-9-_]+$' for module_name in modules_list: + if not re.match(pattern, module_name): + logging.warning("module_name: %s is invalid", module_name) + continue if not self.config.has_section(module_name): logging.warning("module_name: %s config is incorrect", module_name) continue @@ -94,6 +101,11 @@ class CollectConfig: disk = io_map_value.get(CONF_IO_DISK) if disk: disk_str = disk.replace(" ", "") + pattern = r'^[a-zA-Z0-9-_,]+$' + if not re.match(pattern, disk_str): + logging.warning("module_name = %s section, field = %s is incorrect, use default %s", + CONF_IO, CONF_IO_DISK, CONF_IO_DISK_DEFAULT) + disk_str = CONF_IO_DISK_DEFAULT result_io_config[CONF_IO_DISK] = disk_str else: logging.warning("module_name = %s section, field = %s is incorrect, use default %s", diff --git a/sysSentry-1.0.2/src/python/sentryCollector/collect_io.py b/sysSentry-1.0.2/src/python/sentryCollector/collect_io.py index bdbfecae58fe2abe1292f54a9acd056d2264d7e3..b826dc4be6a156cd074b9ffee4d9520c7588cfbb 100644 --- a/sysSentry-1.0.2/src/python/sentryCollector/collect_io.py +++ b/sysSentry-1.0.2/src/python/sentryCollector/collect_io.py @@ -96,19 +96,43 @@ class CollectIo(): IO_GLOBAL_DATA[disk_name][stage][Io_Category[index]].insert(0, [curr_lat, curr_io_dump, curr_io_length, curr_iops]) def get_iops(self, curr_stage_value, last_stage_value, category): - finish = int(curr_stage_value[category * 3 + IoStatus.FINISH]) - int(last_stage_value[category * 3 + IoStatus.FINISH]) - return finish // self.period_time + try: + finish = int(curr_stage_value[category * 3 + IoStatus.FINISH]) - int(last_stage_value[category * 3 + IoStatus.FINISH]) + except ValueError as e: + logging.error("get_iops convert to int failed, %s", e) + return 0 + value = finish / self.period_time + if value.is_integer(): + return int(value) + else: + return round(value, 1) def get_latency_value(self, curr_stage_value, last_stage_value, category): - finish = self.get_iops(curr_stage_value, last_stage_value, category) - lat_time = (int(curr_stage_value[category * 3 + IoStatus.LATENCY]) - int(last_stage_value[category * 3 + IoStatus.LATENCY])) // self.period_time - if finish > 0 and lat_time > 0: - return lat_time // finish - return 0 + try: + finish = int(curr_stage_value[category * 3 + IoStatus.FINISH]) - int(last_stage_value[category * 3 + IoStatus.FINISH]) + lat_time = (int(curr_stage_value[category * 3 + IoStatus.LATENCY]) - int(last_stage_value[category * 3 + IoStatus.LATENCY])) + except ValueError as e: + logging.error("get_latency_value convert to int failed, %s", e) + return 0 + if finish <= 0 or lat_time <= 0: + return 0 + value = lat_time / finish / 1000 / 1000 + if value.is_integer(): + return int(value) + else: + return round(value, 1) def get_io_length(self, curr_stage_value, last_stage_value, category): - finish = self.get_iops(curr_stage_value, last_stage_value, category) - return finish // self.period_time + try: + finish = int(curr_stage_value[category * 3 + IoStatus.FINISH]) - int(last_stage_value[category * 3 + IoStatus.FINISH]) + except ValueError as e: + logging.error("get_io_length convert to int failed, %s", e) + return 0 + value = finish / self.period_time / 1000 / 1000 + if value.is_integer(): + return int(value) + else: + return round(value, 1) def get_io_dump(self, disk_name, stage, category): io_dump_file = '/sys/kernel/debug/block/{}/blk_io_hierarchy/{}/io_dump'.format(disk_name, stage) diff --git a/sysSentry-1.0.2/src/python/sentryCollector/collect_plugin.py b/sysSentry-1.0.2/src/python/sentryCollector/collect_plugin.py index 9c8cc6dc9fe5000bf247f0e7844d86f7df0f7ff4..49ce0a868ba8c3a0f98d6bfb4cf36c1aff0689be 100644 --- a/sysSentry-1.0.2/src/python/sentryCollector/collect_plugin.py +++ b/sysSentry-1.0.2/src/python/sentryCollector/collect_plugin.py @@ -1,276 +1,276 @@ -# coding: utf-8 -# Copyright (c) 2024 Huawei Technologies Co., Ltd. -# sysSentry is licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -# See the Mulan PSL v2 for more details. - -""" -collcet plugin -""" -import json -import socket -import logging -import re - -COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" - -# data length param -CLT_MSG_HEAD_LEN = 9 #3+2+4 -CLT_MSG_PRO_LEN = 2 -CLT_MSG_MAGIC_LEN = 3 -CLT_MSG_LEN_LEN = 4 - -CLT_MAGIC = "CLT" -RES_MAGIC = "RES" - -# disk limit -LIMIT_DISK_CHAR_LEN = 32 -LIMIT_DISK_LIST_LEN = 10 - -# stage limit -LIMIT_STAGE_CHAR_LEN = 20 -LIMIT_STAGE_LIST_LEN = 15 - -#iotype limit -LIMIT_IOTYPE_CHAR_LEN = 7 -LIMIT_IOTYPE_LIST_LEN = 4 - -#period limit -LIMIT_PERIOD_MIN_LEN = 1 -LIMIT_PERIOD_MAX_LEN = 300 - -# interface protocol -class ClientProtocol(): - IS_IOCOLLECT_VALID = 0 - GET_IO_DATA = 1 - PRO_END = 3 - -class ResultMessage(): - RESULT_SUCCEED = 0 - RESULT_UNKNOWN = 1 # unknown error - RESULT_NOT_PARAM = 2 # the parameter does not exist or the type does not match. - RESULT_INVALID_LENGTH = 3 # invalid parameter length. - RESULT_EXCEED_LIMIT = 4 # the parameter length exceeds the limit. - RESULT_PARSE_FAILED = 5 # parse failed - RESULT_INVALID_CHAR = 6 # invalid char - -Result_Messages = { - ResultMessage.RESULT_SUCCEED: "Succeed", - ResultMessage.RESULT_UNKNOWN: "Unknown error", - ResultMessage.RESULT_NOT_PARAM: "The parameter does not exist or the type does not match", - ResultMessage.RESULT_INVALID_LENGTH: "Invalid parameter length", - ResultMessage.RESULT_EXCEED_LIMIT: "The parameter length exceeds the limit", - ResultMessage.RESULT_PARSE_FAILED: "Parse failed", - ResultMessage.RESULT_INVALID_CHAR: "Invalid char" -} - - -def client_send_and_recv(request_data, data_str_len, protocol): - """client socket send and recv message""" - try: - client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - except socket.error: - print("collect_plugin: client creat socket error") - return None - - try: - client_socket.connect(COLLECT_SOCKET_PATH) - except OSError: - client_socket.close() - print("collect_plugin: client connect error") - return None - - req_data_len = len(request_data) - request_msg = CLT_MAGIC + str(protocol).zfill(CLT_MSG_PRO_LEN) + str(req_data_len).zfill(CLT_MSG_LEN_LEN) + request_data - - try: - client_socket.send(request_msg.encode()) - res_data = client_socket.recv(len(RES_MAGIC) + CLT_MSG_PRO_LEN + data_str_len) - res_data = res_data.decode() - except (OSError, UnicodeError): - client_socket.close() - print("collect_plugin: client communicate error") - return None - - res_magic = res_data[:CLT_MSG_MAGIC_LEN] - if res_magic != "RES": - print("res msg format error") - return None - - protocol_str = res_data[CLT_MSG_MAGIC_LEN:CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN] - try: - protocol_id = int(protocol_str) - except ValueError: - print("recv msg protocol id is invalid %s", protocol_str) - return None - - if protocol_id >= ClientProtocol.PRO_END: - print("protocol id is invalid") - return None - - try: - res_data_len = int(res_data[CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN:]) - res_msg_data = client_socket.recv(res_data_len) - res_msg_data = res_msg_data.decode() - return res_msg_data - except (OSError, ValueError, UnicodeError): - print("collect_plugin: client recv res msg error") - finally: - client_socket.close() - - return None - -def validate_parameters(param, len_limit, char_limit): - ret = ResultMessage.RESULT_SUCCEED - if not param: - print("parm is invalid") - ret = ResultMessage.RESULT_NOT_PARAM - return [False, ret] - - if not isinstance(param, list): - print(f"{param} is not list type.") - ret = ResultMessage.RESULT_NOT_PARAM - return [False, ret] - - if len(param) <= 0: - print(f"{param} length is 0.") - ret = ResultMessage.RESULT_INVALID_LENGTH - return [False, ret] - - if len(param) > len_limit: - print(f"{param} length more than {len_limit}") - ret = ResultMessage.RESULT_EXCEED_LIMIT - return [False, ret] - - pattern = r'^[a-zA-Z0-9_-]+$' - for info in param: - if len(info) > char_limit: - print(f"{info} length more than {char_limit}") - ret = ResultMessage.RESULT_EXCEED_LIMIT - return [False, ret] - if not re.match(pattern, info): - print(f"{info} is invalid char") - ret = ResultMessage.RESULT_INVALID_CHAR - return [False, ret] - - return [True, ret] - -def is_iocollect_valid(period, disk_list=None, stage=None): - result = inter_is_iocollect_valid(period, disk_list, stage) - error_code = result['ret'] - if error_code != ResultMessage.RESULT_SUCCEED: - result['message'] = Result_Messages[error_code] - return result - -def inter_is_iocollect_valid(period, disk_list=None, stage=None): - result = {} - result['ret'] = ResultMessage.RESULT_UNKNOWN - result['message'] = "" - - if not period or not isinstance(period, int): - result['ret'] = ResultMessage.RESULT_NOT_PARAM - return result - if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN: - result['ret'] = ResultMessage.RESULT_INVALID_LENGTH - return result - - if not disk_list: - disk_list = [] - else: - res = validate_parameters(disk_list, LIMIT_DISK_LIST_LEN, LIMIT_DISK_CHAR_LEN) - if not res[0]: - result['ret'] = res[1] - return result - - if not stage: - stage = [] - else: - res = validate_parameters(stage, LIMIT_STAGE_LIST_LEN, LIMIT_STAGE_CHAR_LEN) - if not res[0]: - result['ret'] = res[1] - return result - - req_msg_struct = { - 'disk_list': json.dumps(disk_list), - 'period': period, - 'stage': json.dumps(stage) - } - request_message = json.dumps(req_msg_struct) - result_message = client_send_and_recv(request_message, CLT_MSG_LEN_LEN, ClientProtocol.IS_IOCOLLECT_VALID) - if not result_message: - print("collect_plugin: client_send_and_recv failed") - return result - - try: - json.loads(result_message) - except json.JSONDecodeError: - print("is_iocollect_valid: json decode error") - result['ret'] = ResultMessage.RESULT_PARSE_FAILED - return result - - result['ret'] = ResultMessage.RESULT_SUCCEED - result['message'] = result_message - return result - -def get_io_data(period, disk_list, stage, iotype): - result = inter_get_io_data(period, disk_list, stage, iotype) - error_code = result['ret'] - if error_code != ResultMessage.RESULT_SUCCEED: - result['message'] = Result_Messages[error_code] - return result - -def inter_get_io_data(period, disk_list, stage, iotype): - result = {} - result['ret'] = ResultMessage.RESULT_UNKNOWN - result['message'] = "" - - if not isinstance(period, int): - result['ret'] = ResultMessage.RESULT_NOT_PARAM - return result - if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN: - result['ret'] = ResultMessage.RESULT_INVALID_LENGTH - return result - - res = validate_parameters(disk_list, LIMIT_DISK_LIST_LEN, LIMIT_DISK_CHAR_LEN) - if not res[0]: - result['ret'] = res[1] - return result - - res = validate_parameters(stage, LIMIT_STAGE_LIST_LEN, LIMIT_STAGE_CHAR_LEN) - if not res[0]: - result['ret'] = res[1] - return result - - res = validate_parameters(iotype, LIMIT_IOTYPE_LIST_LEN, LIMIT_IOTYPE_CHAR_LEN) - if not res[0]: - result['ret'] = res[1] - return result - - req_msg_struct = { - 'disk_list': json.dumps(disk_list), - 'period': period, - 'stage': json.dumps(stage), - 'iotype' : json.dumps(iotype) - } - - request_message = json.dumps(req_msg_struct) - result_message = client_send_and_recv(request_message, CLT_MSG_LEN_LEN, ClientProtocol.GET_IO_DATA) - if not result_message: - print("collect_plugin: client_send_and_recv failed") - return result - try: - json.loads(result_message) - except json.JSONDecodeError: - print("get_io_data: json decode error") - result['ret'] = ResultMessage.RESULT_PARSE_FAILED - return result - - result['ret'] = ResultMessage.RESULT_SUCCEED - result['message'] = result_message - return result - +# coding: utf-8 +# Copyright (c) 2024 Huawei Technologies Co., Ltd. +# sysSentry is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. + +""" +collcet plugin +""" +import json +import socket +import logging +import re + +COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" + +# data length param +CLT_MSG_HEAD_LEN = 9 #3+2+4 +CLT_MSG_PRO_LEN = 2 +CLT_MSG_MAGIC_LEN = 3 +CLT_MSG_LEN_LEN = 4 + +CLT_MAGIC = "CLT" +RES_MAGIC = "RES" + +# disk limit +LIMIT_DISK_CHAR_LEN = 32 +LIMIT_DISK_LIST_LEN = 10 + +# stage limit +LIMIT_STAGE_CHAR_LEN = 20 +LIMIT_STAGE_LIST_LEN = 15 + +#iotype limit +LIMIT_IOTYPE_CHAR_LEN = 7 +LIMIT_IOTYPE_LIST_LEN = 4 + +#period limit +LIMIT_PERIOD_MIN_LEN = 1 +LIMIT_PERIOD_MAX_LEN = 300 + +# interface protocol +class ClientProtocol(): + IS_IOCOLLECT_VALID = 0 + GET_IO_DATA = 1 + PRO_END = 3 + +class ResultMessage(): + RESULT_SUCCEED = 0 + RESULT_UNKNOWN = 1 # unknown error + RESULT_NOT_PARAM = 2 # the parameter does not exist or the type does not match. + RESULT_INVALID_LENGTH = 3 # invalid parameter length. + RESULT_EXCEED_LIMIT = 4 # the parameter length exceeds the limit. + RESULT_PARSE_FAILED = 5 # parse failed + RESULT_INVALID_CHAR = 6 # invalid char + +Result_Messages = { + ResultMessage.RESULT_SUCCEED: "Succeed", + ResultMessage.RESULT_UNKNOWN: "Unknown error", + ResultMessage.RESULT_NOT_PARAM: "The parameter does not exist or the type does not match", + ResultMessage.RESULT_INVALID_LENGTH: "Invalid parameter length", + ResultMessage.RESULT_EXCEED_LIMIT: "The parameter length exceeds the limit", + ResultMessage.RESULT_PARSE_FAILED: "Parse failed", + ResultMessage.RESULT_INVALID_CHAR: "Invalid char" +} + + +def client_send_and_recv(request_data, data_str_len, protocol): + """client socket send and recv message""" + try: + client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + except socket.error: + print("collect_plugin: client creat socket error") + return None + + try: + client_socket.connect(COLLECT_SOCKET_PATH) + except OSError: + client_socket.close() + print("collect_plugin: client connect error") + return None + + req_data_len = len(request_data) + request_msg = CLT_MAGIC + str(protocol).zfill(CLT_MSG_PRO_LEN) + str(req_data_len).zfill(CLT_MSG_LEN_LEN) + request_data + + try: + client_socket.send(request_msg.encode()) + res_data = client_socket.recv(len(RES_MAGIC) + CLT_MSG_PRO_LEN + data_str_len) + res_data = res_data.decode() + except (OSError, UnicodeError): + client_socket.close() + print("collect_plugin: client communicate error") + return None + + res_magic = res_data[:CLT_MSG_MAGIC_LEN] + if res_magic != "RES": + print("res msg format error") + return None + + protocol_str = res_data[CLT_MSG_MAGIC_LEN:CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN] + try: + protocol_id = int(protocol_str) + except ValueError: + print("recv msg protocol id is invalid %s", protocol_str) + return None + + if protocol_id >= ClientProtocol.PRO_END: + print("protocol id is invalid") + return None + + try: + res_data_len = int(res_data[CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN:]) + res_msg_data = client_socket.recv(res_data_len) + res_msg_data = res_msg_data.decode() + return res_msg_data + except (OSError, ValueError, UnicodeError): + print("collect_plugin: client recv res msg error") + finally: + client_socket.close() + + return None + +def validate_parameters(param, len_limit, char_limit): + ret = ResultMessage.RESULT_SUCCEED + if not param: + print("parm is invalid") + ret = ResultMessage.RESULT_NOT_PARAM + return [False, ret] + + if not isinstance(param, list): + print(f"{param} is not list type.") + ret = ResultMessage.RESULT_NOT_PARAM + return [False, ret] + + if len(param) <= 0: + print(f"{param} length is 0.") + ret = ResultMessage.RESULT_INVALID_LENGTH + return [False, ret] + + if len(param) > len_limit: + print(f"{param} length more than {len_limit}") + ret = ResultMessage.RESULT_EXCEED_LIMIT + return [False, ret] + + pattern = r'^[a-zA-Z0-9_-]+$' + for info in param: + if len(info) > char_limit: + print(f"{info} length more than {char_limit}") + ret = ResultMessage.RESULT_EXCEED_LIMIT + return [False, ret] + if not re.match(pattern, info): + print(f"{info} is invalid char") + ret = ResultMessage.RESULT_INVALID_CHAR + return [False, ret] + + return [True, ret] + +def is_iocollect_valid(period, disk_list=None, stage=None): + result = inter_is_iocollect_valid(period, disk_list, stage) + error_code = result['ret'] + if error_code != ResultMessage.RESULT_SUCCEED: + result['message'] = Result_Messages[error_code] + return result + +def inter_is_iocollect_valid(period, disk_list=None, stage=None): + result = {} + result['ret'] = ResultMessage.RESULT_UNKNOWN + result['message'] = "" + + if not period or not isinstance(period, int): + result['ret'] = ResultMessage.RESULT_NOT_PARAM + return result + if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN: + result['ret'] = ResultMessage.RESULT_INVALID_LENGTH + return result + + if not disk_list: + disk_list = [] + else: + res = validate_parameters(disk_list, LIMIT_DISK_LIST_LEN, LIMIT_DISK_CHAR_LEN) + if not res[0]: + result['ret'] = res[1] + return result + + if not stage: + stage = [] + else: + res = validate_parameters(stage, LIMIT_STAGE_LIST_LEN, LIMIT_STAGE_CHAR_LEN) + if not res[0]: + result['ret'] = res[1] + return result + + req_msg_struct = { + 'disk_list': json.dumps(disk_list), + 'period': period, + 'stage': json.dumps(stage) + } + request_message = json.dumps(req_msg_struct) + result_message = client_send_and_recv(request_message, CLT_MSG_LEN_LEN, ClientProtocol.IS_IOCOLLECT_VALID) + if not result_message: + print("collect_plugin: client_send_and_recv failed") + return result + + try: + json.loads(result_message) + except json.JSONDecodeError: + print("is_iocollect_valid: json decode error") + result['ret'] = ResultMessage.RESULT_PARSE_FAILED + return result + + result['ret'] = ResultMessage.RESULT_SUCCEED + result['message'] = result_message + return result + +def get_io_data(period, disk_list, stage, iotype): + result = inter_get_io_data(period, disk_list, stage, iotype) + error_code = result['ret'] + if error_code != ResultMessage.RESULT_SUCCEED: + result['message'] = Result_Messages[error_code] + return result + +def inter_get_io_data(period, disk_list, stage, iotype): + result = {} + result['ret'] = ResultMessage.RESULT_UNKNOWN + result['message'] = "" + + if not isinstance(period, int): + result['ret'] = ResultMessage.RESULT_NOT_PARAM + return result + if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN: + result['ret'] = ResultMessage.RESULT_INVALID_LENGTH + return result + + res = validate_parameters(disk_list, LIMIT_DISK_LIST_LEN, LIMIT_DISK_CHAR_LEN) + if not res[0]: + result['ret'] = res[1] + return result + + res = validate_parameters(stage, LIMIT_STAGE_LIST_LEN, LIMIT_STAGE_CHAR_LEN) + if not res[0]: + result['ret'] = res[1] + return result + + res = validate_parameters(iotype, LIMIT_IOTYPE_LIST_LEN, LIMIT_IOTYPE_CHAR_LEN) + if not res[0]: + result['ret'] = res[1] + return result + + req_msg_struct = { + 'disk_list': json.dumps(disk_list), + 'period': period, + 'stage': json.dumps(stage), + 'iotype' : json.dumps(iotype) + } + + request_message = json.dumps(req_msg_struct) + result_message = client_send_and_recv(request_message, CLT_MSG_LEN_LEN, ClientProtocol.GET_IO_DATA) + if not result_message: + print("collect_plugin: client_send_and_recv failed") + return result + try: + json.loads(result_message) + except json.JSONDecodeError: + print("get_io_data: json decode error") + result['ret'] = ResultMessage.RESULT_PARSE_FAILED + return result + + result['ret'] = ResultMessage.RESULT_SUCCEED + result['message'] = result_message + return result + diff --git a/sysSentry-1.0.2/src/python/sentryCollector/collectd.py b/sysSentry-1.0.2/src/python/sentryCollector/collectd.py index cbc350f05969a7c5f8324b60b042d22078dd07ea..b77c642b17bdfee0b02870cb0710367fd272c165 100644 --- a/sysSentry-1.0.2/src/python/sentryCollector/collectd.py +++ b/sysSentry-1.0.2/src/python/sentryCollector/collectd.py @@ -79,7 +79,7 @@ def main(): # collect thread for info in module_list: - class_name = Module_Map_Class[info] + class_name = Module_Map_Class.get(info) if not class_name: logging.info("%s correspond to class is not exists", info) continue