From 9de4c5a236ae56c7b6453873ab29d0b0a0f9e3fd Mon Sep 17 00:00:00 2001 From: zhuofeng <1107893276@qq.com> Date: Mon, 20 Jan 2025 08:29:08 +0000 Subject: [PATCH] init the new version-1.0.3 Signed-off-by: zhuofeng <1107893276@qq.com> --- ...that-function-cpu_report_result-is-c.patch | 35 - README.en.md | 36 - README.md | 110 - Remove-ANSI-escape-sequences.patch | 32 - ...i-threshold-slow-io-detection-plugin.patch | 1201 --------- add-boundary-check-for-settings.patch | 39 - add-collect-module-to-sysSentry.patch | 1165 --------- add-deleted-code-to-plugin-rasdaemon.patch | 31 - add-detail-time.patch | 32 - add-get_disk_type-and-fix-some-bugs.patch | 176 -- add-hbm-online-repair.patch | 2194 ----------------- add-log-for-improving-maintainability.patch | 251 -- ...rm-when-sending-msg-and-clean-invali.patch | 24 - add-log-level-and-change-log-format.patch | 522 ---- ...me_range-alarm_id-and-alarm_clear_ti.patch | 104 - ...-pySentryNotify-add-multi-users-supp.patch | 678 ----- add-root-cause-analysis.patch | 1253 ---------- ...get_alarm-module_name-s-time_range-d.patch | 438 ---- ...eanup-invalid-server-socket-peroidly.patch | 90 - ai_block_io-adapt-alarm-module.patch | 221 -- ai_block_io-fix-some-bugs.patch | 235 -- ...fix-some-config-parameters-parse-bug.patch | 626 ----- ai_block_io-lack-section-exit.patch | 98 - ...pport-absolute-threshold-lower-limit.patch | 728 ------ ai_block_io-support-iodump.patch | 200 -- ai_block_io-support-stage-and-iotype.patch | 906 ------- avg_block_io-send-alarm-to-xalarmd.patch | 73 - bugfix-typo.patch | 34 - change-alarm-length.patch | 56 - change-avg_block_io-config.patch | 55 - ...tus-of-period-task-and-sort-mod-file.patch | 36 - ...ty-and-cpu_patrol-must-be-an-integer.patch | 41 - diff-disk-type-use-diff-config.patch | 430 ---- enrich-alert-info-about-kernel-stack.patch | 29 - feature-add-avg_block_io-plugin.patch | 572 ----- fix-ai_block_io-root-cause-bug.patch | 33 - fix-ai_block_io-some-issues.patch | 832 ------- fix-alarm_info-newline-break-error.patch | 48 - ...bout-collect-module-and-avg-block-io.patch | 323 --- fix-config-relative-some-issues.patch | 243 -- ...onfigparser.InterpolationSyntaxError.patch | 37 - fix-error-handling.patch | 25 - fix-excessive-CPU-usage.patch | 41 - fix-frequency-param-check-bug.patch | 70 - fix-get_alarm-error.patch | 36 - ...-online-repair-notice-and-efi-create.patch | 508 ---- fix-io_dump-for-collect-module.patch | 25 - ...ython-3.7-not-support-list-bool-type.patch | 53 - fix-result-when-process-output-is-None.patch | 36 - ...bout-collect-module-and-avg-block-io.patch | 226 -- ...ils-to-be-started-when-cpu_sentry-is.patch | 56 - fix-test_ai_block_io-fail.patch | 91 - ...g-and-change-isolation-default-value.patch | 61 - fix-version-in-setup.py.patch | 25 - fix-word-error.patch | 53 - fix-write-file-return-code-bug.patch | 69 - fix-xalarm-non-uniform-log-formatting.patch | 60 - ...t-function-not-refuse-alarm-msg-exce.patch | 76 - ...de-not-return-val-and-fail-when-thre.patch | 71 - get_alarm-d-abnomal-display.patch | 26 - ...ed-wont-stop-avg_block_io-and-del-di.patch | 168 -- hbm_online_repair-add-unload-driver.patch | 107 - ...of-collect-module-exits-occasionally.patch | 104 - make-debug-msg-clear.patch | 69 - ...stack-when-the-disk-field-is-not-con.patch | 28 - modify-logrotate-rule.patch | 27 - optimize-log-printing.patch | 125 - ...g-of-cat-cli-error-msg-in-cpu_sentry.patch | 77 - ...-should-be-warn-level-log-in-cat-cli.patch | 25 - param-must-be-integer.patch | 23 - precise-alarm-query-time.patch | 91 - ...py-and-bugfix-uncorrect-slow-io-repo.patch | 566 ----- set-logrotate.patch | 92 - setting-parameters-must-be-integer.patch | 38 - split-cpu_sentry-and-syssentry.patch | 155 -- sysSentry-1.0.2.tar.gz | Bin 317440 -> 0 bytes sysSentry-1.0.3.tar.gz | Bin 0 -> 1351892 bytes sysSentry.spec | 659 +---- ...avg_block_io-log-and-ai_block_io-log.patch | 63 - update-collect-log.patch | 25 - update-collect-plugin-period-max.patch | 44 - update-log-when-it-is-not-lock-collect.patch | 35 - update-nvme-config.patch | 51 - xalarm-add-alarm-msg-length-to-8192.patch | 112 - 84 files changed, 31 insertions(+), 18528 deletions(-) delete mode 100644 Fix-the-problem-that-function-cpu_report_result-is-c.patch delete mode 100644 README.en.md delete mode 100644 README.md delete mode 100644 Remove-ANSI-escape-sequences.patch delete mode 100644 add-ai-threshold-slow-io-detection-plugin.patch delete mode 100644 add-boundary-check-for-settings.patch delete mode 100644 add-collect-module-to-sysSentry.patch delete mode 100644 add-deleted-code-to-plugin-rasdaemon.patch delete mode 100644 add-detail-time.patch delete mode 100644 add-get_disk_type-and-fix-some-bugs.patch delete mode 100644 add-hbm-online-repair.patch delete mode 100644 add-log-for-improving-maintainability.patch delete mode 100644 add-log-for-xalarm-when-sending-msg-and-clean-invali.patch delete mode 100644 add-log-level-and-change-log-format.patch delete mode 100644 add-parameter-time_range-alarm_id-and-alarm_clear_ti.patch delete mode 100644 add-pyxalarm-and-pySentryNotify-add-multi-users-supp.patch delete mode 100644 add-root-cause-analysis.patch delete mode 100644 add-sentryctl-get_alarm-module_name-s-time_range-d.patch delete mode 100644 add-xalarm-cleanup-invalid-server-socket-peroidly.patch delete mode 100644 ai_block_io-adapt-alarm-module.patch delete mode 100644 ai_block_io-fix-some-bugs.patch delete mode 100644 ai_block_io-fix-some-config-parameters-parse-bug.patch delete mode 100644 ai_block_io-lack-section-exit.patch delete mode 100644 ai_block_io-support-absolute-threshold-lower-limit.patch delete mode 100644 ai_block_io-support-iodump.patch delete mode 100644 ai_block_io-support-stage-and-iotype.patch delete mode 100644 avg_block_io-send-alarm-to-xalarmd.patch delete mode 100644 bugfix-typo.patch delete mode 100644 change-alarm-length.patch delete mode 100644 change-avg_block_io-config.patch delete mode 100644 change-status-of-period-task-and-sort-mod-file.patch delete mode 100644 cpu_utility-and-cpu_patrol-must-be-an-integer.patch delete mode 100644 diff-disk-type-use-diff-config.patch delete mode 100644 enrich-alert-info-about-kernel-stack.patch delete mode 100644 feature-add-avg_block_io-plugin.patch delete mode 100644 fix-ai_block_io-root-cause-bug.patch delete mode 100644 fix-ai_block_io-some-issues.patch delete mode 100644 fix-alarm_info-newline-break-error.patch delete mode 100644 fix-bug-step-2-about-collect-module-and-avg-block-io.patch delete mode 100644 fix-config-relative-some-issues.patch delete mode 100644 fix-configparser.InterpolationSyntaxError.patch delete mode 100644 fix-error-handling.patch delete mode 100644 fix-excessive-CPU-usage.patch delete mode 100644 fix-frequency-param-check-bug.patch delete mode 100644 fix-get_alarm-error.patch delete mode 100644 fix-hbm-online-repair-notice-and-efi-create.patch delete mode 100644 fix-io_dump-for-collect-module.patch delete mode 100644 fix-python-3.7-not-support-list-bool-type.patch delete mode 100644 fix-result-when-process-output-is-None.patch delete mode 100644 fix-some-about-collect-module-and-avg-block-io.patch delete mode 100644 fix-syssentry-fails-to-be-started-when-cpu_sentry-is.patch delete mode 100644 fix-test_ai_block_io-fail.patch delete mode 100644 fix-uint8-bug-and-change-isolation-default-value.patch delete mode 100644 fix-version-in-setup.py.patch delete mode 100644 fix-word-error.patch delete mode 100644 fix-write-file-return-code-bug.patch delete mode 100644 fix-xalarm-non-uniform-log-formatting.patch delete mode 100644 fix-xalarm_Report-function-not-refuse-alarm-msg-exce.patch delete mode 100644 fix-xalarm_upgrade-not-return-val-and-fail-when-thre.patch delete mode 100644 get_alarm-d-abnomal-display.patch delete mode 100644 get_io_data-failed-wont-stop-avg_block_io-and-del-di.patch delete mode 100644 hbm_online_repair-add-unload-driver.patch delete mode 100644 listen-thread-of-collect-module-exits-occasionally.patch delete mode 100644 make-debug-msg-clear.patch delete mode 100644 modify-abnormal-stack-when-the-disk-field-is-not-con.patch delete mode 100644 modify-logrotate-rule.patch delete mode 100644 optimize-log-printing.patch delete mode 100644 optimize-the-handing-of-cat-cli-error-msg-in-cpu_sentry.patch delete mode 100644 over-threshold-should-be-warn-level-log-in-cat-cli.patch delete mode 100644 param-must-be-integer.patch delete mode 100644 precise-alarm-query-time.patch delete mode 100644 refactor-config.py-and-bugfix-uncorrect-slow-io-repo.patch delete mode 100644 set-logrotate.patch delete mode 100644 setting-parameters-must-be-integer.patch delete mode 100644 split-cpu_sentry-and-syssentry.patch delete mode 100644 sysSentry-1.0.2.tar.gz create mode 100644 sysSentry-1.0.3.tar.gz delete mode 100644 uniform-avg_block_io-log-and-ai_block_io-log.patch delete mode 100644 update-collect-log.patch delete mode 100644 update-collect-plugin-period-max.patch delete mode 100644 update-log-when-it-is-not-lock-collect.patch delete mode 100644 update-nvme-config.patch delete mode 100644 xalarm-add-alarm-msg-length-to-8192.patch diff --git a/Fix-the-problem-that-function-cpu_report_result-is-c.patch b/Fix-the-problem-that-function-cpu_report_result-is-c.patch deleted file mode 100644 index 7a46590..0000000 --- a/Fix-the-problem-that-function-cpu_report_result-is-c.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 3e2721852ad1f8047ad219a5ab6c68fd4c9d6f5c Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Wed, 24 Jul 2024 16:17:54 +0800 -Subject: [PATCH] Fix the problem that function cpu_report_result() is called - more than once - -when task is running, user to exec "sentryctl stop cpu_sentry", cpu_report_result() will be called twice. This will cause the log to be printed twice ---- - src/python/syssentry/cpu_sentry.py | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/python/syssentry/cpu_sentry.py b/src/python/syssentry/cpu_sentry.py -index 7e77654..3c4d58d 100644 ---- a/src/python/syssentry/cpu_sentry.py -+++ b/src/python/syssentry/cpu_sentry.py -@@ -133,6 +133,7 @@ class CpuSentry: - - result_level = self.send_result.get("result", ResultLevel.FAIL) - report_result(task_name, result_level, details) -+ self.init_send_result() - - def kill_process(signum, _f, cpu_sentry_obj): - """kill process by 'pkill -9'""" -@@ -179,6 +180,6 @@ def main(): - cpu_sentry_task.send_result["result"] = ResultLevel.FAIL - cpu_sentry_task.send_result["details"]["code"] = 1004 - cpu_sentry_task.send_result["details"]["msg"] = "run cmd [%s] raise Error" % cpu_sentry_task_cmd -- finally: - cpu_sentry_task.cpu_report_result() -- cpu_sentry_task.init_send_result() -+ else: -+ cpu_sentry_task.cpu_report_result() --- -2.27.0 - diff --git a/README.en.md b/README.en.md deleted file mode 100644 index d6445ed..0000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# sysSentry - -#### Description -sysSentry is a system inspection framework used to manage system inspection tasks. - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index d857162..0000000 --- a/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# sysSentry - -#### 介绍 -sysSentry is a system inspection framework used to manage system inspection tasks. - -#### 软件架构 -1. 框架:支持x86和aarch64架构 -2. 插件:不同的差距支持架构不同,请参考docs.openeuler.org中的内容 - - -#### 安装教程 - -1. 安装巡检框架 -```shell -[root@openEuler ~]# yum install -y sysSentry -``` -2. 启动巡检框架 -```shell -[root@openEuler ~]# systemctl start sentryCollector -[root@openEuler ~]# systemctl start xalarmd -[root@openEuler ~]# systemctl start sysSentry -``` -3. 安装&重载巡检插件 -step1. 安装用户需要的巡检插件 -```shell -yum install <插件名> -``` -当前支持插件有: -- cpu_sentry -- cpu巡检,支持22.03-LTS-SP4版本,aarch64架构,920F芯片使用 -- avg_block_io -- 平均阈值慢io检测,支持20.03-LTS-SP4版本,x86及aarch64架构 -- ai_block_io -- AI阈值慢io检测,支持20.03-LTS-SP4版本,x86及aarch64架构 - -step2. 重载巡检插件 -```shell -[root@openEuler ~]# sentryctl reload <插件名> -``` - -#### 使用说明 - -sysSentry提供了用于管理巡检插件的命令 -- sentryctl,可以用于启动/停止巡检插件任务、查看巡检插件运行状态、查看巡检插件上报信息等功能。 - -1. 启动指定巡检任务 - - ```shell - [root@openEuler ~]# sentryctl start - ``` - -2. 终止指定巡检任务 - - ```shell - [root@openEuler ~]# sentryctl stop - ``` - -3. 列出所有已加载的巡检任务及状态 - - ```shell - [root@openEuler ~]# sentryctl list - ``` - -4. 查询指定巡检任务的状态 - - ```shell - [root@openEuler ~]# sentryctl status - ``` - - 巡检任务共存在四种状态,每种状态的回显信息及对应介绍如下: - - | 状态 | 描述 | - | ------- | ------------------------------------------------------------ | - | RUNNING | 巡检任务正在运行 | - | WAITING | 仅period类型巡检任务可设置此状态,表示period巡检任务等待下一次被调度执行 | - | EXITED | 巡检任务尚未执行,或者oneshot类型的巡检任务执行结束处于此状态 | - | FAILED | 巡检任务未拉起成功,或者巡检任务未正常退出 | - -5. 重载指定巡检任务的配置 - - 当用户修改了巡检任务的配置文件/etc/sysSentry/tasks/.mod时,可通过以下命令重载配置文件: - - ```shell - [root@openEuler ~]# sentryctl reload - ``` - -6. 查询指定任务的告警信息 - - ```shell - [root@openEuler ~]# sentryctl get_alarm [options] - ``` - - options可选参数及释义如下: - - | 参数 | 描述 | - | -------------------------------------- | ------------------------------------------------------------ | - | -s TIME_RANGE, --time_range TIME_RANGE | 展示用户指定时间长度内的告警信息,TIME_RANGE为整形,单位秒,范围为1~15 | - | -d, --detailed | 打印详细告警信息 | - -7. 查询指定巡检任务的巡检结果 - - ```shell - sentryctl get_result - ``` - - - - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request \ No newline at end of file diff --git a/Remove-ANSI-escape-sequences.patch b/Remove-ANSI-escape-sequences.patch deleted file mode 100644 index 713bfc0..0000000 --- a/Remove-ANSI-escape-sequences.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 91aa47999030503fda4935d4cc238b82d6842238 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Sun, 11 Aug 2024 18:36:23 +0800 -Subject: [PATCH] Remove ANSI escape sequences - ---- - src/python/syssentry/cpu_sentry.py | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/src/python/syssentry/cpu_sentry.py b/src/python/syssentry/cpu_sentry.py -index 9287e2f..99af127 100644 ---- a/src/python/syssentry/cpu_sentry.py -+++ b/src/python/syssentry/cpu_sentry.py -@@ -97,7 +97,14 @@ class CpuSentry: - if "ERROR" in stdout: - self.send_result["result"] = ResultLevel.FAIL - self.send_result["details"]["code"] = 1004 -- self.send_result["details"]["msg"] = stdout.split("\n")[0] -+ -+ # Remove ANSI escape sequences -+ error_info = stdout.split("\n")[0] -+ if error_info.startswith("\u001b"): -+ ansi_escape = r'\x1b\[([0-9]+)(;[0-9]+)*([A-Za-z])' -+ error_info = re.sub(ansi_escape, '', error_info) -+ -+ self.send_result["details"]["msg"] = error_info - return - - out_split = stdout.split("\n") --- -2.33.0 - diff --git a/add-ai-threshold-slow-io-detection-plugin.patch b/add-ai-threshold-slow-io-detection-plugin.patch deleted file mode 100644 index 6f707a4..0000000 --- a/add-ai-threshold-slow-io-detection-plugin.patch +++ /dev/null @@ -1,1201 +0,0 @@ -From 3d72fa7f517e6e99af1205e965c3775dc23461f4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Mon, 23 Sep 2024 11:03:26 +0800 -Subject: [PATCH] add ai threshold slow io detection to sysSentry - ---- - .../ai_threshold_slow_io_detection.ini | 16 ++ - .../tasks/ai_threshold_slow_io_detection.mod | 5 + - .../test_ai_threshold_slow_io_detection.py | 165 ++++++++++++++++++ - .../ai_threshold_slow_io_detection/README.md | 2 + - .../__init__.py | 0 - .../alarm_report.py | 49 ++++++ - .../config_parser.py | 141 +++++++++++++++ - .../data_access.py | 91 ++++++++++ - .../detector.py | 48 +++++ - .../ai_threshold_slow_io_detection/io_data.py | 74 ++++++++ - .../sliding_window.py | 113 ++++++++++++ - .../slow_io_detection.py | 133 ++++++++++++++ - .../threshold.py | 160 +++++++++++++++++ - .../ai_threshold_slow_io_detection/utils.py | 67 +++++++ - src/python/setup.py | 3 +- - 15 files changed, 1066 insertions(+), 1 deletion(-) - create mode 100644 config/plugins/ai_threshold_slow_io_detection.ini - create mode 100644 config/tasks/ai_threshold_slow_io_detection.mod - create mode 100644 selftest/test/test_ai_threshold_slow_io_detection.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/__init__.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/io_data.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py - create mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py - -diff --git a/config/plugins/ai_threshold_slow_io_detection.ini b/config/plugins/ai_threshold_slow_io_detection.ini -new file mode 100644 -index 0000000..44eb928 ---- /dev/null -+++ b/config/plugins/ai_threshold_slow_io_detection.ini -@@ -0,0 +1,16 @@ -+[common] -+absolute_threshold=40 -+slow_io_detect_frequency=1 -+log_level=info -+ -+[algorithm] -+train_data_duration=0.1 -+train_update_duration=0.02 -+algorithm_type=n_sigma -+boxplot_parameter=1.5 -+n_sigma_parameter=3 -+ -+[sliding_window] -+sliding_window_type=not_continuous -+window_size=30 -+window_minimum_threshold=6 -\ No newline at end of file -diff --git a/config/tasks/ai_threshold_slow_io_detection.mod b/config/tasks/ai_threshold_slow_io_detection.mod -new file mode 100644 -index 0000000..2729f72 ---- /dev/null -+++ b/config/tasks/ai_threshold_slow_io_detection.mod -@@ -0,0 +1,5 @@ -+[common] -+enabled=yes -+task_start=/usr/bin/python3 /usr/bin/ai_threshold_slow_io_detection -+task_stop=pkill -f /usr/bin/ai_threshold_slow_io_detection -+type=oneshot -\ No newline at end of file -diff --git a/selftest/test/test_ai_threshold_slow_io_detection.py b/selftest/test/test_ai_threshold_slow_io_detection.py -new file mode 100644 -index 0000000..c36fef5 ---- /dev/null -+++ b/selftest/test/test_ai_threshold_slow_io_detection.py -@@ -0,0 +1,165 @@ -+# 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. -+ -+import unittest -+import numpy as np -+ -+from sentryPlugins.ai_threshold_slow_io_detection.threshold import AbsoluteThreshold, BoxplotThreshold, NSigmaThreshold -+from sentryPlugins.ai_threshold_slow_io_detection.sliding_window import (NotContinuousSlidingWindow, -+ ContinuousSlidingWindow, MedianSlidingWindow) -+ -+ -+def _get_boxplot_threshold(data_list: list, parameter): -+ q1 = np.percentile(data_list, 25) -+ q3 = np.percentile(data_list, 75) -+ iqr = q3 - q1 -+ return q3 + parameter * iqr -+ -+ -+def _get_n_sigma_threshold(data_list: list, parameter): -+ mean = np.mean(data_list) -+ std = np.std(data_list) -+ return mean + parameter * std -+ -+ -+class Test(unittest.TestCase): -+ @classmethod -+ def setUpClass(cls): -+ print("UnitTest Begin...") -+ -+ @classmethod -+ def tearDownClass(cls): -+ print("UnitTest End...") -+ -+ def setUp(self): -+ print("Begin...") -+ -+ def tearDown(self): -+ print("End...") -+ -+ def test_absolute_threshold(self): -+ absolute = AbsoluteThreshold() -+ self.assertEqual(None, absolute.get_threshold()) -+ self.assertFalse(absolute.is_abnormal(5000)) -+ absolute.set_threshold(40) -+ self.assertEqual(40, absolute.get_threshold()) -+ self.assertTrue(absolute.is_abnormal(50)) -+ -+ def test_boxplot_threshold(self): -+ boxplot = BoxplotThreshold(1.5, 5, 1) -+ # 阶段1:尚未初始化 -+ self.assertEqual(None, boxplot.get_threshold()) -+ self.assertFalse(boxplot.is_abnormal(5000)) -+ # 往boxplot中插入5个元素后,会生成阈值 -+ data_list = [20, 20, 20, 30, 10] -+ for data in data_list: -+ boxplot.push_latest_data_to_queue(data) -+ # 阶段2:初始化 -+ boxplot_threshold = boxplot.get_threshold() -+ self.assertEqual(_get_boxplot_threshold(data_list, 1.5), boxplot_threshold) -+ self.assertTrue(boxplot.is_abnormal(5000)) -+ data_list.pop(0) -+ data_list.append(100) -+ boxplot.push_latest_data_to_queue(100) -+ # 阶段3:更新阈值 -+ boxplot_threshold = boxplot.get_threshold() -+ self.assertEqual(_get_boxplot_threshold(data_list, 1.5), boxplot_threshold) -+ -+ def test_n_sigma_threshold(self): -+ n_sigma = NSigmaThreshold(3, 5, 1) -+ self.assertEqual(None, n_sigma.get_threshold()) -+ self.assertFalse(n_sigma.is_abnormal(5000)) -+ data_list = [20, 20, 20, 30, 10] -+ for data in data_list: -+ n_sigma.push_latest_data_to_queue(data) -+ n_sigma_threshold = n_sigma.get_threshold() -+ self.assertEqual(_get_n_sigma_threshold(data_list, 3), n_sigma_threshold) -+ self.assertTrue(n_sigma.is_abnormal(5000)) -+ data_list.pop(0) -+ data_list.append(100) -+ n_sigma.push_latest_data_to_queue(100) -+ # 阶段3:更新阈值 -+ n_sigma_threshold = n_sigma.get_threshold() -+ self.assertEqual(_get_n_sigma_threshold(data_list, 3), n_sigma_threshold) -+ -+ def test_not_continuous_sliding_window(self): -+ not_continuous = NotContinuousSlidingWindow(5, 3) -+ boxplot_threshold = BoxplotThreshold(1.5, 10, 8) -+ boxplot_threshold.attach_observer(not_continuous) -+ data_list1 = [19, 20, 20, 20, 20, 20, 22, 24, 23, 20] -+ for data in data_list1: -+ boxplot_threshold.push_latest_data_to_queue(data) -+ result = not_continuous.is_slow_io_event(data) -+ self.assertFalse(result[0]) -+ self.assertEqual(23.75, boxplot_threshold.get_threshold()) -+ boxplot_threshold.push_latest_data_to_queue(24) -+ result = not_continuous.is_slow_io_event(24) -+ self.assertFalse(result[0]) -+ boxplot_threshold.push_latest_data_to_queue(25) -+ result = not_continuous.is_slow_io_event(25) -+ self.assertTrue(result[0]) -+ data_list2 = [20, 20, 20, 20, 20, 20] -+ for data in data_list2: -+ boxplot_threshold.push_latest_data_to_queue(data) -+ result = not_continuous.is_slow_io_event(data) -+ self.assertFalse(result[0]) -+ self.assertEqual(25.625, boxplot_threshold.get_threshold()) -+ -+ def test_continuous_sliding_window(self): -+ continuous = ContinuousSlidingWindow(5, 3) -+ boxplot_threshold = BoxplotThreshold(1.5, 10, 8) -+ boxplot_threshold.attach_observer(continuous) -+ data_list = [19, 20, 20, 20, 20, 20, 22, 24, 23, 20] -+ for data in data_list: -+ boxplot_threshold.push_latest_data_to_queue(data) -+ result = continuous.is_slow_io_event(data) -+ self.assertFalse(result[0]) -+ self.assertEqual(23.75, boxplot_threshold.get_threshold()) -+ # 没有三个异常点 -+ self.assertFalse(continuous.is_slow_io_event(25)[0]) -+ # 不连续的三个异常点 -+ self.assertFalse(continuous.is_slow_io_event(25)[0]) -+ # 连续的三个异常点 -+ self.assertTrue(continuous.is_slow_io_event(25)[0]) -+ -+ def test_median_sliding_window(self): -+ median = MedianSlidingWindow(5, 3) -+ absolute_threshold = AbsoluteThreshold(10, 8) -+ absolute_threshold.attach_observer(median) -+ absolute_threshold.set_threshold(24.5) -+ data_list = [24, 24, 24, 25, 25] -+ for data in data_list: -+ self.assertFalse(median.is_slow_io_event(data)[0]) -+ self.assertTrue(median.is_slow_io_event(25)[0]) -+ -+ def test_parse_collect_data(self): -+ collect = { -+ "read": [1.0, 2.0, 3.0, 4.0], -+ "write": [5.0, 6.0, 7.0, 8.0], -+ "flush": [9.0, 10.0, 11.0, 12.0], -+ "discard": [13.0, 14.0, 15.0, 16.0], -+ } -+ from io_data import BaseData -+ from data_access import _get_io_stage_data -+ -+ io_data = _get_io_stage_data(collect) -+ self.assertEqual( -+ io_data.read, BaseData(latency=1.0, io_dump=2.0, io_length=3.0, iops=4.0) -+ ) -+ self.assertEqual( -+ io_data.write, BaseData(latency=5.0, io_dump=6.0, io_length=7.0, iops=8.0) -+ ) -+ self.assertEqual( -+ io_data.flush, BaseData(latency=9.0, io_dump=10.0, io_length=11.0, iops=12.0) -+ ) -+ self.assertEqual( -+ io_data.discard, BaseData(latency=13.0, io_dump=14.0, io_length=15.0, iops=16.0) -+ ) -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md b/src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md -new file mode 100644 -index 0000000..f9b8388 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md -@@ -0,0 +1,2 @@ -+# slow_io_detection -+ -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/__init__.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py -new file mode 100644 -index 0000000..3f4f34e ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py -@@ -0,0 +1,49 @@ -+# 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. -+ -+from syssentry.result import ResultLevel, report_result -+import logging -+import json -+ -+ -+class AlarmReport: -+ TASK_NAME = "SLOW_IO_DETECTION" -+ -+ @staticmethod -+ def report_pass(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.PASS, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} PASS: {info}') -+ -+ @staticmethod -+ def report_fail(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} FAIL: {info}') -+ -+ @staticmethod -+ def report_skip(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.SKIP, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} SKIP: {info}') -+ -+ @staticmethod -+ def report_minor_alm(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.MINOR_ALM, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} MINOR_ALM: {info}') -+ -+ @staticmethod -+ def report_major_alm(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.MAJOR_ALM, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} MAJOR_ALM: {info}') -+ -+ @staticmethod -+ def report_critical_alm(info: str): -+ report_result(AlarmReport.TASK_NAME, ResultLevel.CRITICAL_ALM, json.dumps({"msg": info})) -+ logging.info(f'Report {AlarmReport.TASK_NAME} CRITICAL_ALM: {info}') -+ -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py -new file mode 100644 -index 0000000..cd4e6f1 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py -@@ -0,0 +1,141 @@ -+# 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. -+ -+import configparser -+import logging -+ -+ -+class ConfigParser: -+ -+ DEFAULT_ABSOLUTE_THRESHOLD = 40 -+ DEFAULT_SLOW_IO_DETECTION_FREQUENCY = 1 -+ DEFAULT_LOG_LEVEL = 'info' -+ DEFAULT_TRAIN_DATA_DURATION = 24 -+ DEFAULT_TRAIN_UPDATE_DURATION = 2 -+ DEFAULT_ALGORITHM_TYPE = 'boxplot' -+ DEFAULT_N_SIGMA_PARAMETER = 3 -+ DEFAULT_BOXPLOT_PARAMETER = 1.5 -+ DEFAULT_SLIDING_WINDOW_TYPE = 'not_continuous' -+ DEFAULT_WINDOW_SIZE = 30 -+ DEFAULT_WINDOW_MINIMUM_THRESHOLD = 6 -+ -+ def __init__(self, config_file_name): -+ self.__boxplot_parameter = None -+ self.__window_minimum_threshold = None -+ self.__window_size = None -+ self.__sliding_window_type = None -+ self.__n_sigma_parameter = None -+ self.__algorithm_type = None -+ self.__train_update_duration = None -+ self.__log_level = None -+ self.__slow_io_detect_frequency = None -+ self.__absolute_threshold = None -+ self.__train_data_duration = None -+ self.__config_file_name = config_file_name -+ -+ def read_config_from_file(self): -+ -+ con = configparser.ConfigParser() -+ con.read(self.__config_file_name, encoding='utf-8') -+ -+ items_common = dict(con.items('common')) -+ items_algorithm = dict(con.items('algorithm')) -+ items_sliding_window = dict(con.items('sliding_window')) -+ -+ try: -+ self.__absolute_threshold = int(items_common.get('absolute_threshold', -+ ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD)) -+ except ValueError: -+ self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -+ logging.warning('absolute threshold type conversion has error, use default value.') -+ -+ try: -+ self.__slow_io_detect_frequency = int(items_common.get('slow_io_detect_frequency', -+ ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY)) -+ except ValueError: -+ self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -+ logging.warning('slow_io_detect_frequency type conversion has error, use default value.') -+ -+ self.__log_level = items_common.get('log_level', ConfigParser.DEFAULT_LOG_LEVEL) -+ -+ try: -+ self.__train_data_duration = float(items_algorithm.get('train_data_duration', -+ ConfigParser.DEFAULT_TRAIN_DATA_DURATION)) -+ except ValueError: -+ self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -+ logging.warning('train_data_duration type conversion has error, use default value.') -+ -+ try: -+ self.__train_update_duration = float(items_algorithm.get('train_update_duration', -+ ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION)) -+ except ValueError: -+ self.__train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -+ logging.warning('train_update_duration type conversion has error, use default value.') -+ -+ try: -+ self.__algorithm_type = items_algorithm.get('algorithm_type', ConfigParser.DEFAULT_ALGORITHM_TYPE) -+ except ValueError: -+ self.__algorithm_type = ConfigParser.DEFAULT_ALGORITHM_TYPE -+ logging.warning('algorithmType type conversion has error, use default value.') -+ -+ if self.__algorithm_type == 'n_sigma': -+ try: -+ self.__n_sigma_parameter = float(items_algorithm.get('n_sigma_parameter', -+ ConfigParser.DEFAULT_N_SIGMA_PARAMETER)) -+ except ValueError: -+ self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -+ logging.warning('n_sigma_parameter type conversion has error, use default value.') -+ elif self.__algorithm_type == 'boxplot': -+ try: -+ self.__boxplot_parameter = float(items_algorithm.get('boxplot_parameter', -+ ConfigParser.DEFAULT_BOXPLOT_PARAMETER)) -+ except ValueError: -+ self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -+ logging.warning('boxplot_parameter type conversion has error, use default value.') -+ -+ self.__sliding_window_type = items_sliding_window.get('sliding_window_type', -+ ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE) -+ -+ try: -+ self.__window_size = int(items_sliding_window.get('window_size', -+ ConfigParser.DEFAULT_WINDOW_SIZE)) -+ except ValueError: -+ self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -+ logging.warning('window_size type conversion has error, use default value.') -+ -+ try: -+ self.__window_minimum_threshold = ( -+ int(items_sliding_window.get('window_minimum_threshold', -+ ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD))) -+ except ValueError: -+ self.__window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -+ logging.warning('window_minimum_threshold type conversion has error, use default value.') -+ -+ def get_slow_io_detect_frequency(self): -+ return self.__slow_io_detect_frequency -+ -+ def get_algorithm_type(self): -+ return self.__algorithm_type -+ -+ def get_sliding_window_type(self): -+ return self.__sliding_window_type -+ -+ def get_train_data_duration_and_train_update_duration(self): -+ return self.__train_data_duration, self.__train_update_duration -+ -+ def get_window_size_and_window_minimum_threshold(self): -+ return self.__window_size, self.__window_minimum_threshold -+ -+ def get_absolute_threshold(self): -+ return self.__absolute_threshold -+ -+ def get_log_level(self): -+ return self.__log_level -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py -new file mode 100644 -index 0000000..d9f3460 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py -@@ -0,0 +1,91 @@ -+# 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. -+ -+import json -+import logging -+ -+from sentryCollector.collect_plugin import ( -+ Result_Messages, -+ get_io_data, -+ is_iocollect_valid, -+) -+from .io_data import IOStageData, IOData -+ -+COLLECT_STAGES = [ -+ "throtl", -+ "wbt", -+ "gettag", -+ "plug", -+ "bfq", -+ "hctx", -+ "requeue", -+ "rq_driver", -+ "bio", -+ "iocost", -+] -+ -+def check_collect_valid(period): -+ data_raw = is_iocollect_valid(period) -+ if data_raw["ret"] == 0: -+ try: -+ data = json.loads(data_raw["message"]) -+ except Exception as e: -+ logging.warning(f"get io data failed, {e}") -+ return [] -+ return [k for k in data.keys()] -+ else: -+ return [] -+ -+ -+def _get_raw_data(period, disk_list): -+ return get_io_data( -+ period, -+ disk_list, -+ COLLECT_STAGES, -+ ["read", "write", "flush", "discard"], -+ ) -+ -+ -+def _get_io_stage_data(data): -+ io_stage_data = IOStageData() -+ for data_type in ('read', 'write', 'flush', 'discard'): -+ if data_type in data: -+ getattr(io_stage_data, data_type).latency = data[data_type][0] -+ getattr(io_stage_data, data_type).io_dump = data[data_type][1] -+ getattr(io_stage_data, data_type).io_length = data[data_type][2] -+ getattr(io_stage_data, data_type).iops = data[data_type][3] -+ return io_stage_data -+ -+ -+def get_io_data_from_collect_plug(period, disk_list): -+ data_raw = _get_raw_data(period, disk_list) -+ if data_raw["ret"] == 0: -+ ret = {} -+ try: -+ data = json.loads(data_raw["message"]) -+ except json.decoder.JSONDecodeError as e: -+ logging.warning(f"get io data failed, {e}") -+ return None -+ -+ for disk in data: -+ disk_data = data[disk] -+ disk_ret = IOData() -+ for k, v in disk_data.items(): -+ try: -+ getattr(disk_ret, k) -+ setattr(disk_ret, k, _get_io_stage_data(v)) -+ except AttributeError: -+ logging.debug(f'no attr {k}') -+ continue -+ ret[disk] = disk_ret -+ return ret -+ logging.warning(f'get io data failed with message: {data_raw["message"]}') -+ return None -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py -new file mode 100644 -index 0000000..eda9825 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py -@@ -0,0 +1,48 @@ -+# 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. -+import logging -+ -+from .io_data import MetricName -+from .threshold import Threshold -+from .sliding_window import SlidingWindow -+from .utils import get_metric_value_from_io_data_dict_by_metric_name -+ -+ -+class Detector: -+ _metric_name: MetricName = None -+ _threshold: Threshold = None -+ _slidingWindow: SlidingWindow = None -+ -+ def __init__(self, metric_name: MetricName, threshold: Threshold, sliding_window: SlidingWindow): -+ self._metric_name = metric_name -+ self._threshold = threshold -+ self._slidingWindow = sliding_window -+ self._threshold.attach_observer(self._slidingWindow) -+ -+ def get_metric_name(self): -+ return self._metric_name -+ -+ def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -+ logging.debug(f'Enter Detector: {self}') -+ metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) -+ if metric_value > 1e-6: -+ logging.debug(f'Input metric value: {str(metric_value)}') -+ self._threshold.push_latest_data_to_queue(metric_value) -+ detection_result = self._slidingWindow.is_slow_io_event(metric_value) -+ logging.debug(f'Detection result: {str(detection_result)}') -+ logging.debug(f'Exit Detector: {self}') -+ return detection_result -+ -+ 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' 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_threshold_slow_io_detection/io_data.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/io_data.py -new file mode 100644 -index 0000000..0e17051 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/io_data.py -@@ -0,0 +1,74 @@ -+# 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. -+ -+from dataclasses import dataclass, field -+from datetime import datetime -+from typing import Optional -+ -+ -+@dataclass -+class BaseData: -+ latency: Optional[float] = field(default_factory=lambda: None) -+ io_dump: Optional[int] = field(default_factory=lambda: None) -+ io_length: Optional[int] = field(default_factory=lambda: None) -+ iops: Optional[int] = field(default_factory=lambda: None) -+ -+ -+@dataclass -+class IOStageData: -+ read: BaseData = field(default_factory=lambda: BaseData()) -+ write: BaseData = field(default_factory=lambda: BaseData()) -+ flush: BaseData = field(default_factory=lambda: BaseData()) -+ discard: BaseData = field(default_factory=lambda: BaseData()) -+ -+ -+@dataclass -+class IOData: -+ throtl: IOStageData = field(default_factory=lambda: IOStageData()) -+ wbt: IOStageData = field(default_factory=lambda: IOStageData()) -+ gettag: IOStageData = field(default_factory=lambda: IOStageData()) -+ iocost: IOStageData = field(default_factory=lambda: IOStageData()) -+ plug: IOStageData = field(default_factory=lambda: IOStageData()) -+ bfq: IOStageData = field(default_factory=lambda: IOStageData()) -+ hctx: IOStageData = field(default_factory=lambda: IOStageData()) -+ requeue: IOStageData = field(default_factory=lambda: IOStageData()) -+ rq_driver: IOStageData = field(default_factory=lambda: IOStageData()) -+ bio: IOStageData = field(default_factory=lambda: IOStageData()) -+ time_stamp: float = field(default_factory=lambda: datetime.now().timestamp()) -+ -+ -+class MetricName: -+ _disk_name: str = None -+ _stage_name: str = None -+ _io_access_type_name: str = None -+ _metric_name: str = None -+ -+ def __init__(self, disk_name: str, stage_name: str, io_access_type_name: str, metric_name: str): -+ self._disk_name = disk_name -+ self._stage_name = stage_name -+ self._io_access_type_name = io_access_type_name -+ self._metric_name = metric_name -+ -+ def get_disk_name(self): -+ return self._disk_name -+ -+ def get_stage_name(self): -+ return self._stage_name -+ -+ def get_io_access_type_name(self): -+ return self._io_access_type_name -+ -+ def get_metric_name(self): -+ return self._metric_name -+ -+ def __repr__(self): -+ return (f'disk: {self._disk_name}, stage: {self._stage_name}, io_access_type: {self._io_access_type_name},' -+ f'metric: {self._metric_name}') -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py -new file mode 100644 -index 0000000..d395d48 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py -@@ -0,0 +1,113 @@ -+# 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. -+ -+from enum import Enum, unique -+import numpy as np -+ -+ -+@unique -+class SlidingWindowType(Enum): -+ NotContinuousSlidingWindow = 0 -+ ContinuousSlidingWindow = 1 -+ MedianSlidingWindow = 2 -+ -+ -+class SlidingWindow: -+ _ai_threshold = None -+ _queue_length = None -+ _queue_threshold = None -+ _io_data_queue: list = None -+ _io_data_queue_abnormal_tag: list = None -+ -+ def __init__(self, queue_length: int, threshold: int): -+ self._queue_length = queue_length -+ self._queue_threshold = threshold -+ self._io_data_queue = [] -+ self._io_data_queue_abnormal_tag = [] -+ -+ def push(self, data: float): -+ if len(self._io_data_queue) == self._queue_length: -+ self._io_data_queue.pop(0) -+ self._io_data_queue_abnormal_tag.pop(0) -+ self._io_data_queue.append(data) -+ self._io_data_queue_abnormal_tag.append(data >= self._ai_threshold if self._ai_threshold is not None else False) -+ -+ def update(self, threshold): -+ if self._ai_threshold == threshold: -+ return -+ self._ai_threshold = threshold -+ self._io_data_queue_abnormal_tag.clear() -+ for data in self._io_data_queue: -+ self._io_data_queue_abnormal_tag.append(data >= self._ai_threshold) -+ -+ def is_slow_io_event(self, data): -+ return False, None, None -+ -+ def __repr__(self): -+ return "SlidingWindow" -+ -+ -+class NotContinuousSlidingWindow(SlidingWindow): -+ def is_slow_io_event(self, data): -+ super().push(data) -+ if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -+ return False, self._io_data_queue, self._ai_threshold -+ if self._io_data_queue_abnormal_tag.count(True) >= self._queue_threshold: -+ return True, self._io_data_queue, self._ai_threshold -+ return False, self._io_data_queue, self._ai_threshold -+ -+ def __repr__(self): -+ return "NotContinuousSlidingWindow" -+ -+ -+class ContinuousSlidingWindow(SlidingWindow): -+ def is_slow_io_event(self, data): -+ super().push(data) -+ if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -+ return False, self._io_data_queue, self._ai_threshold -+ consecutive_count = 0 -+ for tag in self._io_data_queue_abnormal_tag: -+ if tag: -+ consecutive_count += 1 -+ if consecutive_count >= self._queue_threshold: -+ return True, self._io_data_queue, self._ai_threshold -+ else: -+ consecutive_count = 0 -+ return False, self._io_data_queue, self._ai_threshold -+ -+ def __repr__(self): -+ return "ContinuousSlidingWindow" -+ -+ -+class MedianSlidingWindow(SlidingWindow): -+ def is_slow_io_event(self, data): -+ super().push(data) -+ if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -+ return False, self._io_data_queue, self._ai_threshold -+ median = np.median(self._io_data_queue) -+ if median >= self._ai_threshold: -+ return True, self._io_data_queue, self._ai_threshold -+ return False, self._io_data_queue, self._ai_threshold -+ -+ def __repr__(self): -+ return "MedianSlidingWindow" -+ -+ -+class SlidingWindowFactory: -+ def get_sliding_window(self, sliding_window_type: SlidingWindowType, *args, **kwargs): -+ if sliding_window_type == SlidingWindowType.NotContinuousSlidingWindow: -+ return NotContinuousSlidingWindow(*args, **kwargs) -+ elif sliding_window_type == SlidingWindowType.ContinuousSlidingWindow: -+ return ContinuousSlidingWindow(*args, **kwargs) -+ elif sliding_window_type == SlidingWindowType.MedianSlidingWindow: -+ return MedianSlidingWindow(*args, **kwargs) -+ else: -+ return NotContinuousSlidingWindow(*args, **kwargs) -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py -new file mode 100644 -index 0000000..43cf770 ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py -@@ -0,0 +1,133 @@ -+# 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. -+ -+import time -+import signal -+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 .config_parser import ConfigParser -+from .data_access import get_io_data_from_collect_plug, check_collect_valid -+from .io_data import MetricName -+from .alarm_report import AlarmReport -+ -+CONFIG_FILE = "/etc/sysSentry/plugins/ai_threshold_slow_io_detection.ini" -+ -+ -+def sig_handler(signum, frame): -+ logging.info("receive signal: %d", signum) -+ AlarmReport().report_fail(f"receive signal: {signum}") -+ exit(signum) -+ -+ -+class SlowIODetection: -+ _config_parser = None -+ _disk_list = None -+ _detector_name_list = [] -+ _detectors = {} -+ -+ def __init__(self, config_parser: ConfigParser): -+ self._config_parser = config_parser -+ self.__set_log_format() -+ self.__init_detector_name_list() -+ self.__init_detector() -+ -+ def __set_log_format(self): -+ log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -+ log_level = get_log_level(self._config_parser.get_log_level()) -+ logging.basicConfig(level=log_level, format=log_format) -+ -+ def __init_detector_name_list(self): -+ self._disk_list = check_collect_valid(self._config_parser.get_slow_io_detect_frequency()) -+ 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")) -+ -+ def __init_detector(self): -+ train_data_duration, train_update_duration = (self._config_parser. -+ get_train_data_duration_and_train_update_duration()) -+ slow_io_detection_frequency = self._config_parser.get_slow_io_detect_frequency() -+ threshold_type = get_threshold_type_enum(self._config_parser.get_algorithm_type()) -+ data_queue_size, update_size = get_data_queue_size_and_update_size(train_data_duration, -+ train_update_duration, -+ slow_io_detection_frequency) -+ sliding_window_type = get_sliding_window_type_enum(self._config_parser.get_sliding_window_type()) -+ window_size, window_threshold = self._config_parser.get_window_size_and_window_minimum_threshold() -+ -+ for detector_name in self._detector_name_list: -+ threshold = ThresholdFactory().get_threshold(threshold_type, data_queue_size=data_queue_size, -+ data_queue_update_size=update_size) -+ sliding_window = SlidingWindowFactory().get_sliding_window(sliding_window_type, queue_length=window_size, -+ threshold=window_threshold) -+ detector = Detector(detector_name, threshold, sliding_window) -+ # 绝对阈值的阈值初始化 -+ if isinstance(threshold, AbsoluteThreshold): -+ threshold.set_threshold(self._config_parser.get_absolute_threshold()) -+ self._detectors[detector_name] = detector -+ logging.info(f"add detector: {detector}") -+ -+ def launch(self): -+ while True: -+ logging.debug('step0. AI threshold slow io event detection is looping.') -+ -+ # Step1:获取IO数据 -+ io_data_dict_with_disk_name = get_io_data_from_collect_plug( -+ self._config_parser.get_slow_io_detect_frequency(), self._disk_list -+ ) -+ logging.debug(f'step1. Get io data: {str(io_data_dict_with_disk_name)}') -+ if io_data_dict_with_disk_name is None: -+ continue -+ # Step2:慢IO检测 -+ logging.debug('step2. Start to detection slow io event.') -+ slow_io_event_list = [] -+ for metric_name, detector in self._detectors.items(): -+ result = detector.is_slow_io_event(io_data_dict_with_disk_name) -+ if result[0]: -+ slow_io_event_list.append((detector.get_metric_name(), result)) -+ logging.debug('step2. End to detection slow io event.') -+ -+ # Step3:慢IO事件上报 -+ logging.debug('step3. Report slow io event to sysSentry.') -+ for slow_io_event in slow_io_event_list: -+ metric_name: MetricName = slow_io_event[0] -+ result = slow_io_event[1] -+ AlarmReport.report_major_alm(f"disk {metric_name.get_disk_name()} has slow io event." -+ f"stage: {metric_name.get_metric_name()}," -+ f"type: {metric_name.get_io_access_type_name()}," -+ f"metric: {metric_name.get_metric_name()}," -+ f"current window: {result[1]}," -+ f"threshold: {result[2]}") -+ logging.error(f"slow io event happen: {str(slow_io_event)}") -+ -+ # Step4:等待检测时间 -+ logging.debug('step4. Wait to start next slow io event detection loop.') -+ time.sleep(self._config_parser.get_slow_io_detect_frequency()) -+ -+ -+def main(): -+ # Step1:注册消息处理函数 -+ signal.signal(signal.SIGINT, sig_handler) -+ signal.signal(signal.SIGTERM, sig_handler) -+ # Step2:断点恢复 -+ # todo: -+ -+ # Step3:读取配置 -+ config_file_name = CONFIG_FILE -+ config = ConfigParser(config_file_name) -+ config.read_config_from_file() -+ -+ # Step4:启动慢IO检测 -+ slow_io_detection = SlowIODetection(config) -+ slow_io_detection.launch() -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py -new file mode 100644 -index 0000000..9e1ca7b ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py -@@ -0,0 +1,160 @@ -+# 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. -+import logging -+from enum import Enum -+import queue -+import numpy as np -+import math -+ -+from .sliding_window import SlidingWindow -+ -+ -+class ThresholdState(Enum): -+ INIT = 0 -+ START = 1 -+ -+ -+class Threshold: -+ threshold = None -+ data_queue: queue.Queue = None -+ data_queue_update_size: int = None -+ new_data_size: int = None -+ threshold_state: ThresholdState = None -+ -+ def __init__(self, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ self._observer = None -+ self.data_queue = queue.Queue(data_queue_size) -+ self.data_queue_update_size = data_queue_update_size -+ self.new_data_size = 0 -+ self.threshold_state = ThresholdState.INIT -+ self.threshold = math.inf -+ -+ def set_threshold(self, threshold): -+ self.threshold = threshold -+ self.threshold_state = ThresholdState.START -+ self.notify_observer() -+ -+ def get_threshold(self): -+ if self.threshold_state == ThresholdState.INIT: -+ return None -+ return self.threshold -+ -+ def is_abnormal(self, data): -+ if self.threshold_state == ThresholdState.INIT: -+ return False -+ return data >= self.threshold -+ -+ # 使用观察者模式,当阈值更新时,自动同步刷新滑窗中的阈值 -+ def attach_observer(self, observer: SlidingWindow): -+ self._observer = observer -+ -+ def notify_observer(self): -+ if self._observer is not None: -+ self._observer.update(self.threshold) -+ -+ def push_latest_data_to_queue(self, data): -+ pass -+ -+ def __repr__(self): -+ return "Threshold" -+ -+ -+class AbsoluteThreshold(Threshold): -+ def __init__(self, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ super().__init__(data_queue_size, data_queue_update_size) -+ -+ def push_latest_data_to_queue(self, data): -+ pass -+ -+ def __repr__(self): -+ return "AbsoluteThreshold" -+ -+ -+class BoxplotThreshold(Threshold): -+ def __init__(self, parameter: float = 1.5, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ super().__init__(data_queue_size, data_queue_update_size) -+ self.parameter = parameter -+ -+ def _update_threshold(self): -+ data = list(self.data_queue.queue) -+ q1 = np.percentile(data, 25) -+ q3 = np.percentile(data, 75) -+ iqr = q3 - q1 -+ self.threshold = q3 + self.parameter * iqr -+ if self.threshold_state == ThresholdState.INIT: -+ self.threshold_state = ThresholdState.START -+ self.notify_observer() -+ -+ def push_latest_data_to_queue(self, data): -+ try: -+ self.data_queue.put(data, block=False) -+ except queue.Full: -+ self.data_queue.get() -+ self.data_queue.put(data) -+ self.new_data_size += 1 -+ if (self.data_queue.full() and (self.threshold_state == ThresholdState.INIT or -+ (self.threshold_state == ThresholdState.START and -+ self.new_data_size >= self.data_queue_update_size))): -+ self._update_threshold() -+ self.new_data_size = 0 -+ -+ def __repr__(self): -+ return "BoxplotThreshold" -+ -+ -+class NSigmaThreshold(Threshold): -+ def __init__(self, parameter: float = 2.0, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ super().__init__(data_queue_size, data_queue_update_size) -+ self.parameter = parameter -+ -+ def _update_threshold(self): -+ data = list(self.data_queue.queue) -+ mean = np.mean(data) -+ std = np.std(data) -+ self.threshold = mean + self.parameter * std -+ if self.threshold_state == ThresholdState.INIT: -+ self.threshold_state = ThresholdState.START -+ self.notify_observer() -+ -+ def push_latest_data_to_queue(self, data): -+ try: -+ self.data_queue.put(data, block=False) -+ except queue.Full: -+ self.data_queue.get() -+ self.data_queue.put(data) -+ self.new_data_size += 1 -+ if (self.data_queue.full() and (self.threshold_state == ThresholdState.INIT or -+ (self.threshold_state == ThresholdState.START and -+ self.new_data_size >= self.data_queue_update_size))): -+ self._update_threshold() -+ self.new_data_size = 0 -+ -+ def __repr__(self): -+ return "NSigmaThreshold" -+ -+ -+class ThresholdType(Enum): -+ AbsoluteThreshold = 0 -+ BoxplotThreshold = 1 -+ NSigmaThreshold = 2 -+ -+ -+class ThresholdFactory: -+ def get_threshold(self, threshold_type: ThresholdType, *args, **kwargs): -+ if threshold_type == ThresholdType.AbsoluteThreshold: -+ return AbsoluteThreshold(*args, **kwargs) -+ elif threshold_type == ThresholdType.BoxplotThreshold: -+ return BoxplotThreshold(*args, **kwargs) -+ elif threshold_type == ThresholdType.NSigmaThreshold: -+ return NSigmaThreshold(*args, **kwargs) -+ else: -+ raise ValueError(f"Invalid threshold type: {threshold_type}") -+ -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py -new file mode 100644 -index 0000000..f66e5ed ---- /dev/null -+++ b/src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py -@@ -0,0 +1,67 @@ -+# 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. -+import logging -+from dataclasses import asdict -+ -+from .threshold import ThresholdType -+from .sliding_window import SlidingWindowType -+from .io_data import MetricName, IOData -+ -+def get_threshold_type_enum(algorithm_type: str): -+ if algorithm_type.lower() == 'absolute': -+ return ThresholdType.AbsoluteThreshold -+ if algorithm_type.lower() == 'boxplot': -+ return ThresholdType.BoxplotThreshold -+ if algorithm_type.lower() == 'n_sigma': -+ return ThresholdType.NSigmaThreshold -+ logging.info('not found correct algorithm type, use default: boxplot.') -+ return ThresholdType.BoxplotThreshold -+ -+ -+def get_sliding_window_type_enum(sliding_window_type: str): -+ if sliding_window_type.lower() == 'not_continuous': -+ return SlidingWindowType.NotContinuousSlidingWindow -+ if sliding_window_type.lower() == 'continuous': -+ return SlidingWindowType.ContinuousSlidingWindow -+ if sliding_window_type.lower() == 'median': -+ return SlidingWindowType.MedianSlidingWindow -+ logging.info('not found correct sliding window type, use default: not_continuous.') -+ return SlidingWindowType.NotContinuousSlidingWindow -+ -+ -+def get_metric_value_from_io_data_dict_by_metric_name(io_data_dict: dict, metric_name: MetricName): -+ try: -+ io_data: IOData = io_data_dict[metric_name.get_disk_name()] -+ io_stage_data = asdict(io_data)[metric_name.get_stage_name()] -+ base_data = io_stage_data[metric_name.get_io_access_type_name()] -+ metric_value = base_data[metric_name.get_metric_name()] -+ return metric_value -+ except KeyError: -+ return None -+ -+ -+def get_data_queue_size_and_update_size(training_data_duration: float, train_update_duration: float, -+ slow_io_detect_frequency: int): -+ data_queue_size = int(training_data_duration * 60 * 60 / slow_io_detect_frequency) -+ update_size = int(train_update_duration * 60 * 60 / slow_io_detect_frequency) -+ return data_queue_size, update_size -+ -+ -+def get_log_level(log_level: str): -+ if log_level.lower() == 'debug': -+ return logging.DEBUG -+ elif log_level.lower() == 'info': -+ return logging.INFO -+ elif log_level.lower() == 'warning': -+ return logging.WARNING -+ elif log_level.lower() == 'fatal': -+ return logging.FATAL -+ return None -diff --git a/src/python/setup.py b/src/python/setup.py -index c28c691..dac6481 100644 ---- a/src/python/setup.py -+++ b/src/python/setup.py -@@ -33,7 +33,8 @@ setup( - 'syssentry=syssentry.syssentry:main', - 'xalarmd=xalarm.xalarm_daemon:alarm_process_create', - 'sentryCollector=sentryCollector.collectd:main', -- 'avg_block_io=sentryPlugins.avg_block_io.avg_block_io:main' -+ 'avg_block_io=sentryPlugins.avg_block_io.avg_block_io:main', -+ 'ai_threshold_slow_io_detection=sentryPlugins.ai_threshold_slow_io_detection.slow_io_detection:main' - ] - }, - ) --- -2.23.0 - diff --git a/add-boundary-check-for-settings.patch b/add-boundary-check-for-settings.patch deleted file mode 100644 index 05184c0..0000000 --- a/add-boundary-check-for-settings.patch +++ /dev/null @@ -1,39 +0,0 @@ -From abf36bf0351efde388c089245aed9f6d8d2e6d3b Mon Sep 17 00:00:00 2001 -From: luckky -Date: Wed, 6 Nov 2024 11:42:53 +0800 -Subject: [PATCH] add boundary check for settings -1. add two boundary checks for page_isolation_threshold and hbm_online_repair_log_level -(0 <= page_isolation_threshold) -(0(LOG_DEBUG) <= hbm_online_repair_log_level <= 3(LOG_ERROR)) - ---- - src/c/hbm_online_repair/hbm_online_repair.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/src/c/hbm_online_repair/hbm_online_repair.c b/src/c/hbm_online_repair/hbm_online_repair.c -index 943f201..00c9c0b 100644 ---- a/src/c/hbm_online_repair/hbm_online_repair.c -+++ b/src/c/hbm_online_repair/hbm_online_repair.c -@@ -89,6 +89,9 @@ void hbm_param_init(void) - if (ret < 0) { - global_level_setting = DEFAULT_LOG_LEVEL; - log(LOG_WARNING, "Get log level from config failed, set the default value %d\n", DEFAULT_LOG_LEVEL); -+ } else if (global_level_setting < LOG_DEBUG || global_level_setting > LOG_ERROR) { -+ log(LOG_WARNING, "The log level value %d in config is out of range, set the default value %d\n", global_level_setting, DEFAULT_LOG_LEVEL); -+ global_level_setting = DEFAULT_LOG_LEVEL; - } else { - log(LOG_INFO, "log level: %d\n", global_level_setting); - } -@@ -98,6 +101,9 @@ void hbm_param_init(void) - if (ret < 0) { - page_isolation_threshold = DEFAULT_PAGE_ISOLATION_THRESHOLD; - log(LOG_WARNING, "Get page_isolation_threshold from config failed, set the default value %d\n", DEFAULT_PAGE_ISOLATION_THRESHOLD); -+ } else if (page_isolation_threshold < 0) { -+ log(LOG_WARNING, "The page_isolation_threshold %d in config is out of range, set the default value %d\n", page_isolation_threshold, DEFAULT_PAGE_ISOLATION_THRESHOLD); -+ page_isolation_threshold = DEFAULT_PAGE_ISOLATION_THRESHOLD; - } else { - log(LOG_INFO, "page_isolation_threshold: %d\n", page_isolation_threshold); - } --- -2.43.0 - diff --git a/add-collect-module-to-sysSentry.patch b/add-collect-module-to-sysSentry.patch deleted file mode 100644 index f8fa667..0000000 --- a/add-collect-module-to-sysSentry.patch +++ /dev/null @@ -1,1165 +0,0 @@ -From bd32dc01000126d593c188d47404cfdbe1df343e Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Thu, 12 Sep 2024 11:29:01 +0800 -Subject: [PATCH 1/2] add collect module to sysSentry - ---- - config/collector.conf | 7 + - service/sentryCollector.service | 12 + - service/sysSentry.service | 2 +- - src/python/sentryCollector/__init__.py | 0 - src/python/sentryCollector/__main__.py | 17 ++ - src/python/sentryCollector/collect_config.py | 118 ++++++++ - src/python/sentryCollector/collect_io.py | 239 ++++++++++++++++ - src/python/sentryCollector/collect_plugin.py | 276 ++++++++++++++++++ - src/python/sentryCollector/collect_server.py | 285 +++++++++++++++++++ - src/python/sentryCollector/collectd.py | 99 +++++++ - src/python/setup.py | 4 +- - 11 files changed, 1057 insertions(+), 2 deletions(-) - create mode 100644 config/collector.conf - create mode 100644 service/sentryCollector.service - create mode 100644 src/python/sentryCollector/__init__.py - create mode 100644 src/python/sentryCollector/__main__.py - create mode 100644 src/python/sentryCollector/collect_config.py - create mode 100644 src/python/sentryCollector/collect_io.py - create mode 100644 src/python/sentryCollector/collect_plugin.py - create mode 100644 src/python/sentryCollector/collect_server.py - create mode 100644 src/python/sentryCollector/collectd.py - -diff --git a/config/collector.conf b/config/collector.conf -new file mode 100644 -index 0000000..9baa086 ---- /dev/null -+++ b/config/collector.conf -@@ -0,0 +1,7 @@ -+[common] -+modules=io -+ -+[io] -+period_time=1 -+max_save=10 -+disk=default -\ No newline at end of file -diff --git a/service/sentryCollector.service b/service/sentryCollector.service -new file mode 100644 -index 0000000..4ee07d5 ---- /dev/null -+++ b/service/sentryCollector.service -@@ -0,0 +1,12 @@ -+[Unit] -+Description = Collection module added for sysSentry and kernel lock-free collection -+ -+[Service] -+ExecStart=/usr/bin/python3 /usr/bin/sentryCollector -+ExecStop=/bin/kill $MAINPID -+KillMode=process -+Restart=on-failure -+RestartSec=10s -+ -+[Install] -+WantedBy = multi-user.target -diff --git a/service/sysSentry.service b/service/sysSentry.service -index 4d85a6c..1d8338f 100644 ---- a/service/sysSentry.service -+++ b/service/sysSentry.service -@@ -2,7 +2,7 @@ - Description=EulerOS System Inspection Frame - - [Service] --ExecStart=/usr/bin/syssentry -+ExecStart=/usr/bin/python3 /usr/bin/syssentry - ExecStop=/bin/kill $MAINPID - KillMode=process - Restart=on-failure -diff --git a/src/python/sentryCollector/__init__.py b/src/python/sentryCollector/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/src/python/sentryCollector/__main__.py b/src/python/sentryCollector/__main__.py -new file mode 100644 -index 0000000..9c2ae50 ---- /dev/null -+++ b/src/python/sentryCollector/__main__.py -@@ -0,0 +1,17 @@ -+# coding: utf-8 -+# Copyright (c) 2023 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. -+ -+""" -+main -+""" -+from collectd import collectd -+ -+collectd.main() -diff --git a/src/python/sentryCollector/collect_config.py b/src/python/sentryCollector/collect_config.py -new file mode 100644 -index 0000000..b6cc75c ---- /dev/null -+++ b/src/python/sentryCollector/collect_config.py -@@ -0,0 +1,118 @@ -+# 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. -+ -+""" -+Read and save collector.conf value. -+""" -+import configparser -+import logging -+import os -+import re -+ -+ -+COLLECT_CONF_PATH = "/etc/sysSentry/collector.conf" -+ -+CONF_COMMON = 'common' -+CONF_MODULES = 'modules' -+ -+# io -+CONF_IO = 'io' -+CONF_IO_PERIOD_TIME = 'period_time' -+CONF_IO_MAX_SAVE = 'max_save' -+CONF_IO_DISK = 'disk' -+CONF_IO_PERIOD_TIME_DEFAULT = 1 -+CONF_IO_MAX_SAVE_DEFAULT = 10 -+CONF_IO_DISK_DEFAULT = "default" -+ -+class CollectConfig: -+ def __init__(self, filename=COLLECT_CONF_PATH): -+ -+ self.filename = filename -+ self.modules = [] -+ self.module_count = 0 -+ self.load_config() -+ -+ def load_config(self): -+ if not os.path.exists(self.filename): -+ logging.error("%s is not exists", self.filename) -+ return -+ -+ try: -+ self.config = configparser.ConfigParser() -+ self.config.read(self.filename) -+ except configparser.Error: -+ logging.error("collectd configure file read failed") -+ return -+ -+ try: -+ common_config = self.config[CONF_COMMON] -+ 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 -+ self.modules.append(module_name) -+ -+ def load_module_config(self, module_name): -+ module_name = module_name.strip().lower() -+ if module_name in self.modules and self.config.has_section(module_name): -+ return {key.lower(): value for key, value in self.config[module_name].items()} -+ else: -+ raise ValueError(f"Module '{module_name}' not found in configuration") -+ -+ def get_io_config(self): -+ result_io_config = {} -+ io_map_value = self.load_module_config(CONF_IO) -+ # period_time -+ period_time = io_map_value.get(CONF_IO_PERIOD_TIME) -+ if period_time and period_time.isdigit() and int(period_time) >= 1 and int(period_time) <= 300: -+ result_io_config[CONF_IO_PERIOD_TIME] = int(period_time) -+ else: -+ logging.warning("module_name = %s section, field = %s is incorrect, use default %d", -+ CONF_IO, CONF_IO_PERIOD_TIME, CONF_IO_PERIOD_TIME_DEFAULT) -+ result_io_config[CONF_IO_PERIOD_TIME] = CONF_IO_PERIOD_TIME_DEFAULT -+ # max_save -+ max_save = io_map_value.get(CONF_IO_MAX_SAVE) -+ if max_save and max_save.isdigit() and int(max_save) >= 1 and int(max_save) <= 300: -+ result_io_config[CONF_IO_MAX_SAVE] = int(max_save) -+ else: -+ logging.warning("module_name = %s section, field = %s is incorrect, use default %d", -+ CONF_IO, CONF_IO_MAX_SAVE, CONF_IO_MAX_SAVE_DEFAULT) -+ result_io_config[CONF_IO_MAX_SAVE] = CONF_IO_MAX_SAVE_DEFAULT -+ # disk -+ 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", -+ CONF_IO, CONF_IO_DISK, CONF_IO_DISK_DEFAULT) -+ result_io_config[CONF_IO_DISK] = CONF_IO_DISK_DEFAULT -+ logging.info("config get_io_config: %s", result_io_config) -+ return result_io_config -+ -+ def get_common_config(self): -+ return {key.lower(): value for key, value in self.config['common'].items()} -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -new file mode 100644 -index 0000000..b826dc4 ---- /dev/null -+++ b/src/python/sentryCollector/collect_io.py -@@ -0,0 +1,239 @@ -+# 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. -+ -+""" -+collect module -+""" -+import os -+import time -+import logging -+import threading -+ -+from .collect_config import CollectConfig -+ -+Io_Category = ["read", "write", "flush", "discard"] -+IO_GLOBAL_DATA = {} -+IO_CONFIG_DATA = [] -+ -+class IoStatus(): -+ TOTAL = 0 -+ FINISH = 1 -+ LATENCY = 2 -+ -+class CollectIo(): -+ -+ def __init__(self, module_config): -+ -+ io_config = module_config.get_io_config() -+ -+ self.period_time = io_config['period_time'] -+ self.max_save = io_config['max_save'] -+ disk_str = io_config['disk'] -+ -+ self.disk_map_stage = {} -+ self.window_value = {} -+ -+ self.loop_all = False -+ -+ if disk_str == "default": -+ self.loop_all = True -+ else: -+ self.disk_list = disk_str.strip().split(',') -+ -+ self.stop_event = threading.Event() -+ -+ IO_CONFIG_DATA.append(self.period_time) -+ IO_CONFIG_DATA.append(self.max_save) -+ -+ def get_blk_io_hierarchy(self, disk_name, stage_list): -+ stats_file = '/sys/kernel/debug/block/{}/blk_io_hierarchy/stats'.format(disk_name) -+ try: -+ with open(stats_file, 'r') as file: -+ lines = file.read() -+ except FileNotFoundError: -+ logging.error("The file %s does not exist", stats_file) -+ return -1 -+ except Exception as e: -+ logging.error("An error occurred3: %s", e) -+ return -1 -+ -+ curr_value = lines.strip().split('\n') -+ -+ for stage_val in curr_value: -+ stage = stage_val.split(' ')[0] -+ if (len(self.window_value[disk_name][stage])) >= 2: -+ self.window_value[disk_name][stage].pop(0) -+ -+ curr_stage_value = stage_val.split(' ')[1:-1] -+ self.window_value[disk_name][stage].append(curr_stage_value) -+ return 0 -+ -+ def append_period_lat(self, disk_name, stage_list): -+ for stage in stage_list: -+ if len(self.window_value[disk_name][stage]) < 2: -+ return -+ curr_stage_value = self.window_value[disk_name][stage][-1] -+ last_stage_value = self.window_value[disk_name][stage][-2] -+ -+ for index in range(len(Io_Category)): -+ # read=0, write=1, flush=2, discard=3 -+ if (len(IO_GLOBAL_DATA[disk_name][stage][Io_Category[index]])) >= self.max_save: -+ IO_GLOBAL_DATA[disk_name][stage][Io_Category[index]].pop() -+ -+ curr_lat = self.get_latency_value(curr_stage_value, last_stage_value, index) -+ curr_iops = self.get_iops(curr_stage_value, last_stage_value, index) -+ curr_io_length = self.get_io_length(curr_stage_value, last_stage_value, index) -+ curr_io_dump = self.get_io_dump(disk_name, stage, index) -+ -+ 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): -+ 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): -+ 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): -+ 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) -+ count = 0 -+ try: -+ with open(io_dump_file, 'r') as file: -+ for line in file: -+ count += line.count('.op=' + Io_Category[category]) -+ except FileNotFoundError: -+ logging.error("The file %s does not exist.", io_dump_file) -+ return count -+ except Exception as e: -+ logging.error("An error occurred1: %s", e) -+ return count -+ return count -+ -+ def extract_first_column(self, file_path): -+ column_names = [] -+ try: -+ with open(file_path, 'r') as file: -+ for line in file: -+ parts = line.strip().split() -+ if parts: -+ column_names.append(parts[0]) -+ except FileNotFoundError: -+ logging.error("The file %s does not exist.", file_path) -+ except Exception as e: -+ logging.error("An error occurred2: %s", e) -+ return column_names -+ -+ def task_loop(self): -+ if self.stop_event.is_set(): -+ logging.info("collect io thread exit") -+ return -+ -+ for disk_name, stage_list in self.disk_map_stage.items(): -+ if self.get_blk_io_hierarchy(disk_name, stage_list) < 0: -+ continue -+ self.append_period_lat(disk_name, stage_list) -+ -+ threading.Timer(self.period_time, self.task_loop).start() -+ -+ def main_loop(self): -+ logging.info("collect io thread start") -+ base_path = '/sys/kernel/debug/block' -+ for disk_name in os.listdir(base_path): -+ if not self.loop_all and disk_name not in self.disk_list: -+ continue -+ -+ disk_path = os.path.join(base_path, disk_name) -+ blk_io_hierarchy_path = os.path.join(disk_path, 'blk_io_hierarchy') -+ -+ if not os.path.exists(blk_io_hierarchy_path): -+ logging.error("no blk_io_hierarchy directory found in %s, skipping.", disk_name) -+ continue -+ -+ for file_name in os.listdir(blk_io_hierarchy_path): -+ file_path = os.path.join(blk_io_hierarchy_path, file_name) -+ -+ if file_name == 'stats': -+ stage_list = self.extract_first_column(file_path) -+ self.disk_map_stage[disk_name] = stage_list -+ self.window_value[disk_name] = {} -+ IO_GLOBAL_DATA[disk_name] = {} -+ -+ if len(self.disk_map_stage) == 0: -+ logging.warning("no disks meet the requirements. the thread exits") -+ return -+ -+ for disk_name, stage_list in self.disk_map_stage.items(): -+ for stage in stage_list: -+ self.window_value[disk_name][stage] = [] -+ IO_GLOBAL_DATA[disk_name][stage] = {} -+ for category in Io_Category: -+ IO_GLOBAL_DATA[disk_name][stage][category] = [] -+ -+ while True: -+ start_time = time.time() -+ -+ if self.stop_event.is_set(): -+ logging.info("collect io thread exit") -+ return -+ -+ for disk_name, stage_list in self.disk_map_stage.items(): -+ if self.get_blk_io_hierarchy(disk_name, stage_list) < 0: -+ continue -+ self.append_period_lat(disk_name, stage_list) -+ -+ elapsed_time = time.time() - start_time -+ sleep_time = self.period_time - elapsed_time -+ if sleep_time < 0: -+ continue -+ while sleep_time > 1: -+ if self.stop_event.is_set(): -+ logging.info("collect io thread exit") -+ return -+ time.sleep(1) -+ sleep_time -= 1 -+ time.sleep(sleep_time) -+ -+ # set stop event, notify thread exit -+ def stop_thread(self): -+ logging.info("collect io thread is preparing to exit") -+ self.stop_event.set() -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -new file mode 100644 -index 0000000..49ce0a8 ---- /dev/null -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -0,0 +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 -+ -diff --git a/src/python/sentryCollector/collect_server.py b/src/python/sentryCollector/collect_server.py -new file mode 100644 -index 0000000..fa49781 ---- /dev/null -+++ b/src/python/sentryCollector/collect_server.py -@@ -0,0 +1,285 @@ -+# 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. -+ -+""" -+listen module -+""" -+import sys -+import signal -+import traceback -+import socket -+import os -+import json -+import logging -+import fcntl -+import select -+import threading -+import time -+ -+from .collect_io import IO_GLOBAL_DATA, IO_CONFIG_DATA -+from .collect_config import CollectConfig -+ -+SENTRY_RUN_DIR = "/var/run/sysSentry" -+COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" -+ -+# socket param -+CLT_LISTEN_QUEUE_LEN = 5 -+SERVER_EPOLL_TIMEOUT = 0.3 -+ -+# 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 -+ -+# data flag param -+CLT_MAGIC = "CLT" -+RES_MAGIC = "RES" -+ -+# interface protocol -+class ServerProtocol(): -+ IS_IOCOLLECT_VALID = 0 -+ GET_IO_DATA = 1 -+ PRO_END = 3 -+ -+class CollectServer(): -+ -+ def __init__(self): -+ -+ self.io_global_data = {} -+ -+ self.stop_event = threading.Event() -+ -+ def is_iocollect_valid(self, data_struct): -+ -+ result_rev = {} -+ self.io_global_data = IO_GLOBAL_DATA -+ -+ if len(IO_CONFIG_DATA) == 0: -+ logging.error("the collect thread is not started, the data is invalid. ") -+ return json.dumps(result_rev) -+ -+ period_time = IO_CONFIG_DATA[0] -+ max_save = IO_CONFIG_DATA[1] -+ -+ disk_list = json.loads(data_struct['disk_list']) -+ period = int(data_struct['period']) -+ stage_list = json.loads(data_struct['stage']) -+ -+ if (period < period_time) or (period > period_time * max_save) or (period % period_time): -+ logging.error("is_iocollect_valid: period time: %d is invalid", period) -+ return json.dumps(result_rev) -+ -+ for disk_name, stage_info in self.io_global_data.items(): -+ if len(disk_list) > 0 and disk_name not in disk_list: -+ continue -+ result_rev[disk_name] = [] -+ if len(stage_list) == 0: -+ result_rev[disk_name] = list(stage_info.keys()) -+ continue -+ for stage_name, stage_data in stage_info.items(): -+ if stage_name in stage_list: -+ result_rev[disk_name].append(stage_name) -+ -+ return json.dumps(result_rev) -+ -+ def get_io_data(self, data_struct): -+ result_rev = {} -+ self.io_global_data = IO_GLOBAL_DATA -+ -+ if len(IO_CONFIG_DATA) == 0: -+ logging.error("the collect thread is not started, the data is invalid. ") -+ return json.dumps(result_rev) -+ period_time = IO_CONFIG_DATA[0] -+ max_save = IO_CONFIG_DATA[1] -+ -+ period = int(data_struct['period']) -+ disk_list = json.loads(data_struct['disk_list']) -+ stage_list = json.loads(data_struct['stage']) -+ iotype_list = json.loads(data_struct['iotype']) -+ -+ if (period < period_time) or (period > period_time * max_save) or (period % period_time): -+ logging.error("get_io_data: period time: %d is invalid", period) -+ return json.dumps(result_rev) -+ -+ collect_index = period // period_time - 1 -+ logging.debug("period: %d, collect_index: %d", period, collect_index) -+ -+ for disk_name, stage_info in self.io_global_data.items(): -+ if disk_name not in disk_list: -+ continue -+ result_rev[disk_name] = {} -+ for stage_name, iotype_info in stage_info.items(): -+ if len(stage_list) > 0 and stage_name not in stage_list: -+ continue -+ result_rev[disk_name][stage_name] = {} -+ for iotype_name, iotype_info in iotype_info.items(): -+ if iotype_name not in iotype_list: -+ continue -+ if len(iotype_info) < collect_index: -+ continue -+ result_rev[disk_name][stage_name][iotype_name] = iotype_info[collect_index] -+ -+ return json.dumps(result_rev) -+ -+ def msg_data_process(self, msg_data, protocal_id): -+ """message data process""" -+ logging.debug("msg_data %s", msg_data) -+ protocol_name = msg_data[0] -+ try: -+ data_struct = json.loads(msg_data) -+ except json.JSONDecodeError: -+ logging.error("msg data process: json decode error") -+ return "Request message decode failed" -+ -+ if protocal_id == ServerProtocol.IS_IOCOLLECT_VALID: -+ res_msg = self.is_iocollect_valid(data_struct) -+ elif protocal_id == ServerProtocol.GET_IO_DATA: -+ res_msg = self.get_io_data(data_struct) -+ -+ return res_msg -+ -+ def msg_head_process(self, msg_head): -+ """message head process""" -+ ctl_magic = msg_head[:CLT_MSG_MAGIC_LEN] -+ if ctl_magic != CLT_MAGIC: -+ logging.error("recv msg head magic invalid") -+ return None -+ -+ protocol_str = msg_head[CLT_MSG_MAGIC_LEN:CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN] -+ try: -+ protocol_id = int(protocol_str) -+ except ValueError: -+ logging.error("recv msg protocol id is invalid") -+ return None -+ -+ data_len_str = msg_head[CLT_MSG_MAGIC_LEN+CLT_MSG_PRO_LEN:CLT_MSG_HEAD_LEN] -+ try: -+ data_len = int(data_len_str) -+ except ValueError: -+ logging.error("recv msg data len is invalid %s", data_len_str) -+ return None -+ -+ return [protocol_id, data_len] -+ -+ def server_recv(self, server_socket: socket.socket): -+ """server receive""" -+ try: -+ client_socket, _ = server_socket.accept() -+ logging.debug("server_fd listen ok") -+ except socket.error: -+ logging.error("server accept failed, %s", socket.error) -+ return -+ -+ try: -+ msg_head = client_socket.recv(CLT_MSG_HEAD_LEN) -+ logging.debug("recv msg head: %s", msg_head.decode()) -+ head_info = self.msg_head_process(msg_head.decode()) -+ except (OSError, UnicodeError): -+ client_socket.close() -+ logging.error("server recv HEAD failed") -+ return -+ -+ protocol_id = head_info[0] -+ data_len = head_info[1] -+ logging.debug("msg protocol id: %d, data length: %d", protocol_id, data_len) -+ if protocol_id >= ServerProtocol.PRO_END: -+ client_socket.close() -+ logging.error("protocol id is invalid") -+ return -+ -+ if data_len < 0: -+ client_socket.close() -+ logging.error("msg head parse failed") -+ return -+ -+ try: -+ msg_data = client_socket.recv(data_len) -+ msg_data_decode = msg_data.decode() -+ logging.debug("msg data %s", msg_data_decode) -+ except (OSError, UnicodeError): -+ client_socket.close() -+ logging.error("server recv MSG failed") -+ return -+ -+ res_data = self.msg_data_process(msg_data_decode, protocol_id) -+ logging.debug("res data %s", res_data) -+ -+ # server send -+ res_head = RES_MAGIC -+ res_head += str(protocol_id).zfill(CLT_MSG_PRO_LEN) -+ res_data_len = str(len(res_data)).zfill(CLT_MSG_LEN_LEN) -+ res_head += res_data_len -+ logging.debug("res head %s", res_head) -+ -+ res_msg = res_head + res_data -+ logging.debug("res msg %s", res_msg) -+ -+ try: -+ client_socket.send(res_msg.encode()) -+ except OSError: -+ logging.error("server recv failed") -+ finally: -+ client_socket.close() -+ return -+ -+ def server_fd_create(self): -+ """create server fd""" -+ if not os.path.exists(SENTRY_RUN_DIR): -+ logging.error("%s not exist, failed", SENTRY_RUN_DIR) -+ return None -+ -+ try: -+ server_fd = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -+ server_fd.setblocking(False) -+ if os.path.exists(COLLECT_SOCKET_PATH): -+ os.remove(COLLECT_SOCKET_PATH) -+ -+ server_fd.bind(COLLECT_SOCKET_PATH) -+ os.chmod(COLLECT_SOCKET_PATH, 0o600) -+ server_fd.listen(CLT_LISTEN_QUEUE_LEN) -+ logging.debug("%s bind and listen", COLLECT_SOCKET_PATH) -+ except socket.error: -+ logging.error("server fd create failed") -+ server_fd = None -+ -+ return server_fd -+ -+ -+ def server_loop(self): -+ """main loop""" -+ logging.info("collect server thread start") -+ server_fd = self.server_fd_create() -+ if not server_fd: -+ return -+ -+ epoll_fd = select.epoll() -+ epoll_fd.register(server_fd.fileno(), select.EPOLLIN) -+ -+ logging.debug("start server_loop loop") -+ while True: -+ if self.stop_event.is_set(): -+ logging.info("collect server thread exit") -+ server_fd = None -+ return -+ try: -+ events_list = epoll_fd.poll(SERVER_EPOLL_TIMEOUT) -+ for event_fd, _ in events_list: -+ if event_fd == server_fd.fileno(): -+ self.server_recv(server_fd) -+ else: -+ continue -+ except socket.error: -+ pass -+ -+ def stop_thread(self): -+ logging.info("collect server thread is preparing to exit") -+ self.stop_event.set() -diff --git a/src/python/sentryCollector/collectd.py b/src/python/sentryCollector/collectd.py -new file mode 100644 -index 0000000..b77c642 ---- /dev/null -+++ b/src/python/sentryCollector/collectd.py -@@ -0,0 +1,99 @@ -+# 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. -+ -+""" -+main loop for collect. -+""" -+import sys -+import signal -+import traceback -+import socket -+import os -+import json -+import logging -+import fcntl -+import select -+ -+import threading -+ -+from .collect_io import CollectIo -+from .collect_server import CollectServer -+from .collect_config import CollectConfig -+ -+SENTRY_RUN_DIR = "/var/run/sysSentry" -+COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" -+SENTRY_RUN_DIR_PERM = 0o750 -+ -+COLLECT_LOG_FILE = "/var/log/sysSentry/collector.log" -+Thread_List = [] -+Module_Map_Class = {"io" : CollectIo} -+ -+def remove_sock_file(): -+ try: -+ os.unlink(COLLECT_SOCKET_PATH) -+ except FileNotFoundError: -+ pass -+ -+def sig_handler(signum, _f): -+ if signum not in (signal.SIGINT, signal.SIGTERM): -+ return -+ for i in range(len(Thread_List)): -+ Thread_List[i][0].stop_thread() -+ -+ remove_sock_file() -+ sys.exit(0) -+ -+def main(): -+ """main -+ """ -+ if not os.path.exists(SENTRY_RUN_DIR): -+ os.mkdir(SENTRY_RUN_DIR) -+ os.chmod(SENTRY_RUN_DIR, mode=SENTRY_RUN_DIR_PERM) -+ -+ logging.basicConfig(filename=COLLECT_LOG_FILE, level=logging.INFO) -+ os.chmod(COLLECT_LOG_FILE, 0o600) -+ -+ try: -+ signal.signal(signal.SIGINT, sig_handler) -+ signal.signal(signal.SIGTERM, sig_handler) -+ signal.signal(signal.SIGHUP, sig_handler) -+ -+ logging.info("finish main parse_args") -+ -+ module_config = CollectConfig() -+ module_list = module_config.modules -+ -+ # listen thread -+ cs = CollectServer() -+ listen_thread = threading.Thread(target=cs.server_loop) -+ listen_thread.start() -+ Thread_List.append([cs, listen_thread]) -+ -+ # collect thread -+ for info in module_list: -+ class_name = Module_Map_Class.get(info) -+ if not class_name: -+ logging.info("%s correspond to class is not exists", info) -+ continue -+ cn = class_name(module_config) -+ collect_thread = threading.Thread(target=cn.main_loop) -+ collect_thread.start() -+ Thread_List.append([cn, collect_thread]) -+ -+ for i in range(len(Thread_List)): -+ Thread_List[i][1].join() -+ -+ except Exception: -+ logging.error('%s', traceback.format_exc()) -+ finally: -+ pass -+ -+ logging.info("All threads have finished. Main thread is exiting.") -\ No newline at end of file -diff --git a/src/python/setup.py b/src/python/setup.py -index f96a96e..c28c691 100644 ---- a/src/python/setup.py -+++ b/src/python/setup.py -@@ -31,7 +31,9 @@ setup( - 'console_scripts': [ - 'cpu_sentry=syssentry.cpu_sentry:main', - 'syssentry=syssentry.syssentry:main', -- 'xalarmd=xalarm.xalarm_daemon:alarm_process_create' -+ 'xalarmd=xalarm.xalarm_daemon:alarm_process_create', -+ 'sentryCollector=sentryCollector.collectd:main', -+ 'avg_block_io=sentryPlugins.avg_block_io.avg_block_io:main' - ] - }, - ) --- -2.33.0 - diff --git a/add-deleted-code-to-plugin-rasdaemon.patch b/add-deleted-code-to-plugin-rasdaemon.patch deleted file mode 100644 index 89d1cc4..0000000 --- a/add-deleted-code-to-plugin-rasdaemon.patch +++ /dev/null @@ -1,31 +0,0 @@ -From eca8c542875aef5cfbf947d697c4b644490d1c05 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Fri, 30 Aug 2024 19:58:41 +0800 -Subject: [PATCH] add deleted code to plugin rasdaemon - ---- - src/python/syssentry/syssentry.py | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index 32b81e3..3d5cb8d 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -462,6 +462,14 @@ def main_loop(): - epoll_fd.register(cpu_alarm_fd.fileno(), select.EPOLLIN) - - logging.debug("start main loop") -+ # onstart_tasks_handle() -+ for task_type in TasksMap.tasks_dict: -+ for task_name in TasksMap.tasks_dict.get(task_type): -+ task = TasksMap.tasks_dict.get(task_type).get(task_name) -+ if not task: -+ continue -+ task.onstart_handle() -+ - while True: - try: - events_list = epoll_fd.poll(SERVER_EPOLL_TIMEOUT) --- -2.33.0 - diff --git a/add-detail-time.patch b/add-detail-time.patch deleted file mode 100644 index 8e23452..0000000 --- a/add-detail-time.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 9ecd4c2c9c9f9578f5ec4780360dc67b182b384a Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Wed, 9 Oct 2024 08:09:04 +0000 -Subject: [PATCH 2/2] add detail time - -Signed-off-by: jinsaihang ---- - src/python/syssentry/alarm.py | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index 74a2716..d5337d3 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -118,11 +118,13 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - logging.debug(f"get_alarm_result: final alarm_list of {alarm_id} has {len(alarm_list)} elements") - - def xalarm_to_dict(alarm_info: Xalarm) -> dict: -+ timestamp = alarm_info.timetamp.tv_sec + alarm_info.timetamp.tv_usec / 1000000 -+ dt_object = datetime.fromtimestamp(int(timestamp)) - return { - 'alarm_id': xalarm_getid(alarm_info), - 'alarm_type': xalarm_gettype(alarm_info), - 'alarm_level': xalarm_getlevel(alarm_info), -- 'timetamp': xalarm_gettime(alarm_info), -+ 'timestamp': dt_object.strftime("%Y-%m-%d %H:%M:%S"), - 'msg1': xalarm_getdesc(alarm_info) - } - --- -2.27.0 - diff --git a/add-get_disk_type-and-fix-some-bugs.patch b/add-get_disk_type-and-fix-some-bugs.patch deleted file mode 100644 index b5e59e8..0000000 --- a/add-get_disk_type-and-fix-some-bugs.patch +++ /dev/null @@ -1,176 +0,0 @@ -From c2ffc679eddda5d78362612d89a9319d268da7e3 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Thu, 10 Oct 2024 20:17:34 +0800 -Subject: [PATCH] add get_disk_type and fix some bugs - ---- - service/sentryCollector.service | 2 +- - src/python/sentryCollector/collect_io.py | 16 ++++- - src/python/sentryCollector/collect_plugin.py | 68 +++++++++++++++++++- - 3 files changed, 81 insertions(+), 5 deletions(-) - -diff --git a/service/sentryCollector.service b/service/sentryCollector.service -index 4ee07d5..e09ddb3 100644 ---- a/service/sentryCollector.service -+++ b/service/sentryCollector.service -@@ -1,5 +1,5 @@ - [Unit] --Description = Collection module added for sysSentry and kernel lock-free collection -+Description = Collection module added for sysSentry - - [Service] - ExecStart=/usr/bin/python3 /usr/bin/sentryCollector -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index 8780648..6699a90 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -116,7 +116,7 @@ class CollectIo(): - return 0 - if finish <= 0 or lat_time <= 0: - return 0 -- value = lat_time / finish / 1000 / 1000 -+ value = lat_time / finish / 1000 - if value.is_integer(): - return int(value) - else: -@@ -124,11 +124,17 @@ class CollectIo(): - - def get_io_length(self, curr_stage_value, last_stage_value, category): - 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_io_length convert to int failed, %s", e) - return 0 -- value = finish / self.period_time / 1000 / 1000 -+ if lat_time <= 0: -+ return 0 -+ # ns convert us -+ lat_time = lat_time / 1000 -+ # s convert us -+ period_time = self.period_time * 1000 * 1000 -+ value = lat_time / period_time - if value.is_integer(): - return int(value) - else: -@@ -141,6 +147,8 @@ class CollectIo(): - with open(io_dump_file, 'r') as file: - for line in file: - count += line.count('.op=' + Io_Category[category]) -+ if count > 0: -+ logging.info(f"io_dump info : {disk_name}, {stage}, {category}, {count}") - except FileNotFoundError: - logging.error("The file %s does not exist.", io_dump_file) - return count -@@ -223,6 +231,8 @@ class CollectIo(): - if self.get_blk_io_hierarchy(disk_name, stage_list) < 0: - continue - self.append_period_lat(disk_name, stage_list) -+ -+ logging.debug(f"no-lock collect data : {IO_GLOBAL_DATA}") - - elapsed_time = time.time() - start_time - sleep_time = self.period_time - elapsed_time -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 3e2cf4c..31bf11b 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -16,6 +16,7 @@ import json - import socket - import logging - import re -+import os - - COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" - -@@ -58,6 +59,8 @@ class ResultMessage(): - RESULT_EXCEED_LIMIT = 4 # the parameter length exceeds the limit. - RESULT_PARSE_FAILED = 5 # parse failed - RESULT_INVALID_CHAR = 6 # invalid char -+ RESULT_DISK_NOEXIST = 7 # disk is not exist -+ RESULT_DISK_TYPE_MISMATCH= 8 # disk type mismatch - - Result_Messages = { - ResultMessage.RESULT_SUCCEED: "Succeed", -@@ -66,9 +69,15 @@ Result_Messages = { - 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" -+ ResultMessage.RESULT_INVALID_CHAR: "Invalid char", -+ ResultMessage.RESULT_DISK_NOEXIST: "Disk is not exist", -+ ResultMessage.RESULT_DISK_TYPE_MISMATCH: "Disk type mismatch" - } - -+class DiskType(): -+ TYPE_NVME_SSD = 0 -+ TYPE_SATA_SSD = 1 -+ TYPE_SATA_HDD = 2 - - def client_send_and_recv(request_data, data_str_len, protocol): - """client socket send and recv message""" -@@ -273,3 +282,60 @@ def inter_get_io_data(period, disk_list, stage, iotype): - result['message'] = result_message - return result - -+def get_disk_type(disk): -+ result = {} -+ result['ret'] = ResultMessage.RESULT_UNKNOWN -+ result['message'] = "" -+ if not disk: -+ logging.error("param is invalid") -+ result['ret'] = ResultMessage.RESULT_NOT_PARAM -+ return result -+ if len(disk) <= 0 or len(disk) > LIMIT_DISK_CHAR_LEN: -+ logging.error("invalid disk length") -+ result['ret'] = ResultMessage.RESULT_INVALID_LENGTH -+ return result -+ pattern = r'^[a-zA-Z0-9_-]+$' -+ if not re.match(pattern, disk): -+ logging.error("%s is invalid char", disk) -+ result['ret'] = ResultMessage.RESULT_INVALID_CHAR -+ return result -+ -+ base_path = '/sys/block' -+ all_disk = [] -+ for disk_name in os.listdir(base_path): -+ all_disk.append(disk_name) -+ -+ if disk not in all_disk: -+ logging.error("disk %s is not exist", disk) -+ result['ret'] = ResultMessage.RESULT_DISK_NOEXIST -+ return result -+ -+ if disk[0:4] == "nvme": -+ result['message'] = str(DiskType.TYPE_NVME_SSD) -+ elif disk[0:2] == "sd": -+ disk_file = '/sys/block/{}/queue/rotational'.format(disk) -+ try: -+ with open(disk_file, 'r') as file: -+ num = int(file.read()) -+ if num == 1: -+ result['message'] = str(DiskType.TYPE_SATA_SSD) -+ elif num == 0: -+ result['message'] = str(DiskType.TYPE_SATA_HDD) -+ else: -+ logging.error("disk %s is not support, num = %d", disk, num) -+ result['ret'] = ResultMessage.RESULT_DISK_TYPE_MISMATCH -+ return result -+ except FileNotFoundError: -+ logging.error("The disk_file [%s] does not exist", disk_file) -+ result['ret'] = ResultMessage.RESULT_DISK_NOEXIST -+ return result -+ except Exception as e: -+ logging.error("open disk_file %s happen an error: %s", disk_file, e) -+ return result -+ else: -+ logging.error("disk %s is not support", disk) -+ result['ret'] = ResultMessage.RESULT_DISK_TYPE_MISMATCH -+ return result -+ -+ result['ret'] = ResultMessage.RESULT_SUCCEED -+ return result -\ No newline at end of file --- -2.33.0 - diff --git a/add-hbm-online-repair.patch b/add-hbm-online-repair.patch deleted file mode 100644 index c6906ff..0000000 --- a/add-hbm-online-repair.patch +++ /dev/null @@ -1,2194 +0,0 @@ -From abdeacfa6ae54b503714cb98f3262a39d883972e Mon Sep 17 00:00:00 2001 -From: luckky -Date: Fri, 11 Oct 2024 09:49:40 +0000 -Subject: [PATCH] add hbm online repair - ---- - config/tasks/hbm_online_repair.mod | 9 + - src/c/hbm_online_repair/.gitignore | 6 + - src/c/hbm_online_repair/Makefile | 25 + - src/c/hbm_online_repair/hbm_online_repair.c | 144 ++++ - src/c/hbm_online_repair/hbm_online_repair.env | 2 + - src/c/hbm_online_repair/logger.h | 31 + - .../non-standard-hbm-repair.c | 799 ++++++++++++++++++ - .../non-standard-hbm-repair.h | 89 ++ - src/c/hbm_online_repair/ras-events.c | 534 ++++++++++++ - src/c/hbm_online_repair/ras-events.h | 28 + - .../ras-non-standard-handler.c | 81 ++ - .../ras-non-standard-handler.h | 25 + - src/python/.gitignore | 1 + - src/python/syssentry/bmc_alarm.py | 159 ++++ - src/python/syssentry/syssentry.py | 78 +- - 15 files changed, 2001 insertions(+), 10 deletions(-) - create mode 100644 config/tasks/hbm_online_repair.mod - create mode 100644 src/c/hbm_online_repair/.gitignore - create mode 100644 src/c/hbm_online_repair/Makefile - create mode 100644 src/c/hbm_online_repair/hbm_online_repair.c - create mode 100644 src/c/hbm_online_repair/hbm_online_repair.env - create mode 100644 src/c/hbm_online_repair/logger.h - create mode 100644 src/c/hbm_online_repair/non-standard-hbm-repair.c - create mode 100644 src/c/hbm_online_repair/non-standard-hbm-repair.h - create mode 100644 src/c/hbm_online_repair/ras-events.c - create mode 100644 src/c/hbm_online_repair/ras-events.h - create mode 100644 src/c/hbm_online_repair/ras-non-standard-handler.c - create mode 100644 src/c/hbm_online_repair/ras-non-standard-handler.h - create mode 100644 src/python/.gitignore - create mode 100644 src/python/syssentry/bmc_alarm.py - -diff --git a/config/tasks/hbm_online_repair.mod b/config/tasks/hbm_online_repair.mod -new file mode 100644 -index 0000000..77dd73e ---- /dev/null -+++ b/config/tasks/hbm_online_repair.mod -@@ -0,0 +1,9 @@ -+[common] -+enabled=yes -+task_start=/usr/bin/hbm_online_repair -+task_stop=kill $pid -+type=period -+interval=180 -+onstart=yes -+env_file=/etc/sysconfig/hbm_online_repair.env -+conflict=up -\ No newline at end of file -diff --git a/src/c/hbm_online_repair/.gitignore b/src/c/hbm_online_repair/.gitignore -new file mode 100644 -index 0000000..a577882 ---- /dev/null -+++ b/src/c/hbm_online_repair/.gitignore -@@ -0,0 +1,6 @@ -+*.o -+*.c~ -+*.h~ -+hbm_online_repair -+ -+.vscode/ -diff --git a/src/c/hbm_online_repair/Makefile b/src/c/hbm_online_repair/Makefile -new file mode 100644 -index 0000000..16ebcd8 ---- /dev/null -+++ b/src/c/hbm_online_repair/Makefile -@@ -0,0 +1,25 @@ -+CC = gcc -+ -+CFLAGS = -Wall -o3 -+ -+LDFLAGS = -ltraceevent -+ -+SRC = $(wildcard *.c) -+HDR = $(wildcard *.h) -+ -+OBJ = $(SRC:.c=.o) -+ -+TARGET = hbm_online_repair -+ -+all: $(TARGET) -+ -+$(TARGET): $(OBJ) -+ $(CC) $(OBJ) -o $@ $(LDFLAGS) -+ -+%.o: %.c $(HDR) -+ $(CC) $(CFLAGS) -c $< -o $@ -+ -+clean: -+ rm -f $(OBJ) $(TARGET) -+ -+.PHONY: all clean -diff --git a/src/c/hbm_online_repair/hbm_online_repair.c b/src/c/hbm_online_repair/hbm_online_repair.c -new file mode 100644 -index 0000000..3ace206 ---- /dev/null -+++ b/src/c/hbm_online_repair/hbm_online_repair.c -@@ -0,0 +1,144 @@ -+#include -+#include -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "ras-events.h" -+#include "non-standard-hbm-repair.h" -+ -+#define DEFAULT_LOG_LEVEL LOG_INFO -+#define DEFAULT_PAGE_ISOLATION_THRESHOLD 128 -+ -+int global_level_setting; -+int page_isolation_threshold; -+ -+int string2int(const char* str, int* value) -+{ -+ if (!str) { -+ return -1; -+ } -+ char *endptr; -+ errno = 0; -+ long val = strtol(str, &endptr, 10); -+ if (errno != 0 || *endptr != '\0') { -+ return -1; -+ } -+ *value = (int)val; -+ if (val != (long)*value) { -+ return -1; -+ } -+ return 0; -+} -+ -+int execute_command(const char *command) -+{ -+ FILE *fp; -+ char buffer[128] = {0}; -+ int ret; -+ fp = popen(command, "r"); -+ if (!fp) { -+ log(LOG_ERROR, "popen failed\n"); -+ return -1; -+ } -+ -+ fgets(buffer, sizeof(buffer), fp); -+ log(LOG_DEBUG, "output of command is: %s\n", buffer); -+ -+ ret = pclose(fp); -+ if (ret < 0) { -+ log(LOG_ERROR, "pclose failed\n"); -+ return -1; -+ } -+ -+ if (!WIFEXITED(ret)) { -+ log(LOG_ERROR, "command did not terminate normally\n"); -+ return -1; -+ } -+ -+ ret = WEXITSTATUS(ret); -+ log(LOG_DEBUG, "command exited with status: %d\n", ret); -+ return ret; -+} -+ -+int load_required_driver(void) -+{ -+ int ret; -+ ret = execute_command("modprobe hisi_mem_ras 2>&1"); -+ if (ret < 0) { -+ log(LOG_ERROR, "load repair driver failed\n"); -+ return ret; -+ } -+ ret = execute_command("modprobe page_eject 2>&1"); -+ if (ret < 0) { -+ log(LOG_ERROR, "load page driver failed\n"); -+ return ret; -+ } -+ log(LOG_INFO, "load required driver success\n"); -+ return ret; -+} -+ -+void hbm_param_init(void) -+{ -+ int ret; -+ char *env; -+ -+ env = getenv("HBM_ONLINE_REPAIR_LOG_LEVEL"); -+ ret = string2int(env, &global_level_setting); -+ if (ret < 0) { -+ global_level_setting = DEFAULT_LOG_LEVEL; -+ log(LOG_WARNING, "Get log level from config failed, set the default value %d\n", DEFAULT_LOG_LEVEL); -+ } else { -+ log(LOG_INFO, "log level: %d\n", global_level_setting); -+ } -+ -+ env = getenv("PAGE_ISOLATION_THRESHOLD"); -+ ret = string2int(env, &page_isolation_threshold); -+ if (ret < 0) { -+ page_isolation_threshold = DEFAULT_PAGE_ISOLATION_THRESHOLD; -+ log(LOG_WARNING, "Get page_isolation_threshold from config failed, set the default value %d\n", DEFAULT_PAGE_ISOLATION_THRESHOLD); -+ } else { -+ log(LOG_INFO, "page_isolation_threshold: %d\n", page_isolation_threshold); -+ } -+} -+ -+ -+int main(int argc, char *argv[]) -+{ -+ int ret; -+ -+ hbm_param_init(); -+ -+ ret = load_required_driver(); -+ if (ret < 0) { -+ log(LOG_DEBUG, "load required driver failed\n"); -+ return ret; -+ } -+ -+ struct ras_events *ras = init_trace_instance(); -+ if (!ras) -+ return -1; -+ -+ ret = toggle_ras_event(ras->tracing, "ras", "non_standard_event", 1); -+ if (ret < 0) { -+ log(LOG_WARNING, "unable to enable ras non_standard_event.\n"); -+ free(ras); -+ return -1; -+ } -+ -+ ret = init_all_flash(); -+ if (ret < 0) { -+ log(LOG_ERROR, "flash writer init failed\n"); -+ } -+ -+ handle_ras_events(ras); -+ -+ ret = toggle_ras_event(ras->tracing, "ras", "non_standard_event", 0); -+ if (ret < 0) { -+ log(LOG_WARNING, "unable to disable ras non_standard_event.\n"); -+ } -+ -+ free(ras); -+ return ret; -+} -diff --git a/src/c/hbm_online_repair/hbm_online_repair.env b/src/c/hbm_online_repair/hbm_online_repair.env -new file mode 100644 -index 0000000..de56079 ---- /dev/null -+++ b/src/c/hbm_online_repair/hbm_online_repair.env -@@ -0,0 +1,2 @@ -+HBM_ONLINE_REPAIR_LOG_LEVEL=1 -+PAGE_ISOLATION_THRESHOLD=128 -diff --git a/src/c/hbm_online_repair/logger.h b/src/c/hbm_online_repair/logger.h -new file mode 100644 -index 0000000..ddfa932 ---- /dev/null -+++ b/src/c/hbm_online_repair/logger.h -@@ -0,0 +1,31 @@ -+#ifndef __LOGGER_H -+#define __LOGGER_H -+ -+#define TOOL_NAME "hbm_online_repair" -+ -+#define LOG_DEBUG 0 -+#define LOG_INFO 1 -+#define LOG_WARNING 2 -+#define LOG_ERROR 3 -+ -+extern int global_level_setting; -+ -+#define log_prefix(level) \ -+ (level == LOG_DEBUG ? "DEBUG" : \ -+ level == LOG_INFO ? "INFO" : \ -+ level == LOG_WARNING ? "WARNING" : \ -+ level == LOG_ERROR ? "ERROR" : \ -+ "UNKNOWN_LEVEL") -+ -+#define log_fd(level) \ -+ (level == LOG_ERROR ? stderr : stdout) -+ -+#define log(level, fmt, args...) do {\ -+ if (level >= global_level_setting) {\ -+ fprintf(log_fd(level), "[%s] %s: ", log_prefix(level), TOOL_NAME);\ -+ fprintf(log_fd(level), fmt, ##args);\ -+ fflush(log_fd(level));\ -+ }\ -+} while (0) -+ -+#endif -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.c b/src/c/hbm_online_repair/non-standard-hbm-repair.c -new file mode 100644 -index 0000000..b175e14 ---- /dev/null -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.c -@@ -0,0 +1,799 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "logger.h" -+#include "non-standard-hbm-repair.h" -+ -+extern int page_isolation_threshold; -+size_t total_size = 0; -+struct hisi_common_error_section { -+ uint32_t val_bits; -+ uint8_t version; -+ uint8_t soc_id; -+ uint8_t socket_id; -+ uint8_t totem_id; -+ uint8_t nimbus_id; -+ uint8_t subsystem_id; -+ uint8_t module_id; -+ uint8_t submodule_id; -+ uint8_t core_id; -+ uint8_t port_id; -+ uint16_t err_type; -+ struct { -+ uint8_t function; -+ uint8_t device; -+ uint16_t segment; -+ uint8_t bus; -+ uint8_t reserved[3]; -+ } pcie_info; -+ uint8_t err_severity; -+ uint8_t reserved[3]; -+ uint32_t reg_array_size; -+ uint32_t reg_array[]; -+}; -+ -+struct fault_addr_info { -+ uint32_t processer_id; -+ uint32_t die_id; -+ uint32_t stack_id; -+ uint32_t sid; -+ uint32_t channel_id; -+ uint32_t bankgroup_id; -+ uint32_t bank_id; -+ uint32_t row_id; -+ uint32_t column_id; -+ uint32_t error_type; -+ uint32_t repair_type; -+ uint32_t reserved; -+ uint32_t crc8; -+}; -+ -+typedef struct { -+ const char *VariableName; -+ const char *VendorGuid; -+ uint32_t DataSize; -+ uint8_t *Data; -+ uint32_t Attributes; -+} efi_variable_t; -+ -+char* flash_names[FLASH_ENTRY_NUM] = { -+ "repair0000", -+ "repair0001", -+ "repair0100", -+ "repair0101", -+ "repair0200", -+ "repair0201", -+ "repair0300", -+ "repair0301", -+}; -+char *flash_guids[FLASH_ENTRY_NUM] = { -+ "CD2FF4D9-D937-4e1d-B810-A1A568C37C01", -+ "DD92CC91-43E6-4c69-A42A-B08F72FCB157", -+ "4A8E0D1E-4CFA-47b2-9359-DA3A0006878B", -+ "733F9979-4ED4-478d-BD6A-E4D0F0390FDB", -+ "9BFBBA1F-5A93-4d36-AD47-D3C2D714D914", -+ "A0920D6F-78B8-4c09-9F61-7CEC845F116C", -+ "0049CE5E-8C18-414c-BDC1-A87E60CEEFD7", -+ "6AED17B4-50C7-4a40-A5A7-48AF55DD8EAC" -+}; -+ -+static int get_guid_index(uint32_t socket_id, uint32_t error_type) { -+ if (2 * socket_id + error_type >= FLASH_ENTRY_NUM) -+ return -1; -+ return 2 * socket_id + error_type; -+} -+ -+static void parse_fault_addr_info(struct fault_addr_info* info_struct, unsigned long long fault_addr) -+{ -+ info_struct->processer_id = fault_addr & FAULT_ADDR_PROCESSOR_ID_MASK; -+ fault_addr >>= FAULT_ADDR_PROCESSOR_ID_LEN; -+ info_struct->die_id = fault_addr & FAULT_ADDR_DIE_ID_MASK; -+ fault_addr >>= FAULT_ADDR_DIE_ID_LEN; -+ info_struct->stack_id = fault_addr & FAULT_ADDR_STACK_ID_MASK; -+ fault_addr >>= FAULT_ADDR_STACK_ID_LEN; -+ info_struct->sid = fault_addr & FAULT_ADDR_SID_MASK; -+ fault_addr >>= FAULT_ADDR_SID_LEN; -+ info_struct->channel_id = fault_addr & FAULT_ADDR_CHANNEL_ID_MASK; -+ fault_addr >>= FAULT_ADDR_CHANNEL_ID_LEN; -+ info_struct->bankgroup_id = fault_addr & FAULT_ADDR_BANKGROUP_ID_MASK; -+ fault_addr >>= FAULT_ADDR_BANKGROUP_ID_LEN; -+ info_struct->bank_id = fault_addr & FAULT_ADDR_BANK_ID_MASK; -+ fault_addr >>= FAULT_ADDR_BANK_ID_LEN; -+ info_struct->row_id = fault_addr & FAULT_ADDR_ROW_ID_MASK; -+ fault_addr >>= FAULT_ADDR_ROW_ID_LEN; -+ info_struct->column_id = fault_addr & FAULT_ADDR_COLUMN_ID_MASK; -+ fault_addr >>= FAULT_ADDR_CHANNEL_ID_LEN; -+ info_struct->error_type = fault_addr & FAULT_ADDR_ERROR_TYPE_MASK; -+ fault_addr >>= FAULT_ADDR_ERROR_TYPE_LEN; -+ info_struct->repair_type = fault_addr & FAULT_ADDR_REPAIR_TYPE_MASK; -+ fault_addr >>= FAULT_ADDR_REPAIR_TYPE_LEN; -+ info_struct->reserved = fault_addr & FAULT_ADDR_RESERVED_MASK; -+ fault_addr >>= FAULT_ADDR_RESERVED_LEN; -+ info_struct->crc8 = (uint32_t)fault_addr; -+} -+ -+static bool variable_existed(char *name, char *guid) -+{ -+ char filename[PATH_MAX]; -+ int fd; -+ -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ // open var file -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) { -+ log(LOG_WARNING, "open file %s failed\n", filename); -+ return false; -+ } -+ close(fd); -+ return true; -+} -+ -+static uint32_t read_variable_attribute(char *name, char *guid) { -+ char filename[PATH_MAX]; -+ int fd; -+ size_t readsize; -+ uint32_t attribute = (uint32_t)-1; -+ -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ // open var file -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) { -+ log(LOG_ERROR, "open %s failed\n", filename); -+ return attribute; -+ } -+ -+ // read attributes from first 4 bytes -+ readsize = read(fd, &attribute, sizeof(uint32_t)); -+ if (readsize != sizeof(uint32_t)) { -+ log(LOG_ERROR, "read attribute of %s failed\n", filename); -+ } -+ -+ close(fd); -+ return attribute; -+} -+ -+static int efivarfs_set_mutable(char *name, char *guid, bool mutable) -+{ -+ unsigned long orig_attrs, new_attrs; -+ char filename[PATH_MAX]; -+ int fd; -+ -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) { -+ log(LOG_ERROR, "open %s failed\n", filename); -+ goto err; -+ } -+ -+ if (ioctl(fd, FS_IOC_GETFLAGS, &orig_attrs) == -1) { -+ log(LOG_ERROR, "ioctl FS_IOC_GETFLAGS failed\n"); -+ goto err; -+ } -+ -+ if (mutable) -+ new_attrs = orig_attrs & ~(unsigned long)FS_IMMUTABLE_FL; -+ else -+ new_attrs = orig_attrs | FS_IMMUTABLE_FL; -+ -+ if (new_attrs == orig_attrs) { -+ close(fd); -+ return 0; -+ } -+ -+ if (ioctl(fd, FS_IOC_SETFLAGS, &new_attrs) == -1) { -+ log(LOG_ERROR, "ioctl FS_IOC_SETFLAGS failed\n"); -+ goto err; -+ } -+ close(fd); -+ return 0; -+err: -+ if (fd >= 0) -+ close(fd); -+ return -1; -+} -+ -+static int write_variable(char *name, char *guid, void *value, unsigned long size, uint32_t attribute) { -+ int fd, mode; -+ size_t writesize; -+ void *buffer; -+ unsigned long total; -+ char filename[PATH_MAX]; -+ -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ // prepare attributes(size 4 bytes) and data -+ total = size + sizeof(uint32_t); -+ buffer = malloc(total); -+ if (buffer == NULL) { -+ log(LOG_ERROR, "malloc data for %s failed\n", filename); -+ goto err; -+ } -+ memcpy(buffer, &attribute, sizeof(uint32_t)); -+ memcpy(buffer + sizeof(uint32_t), value, size); -+ -+ // change attr -+ if (efivarfs_set_mutable(name, guid, 1) != 0) { -+ log(LOG_ERROR, "set mutable for %s failed\n", filename); -+ goto err; -+ } -+ -+ mode = O_WRONLY; -+ if (attribute & EFI_VARIABLE_APPEND_WRITE) -+ mode |= O_APPEND; -+ else -+ mode |= O_CREAT; -+ -+ // open var file -+ fd = open(filename, mode, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); -+ if (fd < 0) { -+ log(LOG_ERROR, "open %s failed\n", filename); -+ goto err; -+ } -+ -+ // write to var file -+ writesize = write(fd, buffer, total); -+ if (writesize != total) { -+ log(LOG_ERROR, "write %s failed\n", filename); -+ goto err; -+ } -+ -+ close(fd); -+ free(buffer); -+ if (efivarfs_set_mutable(name, guid, 0) != 0) { -+ log(LOG_ERROR, "set immutable for %s failed\n", filename); -+ } -+ return 0; -+err: -+ if (fd >= 0) -+ close(fd); -+ if (buffer) -+ free(buffer); -+ if (efivarfs_set_mutable(name, guid, 0) != 0) { -+ log(LOG_ERROR, "set immutable for %s failed\n", filename); -+ } -+ return -1; -+} -+ -+static int append_variable(char *name, char *guid, void *data, unsigned long size) { -+ // prepare append attribute -+ uint32_t attribute = read_variable_attribute(name, guid); -+ if (attribute == (uint32_t)-1) { -+ log(LOG_ERROR, "read %s-%s attribute failed\n", name, guid); -+ return -1; -+ } -+ attribute |= EFI_VARIABLE_APPEND_WRITE; -+ -+ return write_variable(name, guid, data, size, attribute); -+} -+ -+static size_t get_var_size(char *name, char *guid) { -+ char filename[PATH_MAX]; -+ int fd; -+ struct stat stat; -+ -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ // open var file -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) { -+ log(LOG_WARNING, "open %s failed\n", filename); -+ goto err; -+ } -+ // read stat -+ if (fstat(fd, &stat) != 0) { -+ log(LOG_WARNING, "fstat %s failed\n", filename); -+ goto err; -+ } -+ close(fd); -+ return stat.st_size; -+err: -+ if (fd >= 0) -+ close(fd); -+ return (size_t)-1; -+} -+ -+int init_all_flash() { -+ for (int i = 0; i < FLASH_ENTRY_NUM; i++) { -+ // check existed entry -+ if (variable_existed(flash_names[i], flash_guids[i])) { -+ total_size += get_var_size(flash_names[i], flash_guids[i]); -+ continue; -+ } -+ // create new entry -+ uint32_t attribute = EFI_VARIABLE_NON_VOLATILE | -+ EFI_VARIABLE_BOOTSERVICE_ACCESS | -+ EFI_VARIABLE_RUNTIME_ACCESS; -+ char *data = ""; -+ unsigned long size = 1; -+ int ret = write_variable(flash_names[i], flash_guids[i], data, size, attribute); -+ if (ret) { -+ log(LOG_ERROR, "init %s-%s failed, fault info storage funtion not enabled\n", flash_names[i], flash_guids[i]); -+ return -1; -+ } -+ total_size += sizeof(uint32_t) + 1; -+ } -+ // check total entry size -+ log(LOG_DEBUG, "current fault info total size: %luKB, flash max threshold: %uKB\n", -+ total_size / KB_SIZE, MAX_VAR_SIZE / KB_SIZE); -+ if (total_size > MAX_VAR_SIZE) { -+ log(LOG_ERROR, "fault info storage reach threshold, cannot save new record\n"); -+ } -+ return 0; -+} -+ -+static int write_fault_info_to_flash(const struct hisi_common_error_section *err) { -+ int ret, guid_index; -+ uint32_t reg_size; -+ uint64_t fault_addr; -+ -+ // check flash usage threshold -+ if (total_size + sizeof(uint64_t) > MAX_VAR_SIZE) { -+ log(LOG_WARNING, "fault info storage reach threshold, cannot save new record into flash\n"); -+ return -1; -+ } -+ -+ // parse physical addr -+ reg_size = err->reg_array_size / sizeof(uint32_t); -+ fault_addr = err->reg_array[reg_size - 1]; -+ fault_addr <<= TYPE_UINT32_WIDTH; -+ fault_addr += err->reg_array[reg_size - 2]; -+ -+ // get guid -+ struct fault_addr_info info_struct; -+ parse_fault_addr_info(&info_struct, fault_addr); -+ guid_index = get_guid_index(info_struct.processer_id, info_struct.error_type); -+ if (guid_index < 0) { -+ log(LOG_ERROR, "invalid fault info\n"); -+ return -1; -+ } -+ // record physical addr in flash -+ ret = append_variable(flash_names[guid_index], flash_guids[guid_index], &fault_addr, sizeof(uint64_t)); -+ if (ret < 0) { -+ log(LOG_ERROR, "append to %s-%s failed\n", flash_names[guid_index], flash_guids[guid_index]); -+ return -1; -+ } -+ total_size += sizeof(uint64_t); -+ log(LOG_INFO, "write hbm fault info to flash success\n"); -+ return 0; -+} -+ -+static int write_file(char *path, const char *name, unsigned long long value) -+{ -+ char fname[MAX_PATH]; -+ char buf[20]; -+ int ret; -+ int fd; -+ -+ snprintf(fname, MAX_PATH, "%s/%s", path, name); -+ -+ fd = open(fname, O_WRONLY); -+ if (fd < 0) { -+ log(LOG_WARNING, "HBM ACLS: Cannot to open '%s': %s\n", -+ fname, strerror(errno)); -+ return -errno; -+ } -+ -+ snprintf(buf, sizeof(buf), "0x%llx\n", value); -+ ret = write(fd, buf, strlen(buf)); -+ if (ret <= 0) -+ log(LOG_WARNING, "HBM ACLS: Failed to set %s (0x%llx): %s\n", -+ fname, value, strerror(errno)); -+ -+ close(fd); -+ return ret > 0 ? 0 : -errno; -+} -+ -+static int get_hardware_corrupted_size() -+{ -+ FILE *fp; -+ char line[256]; -+ int hardware_corrupted_size = -1; -+ char *key = "HardwareCorrupted:"; -+ -+ fp = fopen("/proc/meminfo", "r"); -+ if (fp == NULL) { -+ log(LOG_ERROR, "Failed to open /proc/meminfo\n"); -+ return -1; -+ } -+ -+ while (fgets(line, sizeof(line), fp) != NULL) { -+ char *pos; -+ if ((pos = strstr(line, key)) != NULL) { -+ sscanf(pos, "HardwareCorrupted: %5d kB\n", &hardware_corrupted_size); -+ break; -+ } -+ } -+ -+ fclose(fp); -+ return hardware_corrupted_size; -+} -+ -+static uint8_t get_repair_result_code(int ret) -+{ -+ if (ret == -ENOSPC) { -+ return REPAIR_FAILED_NO_RESOURCE; -+ } else if (ret == -EIO) { -+ return REPAIR_FAILED_OTHER_REASON; -+ } else if (ret == -ENXIO || ret == -EINVAL) { -+ return REPAIR_FAILED_INVALID_PARAM; -+ } -+ return REPAIR_FAILED_OTHER_REASON; -+} -+ -+static int notice_BMC(const struct hisi_common_error_section *err, uint8_t repair_result_code) -+{ -+ int sockfd; -+ struct sockaddr_un addr; -+ char bmc_msg[sizeof(BMC_REPORT_FORMAT)] = {0}; -+ uint8_t repair_type_code, isolation_type_code; -+ uint32_t repair_type; -+ unsigned long long fault_addr; -+ -+ sockfd = socket(AF_UNIX, SOCK_STREAM, 0); -+ if (sockfd < 0) { -+ log(LOG_ERROR, "Failed to create BMC notice socket\n"); -+ return -1; -+ } -+ -+ memset(&addr, 0, sizeof(struct sockaddr_un)); -+ addr.sun_family = AF_UNIX; -+ strncpy(addr.sun_path, BMC_SOCKET_PATH, sizeof(addr.sun_path) - 1); -+ if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) { -+ log(LOG_ERROR, "Failed to connect BMC notice socket\n"); -+ close(sockfd); -+ return -1; -+ } -+ -+ /* assemble bmc specific msg */ -+ repair_type_code = 0; -+ isolation_type_code = 0; -+ repair_type = err->reg_array[HBM_REPAIR_REQ_TYPE]; -+ if (repair_type & HBM_CE_ACLS) { -+ repair_type_code = 0; -+ isolation_type_code = SINGLE_ADDR_FAULT; -+ } else if (repair_type & HBM_PSUE_ACLS) { -+ repair_type_code = 1; -+ isolation_type_code = SINGLE_ADDR_FAULT; -+ } else if (repair_type & HBM_CE_SPPR) { -+ repair_type_code = 2; -+ isolation_type_code = ROW_FAULT; -+ } else if (repair_type & HBM_PSUE_SPPR) { -+ repair_type_code = 3; -+ isolation_type_code = ROW_FAULT; -+ } -+ -+ const uint32_t reg_size = err->reg_array_size / sizeof(uint32_t); -+ -+ fault_addr = err->reg_array[reg_size - 1]; -+ fault_addr <<= TYPE_UINT32_WIDTH; -+ fault_addr += err->reg_array[reg_size - 2]; -+ -+ log(LOG_DEBUG, "Get the fault addr is %llu\n", fault_addr); -+ -+ struct fault_addr_info info_struct; -+ parse_fault_addr_info(&info_struct, fault_addr); -+ -+ log(LOG_DEBUG, "info_struct.processer_id is %u\n", info_struct.processer_id); -+ log(LOG_DEBUG, "info_struct.die_id is %u\n", info_struct.die_id); -+ log(LOG_DEBUG, "info_struct.stack_id is %u\n", info_struct.stack_id); -+ log(LOG_DEBUG, "info_struct.sid is %u\n", info_struct.sid); -+ log(LOG_DEBUG, "info_struct.channel_id is %u\n", info_struct.channel_id); -+ log(LOG_DEBUG, "info_struct.bankgroup_id is %u\n", info_struct.bankgroup_id); -+ log(LOG_DEBUG, "info_struct.bank_id is %u\n", info_struct.bank_id); -+ log(LOG_DEBUG, "info_struct.row_id is %u\n", info_struct.row_id); -+ log(LOG_DEBUG, "info_struct.column_id is %u\n", info_struct.column_id); -+ log(LOG_DEBUG, "info_struct.error_type is %u\n", info_struct.error_type); -+ log(LOG_DEBUG, "info_struct.repair_type is %u\n", info_struct.repair_type); -+ log(LOG_DEBUG, "info_struct.reserved is %u\n", info_struct.reserved); -+ log(LOG_DEBUG, "info_struct.crc8 is %u\n", info_struct.crc8); -+ -+ snprintf(bmc_msg, sizeof(BMC_REPORT_FORMAT), BMC_REPORT_FORMAT, -+ repair_type_code, -+ repair_result_code, -+ isolation_type_code, -+ info_struct.processer_id, -+ info_struct.die_id, -+ info_struct.stack_id, -+ info_struct.sid, -+ info_struct.channel_id, -+ info_struct.bankgroup_id, -+ info_struct.bank_id, -+ info_struct.row_id, -+ info_struct.column_id -+ ); -+ -+ log(LOG_DEBUG, "Send msg to sysSentry, bmc msg is %s\n", bmc_msg); -+ -+ if (write(sockfd, bmc_msg, strlen(bmc_msg)) <= 0) { -+ log(LOG_ERROR, "Failed to send data to BMC notice socket\n"); -+ close(sockfd); -+ return -1; -+ } -+ -+ close(sockfd); -+ return 0; -+} -+ -+static int hbmc_hbm_page_isolate(const struct hisi_common_error_section *err) -+{ -+ unsigned long long paddr; -+ int ret; -+ bool is_acls = err->reg_array[HBM_REPAIR_REQ_TYPE] & (HBM_CE_ACLS | HBM_PSUE_ACLS); -+ int required_isolate_size = (is_acls ? HBM_ACLS_ADDR_NUM : HBM_SPPR_ADDR_NUM) * DEFAULT_PAGE_SIZE_KB; -+ int hardware_corrupted_size = get_hardware_corrupted_size(); -+ if (hardware_corrupted_size < 0) { -+ log(LOG_ERROR, "Page isolate failed: Get hardware_corrupted_size failed"); -+ notice_BMC(err, ISOLATE_FAILED_OTHER_REASON); -+ return -1; -+ } -+ if ((required_isolate_size + hardware_corrupted_size) > page_isolation_threshold) { -+ log(LOG_INFO, "Page isolate failed: the isolation resource is not enough\n"); -+ notice_BMC(err, ISOLATE_FAILED_OVER_THRESHOLD); -+ return -1; -+ } -+ if (is_acls) { -+ /* ACLS */ -+ paddr = err->reg_array[HBM_ADDH]; -+ paddr <<= TYPE_UINT32_WIDTH; -+ paddr += err->reg_array[HBM_ADDL]; -+ -+ ret = write_file("/sys/kernel/page_eject", "offline_page", paddr); -+ if (ret < 0) { -+ notice_BMC(err, ISOLATE_FAILED_OTHER_REASON); -+ log(LOG_WARNING, "HBM: ACLS offline failed, address is 0x%llx \n", paddr); -+ return ret; -+ } -+ } else { -+ /* SPPR */ -+ bool all_success = true; -+ uint32_t i; -+ for (i = 0; i < HBM_SPPR_ADDR_NUM; i++) { -+ paddr = err->reg_array[2 * i + HBM_ADDH]; -+ paddr <<= TYPE_UINT32_WIDTH; -+ paddr += err->reg_array[2 * i + HBM_ADDL]; -+ ret = write_file("/sys/kernel/page_eject", "offline_page", paddr); -+ if (ret < 0) { -+ all_success = false; -+ log(LOG_WARNING, "HBM: SPPR offline failed, address is 0x%llx \n", paddr); -+ continue; -+ } -+ } -+ if (!all_success) { -+ notice_BMC(err, ISOLATE_FAILED_OTHER_REASON); -+ ret = -1; -+ } -+ } -+ return ret < 0 ? ret : 0; -+} -+ -+static int hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsigned long long paddr) -+{ -+ int ret; -+ if (repair_ret < 0) { -+ log(LOG_WARNING, "HBM %s: Keep page (0x%llx) offline\n", is_acls ? "ACLS" : "SPPR", paddr); -+ /* not much we can do about errors here */ -+ (void)write_file("/sys/kernel/page_eject", "remove_page", paddr); -+ return get_repair_result_code(repair_ret); -+ } -+ -+ ret = write_file("/sys/kernel/page_eject", "online_page", paddr); -+ if (ret < 0) { -+ log(LOG_WARNING, "HBM %s: Page (0x%llx) online failed\n",is_acls ? "ACLS" : "SPPR", paddr); -+ return ONLINE_PAGE_FAILED; -+ } else { -+ log(LOG_INFO, "HBM %s: Page (0x%llx) repair and online success\n",is_acls ? "ACLS" : "SPPR", paddr); -+ return ISOLATE_REPAIR_ONLINE_SUCCESS; -+ } -+} -+ -+static uint8_t hbmc_hbm_repair(const struct hisi_common_error_section *err, char *path) -+{ -+ unsigned long long paddr; -+ int ret; -+ uint8_t repair_result_code; -+ bool is_acls; -+ -+ /* Both ACLS and SPPR only repair the first address */ -+ paddr = err->reg_array[HBM_ADDH]; -+ paddr <<= TYPE_UINT32_WIDTH; -+ paddr += err->reg_array[HBM_ADDL]; -+ -+ is_acls = err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_CE_ACLS || -+ err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_PSUE_ACLS; -+ -+ ret = write_file(path, is_acls ? "acls_query" : "sppr_query", paddr); -+ if (ret < 0) { -+ notice_BMC(err, get_repair_result_code(ret)); -+ log(LOG_WARNING, "HBM: Address 0x%llx is not supported to %s repair\n", paddr, is_acls ? "ACLS" : "SPPR"); -+ return ret; -+ } -+ -+ ret = write_file(path, is_acls ? "acls_repair" : "sppr_repair", paddr); -+ -+ if (is_acls) { -+ /* ACLS */ -+ repair_result_code = hbmc_hbm_after_repair(is_acls, ret, paddr); -+ notice_BMC(err, repair_result_code); -+ return ret; -+ } else { -+ /* SPPR */ -+ bool all_online_success = true; -+ uint32_t i; -+ for (i = 0; i < HBM_SPPR_ADDR_NUM; i++) { -+ paddr = err->reg_array[2 * i + HBM_ADDH]; -+ paddr <<= TYPE_UINT32_WIDTH; -+ paddr += err->reg_array[2 * i + HBM_ADDL]; -+ -+ repair_result_code = hbmc_hbm_after_repair(is_acls, ret, paddr); -+ if (repair_result_code != ISOLATE_REPAIR_ONLINE_SUCCESS) { -+ all_online_success = false; -+ } -+ } -+ if (ret < 0) { -+ notice_BMC(err, get_repair_result_code(ret)); -+ return ret; -+ } else if (all_online_success) { -+ notice_BMC(err, ISOLATE_REPAIR_ONLINE_SUCCESS); -+ return 0; -+ } else { -+ notice_BMC(err, ONLINE_PAGE_FAILED); -+ return ret; -+ } -+ } -+ /* The final return code is not necessary */ -+ return ret < 0 ? ret : 0; -+} -+ -+static int hbmc_get_memory_type(char *path) -+{ -+ int type = HBM_UNKNOWN; -+ char fname[MAX_PATH]; -+ char buf[128]; -+ FILE *file; -+ -+ snprintf(fname, MAX_PATH, "%s/%s", path, "memory_type"); -+ file = fopen(fname, "r"); -+ if (!file) { -+ log(LOG_WARNING, "HBM: Cannot to open '%s': %s\n", -+ fname, strerror(errno)); -+ return -errno; -+ } -+ -+ if (!fgets(buf, sizeof(buf), file)) { -+ log(LOG_WARNING, "HBM: Failed to read %s\n", fname); -+ goto err; -+ } -+ -+ /* Remove the last '\n' */ -+ buf[strlen(buf) - 1] = 0; -+ -+ if (strcmp(buf, "HBM") == 0) -+ type = HBM_HBM_MEMORY; -+ else if (strcmp(buf, "DDR") == 0) -+ type = HBM_DDR_MEMORY; -+ -+err: -+ fclose(file); -+ return type; -+} -+ -+static void hbm_repair_handler(const struct hisi_common_error_section *err) -+{ -+ log(LOG_DEBUG, "Received ACLS/SPPR flat mode repair request, try to repair\n"); -+ char *sys_dev_path = "/sys/devices/platform"; -+ char path[MAX_PATH]; -+ struct dirent *dent; -+ DIR *dir; -+ int ret; -+ bool find_device = false, find_hbm_mem = false; -+ -+ ret = hbmc_hbm_page_isolate(err); -+ if (ret < 0) { -+ return; -+ } -+ -+ dir = opendir(sys_dev_path); -+ if (!dir) { -+ log(LOG_WARNING, "Can't read '%s': %s\n", -+ sys_dev_path, strerror(errno)); -+ notice_BMC(err, REPAIR_FAILED_OTHER_REASON); -+ return; -+ } -+ -+ while ((dent = readdir(dir))) { -+ if (!strstr(dent->d_name, HBM_MEM_RAS_NAME)) -+ continue; -+ find_device = true; -+ -+ snprintf(path, MAX_PATH, "%s/%s", sys_dev_path, dent->d_name); -+ -+ if (hbmc_get_memory_type(path) == HBM_HBM_MEMORY) { -+ find_hbm_mem = true; -+ ret = hbmc_hbm_repair(err, path); -+ if (ret != -ENXIO) -+ break; -+ } -+ } -+ if (!find_device) { -+ log(LOG_ERROR, "Repair driver is not loaded, skip error, error_type is %u\n", -+ err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK); -+ notice_BMC(err, REPAIR_FAILED_OTHER_REASON); -+ } else if (!find_hbm_mem) { -+ log(LOG_ERROR, "No HBM device memory type found, skip error, error_type is %u\n", -+ err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK); -+ notice_BMC(err, REPAIR_FAILED_OTHER_REASON); -+ } -+ -+ closedir(dir); -+} -+ -+static bool hbm_repair_validate(const struct hisi_common_error_section *err) -+{ -+ if (!((err->val_bits & BIT(COMMON_VALID_MODULE_ID)) && -+ (err->val_bits & BIT(COMMON_VALID_SUBMODULE_ID)) && -+ (err->val_bits & BIT(COMMON_VALID_REG_ARRAY_SIZE)) -+ )) { -+ log(LOG_DEBUG, "Err val_bits validate failed, val_bits is %u\n", err->val_bits); -+ return false; -+ } -+ log(LOG_DEBUG, "err->module_id: %u\n", err->module_id); -+ log(LOG_DEBUG, "err->submodule_id: %u\n", err->submodule_id); -+ log(LOG_DEBUG, "err->val_bits: 0x%x\n", err->val_bits); -+ log(LOG_DEBUG, "err->reg_array_size: %u\n", err->reg_array_size); -+ -+ if (err->module_id != HBMC_MODULE_ID || -+ err->submodule_id != HBMC_SUBMOD_HBM_REPAIR) { -+ log(LOG_DEBUG, "err module_id or sub_module id doesn't not match\n"); -+ return false; -+ } -+ -+ uint32_t hbm_repair_reg_type = err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK; -+ bool is_acls_valid = (hbm_repair_reg_type & (HBM_CE_ACLS | HBM_PSUE_ACLS)) && -+ (err->reg_array_size == HBM_ACLS_ARRAY_SIZE); -+ bool is_sppr_valid = (hbm_repair_reg_type & (HBM_CE_SPPR | HBM_PSUE_SPPR)) && -+ (err->reg_array_size == HBM_SPPR_ARRAY_SIZE); -+ bool is_cache_mode = (hbm_repair_reg_type & HBM_CACHE_MODE) && -+ (err->reg_array_size == HBM_CACHE_ARRAY_SIZE); -+ -+ if (!(is_acls_valid || is_sppr_valid || is_cache_mode)) { -+ log(LOG_DEBUG, "err type (%u) is unknown or address array length (%u) is invalid\n", -+ hbm_repair_reg_type, err->reg_array_size); -+ return false; -+ } -+ -+ log(LOG_INFO, "Received ACLS/SPPR repair request\n"); -+ return true; -+} -+ -+static bool hbm_flat_mode_validate(const struct hisi_common_error_section *err) -+{ -+ uint32_t hbm_repair_reg_type = err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK; -+ return !(hbm_repair_reg_type & HBM_CACHE_MODE); -+} -+ -+int decode_hisi_common_section(struct ras_non_standard_event *event) -+{ -+ const struct hisi_common_error_section *err = (struct hisi_common_error_section *)event->error; -+ -+ if (hbm_repair_validate(err)) { -+ write_fault_info_to_flash(err); -+ if (hbm_flat_mode_validate(err)) { -+ hbm_repair_handler(err); -+ } -+ } -+ -+ return 0; -+} -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.h b/src/c/hbm_online_repair/non-standard-hbm-repair.h -new file mode 100644 -index 0000000..7e8e448 ---- /dev/null -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.h -@@ -0,0 +1,89 @@ -+#ifndef __NON_STANDARD_HBM_REPAIR -+#define __NON_STANDARD_HBM_REPAIR -+ -+#include "ras-non-standard-handler.h" -+ -+#define DEFAULT_PAGE_SIZE_KB 4 -+#define HBM_MEM_RAS_NAME "HISI0521" -+#define HBM_UNKNOWN 0 -+#define HBM_HBM_MEMORY 1 -+#define HBM_DDR_MEMORY 2 -+ -+#define TYPE_UINT32_WIDTH 32 -+#define HBM_REPAIR_REQ_TYPE 0 -+#define HBM_CE_ACLS BIT(0) -+#define HBM_PSUE_ACLS BIT(1) -+#define HBM_CE_SPPR BIT(2) -+#define HBM_PSUE_SPPR BIT(3) -+#define HBM_CACHE_MODE (BIT(4) | BIT(5) | BIT(6) | BIT(7)) -+#define HBM_ERROR_MASK 0b11111111 -+#define HBM_ADDL 1 -+#define HBM_ADDH 2 -+#define HBM_ERROR_TYPE_SIZE 4 -+#define HBM_ADDR_SIZE 8 -+#define HBM_ACLS_ADDR_NUM 1 -+#define HBM_SPPR_ADDR_NUM 16 -+#define HBM_ACLS_ARRAY_SIZE (HBM_ERROR_TYPE_SIZE + HBM_ADDR_SIZE * HBM_ACLS_ADDR_NUM + HBM_ADDR_SIZE) -+#define HBM_SPPR_ARRAY_SIZE (HBM_ERROR_TYPE_SIZE + HBM_ADDR_SIZE * HBM_SPPR_ADDR_NUM + HBM_ADDR_SIZE) -+#define HBM_CACHE_ARRAY_SIZE (HBM_ERROR_TYPE_SIZE + HBM_ADDR_SIZE) -+#define HBMC_MODULE_ID 0x28 -+#define HBMC_SUBMOD_HBM_REPAIR 6 -+#define COMMON_VALID_MODULE_ID 5 -+#define COMMON_VALID_SUBMODULE_ID 6 -+#define COMMON_VALID_REG_ARRAY_SIZE 12 -+ -+#define BMC_SOCKET_PATH "/var/run/sysSentry/bmc.sock" -+#define BMC_REPORT_FORMAT "REP00%02x%02x%02x0000000000000000%02x%02x%02x00%02x00%02x%02x%02x%08x%08x0000000000" -+ -+#define ISOLATE_FAILED_OVER_THRESHOLD 0b10000001 -+#define ISOLATE_FAILED_OTHER_REASON 0b10000010 -+#define REPAIR_FAILED_NO_RESOURCE 0b10010100 -+#define REPAIR_FAILED_INVALID_PARAM 0b10011000 -+#define REPAIR_FAILED_OTHER_REASON 0b10011100 -+#define ONLINE_PAGE_FAILED 0b10100000 -+#define ISOLATE_REPAIR_ONLINE_SUCCESS 0b00000000 -+ -+#define ROW_FAULT 1 -+#define SINGLE_ADDR_FAULT 6 -+ -+#define FAULT_ADDR_PROCESSOR_ID_LEN 2 -+#define FAULT_ADDR_DIE_ID_LEN 1 -+#define FAULT_ADDR_STACK_ID_LEN 3 -+#define FAULT_ADDR_SID_LEN 3 -+#define FAULT_ADDR_CHANNEL_ID_LEN 8 -+#define FAULT_ADDR_BANKGROUP_ID_LEN 3 -+#define FAULT_ADDR_BANK_ID_LEN 3 -+#define FAULT_ADDR_ROW_ID_LEN 17 -+#define FAULT_ADDR_COLUMN_ID_LEN 10 -+#define FAULT_ADDR_ERROR_TYPE_LEN 2 -+#define FAULT_ADDR_REPAIR_TYPE_LEN 2 -+#define FAULT_ADDR_RESERVED_LEN 2 -+#define FAULT_ADDR_CRC8_LEN 8 -+ -+#define FAULT_ADDR_PROCESSOR_ID_MASK ((1 << FAULT_ADDR_PROCESSOR_ID_LEN ) - 1) -+#define FAULT_ADDR_DIE_ID_MASK ((1 << FAULT_ADDR_DIE_ID_LEN ) - 1) -+#define FAULT_ADDR_STACK_ID_MASK ((1 << FAULT_ADDR_STACK_ID_LEN ) - 1) -+#define FAULT_ADDR_SID_MASK ((1 << FAULT_ADDR_SID_LEN ) - 1) -+#define FAULT_ADDR_CHANNEL_ID_MASK ((1 << FAULT_ADDR_CHANNEL_ID_LEN ) - 1) -+#define FAULT_ADDR_BANKGROUP_ID_MASK ((1 << FAULT_ADDR_BANKGROUP_ID_LEN ) - 1) -+#define FAULT_ADDR_BANK_ID_MASK ((1 << FAULT_ADDR_BANK_ID_LEN ) - 1) -+#define FAULT_ADDR_ROW_ID_MASK ((1 << FAULT_ADDR_ROW_ID_LEN ) - 1) -+#define FAULT_ADDR_COLUMN_ID_MASK ((1 << FAULT_ADDR_COLUMN_ID_LEN ) - 1) -+#define FAULT_ADDR_ERROR_TYPE_MASK ((1 << FAULT_ADDR_ERROR_TYPE_LEN ) - 1) -+#define FAULT_ADDR_REPAIR_TYPE_MASK ((1 << FAULT_ADDR_REPAIR_TYPE_LEN ) - 1) -+#define FAULT_ADDR_RESERVED_MASK ((1 << FAULT_ADDR_RESERVED_LEN ) - 1) -+#define FAULT_ADDR_CRC8_MASK ((1 << FAULT_ADDR_CRC8_LEN ) - 1) -+ -+#define EFI_VARIABLE_NON_VOLATILE 0x1 -+#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x2 -+#define EFI_VARIABLE_RUNTIME_ACCESS 0x4 -+#define EFI_VARIABLE_APPEND_WRITE 0x40 -+ -+#define EFIVARFS_PATH "/sys/firmware/efi/efivars" -+#define MAX_VAR_SIZE (128 * 1024) -+#define FLASH_ENTRY_NUM 8 -+#define KB_SIZE 1024 -+ -+extern int init_all_flash(); -+ -+#endif -diff --git a/src/c/hbm_online_repair/ras-events.c b/src/c/hbm_online_repair/ras-events.c -new file mode 100644 -index 0000000..0b12329 ---- /dev/null -+++ b/src/c/hbm_online_repair/ras-events.c -@@ -0,0 +1,534 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include "ras-non-standard-handler.h" -+#include "logger.h" -+ -+/* -+ * Polling time, if read() doesn't block. Currently, trace_pipe_raw never -+ * blocks on read(). So, we need to sleep for a while, to avoid spending -+ * too much CPU cycles. A fix for it is expected for 3.10. -+ */ -+#define POLLING_TIME 3 -+ -+/* Test for a little-endian machine */ -+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -+ #define ENDIAN KBUFFER_ENDIAN_LITTLE -+#else -+ #define ENDIAN KBUFFER_ENDIAN_BIG -+#endif -+ -+static int get_debugfs_dir(char *debugfs_dir, size_t len) -+{ -+ FILE *fp; -+ char line[MAX_PATH + 1 + 256]; -+ -+ fp = fopen("/proc/mounts","r"); -+ if (!fp) { -+ log(LOG_INFO, "Can't open /proc/mounts"); -+ return errno; -+ } -+ -+ do { -+ char *p, *type, *dir; -+ if (!fgets(line, sizeof(line), fp)) -+ break; -+ -+ p = strtok(line, " \t"); -+ if (!p) -+ break; -+ -+ dir = strtok(NULL, " \t"); -+ if (!dir) -+ break; -+ -+ type = strtok(NULL, " \t"); -+ if (!type) -+ break; -+ -+ if (!strcmp(type, "debugfs")) { -+ fclose(fp); -+ strncpy(debugfs_dir, dir, len - 1); -+ debugfs_dir[len - 1] = '\0'; -+ return 0; -+ } -+ } while(1); -+ -+ fclose(fp); -+ log(LOG_INFO, "Can't find debugfs\n"); -+ return ENOENT; -+} -+ -+ -+static int open_trace(char *trace_dir, char *name, int flags) -+{ -+ int ret; -+ char fname[MAX_PATH + 1]; -+ -+ strcpy(fname, trace_dir); -+ strcat(fname, "/"); -+ strcat(fname, name); -+ -+ ret = open(fname, flags); -+ if (ret < 0) -+ log(LOG_WARNING, "open_trace() failed, fname=%s ret=%d errno=%d\n", fname, ret, errno); -+ -+ return ret; -+} -+ -+static int create_trace_instance(char *trace_instance_dir) -+{ -+ char fname[MAX_PATH + 1]; -+ int rc; -+ -+ get_debugfs_dir(fname, sizeof(fname)); -+ strcat(fname, "/tracing/instances/"TOOL_NAME); -+ rc = mkdir(fname, S_IRWXU); -+ if (rc < 0 && errno != EEXIST) { -+ log(LOG_INFO, "Unable to create " TOOL_NAME " instance at %s\n", fname); -+ return -1; -+ } -+ strcpy(trace_instance_dir, fname); -+ return 0; -+} -+ -+struct ras_events *init_trace_instance(void) -+{ -+ struct ras_events *ras = calloc(1, sizeof(*ras)); -+ if (!ras) { -+ log(LOG_ERROR, "Can't allocate memory for ras struct\n"); -+ return NULL; -+ } -+ int rc = create_trace_instance(ras->tracing); -+ if (rc < 0) { -+ free(ras); -+ return NULL; -+ } -+ return ras; -+} -+ -+/* -+ * Tracing enable/disable code -+ */ -+int toggle_ras_event(char *trace_dir, char *group, char *event, int enable) -+{ -+ int fd, rc; -+ char fname[MAX_PATH + 1]; -+ -+ snprintf(fname, sizeof(fname), "%s%s:%s\n", -+ enable ? "" : "!", -+ group, event); -+ -+ /* Enable RAS events */ -+ fd = open_trace(trace_dir, "set_event", O_RDWR | O_APPEND); -+ if (fd < 0) { -+ log(LOG_WARNING, "Can't open set_event\n"); -+ rc = -errno; -+ goto err; -+ } -+ -+ rc = write(fd, fname, strlen(fname)); -+ close(fd); -+ if (rc <= 0) { -+ log(LOG_WARNING, "Can't write to set_event\n"); -+ rc = -EIO; -+ goto err; -+ } -+ -+ log(LOG_INFO, "%s:%s event %s\n", -+ group, event, -+ enable ? "enabled" : "disabled"); -+ return 0; -+err: -+ log(LOG_ERROR, "Can't %s %s:%s tracing\n", -+ enable ? "enable" : "disable", group, event); -+ return rc; -+} -+ -+static int parse_header_page(struct ras_events *ras, struct tep_handle *pevent) -+{ -+ int fd, len, page_size = DEFAULT_PAGE_SIZE; -+ char buf[page_size]; -+ -+ fd = open_trace(ras->tracing, "events/header_page", O_RDONLY); -+ if (fd < 0) { -+ log(LOG_WARNING, "Open event header page failed\n"); -+ return -1; -+ } -+ -+ len = read(fd, buf, page_size); -+ close(fd); -+ if (len <= 0) { -+ log(LOG_WARNING, "Read event header page failed\n"); -+ return -1; -+ } -+ -+ if (tep_parse_header_page(pevent, buf, len, sizeof(long))) { -+ log(LOG_WARNING, "Parse event header page failed\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static void parse_ras_data(struct pcpu_data *pdata, struct kbuffer *kbuf, -+ void *data, unsigned long long time_stamp) -+{ -+ struct tep_record record; -+ struct trace_seq s; -+ -+ record.ts = time_stamp; -+ record.size = kbuffer_event_size(kbuf); -+ record.data = data; -+ record.offset = kbuffer_curr_offset(kbuf); -+ record.cpu = pdata->cpu; -+ -+ /* note offset is just offset in subbuffer */ -+ record.missed_events = kbuffer_missed_events(kbuf); -+ record.record_size = kbuffer_curr_size(kbuf); -+ -+ trace_seq_init(&s); -+ tep_print_event(pdata->ras->pevent, &s, &record, "%s-%s-%d-%s", -+ TEP_PRINT_NAME, TEP_PRINT_COMM, TEP_PRINT_TIME, TEP_PRINT_INFO); -+ trace_seq_do_printf(&s); -+ fflush(stdout); -+ trace_seq_destroy(&s); -+} -+ -+static int get_num_cpus() -+{ -+ return sysconf(_SC_NPROCESSORS_ONLN); -+} -+ -+static int set_buffer_percent(struct ras_events *ras, int percent) -+{ -+ int res = 0; -+ int fd; -+ -+ fd = open_trace(ras->tracing, "buffer_percent", O_WRONLY); -+ if (fd >= 0) { -+ char buf[16]; -+ ssize_t size; -+ snprintf(buf, sizeof(buf), "%d", percent); -+ size = write(fd, buf, strlen(buf)); -+ if (size <= 0) { -+ log(LOG_WARNING, "can't write to buffer_percent\n"); -+ res = -1; -+ } -+ close(fd); -+ } else { -+ log(LOG_WARNING, "Can't open buffer_percent\n"); -+ res = -1; -+ } -+ -+ return res; -+} -+ -+static int read_ras_event_all_cpus(struct pcpu_data *pdata, -+ unsigned n_cpus) -+{ -+ ssize_t size; -+ unsigned long long time_stamp; -+ void *data; -+ int ready, i, count_nready; -+ struct kbuffer *kbuf; -+ void *page; -+ struct pollfd fds[n_cpus + 1]; -+ struct signalfd_siginfo fdsiginfo; -+ sigset_t mask; -+ int warnonce[n_cpus]; -+ char pipe_raw[PATH_MAX]; -+ -+ memset(&warnonce, 0, sizeof(warnonce)); -+ -+ page = malloc(pdata[0].ras->page_size); -+ if (!page) { -+ log(LOG_ERROR, "Can't allocate page\n"); -+ return -ENOMEM; -+ } -+ -+ kbuf = kbuffer_alloc(KBUFFER_LSIZE_8, ENDIAN); -+ if (!kbuf) { -+ log(LOG_ERROR, "Can't allocate kbuf\n"); -+ free(page); -+ return -ENOMEM; -+ } -+ -+ /* Fix for poll() on the per_cpu trace_pipe and trace_pipe_raw blocks -+ * indefinitely with the default buffer_percent in the kernel trace system, -+ * which is introduced by the following change in the kernel. -+ * https://lore.kernel.org/all/20221020231427.41be3f26@gandalf.local.home/T/#u. -+ * Set buffer_percent to 0 so that poll() will return immediately -+ * when the trace data is available in the ras per_cpu trace pipe_raw -+ */ -+ if (set_buffer_percent(pdata[0].ras, 0)) -+ log(LOG_WARNING, "Set buffer_percent failed\n"); -+ -+ for (i = 0; i < (n_cpus + 1); i++) -+ fds[i].fd = -1; -+ -+ for (i = 0; i < n_cpus; i++) { -+ fds[i].events = POLLIN; -+ -+ snprintf(pipe_raw, sizeof(pipe_raw), -+ "per_cpu/cpu%d/trace_pipe_raw", i); -+ -+ fds[i].fd = open_trace(pdata[0].ras->tracing, pipe_raw, O_RDONLY); -+ if (fds[i].fd < 0) { -+ log(LOG_ERROR, "Can't open trace_pipe_raw\n"); -+ goto error; -+ } -+ } -+ -+ sigemptyset(&mask); -+ sigaddset(&mask, SIGINT); -+ sigaddset(&mask, SIGTERM); -+ sigaddset(&mask, SIGHUP); -+ sigaddset(&mask, SIGQUIT); -+ if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) -+ log(LOG_WARNING, "sigprocmask\n"); -+ fds[n_cpus].events = POLLIN; -+ fds[n_cpus].fd = signalfd(-1, &mask, 0); -+ if (fds[n_cpus].fd < 0) { -+ log(LOG_WARNING, "signalfd\n"); -+ goto error; -+ } -+ -+ log(LOG_INFO, "Listening to events for cpus 0 to %u\n", n_cpus - 1); -+ -+ do { -+ ready = poll(fds, (n_cpus + 1), -1); -+ if (ready < 0) { -+ log(LOG_WARNING, "poll\n"); -+ } -+ -+ /* check for the signal */ -+ if (fds[n_cpus].revents & POLLIN) { -+ size = read(fds[n_cpus].fd, &fdsiginfo, -+ sizeof(struct signalfd_siginfo)); -+ if (size != sizeof(struct signalfd_siginfo)) { -+ log(LOG_WARNING, "signalfd read\n"); -+ continue; -+ } -+ -+ if (fdsiginfo.ssi_signo == SIGINT || -+ fdsiginfo.ssi_signo == SIGTERM || -+ fdsiginfo.ssi_signo == SIGHUP || -+ fdsiginfo.ssi_signo == SIGQUIT) { -+ log(LOG_INFO, "Recevied signal=%d\n", -+ fdsiginfo.ssi_signo); -+ goto error; -+ } else { -+ log(LOG_INFO, -+ "Received unexpected signal=%d\n", -+ fdsiginfo.ssi_signo); -+ continue; -+ } -+ } -+ -+ count_nready = 0; -+ for (i = 0; i < n_cpus; i++) { -+ if (fds[i].revents & POLLERR) { -+ if (!warnonce[i]) { -+ log(LOG_INFO, -+ "Error on CPU %i\n", i); -+ warnonce[i]++; -+ } -+ continue; -+ } -+ if (!(fds[i].revents & POLLIN)) { -+ count_nready++; -+ continue; -+ } -+ size = read(fds[i].fd, page, pdata[i].ras->page_size); -+ if (size < 0) { -+ log(LOG_WARNING, "read\n"); -+ goto error; -+ } else if (size > 0) { -+ log(LOG_DEBUG, "cpu %d receive %ld bytes data\n", i, size); -+ kbuffer_load_subbuffer(kbuf, page); -+ -+ while ((data = kbuffer_read_event(kbuf, &time_stamp))) { -+ if (kbuffer_curr_size(kbuf) < 0) { -+ log(LOG_ERROR, "invalid kbuf data, discard\n"); -+ break; -+ } -+ -+ log(LOG_DEBUG, "parse_ras_data\n"); -+ parse_ras_data(&pdata[i], -+ kbuf, data, time_stamp); -+ -+ /* increment to read next event */ -+ log(LOG_DEBUG, "kbuffer_next_event\n"); -+ kbuffer_next_event(kbuf, NULL); -+ } -+ } else { -+ count_nready++; -+ } -+ } -+ -+ /* -+ * If count_nready == n_cpus, there is no cpu fd in POLLIN state, -+ * so we need to break the cycle -+ */ -+ if (count_nready == n_cpus) { -+ log(LOG_ERROR, "no cpu fd in POLLIN state, stop running\n"); -+ break; -+ } -+ } while (1); -+ -+error: -+ kbuffer_free(kbuf); -+ free(page); -+ sigprocmask(SIG_UNBLOCK, &mask, NULL); -+ -+ for (i = 0; i < (n_cpus + 1); i++) { -+ if (fds[i].fd > 0) -+ close(fds[i].fd); -+ } -+ -+ return -1; -+} -+ -+static int init_header_page(struct ras_events *ras, struct tep_handle *pevent) -+{ -+ int rc; -+ -+ rc = parse_header_page(ras, pevent); -+ if (rc) { -+ log(LOG_ERROR, "cannot read trace header_page: %d\n", rc); -+ return rc; -+ } -+ return 0; -+} -+ -+static int init_event_format(struct ras_events *ras, struct tep_handle *pevent, -+ char *group, char *event) -+{ -+ char *page, fname[MAX_PATH + 1]; -+ int fd, size, rc, page_size = DEFAULT_PAGE_SIZE; -+ -+ // read one page from format -+ snprintf(fname, sizeof(fname), "events/%s/%s/format", group, event); -+ fd = open_trace(ras->tracing, fname, O_RDONLY); -+ if (fd < 0) { -+ log(LOG_ERROR, -+ "Can't get %s:%s traces. Perhaps this feature is not supported on your system.\n", -+ group, event); -+ return errno; -+ } -+ -+ log(LOG_INFO, "page_size: %d\n", page_size); -+ ras->page_size = page_size; -+ page = malloc(page_size); -+ if (!page) { -+ log(LOG_ERROR, "Can't allocate page to read %s:%s format\n", -+ group, event); -+ rc = errno; -+ close(fd); -+ return rc; -+ } -+ -+ size = read(fd, page, page_size); -+ close(fd); -+ if (size < 0) { -+ log(LOG_ERROR, "Can't read format\n"); -+ free(page); -+ return size; -+ } -+ -+ // parse event format -+ rc = tep_parse_event(pevent, page, size, group); -+ if (rc) { -+ log(LOG_ERROR, "Can't parse event %s:%s\n", group, event); -+ free(page); -+ return EINVAL; -+ } -+ return 0; -+} -+ -+static int add_event_handler(struct ras_events *ras, struct tep_handle *pevent, -+ char *group, char *event, -+ tep_event_handler_func func) -+{ -+ int rc; -+ -+ rc = init_event_format(ras, pevent, group, event); -+ if (rc) { -+ log(LOG_ERROR, "init_event_format for %s:%s failed\n", group, event); -+ return rc; -+ } -+ -+ /* Registers the special event handlers */ -+ rc = tep_register_event_handler(pevent, -1, group, event, func, ras); -+ if (rc < 0) { -+ log(LOG_ERROR, "Can't register event handler for %s:%s\n", -+ group, event); -+ return EINVAL; -+ } -+ -+ return 0; -+} -+ -+int handle_ras_events(struct ras_events *ras) -+{ -+ int rc, i; -+ unsigned cpus; -+ struct tep_handle *pevent = NULL; -+ struct pcpu_data *data = NULL; -+ -+ pevent = tep_alloc(); -+ if (!pevent) { -+ log(LOG_ERROR, "Can't allocate pevent\n"); -+ rc = errno; -+ goto err; -+ } -+ ras->pevent = pevent; -+ -+ rc = init_header_page(ras, pevent); -+ if (rc) { -+ log(LOG_ERROR, "init_header_page failed\n"); -+ goto err; -+ } -+ -+ rc = add_event_handler(ras, pevent, "ras", "non_standard_event", -+ ras_non_standard_event_handler); -+ if (rc) { -+ log(LOG_ERROR, "Can't get traces from %s:%s\n", -+ "ras", "non_standard_event"); -+ goto err; -+ } -+ log(LOG_INFO, "add_event_handler done\n"); -+ -+ cpus = get_num_cpus(); -+ data = calloc(sizeof(*data), cpus); -+ if (!data) -+ goto err; -+ -+ for (i = 0; i < cpus; i++) { -+ data[i].ras = ras; -+ data[i].cpu = i; -+ } -+ rc = read_ras_event_all_cpus(data, cpus); -+ -+err: -+ if (data) -+ free(data); -+ if (pevent) -+ tep_free(pevent); -+ return rc; -+} -diff --git a/src/c/hbm_online_repair/ras-events.h b/src/c/hbm_online_repair/ras-events.h -new file mode 100644 -index 0000000..4218d93 ---- /dev/null -+++ b/src/c/hbm_online_repair/ras-events.h -@@ -0,0 +1,28 @@ -+#ifndef __RAS_EVENTS_H -+#define __RAS_EVENTS_H -+ -+#include -+#include -+ -+#define MAX_PATH 1024 -+ -+#define DEFAULT_PAGE_SIZE 4096 -+ -+struct ras_events { -+ char tracing[MAX_PATH + 1]; -+ struct tep_handle *pevent; -+ int page_size; -+}; -+ -+struct pcpu_data { -+ struct tep_handle *pevent; -+ struct ras_events *ras; -+ int cpu; -+}; -+ -+/* Function prototypes */ -+int toggle_ras_event(char *trace_dir, char *group, char *event, int enable); -+int handle_ras_events(struct ras_events *ras); -+struct ras_events *init_trace_instance(void); -+ -+#endif -diff --git a/src/c/hbm_online_repair/ras-non-standard-handler.c b/src/c/hbm_online_repair/ras-non-standard-handler.c -new file mode 100644 -index 0000000..1d1fd04 ---- /dev/null -+++ b/src/c/hbm_online_repair/ras-non-standard-handler.c -@@ -0,0 +1,81 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "ras-non-standard-handler.h" -+#include "logger.h" -+ -+static char *uuid_le(const char *uu) -+{ -+ static char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]; -+ if (!uu) { -+ log(LOG_ERROR, "uuid_le failed: uu is empty"); -+ return uuid; -+ } -+ size_t uu_len = strlen(uu); -+ if (uu_len < SECTION_TYPE_UUID_LEN) { -+ log(LOG_ERROR, "uuid_le failed: uu is too short"); -+ return uuid; -+ } -+ -+ char *p = uuid; -+ int i; -+ static const unsigned char le[16] = {3,2,1,0,5,4,7,6,8,9,10,11,12,13,14,15}; -+ -+ for (i = 0; i < 16; i++) { -+ p += sprintf(p, "%.2x", (unsigned char) uu[le[i]]); -+ switch (i) { -+ case 3: -+ case 5: -+ case 7: -+ case 9: -+ *p++ = '-'; -+ break; -+ } -+ } -+ -+ *p = 0; -+ -+ return uuid; -+} -+ -+int ras_non_standard_event_handler(struct trace_seq *s, -+ struct tep_record *record, -+ struct tep_event *event, void *context) -+{ -+ int len; -+ unsigned long long val; -+ struct ras_non_standard_event ev; -+ -+ ev.sec_type = tep_get_field_raw(s, event, "sec_type", -+ record, &len, 1); -+ if(!ev.sec_type) { -+ log(LOG_WARNING, "get event section type failed"); -+ return -1; -+ } -+ -+ trace_seq_printf(s, "\n"); -+ trace_seq_printf(s, "sec_type: %s\n", uuid_le(ev.sec_type)); -+ -+ if (tep_get_field_val(s, event, "len", record, &val, 1) < 0) { -+ log(LOG_WARNING, "tep get field val failed"); -+ return -1; -+ } -+ -+ ev.length = val; -+ trace_seq_printf(s, "length: %d\n", ev.length); -+ -+ ev.error = tep_get_field_raw(s, event, "buf", record, &len, 1); -+ if(!ev.error || ev.length != len) { -+ log(LOG_WARNING, "get event error failed"); -+ return -1; -+ } -+ -+ if (strcmp(uuid_le(ev.sec_type), HISI_COMMON_SECTION_TYPE_UUID) == 0) { -+ decode_hisi_common_section(&ev); -+ } -+ -+ return 0; -+} -diff --git a/src/c/hbm_online_repair/ras-non-standard-handler.h b/src/c/hbm_online_repair/ras-non-standard-handler.h -new file mode 100644 -index 0000000..0272dc1 ---- /dev/null -+++ b/src/c/hbm_online_repair/ras-non-standard-handler.h -@@ -0,0 +1,25 @@ -+#ifndef __RAS_NON_STANDARD_HANDLER_H -+#define __RAS_NON_STANDARD_HANDLER_H -+ -+#include -+#include "ras-events.h" -+ -+#define BIT(nr) (1UL << (nr)) -+ -+#define SECTION_TYPE_UUID_LEN 16 -+#define HISI_COMMON_SECTION_TYPE_UUID "c8b328a8-9917-4af6-9a13-2e08ab2e7586" -+ -+struct ras_non_standard_event { -+ char timestamp[64]; -+ const char *sec_type; -+ const uint8_t *error; -+ uint32_t length; -+}; -+ -+int ras_non_standard_event_handler(struct trace_seq *s, -+ struct tep_record *record, -+ struct tep_event *event, void *context); -+ -+int decode_hisi_common_section(struct ras_non_standard_event *event); -+ -+#endif -diff --git a/src/python/.gitignore b/src/python/.gitignore -new file mode 100644 -index 0000000..58200d4 ---- /dev/null -+++ b/src/python/.gitignore -@@ -0,0 +1 @@ -+__pycache__/ -diff --git a/src/python/syssentry/bmc_alarm.py b/src/python/syssentry/bmc_alarm.py -new file mode 100644 -index 0000000..5956538 ---- /dev/null -+++ b/src/python/syssentry/bmc_alarm.py -@@ -0,0 +1,159 @@ -+import logging -+import socket -+from enum import Enum -+ -+from .utils import execute_command -+ -+HEX_CHAR_LEN = 2 -+SOCKET_RECEIVE_LEN = 128 -+BMC_DATA_HEAD = "REP" -+BMC_REPORT_TYPE_BIT = 0 -+HBMC_REPAIR_TYPE_BIT = 1 -+HBMC_REPAIR_RESULT_BIT = 2 -+HBMC_ISOLATION_TYPE_BIT = 3 -+HBMC_SEND_HEAD_LEN = 4 # "ipmtool", "raw", "0x30", "0x92" -+HBMC_SEND_ROW_BIT = 26 + HBMC_SEND_HEAD_LEN -+HBMC_SEND_COL_BIT = 30 + HBMC_SEND_HEAD_LEN -+HBMC_REPAIR_TYPE_OFFSET = 7 -+ -+HBMC_SEND_SUCCESS_CODE = "db 07 00" -+ -+ -+class ReportType(Enum): -+ HBMC_REPAIR_BMC = 0x00 -+ -+ -+class HBMCRepairType(Enum): -+ CE_ACLS = 7 -+ PS_UCE_ACLS = 8 -+ CE_SPPR = 9 -+ PS_UCE_SPPR = 10 -+ -+ -+class HBMCRepairResultType(Enum): -+ ISOLATE_FAILED_OVER_THRESHOLD = 0b10000001 -+ ISOLATE_FAILED_OTHER_REASON = 0b10000010 -+ REPAIR_FAILED_NO_RESOURCE = 0b10010100 -+ REPAIR_FAILED_INVALID_PARAM = 0b10011000 -+ REPAIR_FAILED_OTHER_REASON = 0b10011100 -+ ONLINE_PAGE_FAILED = 0b10100000 -+ ISOLATE_REPAIR_ONLINE_SUCCESS = 0b00000000 -+ -+ -+class HBMCIsolationType(Enum): -+ ROW_FAULT = 1 -+ SINGLE_ADDR_FAULT = 6 -+ -+ -+def find_value_is_in_enum(value: int, enum: Enum): -+ for item in enum: -+ if value == item.value: -+ return True -+ return False -+ -+ -+def convert_hex_char_to_int(data, bit): -+ if len(data) < (bit+1)*HEX_CHAR_LEN: -+ logging.error(f"Data {data} len is too short, current convert bit is {bit}") -+ char = data[bit*HEX_CHAR_LEN:(bit+1)*HEX_CHAR_LEN] -+ try: -+ value = int(char, 16) -+ except ValueError: -+ logging.error(f"Cannot convert char [{char}] to int") -+ raise ValueError -+ return value -+ -+ -+def reverse_byte(data): -+ return data[3], data[2], data[1], data[0] -+ -+ -+def parse_hbmc_report(data: str): -+ logging.debug(f"bmc receive raw data is {data}") -+ repair_type = convert_hex_char_to_int(data, HBMC_REPAIR_TYPE_BIT) -+ repair_type += HBMC_REPAIR_TYPE_OFFSET -+ if not find_value_is_in_enum(repair_type, HBMCRepairType): -+ logging.warning(f"HBMC msg repair type ({repair_type}) is unknown") -+ raise ValueError -+ -+ repair_result = convert_hex_char_to_int(data, HBMC_REPAIR_RESULT_BIT) -+ if not find_value_is_in_enum(repair_result, HBMCRepairResultType): -+ logging.warning(f"HBMC msg repair result ({repair_result}) is unknown") -+ raise ValueError -+ -+ isolation_type = convert_hex_char_to_int(data, HBMC_ISOLATION_TYPE_BIT) -+ if not find_value_is_in_enum(isolation_type, HBMCIsolationType): -+ logging.warning(f"HBMC msg isolation type ({isolation_type}) is unknown") -+ raise ValueError -+ -+ cmd_list = [ -+ "ipmitool", -+ "raw", -+ "0x30", # Netfn -+ "0x92", # cmd -+ "0xdb", -+ "0x07", -+ "0x00", -+ "0x65", # sub command -+ "0x01", # SystemId -+ "0x00", # LocalSystemId -+ "{:#04X}".format(repair_type), -+ "{:#04X}".format(repair_result), -+ "{:#04X}".format(isolation_type), -+ ] -+ # send the remain data directly -+ data = data[(HBMC_ISOLATION_TYPE_BIT + 1) * HEX_CHAR_LEN:] -+ other_info_str = [] -+ for i in range(len(data) // 2): -+ other_info_str.append("{:#04X}".format(convert_hex_char_to_int(data, i))) -+ cmd_list.extend(other_info_str) -+ -+ cmd_list[HBMC_SEND_ROW_BIT:HBMC_SEND_ROW_BIT + 4] = reverse_byte(cmd_list[HBMC_SEND_ROW_BIT:HBMC_SEND_ROW_BIT + 4]) -+ cmd_list[HBMC_SEND_COL_BIT:HBMC_SEND_COL_BIT + 4] = reverse_byte(cmd_list[HBMC_SEND_COL_BIT:HBMC_SEND_COL_BIT + 4]) -+ -+ logging.info(f"Send bmc alarm command is {cmd_list}") -+ -+ ret = execute_command(cmd_list) -+ if HBMC_SEND_SUCCESS_CODE not in ret: -+ logging.warning(f"Send bmc alarm failed, error code is {ret}") -+ raise ValueError -+ logging.debug("Send bmc alarm success") -+ -+ -+PARSE_REPORT_MSG_FUNC_DICT = { -+ ReportType.HBMC_REPAIR_BMC.value: parse_hbmc_report, -+} -+ -+ -+def bmc_recv(server_socket: socket.socket): -+ logging.debug("Get hbm socket connection request") -+ try: -+ client_socket, _ = server_socket.accept() -+ logging.debug("cpu alarm fd listen ok") -+ -+ data = client_socket.recv(SOCKET_RECEIVE_LEN) -+ data = data.decode() -+ -+ data_head = data[0:len(BMC_DATA_HEAD)] -+ if data_head != BMC_DATA_HEAD: -+ logging.warning(f"The head of the msg is incorrect, head is {data_head}") -+ raise ValueError -+ -+ # remove the data head -+ data = data[len(BMC_DATA_HEAD):] -+ logging.info(f"Remove head data is {data}") -+ -+ report_type = convert_hex_char_to_int(data, BMC_REPORT_TYPE_BIT) -+ if report_type not in PARSE_REPORT_MSG_FUNC_DICT.keys(): -+ logging.warning(f"The type of the msg ({report_type}) is unknown") -+ raise ValueError -+ -+ PARSE_REPORT_MSG_FUNC_DICT[report_type](data) -+ -+ except socket.error: -+ logging.error("socket error") -+ return -+ except (ValueError, OSError, UnicodeError, TypeError, NotImplementedError): -+ logging.error("server recv bmc msg failed!") -+ client_socket.close() -+ return -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index ea09095..3829849 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -48,6 +48,12 @@ try: - except ImportError: - CPU_EXIST = False - -+BMC_EXIST = True -+try: -+ from .bmc_alarm import bmc_recv -+except ImportError: -+ BMC_EXIST = False -+ - - INSPECTOR = None - -@@ -89,6 +95,9 @@ RESULT_SOCKET_PATH = "/var/run/sysSentry/result.sock" - - CPU_ALARM_SOCKET_PATH = "/var/run/sysSentry/report.sock" - -+BMC_SOCKET_PATH = "/var/run/sysSentry/bmc.sock" -+ -+fd_list = [] - - def msg_data_process(msg_data): - """message data process""" -@@ -334,6 +343,41 @@ def cpu_alarm_fd_create(): - - return cpu_alarm_fd - -+def bmc_fd_create(): -+ """create bmc fd""" -+ if not os.path.exists(SENTRY_RUN_DIR): -+ logging.debug("%s not exist", SENTRY_RUN_DIR) -+ return None -+ -+ try: -+ bmc_fd = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -+ except socket.error: -+ logging.error("bmc fd create failed") -+ return None -+ -+ bmc_fd.setblocking(False) -+ if os.path.exists(BMC_SOCKET_PATH): -+ os.remove(BMC_SOCKET_PATH) -+ -+ try: -+ bmc_fd.bind(BMC_SOCKET_PATH) -+ except OSError: -+ logging.error("bmc fd bind failed") -+ bmc_fd.close() -+ return None -+ -+ os.chmod(BMC_SOCKET_PATH, 0o600) -+ try: -+ bmc_fd.listen(5) -+ except OSError: -+ logging.error("bmc fd listen failed") -+ bmc_fd.close() -+ return None -+ -+ logging.debug("%s bind and listen", BMC_SOCKET_PATH) -+ -+ return bmc_fd -+ - - def server_result_recv(server_socket: socket.socket): - """server result receive""" -@@ -407,35 +451,47 @@ def server_result_fd_create(): - return server_result_fd - - -+def close_all_fd(): -+ for fd in fd_list: -+ fd.close() -+ -+ - def main_loop(): - """main loop""" -+ - server_fd = server_fd_create() - if not server_fd: -+ close_all_fd() - return -+ fd_list.append(server_fd) - - server_result_fd = server_result_fd_create() - if not server_result_fd: -- server_fd.close() -+ close_all_fd() - return -+ fd_list.append(server_result_fd) - - heartbeat_fd = heartbeat_fd_create() - if not heartbeat_fd: -- server_fd.close() -- server_result_fd.close() -+ close_all_fd() - return -+ fd_list.append(heartbeat_fd) - - cpu_alarm_fd = cpu_alarm_fd_create() - if not cpu_alarm_fd: -- server_fd.close() -- heartbeat_fd.close() -- server_result_fd.close() -+ close_all_fd() -+ return -+ fd_list.append(cpu_alarm_fd) -+ -+ bmc_fd = bmc_fd_create() -+ if not bmc_fd: -+ close_all_fd() - return -+ fd_list.append(bmc_fd) - - epoll_fd = select.epoll() -- epoll_fd.register(server_fd.fileno(), select.EPOLLIN) -- epoll_fd.register(server_result_fd.fileno(), select.EPOLLIN) -- epoll_fd.register(heartbeat_fd.fileno(), select.EPOLLIN) -- epoll_fd.register(cpu_alarm_fd.fileno(), select.EPOLLIN) -+ for fd in fd_list: -+ epoll_fd.register(fd.fileno(), select.EPOLLIN) - - logging.debug("start main loop") - # onstart_tasks_handle() -@@ -458,6 +514,8 @@ def main_loop(): - heartbeat_recv(heartbeat_fd) - elif CPU_EXIST and event_fd == cpu_alarm_fd.fileno(): - cpu_alarm_recv(cpu_alarm_fd) -+ elif BMC_EXIST and event_fd == bmc_fd.fileno(): -+ bmc_recv(bmc_fd) - else: - continue - --- -2.27.0 - diff --git a/add-log-for-improving-maintainability.patch b/add-log-for-improving-maintainability.patch deleted file mode 100644 index a9a4527..0000000 --- a/add-log-for-improving-maintainability.patch +++ /dev/null @@ -1,251 +0,0 @@ -From a8418093bb37482da7ccaac0c950f2ed8d0ba2fa Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Thu, 10 Oct 2024 15:07:29 +0800 -Subject: [PATCH] add log for improving maintainability - ---- - .../avg_block_io/avg_block_io.py | 4 +- - .../sentryPlugins/avg_block_io/module_conn.py | 57 ++++++++++------- - .../avg_block_io/stage_window.py | 8 +++ - .../sentryPlugins/avg_block_io/utils.py | 63 +++++++++++++++++-- - 4 files changed, 103 insertions(+), 29 deletions(-) - -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index 26a60c5..cf2ded3 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -194,11 +194,11 @@ def init_io_win(io_dic, config, common_param): - - if avg_lim_value and avg_time_value and tot_lim_value: - io_data[disk_name][stage_name][rw]["latency"] = IoWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_multiple=avg_time_value, abnormal_multiple_lim=avg_lim_value, abnormal_time=tot_lim_value) -- logging.debug("Successfully create {}-{}-{} latency window".format(disk_name, stage_name, rw)) -+ logging.debug("Successfully create {}-{}-{}-latency window".format(disk_name, stage_name, rw)) - - if iodump_lim_value is not None: - io_data[disk_name][stage_name][rw]["iodump"] = IoDumpWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_time=iodump_lim_value) -- logging.debug("Successfully create {}-{}-{} iodump window".format(disk_name, stage_name, rw)) -+ logging.debug("Successfully create {}-{}-{}-iodump window".format(disk_name, stage_name, rw)) - return io_data, io_avg_value - - -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -index 2fc5a83..40b3fcc 100644 ---- a/src/python/sentryPlugins/avg_block_io/module_conn.py -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -13,7 +13,7 @@ import logging - import sys - import time - --from .utils import is_abnormal -+from .utils import is_abnormal, get_win_data, log_slow_win - from sentryCollector.collect_plugin import is_iocollect_valid, get_io_data, Result_Messages - from syssentry.result import ResultLevel, report_result - from xalarm.sentry_notify import xalarm_report, MINOR_ALM, ALARM_TYPE_OCCUR -@@ -66,36 +66,51 @@ def report_alarm_fail(alarm_info): - - def process_report_data(disk_name, rw, io_data): - """check abnormal window and report to xalarm""" -- if not is_abnormal((disk_name, 'bio', rw), io_data): -+ abnormal, abnormal_list = is_abnormal((disk_name, 'bio', rw), io_data) -+ if not abnormal: - return - -- msg = {"alarm_source": TASK_NAME, "driver_name": disk_name, "io_type": rw} -+ msg = { -+ "alarm_source": TASK_NAME, "driver_name": disk_name, "io_type": rw, -+ "reason": "unknown", "block_stack": "bio", "alarm_type": abnormal_list, -+ "details": get_win_data(disk_name, rw, io_data) -+ } - -+ # io press - ctrl_stage = ['throtl', 'wbt', 'iocost', 'bfq'] - for stage_name in ctrl_stage: -- if is_abnormal((disk_name, stage_name, rw), io_data): -- msg["reason"] = "IO press slow" -- msg["block_stack"] = f"bio,{stage_name}" -- logging.warning("{} - {} report IO press slow".format(disk_name, rw)) -- xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -- return -- -- if is_abnormal((disk_name, 'rq_driver', rw), io_data): -+ abnormal, abnormal_list = is_abnormal((disk_name, 'bio', rw), io_data) -+ if not abnormal: -+ continue -+ msg["reason"] = "IO press" -+ msg["block_stack"] = f"bio,{stage_name}" -+ msg["alarm_type"] = abnormal_list -+ log_slow_win(msg, "IO press") -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -+ return -+ -+ # driver slow -+ abnormal, abnormal_list = is_abnormal((disk_name, 'rq_driver', rw), io_data) -+ if abnormal: - msg["reason"] = "driver slow" - msg["block_stack"] = "bio,rq_driver" -- logging.warning("{} - {} report driver slow".format(disk_name, rw)) -+ msg["alarm_type"] = abnormal_list -+ log_slow_win(msg, "driver slow") - xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) - return - -+ # kernel slow - kernel_stage = ['gettag', 'plug', 'deadline', 'hctx', 'requeue'] - for stage_name in kernel_stage: -- if is_abnormal((disk_name, stage_name, rw), io_data): -- msg["reason"] = "kernel slow" -- msg["block_stack"] = f"bio,{stage_name}" -- logging.warning("{} - {} report kernel slow".format(disk_name, rw)) -- xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -- return -- msg["reason"] = "unknown" -- msg["block_stack"] = "bio" -- logging.warning("{} - {} report UNKNOWN slow".format(disk_name, rw)) -+ abnormal, abnormal_list = is_abnormal((disk_name, stage_name, rw), io_data) -+ if not abnormal: -+ continue -+ msg["reason"] = "kernel slow" -+ msg["block_stack"] = f"bio,{stage_name}" -+ msg["alarm_type"] = abnormal_list -+ log_slow_win(msg, "kernel slow") -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -+ return -+ -+ log_slow_win(msg, "unknown") - xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -diff --git a/src/python/sentryPlugins/avg_block_io/stage_window.py b/src/python/sentryPlugins/avg_block_io/stage_window.py -index 9b0ce79..5113782 100644 ---- a/src/python/sentryPlugins/avg_block_io/stage_window.py -+++ b/src/python/sentryPlugins/avg_block_io/stage_window.py -@@ -14,6 +14,11 @@ class AbnormalWindowBase: - self.window_size = window_size - self.window_threshold = window_threshold - self.abnormal_window = [False] * window_size -+ self.window_data = [-1] * window_size -+ -+ def append_new_data(self, ab_res): -+ self.window_data.pop(0) -+ self.window_data.append(ab_res) - - def append_new_period(self, ab_res, avg_val=0): - self.abnormal_window.pop(0) -@@ -25,6 +30,9 @@ class AbnormalWindowBase: - def is_abnormal_window(self): - return sum(self.abnormal_window) > self.window_threshold - -+ def window_data_to_string(self): -+ return ",".join(str(x) for x in self.window_data) -+ - - class IoWindow(AbnormalWindowBase): - def __init__(self, window_size=10, window_threshold=7, abnormal_multiple=5, abnormal_multiple_lim=30, abnormal_time=40): -diff --git a/src/python/sentryPlugins/avg_block_io/utils.py b/src/python/sentryPlugins/avg_block_io/utils.py -index 2de9a46..3b7f027 100644 ---- a/src/python/sentryPlugins/avg_block_io/utils.py -+++ b/src/python/sentryPlugins/avg_block_io/utils.py -@@ -65,15 +65,32 @@ def set_nested_value(data, keys, value): - return True - - -+def get_win_data(disk_name, rw, io_data): -+ """get latency and iodump win data""" -+ latency = '' -+ iodump = '' -+ for stage_name in io_data[disk_name]: -+ if 'latency' in io_data[disk_name][stage_name][rw]: -+ latency_list = io_data[disk_name][stage_name][rw]['latency'].window_data_to_string() -+ latency += f'{stage_name}: [{latency_list}], ' -+ if 'iodump' in io_data[disk_name][stage_name][rw]: -+ iodump_list = io_data[disk_name][stage_name][rw]['iodump'].window_data_to_string() -+ iodump += f'{stage_name}: [{iodump_list}], ' -+ return {"latency": latency[:-2], "iodump": iodump[:-2]} -+ -+ - def is_abnormal(io_key, io_data): - """check if latency and iodump win abnormal""" -+ abnormal_list = '' - for key in ['latency', 'iodump']: - all_keys = get_nested_value(io_data, io_key) - if all_keys and key in all_keys: - win = get_nested_value(io_data, io_key + (key,)) - if win and win.is_abnormal_window(): -- return True -- return False -+ abnormal_list += key + ', ' -+ if not abnormal_list: -+ return False, abnormal_list -+ return True, abnormal_list[:-2] - - - def update_io_avg(old_avg, period_value, win_size): -@@ -87,8 +104,8 @@ def update_io_avg(old_avg, period_value, win_size): - return [new_avg_value, new_avg_count] - - --def update_io_data(old_avg, period_value, win_size, io_data, io_key): -- """update data of latency and iodump window""" -+def update_io_period(old_avg, period_value, io_data, io_key): -+ """update period of latency and iodump window""" - all_wins = get_nested_value(io_data, io_key) - if all_wins and "latency" in all_wins: - io_data[io_key[0]][io_key[1]][io_key[2]]["latency"].append_new_period(period_value[0], old_avg[AVG_VALUE]) -@@ -96,20 +113,54 @@ def update_io_data(old_avg, period_value, win_size, io_data, io_key): - io_data[io_key[0]][io_key[1]][io_key[2]]["iodump"].append_new_period(period_value[1]) - - -+def update_io_data(period_value, io_data, io_key): -+ """update data of latency and iodump window""" -+ all_wins = get_nested_value(io_data, io_key) -+ if all_wins and "latency" in all_wins: -+ io_data[io_key[0]][io_key[1]][io_key[2]]["latency"].append_new_data(period_value[0]) -+ if all_wins and "iodump" in all_wins: -+ io_data[io_key[0]][io_key[1]][io_key[2]]["iodump"].append_new_data(period_value[1]) -+ -+ -+def log_abnormal_period(old_avg, period_value, io_data, io_key): -+ """record log of abnormal period""" -+ all_wins = get_nested_value(io_data, io_key) -+ if all_wins and "latency" in all_wins: -+ if all_wins["latency"].is_abnormal_period(period_value[0], old_avg[AVG_VALUE]): -+ logging.info(f"[abnormal_period] disk: {io_key[0]}, stage: {io_key[1]}, iotype: {io_key[2]}, " -+ f"type: latency, avg: {round(old_avg[AVG_VALUE], 3)}, curr_val: {period_value[0]}") -+ if all_wins and "iodump" in all_wins: -+ if all_wins["iodump"].is_abnormal_period(period_value[1]): -+ logging.info(f"[abnormal_period] disk: {io_key[0]}, stage: {io_key[1]}, iotype: {io_key[2]}, " -+ f"type: iodump, curr_val: {period_value[1]}") -+ -+ -+def log_slow_win(msg, reason): -+ """record log of slow win""" -+ logging.warning(f"[SLOW IO] disk: {msg['driver_name']}, stage: {msg['block_stack']}, " -+ f"iotype: {msg['io_type']}, type: {msg['alarm_type']}, reason: {reason}") -+ logging.info(f"latency: {msg['details']['latency']}") -+ logging.info(f"iodump: {msg['details']['iodump']}") -+ -+ - def update_avg_and_check_abnormal(data, io_key, win_size, io_avg_value, io_data): - """update avg and check abonrmal, return true if win_size full""" - period_value = get_nested_value(data, io_key) - old_avg = get_nested_value(io_avg_value, io_key) - - # 更新avg数据 -+ update_io_data(period_value, io_data, io_key) - if old_avg[AVG_COUNT] < win_size: - set_nested_value(io_avg_value, io_key, update_io_avg(old_avg, period_value, win_size)) - return False - -+ # 打印异常周期数据 -+ log_abnormal_period(old_avg, period_value, io_data, io_key) -+ - # 更新win数据 -- 判断异常周期 -- update_io_data(old_avg, period_value, win_size, io_data, io_key) -+ update_io_period(old_avg, period_value, io_data, io_key) - all_wins = get_nested_value(io_data, io_key) -- if all_wins and 'latency' not in all_wins: -+ if not all_wins or 'latency' not in all_wins: - return True - period = get_nested_value(io_data, io_key + ("latency",)) - if period and period.is_abnormal_period(period_value[0], old_avg[AVG_VALUE]): --- -2.27.0 - diff --git a/add-log-for-xalarm-when-sending-msg-and-clean-invali.patch b/add-log-for-xalarm-when-sending-msg-and-clean-invali.patch deleted file mode 100644 index b8a762f..0000000 --- a/add-log-for-xalarm-when-sending-msg-and-clean-invali.patch +++ /dev/null @@ -1,24 +0,0 @@ -From ef3aad0ca57d35b0a4fe29a0205596021bae0227 Mon Sep 17 00:00:00 2001 -From: caixiaomeng -Date: Fri, 11 Oct 2024 17:59:54 +0800 -Subject: [PATCH] add log for xalarm when sending msg and clean invalid client - socket - ---- - src/python/xalarm/xalarm_transfer.py | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/python/xalarm/xalarm_transfer.py b/src/python/xalarm/xalarm_transfer.py -index 42137d8..9e867cc 100644 ---- a/src/python/xalarm/xalarm_transfer.py -+++ b/src/python/xalarm/xalarm_transfer.py -@@ -117,4 +117,5 @@ def transmit_alarm(server_sock, epoll, fd_to_socket, bin_data): - epoll.unregister(fileno) - fd_to_socket[fileno].close() - del fd_to_socket[fileno] -+ logging.info(f"cleaned up connection {fileno} for client lost connection.") - --- -2.27.0 - - diff --git a/add-log-level-and-change-log-format.patch b/add-log-level-and-change-log-format.patch deleted file mode 100644 index 219c86c..0000000 --- a/add-log-level-and-change-log-format.patch +++ /dev/null @@ -1,522 +0,0 @@ -From c1ab550a3f817826ac6f279de97e6d3820901275 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Fri, 27 Sep 2024 14:10:18 +0800 -Subject: [PATCH] add log level and change log format - ---- - config/collector.conf | 5 ++- - config/inspect.conf | 5 ++- - config/plugins/avg_block_io.ini | 5 ++- - config/xalarm.conf | 3 ++ - src/python/sentryCollector/collect_config.py | 29 ++++++++++++++++ - src/python/sentryCollector/collect_io.py | 15 ++------- - src/python/sentryCollector/collect_plugin.py | 32 +++++++++--------- - src/python/sentryCollector/collectd.py | 6 ++-- - .../avg_block_io/avg_block_io.py | 7 ++-- - .../sentryPlugins/avg_block_io/utils.py | 32 ++++++++++++++++++ - src/python/syssentry/sentry_config.py | 28 ++++++++++++++++ - src/python/syssentry/syssentry.py | 7 ++-- - src/python/xalarm/xalarm_config.py | 33 +++++++++++++++++-- - src/python/xalarm/xalarm_daemon.py | 7 ++-- - 14 files changed, 172 insertions(+), 42 deletions(-) - -diff --git a/config/collector.conf b/config/collector.conf -index 9baa086..56b0ed1 100644 ---- a/config/collector.conf -+++ b/config/collector.conf -@@ -4,4 +4,7 @@ modules=io - [io] - period_time=1 - max_save=10 --disk=default -\ No newline at end of file -+disk=default -+ -+[log] -+level=info -\ No newline at end of file -diff --git a/config/inspect.conf b/config/inspect.conf -index 071cca1..f451d9e 100644 ---- a/config/inspect.conf -+++ b/config/inspect.conf -@@ -1,2 +1,5 @@ - [inspect] --Interval=3 -\ No newline at end of file -+Interval=3 -+ -+[log] -+level=info -diff --git a/config/plugins/avg_block_io.ini b/config/plugins/avg_block_io.ini -index bc33dde..858db18 100644 ---- a/config/plugins/avg_block_io.ini -+++ b/config/plugins/avg_block_io.ini -@@ -1,8 +1,11 @@ -+[log] -+level=info -+ - [common] - disk=default - stage=default - iotype=read,write --period_time=1 -+period_time=1 - - [algorithm] - win_size=30 -diff --git a/config/xalarm.conf b/config/xalarm.conf -index 14c6d39..323d2dd 100644 ---- a/config/xalarm.conf -+++ b/config/xalarm.conf -@@ -1,2 +1,5 @@ - [filter] - id_mask = 1001-1128 -+ -+[log] -+level=info -diff --git a/src/python/sentryCollector/collect_config.py b/src/python/sentryCollector/collect_config.py -index 0fdd9f0..5aa38ec 100644 ---- a/src/python/sentryCollector/collect_config.py -+++ b/src/python/sentryCollector/collect_config.py -@@ -32,6 +32,35 @@ CONF_IO_PERIOD_TIME_DEFAULT = 1 - CONF_IO_MAX_SAVE_DEFAULT = 10 - CONF_IO_DISK_DEFAULT = "default" - -+# log -+CONF_LOG = 'log' -+CONF_LOG_LEVEL = 'level' -+LogLevel = { -+ "debug": logging.DEBUG, -+ "info": logging.INFO, -+ "warning": logging.WARNING, -+ "error": logging.ERROR, -+ "critical": logging.CRITICAL -+} -+ -+ -+def get_log_level(filename=COLLECT_CONF_PATH): -+ if not os.path.exists(filename): -+ return logging.INFO -+ -+ try: -+ config = configparser.ConfigParser() -+ config.read(filename) -+ if not config.has_option(CONF_LOG, CONF_LOG_LEVEL): -+ return logging.INFO -+ log_level = config.get(CONF_LOG, CONF_LOG_LEVEL) -+ if log_level.lower() in LogLevel: -+ return LogLevel.get(log_level.lower()) -+ return logging.INFO -+ except configparser.Error: -+ return logging.INFO -+ -+ - class CollectConfig: - def __init__(self, filename=COLLECT_CONF_PATH): - -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index 9c8dae7..019d174 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -163,18 +163,6 @@ class CollectIo(): - logging.error("An error occurred2: %s", e) - return column_names - -- def task_loop(self): -- if self.stop_event.is_set(): -- logging.info("collect io thread exit") -- return -- -- for disk_name, stage_list in self.disk_map_stage.items(): -- if self.get_blk_io_hierarchy(disk_name, stage_list) < 0: -- continue -- self.append_period_lat(disk_name, stage_list) -- -- threading.Timer(self.period_time, self.task_loop).start() -- - def is_kernel_avaliable(self): - base_path = '/sys/kernel/debug/block' - all_disk = [] -@@ -191,6 +179,9 @@ class CollectIo(): - if file_name == 'stats': - all_disk.append(disk_name) - -+ if self.loop_all: -+ self.disk_list = all_disk -+ - for disk_name in self.disk_list: - if not self.loop_all and disk_name not in all_disk: - logging.warning("the %s disk not exist!", disk_name) -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 1faa5e3..3e2cf4c 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -75,14 +75,14 @@ def client_send_and_recv(request_data, data_str_len, protocol): - try: - client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - except socket.error: -- print("collect_plugin: client create socket error") -+ logging.error("collect_plugin: client create socket error") - return None - - try: - client_socket.connect(COLLECT_SOCKET_PATH) - except OSError: - client_socket.close() -- print("collect_plugin: client connect error") -+ logging.error("collect_plugin: client connect error") - return None - - req_data_len = len(request_data) -@@ -94,23 +94,23 @@ def client_send_and_recv(request_data, data_str_len, protocol): - res_data = res_data.decode() - except (OSError, UnicodeError): - client_socket.close() -- print("collect_plugin: client communicate error") -+ logging.error("collect_plugin: client communicate error") - return None - - res_magic = res_data[:CLT_MSG_MAGIC_LEN] - if res_magic != "RES": -- print("res msg format error") -+ logging.error("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) -+ logging.error("recv msg protocol id is invalid %s", protocol_str) - return None - - if protocol_id >= ClientProtocol.PRO_END: -- print("protocol id is invalid") -+ logging.error("protocol id is invalid") - return None - - try: -@@ -119,7 +119,7 @@ def client_send_and_recv(request_data, data_str_len, protocol): - res_msg_data = res_msg_data.decode() - return res_msg_data - except (OSError, ValueError, UnicodeError): -- print("collect_plugin: client recv res msg error") -+ logging.error("collect_plugin: client recv res msg error") - finally: - client_socket.close() - -@@ -128,30 +128,30 @@ def client_send_and_recv(request_data, data_str_len, protocol): - def validate_parameters(param, len_limit, char_limit): - ret = ResultMessage.RESULT_SUCCEED - if not param: -- print("param is invalid") -+ logging.error("param is invalid, param = %s", param) - ret = ResultMessage.RESULT_NOT_PARAM - return [False, ret] - - if not isinstance(param, list): -- print(f"{param} is not list type.") -+ logging.error("%s is not list type.", param) - ret = ResultMessage.RESULT_NOT_PARAM - return [False, ret] - - if len(param) <= 0: -- print(f"{param} length is 0.") -+ logging.error("%s length is 0.", param) - ret = ResultMessage.RESULT_INVALID_LENGTH - return [False, ret] - - pattern = r'^[a-zA-Z0-9_-]+$' - for info in param: - if not re.match(pattern, info): -- print(f"{info} is invalid char") -+ logging.error("%s is invalid char", info) - ret = ResultMessage.RESULT_INVALID_CHAR - return [False, ret] - - # length of len_limit is exceeded, keep len_limit - if len(param) > len_limit: -- print(f"{param} length more than {len_limit}, keep the first {len_limit}") -+ logging.error("%s length more than %d, keep the first %d", param, len_limit, len_limit) - param[:] = param[0:len_limit] - - # only keep elements under the char_limit length -@@ -202,13 +202,13 @@ def inter_is_iocollect_valid(period, disk_list=None, stage=None): - 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") -+ logging.error("collect_plugin: client_send_and_recv failed") - return result - - try: - json.loads(result_message) - except json.JSONDecodeError: -- print("is_iocollect_valid: json decode error") -+ logging.error("is_iocollect_valid: json decode error") - result['ret'] = ResultMessage.RESULT_PARSE_FAILED - return result - -@@ -260,12 +260,12 @@ def inter_get_io_data(period, disk_list, stage, 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") -+ logging.error("collect_plugin: client_send_and_recv failed") - return result - try: - json.loads(result_message) - except json.JSONDecodeError: -- print("get_io_data: json decode error") -+ logging.error("get_io_data: json decode error") - result['ret'] = ResultMessage.RESULT_PARSE_FAILED - return result - -diff --git a/src/python/sentryCollector/collectd.py b/src/python/sentryCollector/collectd.py -index d9d8862..33f4b04 100644 ---- a/src/python/sentryCollector/collectd.py -+++ b/src/python/sentryCollector/collectd.py -@@ -26,7 +26,7 @@ import threading - - from .collect_io import CollectIo - from .collect_server import CollectServer --from .collect_config import CollectConfig -+from .collect_config import CollectConfig, get_log_level - - SENTRY_RUN_DIR = "/var/run/sysSentry" - COLLECT_SOCKET_PATH = "/var/run/sysSentry/collector.sock" -@@ -57,7 +57,9 @@ def main(): - os.mkdir(SENTRY_RUN_DIR) - os.chmod(SENTRY_RUN_DIR, mode=SENTRY_RUN_DIR_PERM) - -- logging.basicConfig(filename=COLLECT_LOG_FILE, level=logging.INFO) -+ log_level = get_log_level() -+ log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -+ logging.basicConfig(filename=COLLECT_LOG_FILE, level=log_level, format=log_format) - os.chmod(COLLECT_LOG_FILE, 0o600) - - try: -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index ac35be2..b6b3b28 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -15,7 +15,7 @@ import time - - from .stage_window import IoWindow, IoDumpWindow - from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler --from .utils import update_avg_and_check_abnormal -+from .utils import update_avg_and_check_abnormal, get_log_level - - CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" - -@@ -283,7 +283,10 @@ def main(): - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - -- logging.basicConfig(level=logging.INFO) -+ log_level = get_log_level(CONFIG_FILE) -+ log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -+ -+ logging.basicConfig(level=log_level, format=log_format) - - # 初始化配置读取 - config = configparser.ConfigParser(comment_prefixes=('#', ';')) -diff --git a/src/python/sentryPlugins/avg_block_io/utils.py b/src/python/sentryPlugins/avg_block_io/utils.py -index 54ed080..2de9a46 100644 ---- a/src/python/sentryPlugins/avg_block_io/utils.py -+++ b/src/python/sentryPlugins/avg_block_io/utils.py -@@ -8,9 +8,41 @@ - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. - # See the Mulan PSL v2 for more details. -+import configparser -+import logging -+import os -+ - AVG_VALUE = 0 - AVG_COUNT = 1 - -+CONF_LOG = 'log' -+CONF_LOG_LEVEL = 'level' -+LogLevel = { -+ "debug": logging.DEBUG, -+ "info": logging.INFO, -+ "warning": logging.WARNING, -+ "error": logging.ERROR, -+ "critical": logging.CRITICAL -+} -+ -+ -+def get_log_level(filename): -+ if not os.path.exists(filename): -+ return logging.INFO -+ -+ try: -+ config = configparser.ConfigParser() -+ config.read(filename) -+ if not config.has_option(CONF_LOG, CONF_LOG_LEVEL): -+ return logging.INFO -+ log_level = config.get(CONF_LOG, CONF_LOG_LEVEL) -+ -+ if log_level.lower() in LogLevel: -+ return LogLevel.get(log_level.lower()) -+ return logging.INFO -+ except configparser.Error: -+ return logging.INFO -+ - - def get_nested_value(data, keys): - """get data from nested dict""" -diff --git a/src/python/syssentry/sentry_config.py b/src/python/syssentry/sentry_config.py -index a0e7b79..1169887 100644 ---- a/src/python/syssentry/sentry_config.py -+++ b/src/python/syssentry/sentry_config.py -@@ -21,6 +21,34 @@ import sys - DEFAULT_INSPECT_DELAY = 3 - INSPECT_CONF_PATH = "/etc/sysSentry/inspect.conf" - -+CONF_LOG = 'log' -+CONF_LOG_LEVEL = 'level' -+LogLevel = { -+ "debug": logging.DEBUG, -+ "info": logging.INFO, -+ "warning": logging.WARNING, -+ "error": logging.ERROR, -+ "critical": logging.CRITICAL -+} -+ -+ -+def get_log_level(filename=INSPECT_CONF_PATH): -+ if not os.path.exists(filename): -+ return logging.INFO -+ -+ try: -+ config = configparser.ConfigParser() -+ config.read(filename) -+ if not config.has_option(CONF_LOG, CONF_LOG_LEVEL): -+ return logging.INFO -+ log_level = config.get(CONF_LOG, CONF_LOG_LEVEL) -+ -+ if log_level.lower() in LogLevel: -+ return LogLevel.get(log_level.lower()) -+ return logging.INFO -+ except configparser.Error: -+ return logging.INFO -+ - - class SentryConfig: - """ -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index 776971f..9ef0203 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -23,7 +23,7 @@ import fcntl - - import select - --from .sentry_config import SentryConfig -+from .sentry_config import SentryConfig, get_log_level - - from .task_map import TasksMap - from .global_values import SENTRY_RUN_DIR, CTL_SOCKET_PATH, SENTRY_RUN_DIR_PERM -@@ -563,7 +563,10 @@ def main(): - os.mkdir(SENTRY_RUN_DIR) - os.chmod(SENTRY_RUN_DIR, mode=SENTRY_RUN_DIR_PERM) - -- logging.basicConfig(filename=SYSSENTRY_LOG_FILE, level=logging.INFO) -+ log_level = get_log_level() -+ log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -+ -+ logging.basicConfig(filename=SYSSENTRY_LOG_FILE, level=log_level, format=log_format) - os.chmod(SYSSENTRY_LOG_FILE, 0o600) - - if not chk_and_set_pidfile(): -diff --git a/src/python/xalarm/xalarm_config.py b/src/python/xalarm/xalarm_config.py -index 8e56d10..754a816 100644 ---- a/src/python/xalarm/xalarm_config.py -+++ b/src/python/xalarm/xalarm_config.py -@@ -15,9 +15,10 @@ Create: 2023-11-02 - """ - - import re -+import os - import dataclasses - import logging --from configparser import ConfigParser -+import configparser - - - MAIN_CONFIG_PATH = '/etc/sysSentry/xalarm.conf' -@@ -27,6 +28,34 @@ MIN_ID_NUMBER = 1001 - MAX_ID_NUMBER = 1128 - MAX_ID_MASK_CAPACITY = 128 - -+# log -+CONF_LOG = 'log' -+CONF_LOG_LEVEL = 'level' -+LogLevel = { -+ "debug": logging.DEBUG, -+ "info": logging.INFO, -+ "warning": logging.WARNING, -+ "error": logging.ERROR, -+ "critical": logging.CRITICAL -+} -+ -+ -+def get_log_level(filename=MAIN_CONFIG_PATH): -+ if not os.path.exists(filename): -+ return logging.INFO -+ -+ try: -+ config = configparser.ConfigParser() -+ config.read(filename) -+ if not config.has_option(CONF_LOG, CONF_LOG_LEVEL): -+ return logging.INFO -+ log_level = config.get(CONF_LOG, CONF_LOG_LEVEL) -+ if log_level.lower() in LogLevel: -+ return LogLevel.get(log_level.lower()) -+ return logging.INFO -+ except configparser.Error: -+ return logging.INFO -+ - - @dataclasses.dataclass - class AlarmConfig: -@@ -106,7 +135,7 @@ def config_init(): - """ - alarm_config = AlarmConfig() - -- cfg = ConfigParser() -+ cfg = configparser.ConfigParser() - cfg.read(MAIN_CONFIG_PATH) - - id_mask = parse_id_mask(cfg) -diff --git a/src/python/xalarm/xalarm_daemon.py b/src/python/xalarm/xalarm_daemon.py -index 00e8886..3ab211c 100644 ---- a/src/python/xalarm/xalarm_daemon.py -+++ b/src/python/xalarm/xalarm_daemon.py -@@ -21,7 +21,7 @@ import signal - import fcntl - import socket - --from .xalarm_config import config_init -+from .xalarm_config import config_init, get_log_level - from .xalarm_server import server_loop, SOCK_FILE - - ALARM_DIR = "/var/run/xalarm" -@@ -120,9 +120,10 @@ def alarm_process_create(): - os.mkdir(ALARM_DIR) - os.chmod(ALARM_DIR, ALARM_DIR_PERMISSION) - -+ log_level = get_log_level() -+ log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" - -- logging.basicConfig(filename=ALARM_LOGFILE, level=logging.INFO, -- format='%(asctime)s|%(levelname)s| %(message)s') -+ logging.basicConfig(filename=ALARM_LOGFILE, level=log_level, format=log_format) - - signal.signal(signal.SIGTERM, signal_handler) - --- -2.23.0 - diff --git a/add-parameter-time_range-alarm_id-and-alarm_clear_ti.patch b/add-parameter-time_range-alarm_id-and-alarm_clear_ti.patch deleted file mode 100644 index ee9e234..0000000 --- a/add-parameter-time_range-alarm_id-and-alarm_clear_ti.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 0a4bd4097690bee7250676a0c262a830c7a8fbcf Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Fri, 11 Oct 2024 15:35:43 +0800 -Subject: [PATCH] add parameter time_range ,alarm_id and alarm_clear_time - validation - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 19 +++++++++++++++++++ - .../src/python/syssentry/load_mods.py | 6 ++---- - .../src/python/syssentry/sentryctl | 4 +++- - 3 files changed, 24 insertions(+), 5 deletions(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index d5337d3..43c1065 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -18,6 +18,7 @@ from datetime import datetime - import time - import logging - import json -+import sys - - from xalarm.register_xalarm import xalarm_register,xalarm_getid,xalarm_getlevel,xalarm_gettype,xalarm_gettime,xalarm_getdesc - from xalarm.xalarm_api import Xalarm -@@ -41,9 +42,15 @@ id_base = 1001 - clientId = -1 - - MILLISECONDS_UNIT_SECONDS = 1000 -+MAX_NUM_OF_ALARM_ID = 128 -+MIN_ALARM_ID = 1001 -+MAX_ALARM_ID = (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) - - def update_alarm_list(alarm_info: Xalarm): - alarm_id = xalarm_getid(alarm_info) -+ if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -+ logging.warnning(f"Invalid alarm_id {alarm_id}") -+ return - timestamp = xalarm_gettime(alarm_info) - if not timestamp: - logging.error("Retrieve timestamp failed") -@@ -77,7 +84,19 @@ def alarm_register(): - logging.info(f"alarm_register: {task_name} is registered") - task = TasksMap.tasks_dict[task_type][task_name] - alarm_id = task.alarm_id -+ if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -+ logging.warnning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ continue - alarm_clear_time = task.alarm_clear_time -+ try: -+ alarm_clear_time = int(alarm_clear_time) -+ if alarm_clear_time <= 0: -+ raise ValueError("Not a positive integer") -+ if alarm_clear_time > sys.maxsize: -+ raise ValueError("Exceeds maximum value for int") -+ except (ValueError, OverflowError, TypeError) as e: -+ logging.warnning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -+ continue - alarm_list_dict[alarm_id] = [] - task_alarm_id_dict[task_name] = alarm_id - if alarm_id not in alarm_id_clear_time_dict: -diff --git a/src/python/syssentry/load_mods.py b/src/python/syssentry/load_mods.py -index ae05e57..7daf17d 100644 ---- a/src/python/syssentry/load_mods.py -+++ b/src/python/syssentry/load_mods.py -@@ -203,11 +203,9 @@ def parse_mod_conf(mod_name, mod_conf): - if not (MIN_ALARM_ID <= task.alarm_id <= MAX_ALARM_ID): - raise ValueError("Invalid alarm_id") - except ValueError: -- task.alarm_id = -1 -- logging.warning("Invalid alarm_id, set to -1") -+ logging.warning("Invalid alarm_id") - except configparser.NoOptionError: -- task.alarm_id = -1 -- logging.warning("Unset alarm_id and alarm_clear_time, use -1 and 15s as default") -+ logging.warning("Unset alarm_clear_time, use 15s as default") - - if CONF_ONSTART in mod_conf.options(CONF_TASK): - is_onstart = (mod_conf.get(CONF_TASK, CONF_ONSTART) == 'yes') -diff --git a/src/python/syssentry/sentryctl b/src/python/syssentry/sentryctl -index 3de93d0..c2e3cef 100644 ---- a/src/python/syssentry/sentryctl -+++ b/src/python/syssentry/sentryctl -@@ -136,7 +136,7 @@ if __name__ == '__main__': - parser_get_result.add_argument('task_name') - parser_get_alarm = subparsers.add_parser('get_alarm', help='get task alarm') - parser_get_alarm.add_argument('task_name') -- parser_get_alarm.add_argument('-s', '--time_range', type=str, default=DEFAULT_ALARM_TIME_RANGE, help='Specified time range') -+ parser_get_alarm.add_argument('-s', '--time_range', type=int, default=DEFAULT_ALARM_TIME_RANGE, help='Specified time range') - parser_get_alarm.add_argument('-d', '--detailed', action='store_true', help='Print Detailed Information') - parser_list = subparsers.add_parser('list', help='show all loaded task mod') - -@@ -153,6 +153,8 @@ if __name__ == '__main__': - elif client_args.cmd_type == 'get_result': - req_msg_struct = {"type": "get_result", "data": client_args.task_name} - elif client_args.cmd_type == 'get_alarm': -+ if not isinstance(client_args.time_range, int) or client_args.time_range <= 0: -+ print(f"time_range is not a positive integer: {client_args.time_range}") - req_msg_struct = { - "type": "get_alarm", - "data": { --- -2.27.0 - diff --git a/add-pyxalarm-and-pySentryNotify-add-multi-users-supp.patch b/add-pyxalarm-and-pySentryNotify-add-multi-users-supp.patch deleted file mode 100644 index 5b27e69..0000000 --- a/add-pyxalarm-and-pySentryNotify-add-multi-users-supp.patch +++ /dev/null @@ -1,678 +0,0 @@ -From a18ea2e94fef78334a56dce1ea3f67ee649732f3 Mon Sep 17 00:00:00 2001 -From: PshySimon -Date: Thu, 26 Sep 2024 16:12:25 +0800 -Subject: [PATCH] add pyxalarm and pySentryNotify, add multi users support for - xalarmd and adapt libxalarm - ---- - src/libso/xalarm/register_xalarm.c | 41 ++---- - src/libso/xalarm/register_xalarm.h | 10 +- - src/python/xalarm/register_xalarm.py | 192 +++++++++++++++++++++++++++ - src/python/xalarm/sentry_notify.py | 71 ++++++++++ - src/python/xalarm/xalarm_api.py | 18 ++- - src/python/xalarm/xalarm_server.py | 40 +++++- - src/python/xalarm/xalarm_transfer.py | 96 ++++++++++++-- - 7 files changed, 408 insertions(+), 60 deletions(-) - create mode 100644 src/python/xalarm/register_xalarm.py - create mode 100644 src/python/xalarm/sentry_notify.py - -diff --git a/src/libso/xalarm/register_xalarm.c b/src/libso/xalarm/register_xalarm.c -index 152c078..21a419f 100644 ---- a/src/libso/xalarm/register_xalarm.c -+++ b/src/libso/xalarm/register_xalarm.c -@@ -35,7 +35,7 @@ - #define ALARM_SOCKET_PERMISSION 0700 - #define TIME_UNIT_MILLISECONDS 1000 - --#define MAX_PARAS_LEN 511 -+#define MAX_PARAS_LEN 1023 - #define MIN_ALARM_ID 1001 - #define MAX_ALARM_ID (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) - -@@ -91,7 +91,7 @@ static int create_unix_socket(const char *path) - return -1; - } - -- fd = socket(AF_UNIX, SOCK_DGRAM, 0); -+ fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - printf("socket failed:%s\n", strerror(errno)); - return -1; -@@ -103,14 +103,6 @@ static int create_unix_socket(const char *path) - goto release_socket; - } - -- if (access(PATH_REG_ALARM, F_OK) == 0) { -- ret = unlink(PATH_REG_ALARM); -- if (ret != 0) { -- printf("unlink register socket file failed\n"); -- goto release_socket; -- } -- } -- - if (access(DIR_XALARM, F_OK) == -1) { - if (mkdir(DIR_XALARM, ALARM_DIR_PERMISSION) == -1) { - printf("mkdir %s failed\n", DIR_XALARM); -@@ -120,32 +112,22 @@ static int create_unix_socket(const char *path) - - if (memset(&alarm_addr, 0, sizeof(alarm_addr)) == NULL) { - printf("create_unix_socket: memset alarm_addr failed, ret: %d\n", ret); -- goto remove_dir; -+ goto release_socket; - } - alarm_addr.sun_family = AF_UNIX; - strncpy(alarm_addr.sun_path, path, sizeof(alarm_addr.sun_path) - 1); - -- if (bind(fd, (struct sockaddr *)&alarm_addr, sizeof(alarm_addr.sun_family) + strlen(alarm_addr.sun_path)) < 0) { -- printf("bind socket failed:%s\n", strerror(errno)); -- goto remove_dir; -+ if (connect(fd, (struct sockaddr*)&alarm_addr, sizeof(alarm_addr)) == -1) { -+ printf("create_unix_socket: connect alarm_addr failed, ret: %d\n", ret); -+ goto release_socket; - } - if (chmod(path, ALARM_SOCKET_PERMISSION) < 0) { - printf("chmod %s failed: %s\n", path, strerror(errno)); -- goto unlink_sockfile; -+ goto release_socket; - } - - return fd; - --unlink_sockfile: -- ret = unlink(PATH_REG_ALARM); -- if (ret != 0) { -- printf("unlink register socket file failed\n"); -- } --remove_dir: -- ret = rmdir(DIR_XALARM); -- if (ret != 0) { -- printf("rmdir %s failed: %s\n", path, strerror(errno)); -- } - release_socket: - (void)close(fd); - -@@ -271,8 +253,6 @@ int xalarm_Register(alarm_callback_func callback, struct alarm_subscription_info - - void xalarm_UnRegister(int client_id) - { -- int ret; -- - if (!g_register_info.is_registered) { - printf("%s: alarm has not registered\n", __func__); - return; -@@ -292,10 +272,6 @@ void xalarm_UnRegister(int client_id) - if (g_register_info.register_fd != -1) { - (void)close(g_register_info.register_fd); - g_register_info.register_fd = -1; -- ret = unlink(PATH_REG_ALARM); -- if (ret != 0) { -- printf("%s: unlink register socket file failed\n", __func__); -- } - } - - memset(g_register_info.alarm_enable_bitmap, 0, MAX_NUM_OF_ALARM_ID * sizeof(char)); -@@ -357,7 +333,7 @@ int xalarm_Report(unsigned short usAlarmId, unsigned char ucAlarmLevel, - struct sockaddr_un alarm_addr; - - if ((usAlarmId < MIN_ALARM_ID || usAlarmId > MAX_ALARM_ID) || -- (ucAlarmLevel < ALARM_LEVEL_FATAL || ucAlarmLevel > ALARM_LEVEL_DEBUG) || -+ (ucAlarmLevel < MINOR_ALM || ucAlarmLevel > CRITICAL_ALM) || - (ucAlarmType < ALARM_TYPE_OCCUR || ucAlarmType > ALARM_TYPE_RECOVER)) { - fprintf(stderr, "%s: alarm info invalid\n", __func__); - return -1; -@@ -666,3 +642,4 @@ int report_result(const char *task_name, enum RESULT_LEVEL result_level, const c - return RETURE_CODE_SUCCESS; - } - -+ -diff --git a/src/libso/xalarm/register_xalarm.h b/src/libso/xalarm/register_xalarm.h -index 1f26c6a..fef9482 100644 ---- a/src/libso/xalarm/register_xalarm.h -+++ b/src/libso/xalarm/register_xalarm.h -@@ -11,7 +11,7 @@ - #include - #include - --#define ALARM_INFO_MAX_PARAS_LEN 512 -+#define ALARM_INFO_MAX_PARAS_LEN 1024 - #define MAX_STRERROR_SIZE 1024 - #define MAX_ALARM_TYEPS 1024 - #define MIN_ALARM_ID 1001 -@@ -19,11 +19,9 @@ - - #define MEMORY_ALARM_ID 1001 - --#define ALARM_LEVEL_FATAL 1 --#define ALARM_LEVEL_ERROR 2 --#define ALARM_LEVEL_WARNING 3 --#define ALARM_LEVEL_INFO 4 --#define ALARM_LEVEL_DEBUG 5 -+#define MINOR_ALM 1 -+#define MAJOR_ALM 2 -+#define CRITICAL_ALM 3 - - #define ALARM_TYPE_OCCUR 1 - #define ALARM_TYPE_RECOVER 2 -diff --git a/src/python/xalarm/register_xalarm.py b/src/python/xalarm/register_xalarm.py -new file mode 100644 -index 0000000..e58343d ---- /dev/null -+++ b/src/python/xalarm/register_xalarm.py -@@ -0,0 +1,192 @@ -+import os -+import sys -+import socket -+import logging -+import threading -+import time -+import fcntl -+import inspect -+from struct import error as StructParseError -+ -+from .xalarm_api import Xalarm, alarm_bin2stu -+ -+ -+ALARM_REPORT_LEN = 1048 -+MAX_NUM_OF_ALARM_ID=128 -+MIN_ALARM_ID = 1001 -+MAX_ALARM_ID = (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) -+DIR_XALARM = "/var/run/xalarm" -+PATH_REG_ALARM = "/var/run/xalarm/alarm" -+PATH_REPORT_ALARM = "/var/run/xalarm/report" -+ALARM_DIR_PERMISSION = 0o0750 -+ALARM_REG_SOCK_PERMISSION = 0o0700 -+ALARM_SOCKET_PERMISSION = 0o0700 -+TIME_UNIT_MILLISECONDS = 1000 -+ALARM_REGISTER_INFO = None -+ -+ -+class AlarmRegister: -+ def __init__(self, id_filter: list[bool], callback: callable): -+ self.id_filter = id_filter -+ self.callback = callback -+ self.socket = self.create_unix_socket() -+ self.is_registered = True -+ self.thread = threading.Thread(target=self.alarm_recv) -+ self.thread_should_stop = False -+ -+ def check_params(self) -> bool: -+ if (len(self.id_filter) != MAX_NUM_OF_ALARM_ID): -+ sys.stderr.write("check_params: invalid param id_filter\n") -+ return False -+ -+ sig = inspect.signature(self.callback) -+ if len(sig.parameters) != 1: -+ sys.stderr.write("check_params: invalid param callback\n") -+ return False -+ -+ if self.socket is None: -+ sys.stderr.write("check_params: scoket create failed\n") -+ return False -+ return True -+ -+ def set_id_filter(self, id_filter: list[bool]) -> bool: -+ if (len(id_filter) > MAX_NUM_OF_ALARM_ID): -+ sys.stderr.write("set_id_filter: invalid param id_filter\n") -+ return False -+ self.id_filter = id_filter -+ -+ def id_is_registered(self, alarm_id) -> bool: -+ if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -+ return False -+ return self.id_filter[alarm_id - MIN_ALARM_ID] -+ -+ def put_alarm_info(self, alarm_info: Xalarm) -> None: -+ if not self.callback or not alarm_info: -+ return -+ if not self.id_is_registered(alarm_info.alarm_id): -+ return -+ self.callback(alarm_info) -+ -+ def create_unix_socket(self) -> socket.socket: -+ try: -+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -+ sock.setblocking(False) -+ -+ if not os.access(DIR_XALARM, os.F_OK): -+ os.makedirs(DIR_XALARM) -+ os.chmod(DIR_XALARM, ALARM_DIR_PERMISSION) -+ -+ sock.connect(PATH_REG_ALARM) -+ return sock -+ except (IOError, OSError, FileNotFoundError) as e: -+ sock.close() -+ sys.stderr.write(f"create_unix_socket: create socket error:{e}\n") -+ return None -+ -+ def alarm_recv(self): -+ while not self.thread_should_stop: -+ try: -+ data = self.socket.recv(ALARM_REPORT_LEN) -+ if not data: -+ sys.stderr.write("connection closed by xalarmd, maybe connections reach max num or service stopped.\n") -+ self.thread_should_stop = True -+ break -+ if len(data) != ALARM_REPORT_LEN: -+ sys.stderr.write(f"server receive report msg length wrong {len(data)}\n") -+ continue -+ -+ alarm_info = alarm_bin2stu(data) -+ self.put_alarm_info(alarm_info) -+ except (BlockingIOError) as e: -+ time.sleep(0.1) -+ except (ConnectionResetError, ConnectionAbortedError, BrokenPipeError): -+ sys.stderr.write("Connection closed by the server.\n") -+ self.thread_should_stop = True -+ except (ValueError, StructParseError, InterruptedError) as e: -+ sys.stderr.write(f"{e}\n") -+ except Exception as e: -+ sys.stderr.write(f"{e}\n") -+ self.thread_should_stop = True -+ -+ def start_thread(self) -> None: -+ self.thread.daemon = True -+ self.thread.start() -+ -+ def stop_thread(self) -> None: -+ self.thread_should_stop = True -+ self.thread.join() -+ self.socket.close() -+ -+ -+def xalarm_register(callback: callable, id_filter: list[bool]) -> int: -+ global ALARM_REGISTER_INFO -+ -+ if ALARM_REGISTER_INFO is not None: -+ sys.stderr.write("xalarm_register: alarm has registered\n") -+ return -1 -+ -+ ALARM_REGISTER_INFO = AlarmRegister(id_filter, callback) -+ if not ALARM_REGISTER_INFO.check_params(): -+ return -1 -+ -+ ALARM_REGISTER_INFO.start_thread() -+ -+ return 0 -+ -+ -+def xalarm_unregister(clientId: int) -> None: -+ global ALARM_REGISTER_INFO -+ if clientId < 0: -+ sys.stderr.write("xalarm_unregister: invalid client\n") -+ return -+ -+ if ALARM_REGISTER_INFO is None: -+ sys.stderr.write("xalarm_unregister: alarm has not registered\n") -+ return -+ -+ ALARM_REGISTER_INFO.stop_thread() -+ ALARM_REGISTER_INFO = None -+ -+ -+def xalarm_upgrade(clientId: int, id_filter: list[bool]) -> None: -+ global ALARM_REGISTER_INFO -+ if clientId < 0: -+ sys.stderr.write("xalarm_unregister: invalid client\n") -+ return -+ if ALARM_REGISTER_INFO is None: -+ sys.stderr.write("xalarm_unregister: alarm has not registered\n") -+ return -+ ALARM_REGISTER_INFO.id_filter = id_filter -+ -+ -+def xalarm_getid(alarm_info: Xalarm) -> int: -+ if not alarm_info: -+ return 0 -+ return alarm_info.alarm_id -+ -+ -+def xalarm_getlevel(alarm_info: Xalarm) -> int: -+ if not alarm_info: -+ return 0 -+ return alarm_info.alarm_level -+ -+ -+def xalarm_gettype(alarm_info: Xalarm) -> int: -+ if not alarm_info: -+ return 0 -+ return alarm_info.alarm_type -+ -+ -+def xalarm_gettime(alarm_info: Xalarm) -> int: -+ if not alarm_info: -+ return 0 -+ return alarm_info.timetamp.tv_sec * TIME_UNIT_MILLISECONDS + alarm_info.timetamp.tv_usec / TIME_UNIT_MILLISECONDS -+ -+def xalarm_getdesc(alarm_info: Xalarm) -> str: -+ if not alarm_info: -+ return None -+ try: -+ desc_str = alarm_info.msg1.rstrip(b'\x00').decode('utf-8') -+ except UnicodeError: -+ desc_str = None -+ return desc_str -diff --git a/src/python/xalarm/sentry_notify.py b/src/python/xalarm/sentry_notify.py -new file mode 100644 -index 0000000..a19e5b3 ---- /dev/null -+++ b/src/python/xalarm/sentry_notify.py -@@ -0,0 +1,71 @@ -+import os -+import sys -+import time -+import socket -+from struct import error as StructParseError -+ -+from .xalarm_api import alarm_stu2bin, Xalarm -+ -+MAX_NUM_OF_ALARM_ID = 128 -+MIN_ALARM_ID = 1001 -+MAX_ALARM_ID = (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) -+ -+MINOR_ALM = 1 -+MAJOR_ALM = 2 -+CRITICAL_ALM = 3 -+ -+ALARM_TYPE_OCCUR = 1 -+ALARM_TYPE_RECOVER = 2 -+ -+MAX_PUC_PARAS_LEN = 1024 -+ -+DIR_XALARM = "/var/run/xalarm" -+PATH_REPORT_ALARM = "/var/run/xalarm/report" -+ALARM_DIR_PERMISSION = 0o750 -+ALARM_SOCKET_PERMISSION = 0o700 -+ -+ -+def check_params(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: -+ if not os.path.exists(DIR_XALARM): -+ sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed") -+ return False -+ -+ if not os.path.exists(PATH_REPORT_ALARM): -+ sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed") -+ return False -+ -+ if (alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID or -+ alarm_level < MINOR_ALM or alarm_level > CRITICAL_ALM or -+ alarm_type < ALARM_TYPE_OCCUR or alarm_type > ALARM_TYPE_RECOVER): -+ sys.stderr.write("check_params: alarm info invalid\n") -+ return False -+ -+ if len(puc_paras) >= MAX_PUC_PARAS_LEN: -+ sys.stderr.write(f"check_params: alarm msg should be less than {MAX_PUC_PARAS_LEN}\n") -+ return False -+ -+ return True -+ -+def xalarm_report(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: -+ if not check_params(alarm_id, alarm_level, alarm_type, puc_paras): -+ return False -+ -+ try: -+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) -+ -+ current_time = time.time() -+ current_time_seconds = int(current_time) -+ current_microseconds = int((current_time - current_time_seconds) * 1_000_000) -+ alarm_info = Xalarm(alarm_id, alarm_type, alarm_level, -+ current_time_seconds, current_microseconds, puc_paras) -+ -+ sock.sendto(alarm_stu2bin(alarm_info), PATH_REPORT_ALARM) -+ except (FileNotFoundError, StructParseError, socket.error, OSError, UnicodeError) as e: -+ sys.stderr.write(f"check_params: error occurs when sending msg.{e}\n") -+ return False -+ finally: -+ sock.close() -+ -+ return True -+ -+ -diff --git a/src/python/xalarm/xalarm_api.py b/src/python/xalarm/xalarm_api.py -index 94d7638..99eabf5 100644 ---- a/src/python/xalarm/xalarm_api.py -+++ b/src/python/xalarm/xalarm_api.py -@@ -23,6 +23,7 @@ ALARM_LEVELS = (1, 2, 3, 4, 5) - ALARM_SOCK_PATH = "/var/run/xalarm/report" - MIN_ALARM_ID = 1001 - MAX_ALARM_ID = 1128 -+MAX_MSG_LEN = 1024 - - - @dataclasses.dataclass -@@ -97,15 +98,15 @@ class Xalarm: - def msg1(self, msg): - """msg1 setter - """ -- if len(msg) > 512: -- raise ValueError("msg1 length must below 255") -+ if len(msg) > MAX_MSG_LEN: -+ raise ValueError(f"msg1 length must below {MAX_MSG_LEN}") - self._msg1 = msg - - - def alarm_bin2stu(bin_data): - """alarm binary to struct - """ -- struct_data = struct.unpack("@HBBll512s", bin_data) -+ struct_data = struct.unpack(f"@HBBll{MAX_MSG_LEN}s", bin_data) - - alarm_info = Xalarm(1001, 2, 1, 0, 0, "") - alarm_info.alarm_id = struct_data[0] -@@ -116,3 +117,14 @@ def alarm_bin2stu(bin_data): - alarm_info.msg1 = struct_data[5] - - return alarm_info -+ -+ -+def alarm_stu2bin(alarm_info: Xalarm): -+ return struct.pack( -+ f'@HBBll{MAX_MSG_LEN}s', -+ alarm_info.alarm_id, -+ alarm_info.alarm_level, -+ alarm_info.alarm_type, -+ alarm_info.timetamp.tv_sec, -+ alarm_info.timetamp.tv_usec, -+ alarm_info.msg1.encode('utf-8')) -diff --git a/src/python/xalarm/xalarm_server.py b/src/python/xalarm/xalarm_server.py -index 84db273..fcaf393 100644 ---- a/src/python/xalarm/xalarm_server.py -+++ b/src/python/xalarm/xalarm_server.py -@@ -17,16 +17,20 @@ Create: 2023-11-02 - import socket - import os - import logging -+import select -+import threading - from struct import error as StructParseError - - from .xalarm_api import alarm_bin2stu --from .xalarm_transfer import check_filter, transmit_alarm -+from .xalarm_transfer import check_filter, transmit_alarm, wait_for_connection - - - ALARM_DIR = "/var/run/xalarm" -+USER_RECV_SOCK = "/var/run/xalarm/alarm" - SOCK_FILE = "/var/run/xalarm/report" --ALARM_REPORT_LEN = 536 -+ALARM_REPORT_LEN = 1048 - ALARM_DIR_PERMISSION = 0o750 -+ALARM_LISTEN_QUEUE_LEN = 5 - - - def clear_sock_path(): -@@ -37,6 +41,8 @@ def clear_sock_path(): - os.chmod(ALARM_DIR, ALARM_DIR_PERMISSION) - if os.path.exists(SOCK_FILE): - os.unlink(SOCK_FILE) -+ if os.path.exists(USER_RECV_SOCK): -+ os.unlink(USER_RECV_SOCK) - - - def server_loop(alarm_config): -@@ -49,6 +55,21 @@ def server_loop(alarm_config): - sock.bind(SOCK_FILE) - os.chmod(SOCK_FILE, 0o600) - -+ alarm_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) -+ alarm_sock.bind(USER_RECV_SOCK) -+ os.chmod(USER_RECV_SOCK, 0o600) -+ alarm_sock.listen(ALARM_LISTEN_QUEUE_LEN) -+ alarm_sock.setblocking(False) -+ -+ epoll = select.epoll() -+ epoll.register(alarm_sock.fileno(), select.EPOLLIN) -+ fd_to_socket = {alarm_sock.fileno(): alarm_sock,} -+ thread_should_stop = False -+ -+ thread = threading.Thread(target=wait_for_connection, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) -+ thread.daemon = True -+ thread.start() -+ - while True: - try: - data, _ = sock.recvfrom(ALARM_REPORT_LEN) -@@ -58,14 +79,21 @@ def server_loop(alarm_config): - logging.debug("server receive report msg length wrong %d", - len(data)) - continue -- - alarm_info = alarm_bin2stu(data) - logging.debug("server bin2stu msg") - if not check_filter(alarm_info, alarm_config): - continue -+ transmit_alarm(alarm_sock, epoll, fd_to_socket, data) -+ except Exception as e: -+ logging.error(f"Error server:{e}") -+ -+ thread_should_stop = True -+ thread.join() - -- transmit_alarm(data) -- except (ValueError, StructParseError): -- pass -+ epoll.unregister(alarm_sock.fileno()) -+ epoll.close() -+ alarm_sock.close() -+ os.unlink(USER_RECV_SOCK) - - sock.close() -+ -diff --git a/src/python/xalarm/xalarm_transfer.py b/src/python/xalarm/xalarm_transfer.py -index b590b43..42137d8 100644 ---- a/src/python/xalarm/xalarm_transfer.py -+++ b/src/python/xalarm/xalarm_transfer.py -@@ -16,10 +16,12 @@ Create: 2023-11-02 - - import socket - import logging -+import select - --USER_RECV_SOCK = "/var/run/xalarm/alarm" - MIN_ID_NUMBER = 1001 - MAX_ID_NUMBER = 1128 -+MAX_CONNECTION_NUM = 100 -+TEST_CONNECT_BUFFER_SIZE = 32 - - - def check_filter(alarm_info, alarm_filter): -@@ -35,16 +37,84 @@ def check_filter(alarm_info, alarm_filter): - return True - - --def transmit_alarm(bin_data): -- """forward alarm message -+def cleanup_closed_connections(server_sock, epoll, fd_to_socket): - """ -- sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) -- try: -- sock.sendto(bin_data, USER_RECV_SOCK) -- logging.debug("transfer alarm success") -- except ConnectionRefusedError: -- logging.debug("transfer sendto failed") -- except FileNotFoundError: -- logging.debug("transfer sendto failed") -- finally: -- sock.close() -+ clean invalid client socket connections saved in 'fd_to_socket' -+ :param server_sock: server socket instance of alarm -+ :param epoll: epoll instance, used to unregister invalid client connections -+ :param fd_to_socket: dict instance, used to hold client connections and server connections -+ """ -+ to_remove = [] -+ for fileno, connection in fd_to_socket.items(): -+ if connection is server_sock: -+ continue -+ try: -+ # test whether connection still alive, use MSG_DONTWAIT to avoid blocking thread -+ # use MSG_PEEK to avoid consuming buffer data -+ data = connection.recv(TEST_CONNECT_BUFFER_SIZE, socket.MSG_DONTWAIT | socket.MSG_PEEK) -+ if not data: -+ to_remove.append(fileno) -+ except BlockingIOError: -+ pass -+ except (ConnectionResetError, ConnectionAbortedError, BrokenPipeError): -+ to_remove.append(fileno) -+ -+ for fileno in to_remove: -+ epoll.unregister(fileno) -+ fd_to_socket[fileno].close() -+ del fd_to_socket[fileno] -+ logging.info(f"cleaned up connection {fileno} for client lost connection.") -+ -+ -+def wait_for_connection(server_sock, epoll, fd_to_socket, thread_should_stop): -+ """ -+ thread function for catch and save client connection -+ :param server_sock: server socket instance of alarm -+ :param epoll: epoll instance, used to unregister invalid client connections -+ :param fd_to_socket: dict instance, used to hold client connections and server connections -+ :param thread_should_stop: bool instance -+ """ -+ while not thread_should_stop: -+ try: -+ events = epoll.poll(1) -+ -+ for fileno, event in events: -+ if fileno == server_sock.fileno(): -+ connection, client_address = server_sock.accept() -+ # if reach max connection, cleanup closed connections -+ if len(fd_to_socket) - 1 >= MAX_CONNECTION_NUM: -+ cleanup_closed_connections(server_sock, epoll, fd_to_socket) -+ # if connections still reach max num, close this connection automatically -+ if len(fd_to_socket) - 1 >= MAX_CONNECTION_NUM: -+ logging.info(f"connection reach max num of {MAX_CONNECTION_NUM}, closed current connection!") -+ connection.close() -+ continue -+ epoll.register(connection.fileno(), select.EPOLLOUT) -+ fd_to_socket[connection.fileno()] = connection -+ except socket.error as e: -+ logging.debug(f"socket error, reason is {e}") -+ break -+ except (KeyError, OSError, ValueError) as e: -+ logging.debug(f"wait for connection failed {e}") -+ -+ -+def transmit_alarm(server_sock, epoll, fd_to_socket, bin_data): -+ """ -+ this function is to broadcast alarm data to client, if fail to send data, remove connections held by fd_to_socket -+ :param server_sock: server socket instance of alarm -+ :param epoll: epoll instance, used to unregister invalid client connections -+ :param fd_to_socket: dict instance, used to hold client connections and server connections -+ :param bin_data: binary instance, alarm info data in C-style struct format defined in xalarm_api.py -+ """ -+ to_remove = [] -+ for fileno, connection in fd_to_socket.items(): -+ if connection is not server_sock: -+ try: -+ connection.sendall(bin_data) -+ except (BrokenPipeError, ConnectionResetError): -+ to_remove.append(fileno) -+ for fileno in to_remove: -+ epoll.unregister(fileno) -+ fd_to_socket[fileno].close() -+ del fd_to_socket[fileno] -+ --- -2.27.0 - diff --git a/add-root-cause-analysis.patch b/add-root-cause-analysis.patch deleted file mode 100644 index 94de7ff..0000000 --- a/add-root-cause-analysis.patch +++ /dev/null @@ -1,1253 +0,0 @@ -From 24f8eddad364e83cfc5b6b1607462ffe524b59f1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Sat, 12 Oct 2024 21:59:18 +0800 -Subject: [PATCH] add root cause analysis - ---- - config/plugins/ai_block_io.ini | 15 +- - .../sentryPlugins/ai_block_io/ai_block_io.py | 133 +++-- - .../ai_block_io/config_parser.py | 465 +++++++++++------- - .../sentryPlugins/ai_block_io/data_access.py | 1 + - .../sentryPlugins/ai_block_io/detector.py | 54 +- - .../sentryPlugins/ai_block_io/io_data.py | 32 +- - .../ai_block_io/sliding_window.py | 57 ++- - src/python/sentryPlugins/ai_block_io/utils.py | 44 +- - 8 files changed, 491 insertions(+), 310 deletions(-) - -diff --git a/config/plugins/ai_block_io.ini b/config/plugins/ai_block_io.ini -index a814d52..422cfa3 100644 ---- a/config/plugins/ai_block_io.ini -+++ b/config/plugins/ai_block_io.ini -@@ -2,7 +2,6 @@ - level=info - - [common] --absolute_threshold=40 - slow_io_detect_frequency=1 - disk=default - stage=bio -@@ -18,4 +17,16 @@ n_sigma_parameter=3 - [sliding_window] - sliding_window_type=not_continuous - window_size=30 --window_minimum_threshold=6 -\ No newline at end of file -+window_minimum_threshold=6 -+ -+[latency_sata_ssd] -+read_tot_lim=50000 -+write_tot_lim=50000 -+ -+[latency_nvme_ssd] -+read_tot_lim=500 -+write_tot_lim=500 -+ -+[latency_sata_hdd] -+read_tot_lim=50000 -+write_tot_lim=50000 -\ No newline at end of file -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 e1052ec..dd661a1 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -12,13 +12,18 @@ - import time - import signal - import logging -+from collections import defaultdict - - from .detector import Detector, DiskDetector --from .threshold import ThresholdFactory, AbsoluteThreshold -+from .threshold import ThresholdFactory - from .sliding_window import SlidingWindowFactory - 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 .data_access import ( -+ get_io_data_from_collect_plug, -+ check_collect_valid, -+ get_disk_type, -+) - from .io_data import MetricName - from .alarm_report import Xalarm, Report - -@@ -34,7 +39,7 @@ def sig_handler(signum, frame): - class SlowIODetection: - _config_parser = None - _disk_list = None -- _detector_name_list = {} -+ _detector_name_list = defaultdict(list) - _disk_detectors = {} - - def __init__(self, config_parser: ConfigParser): -@@ -43,9 +48,13 @@ class SlowIODetection: - self.__init_detector() - - def __init_detector_name_list(self): -- self._disk_list = check_collect_valid(self._config_parser.slow_io_detect_frequency) -+ self._disk_list = check_collect_valid( -+ self._config_parser.slow_io_detect_frequency -+ ) - if self._disk_list is None: -- Report.report_pass("get available disk error, please check if the collector plug is enable. exiting...") -+ Report.report_pass( -+ "get available disk error, please check if the collector plug is enable. exiting..." -+ ) - exit(1) - - logging.info(f"ai_block_io plug has found disks: {self._disk_list}") -@@ -56,27 +65,45 @@ class SlowIODetection: - # 情况2:is not None and len = 0,则不启动任何磁盘检测 - # 情况3:len != 0,则取交集 - if disks 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: -- for stage in stages: -- for iotype in iotypes: -- if disk not in self._detector_name_list: -- self._detector_name_list[disk] = [] -- self._detector_name_list[disk].append(MetricName(disk, stage, iotype, "latency")) -- else: -- for disk in disks: -- if disk in self._disk_list: -- for stage in stages: -- for iotype in iotypes: -- if disk not in self._detector_name_list: -- self._detector_name_list[disk] = [] -- self._detector_name_list[disk].append(MetricName(disk, stage, iotype, "latency")) -- else: -- logging.warning("disk: [%s] not in available disk list, so it will be ignored.", disk) -- if len(self._detector_name_list) == 0: -- logging.critical("the disks to detection is empty, ai_block_io will exit.") -- Report.report_pass("the disks to detection is empty, ai_block_io will exit.") -- exit(1) -+ 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: -+ if disks is not None: -+ if disk not in disks: -+ continue -+ disks.remove(disk) -+ -+ disk_type_result = get_disk_type(disk) -+ if disk_type_result["ret"] == 0 and disk_type_result["message"] in ( -+ '0', -+ '1', -+ '2', -+ ): -+ disk_type = int(disk_type_result["message"]) -+ else: -+ logging.warning( -+ "%s get disk type error, return %s, so it will be ignored.", -+ disk, -+ disk_type_result, -+ ) -+ continue -+ for stage in stages: -+ for iotype in iotypes: -+ self._detector_name_list[disk].append( -+ MetricName(disk, disk_type, stage, iotype, "latency") -+ ) -+ if disks: -+ logging.warning( -+ "disks: %s not in available disk list, so they will be ignored.", -+ disks, -+ ) -+ if not self._detector_name_list: -+ logging.critical("the disks to detection is empty, ai_block_io will exit.") -+ Report.report_pass( -+ "the disks to detection is empty, ai_block_io will exit." -+ ) -+ exit(1) - - def __init_detector(self): - train_data_duration, train_update_duration = ( -@@ -88,26 +115,39 @@ class SlowIODetection: - train_data_duration, train_update_duration, slow_io_detection_frequency - ) - sliding_window_type = self._config_parser.sliding_window_type -- window_size, window_threshold = (self._config_parser.get_window_size_and_window_minimum_threshold()) -+ window_size, window_threshold = ( -+ self._config_parser.get_window_size_and_window_minimum_threshold() -+ ) - - for disk, metric_name_list in self._detector_name_list.items(): -- threshold = ThresholdFactory().get_threshold( -- threshold_type, -- boxplot_parameter=self._config_parser.boxplot_parameter, -- n_sigma_paramter=self._config_parser.n_sigma_parameter, -- data_queue_size=data_queue_size, -- data_queue_update_size=update_size, -- ) -- sliding_window = SlidingWindowFactory().get_sliding_window( -- sliding_window_type, -- queue_length=window_size, -- threshold=window_threshold, -- ) - disk_detector = DiskDetector(disk) - for metric_name in metric_name_list: -+ threshold = ThresholdFactory().get_threshold( -+ threshold_type, -+ boxplot_parameter=self._config_parser.boxplot_parameter, -+ n_sigma_paramter=self._config_parser.n_sigma_parameter, -+ data_queue_size=data_queue_size, -+ data_queue_update_size=update_size, -+ ) -+ abs_threshold = self._config_parser.get_tot_lim( -+ metric_name.disk_type, metric_name.io_access_type_name -+ ) -+ if abs_threshold is None: -+ logging.warning( -+ "disk %s, disk type %s, io type %s, get tot lim error, so it will be ignored.", -+ disk, -+ metric_name.disk_type, -+ metric_name.io_access_type_name, -+ ) -+ sliding_window = SlidingWindowFactory().get_sliding_window( -+ sliding_window_type, -+ queue_length=window_size, -+ threshold=window_threshold, -+ abs_threshold=abs_threshold, -+ ) - detector = Detector(metric_name, threshold, sliding_window) - disk_detector.add_detector(detector) -- logging.info(f'disk: [{disk}] add detector:\n [{disk_detector}]') -+ logging.info(f"disk: [{disk}] add detector:\n [{disk_detector}]") - self._disk_detectors[disk] = disk_detector - - def launch(self): -@@ -138,14 +178,17 @@ class SlowIODetection: - logging.debug("step3. Report slow io event to sysSentry.") - for slow_io_event in slow_io_event_list: - metric_name: MetricName = slow_io_event[1] -+ window_info = slow_io_event[2] -+ root_cause = slow_io_event[3] - alarm_content = { -- "driver_name": f"{metric_name.get_disk_name()}", -- "reason": "disk_slow", -- "block_stack": f"{metric_name.get_stage_name()}", -- "io_type": f"{metric_name.get_io_access_type_name()}", -+ "driver_name": f"{metric_name.disk_name}", -+ "reason": root_cause, -+ "block_stack": f"{metric_name.stage_name}", -+ "io_type": f"{metric_name.io_access_type_name}", - "alarm_source": "ai_block_io", - "alarm_type": "latency", -- "details": f"current window is: {slow_io_event[2]}, threshold is: {slow_io_event[3]}.", -+ "details": f"disk type: {metric_name.disk_type}, current window: {window_info[1]}, " -+ f"ai threshold: {window_info[2]}, abs threshold: {window_info[3]}.", - } - Xalarm.major(alarm_content) - logging.warning(alarm_content) -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index a357766..3388cd4 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -20,59 +20,62 @@ from .utils import get_threshold_type_enum, get_sliding_window_type_enum, get_lo - - LOG_FORMAT = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" - --ALL_STAGE_LIST = ['throtl', 'wbt', 'gettag', 'plug', 'deadline', 'hctx', 'requeue', 'rq_driver', 'bio'] --ALL_IOTPYE_LIST = ['read', 'write'] -+ALL_STAGE_LIST = [ -+ "throtl", -+ "wbt", -+ "gettag", -+ "plug", -+ "deadline", -+ "hctx", -+ "requeue", -+ "rq_driver", -+ "bio", -+] -+ALL_IOTPYE_LIST = ["read", "write"] -+DISK_TYPE_MAP = { -+ 0: "nvme_ssd", -+ 1: "sata_ssd", -+ 2: "sata_hdd", -+} - - - def init_log_format(log_level: str): - 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." -+ "the log_level: %s you set is invalid, use default value: info.", log_level - ) - - - class ConfigParser: -- DEFAULT_ABSOLUTE_THRESHOLD = 40 -- DEFAULT_SLOW_IO_DETECTION_FREQUENCY = 1 -- DEFAULT_LOG_LEVEL = "info" -- -- DEFAULT_STAGE = 'throtl,wbt,gettag,plug,deadline,hctx,requeue,rq_driver,bio' -- DEFAULT_IOTYPE = 'read,write' -- -- DEFAULT_ALGORITHM_TYPE = "boxplot" -- DEFAULT_TRAIN_DATA_DURATION = 24 -- DEFAULT_TRAIN_UPDATE_DURATION = 2 -- DEFAULT_BOXPLOT_PARAMETER = 1.5 -- DEFAULT_N_SIGMA_PARAMETER = 3 -- -- DEFAULT_SLIDING_WINDOW_TYPE = "not_continuous" -- DEFAULT_WINDOW_SIZE = 30 -- DEFAULT_WINDOW_MINIMUM_THRESHOLD = 6 -+ DEFAULT_CONF = { -+ "log": {"level": "info"}, -+ "common": { -+ "slow_io_detect_frequency": 1, -+ "disk": None, -+ "stage": "throtl,wbt,gettag,plug,deadline,hctx,requeue,rq_driver,bio", -+ "iotype": "read,write", -+ }, -+ "algorithm": { -+ "train_data_duration": 24.0, -+ "train_update_duration": 2.0, -+ "algorithm_type": get_threshold_type_enum("boxplot"), -+ "boxplot_parameter": 1.5, -+ "n_sigma_parameter": 3.0, -+ }, -+ "sliding_window": { -+ "sliding_window_type": get_sliding_window_type_enum("not_continuous"), -+ "window_size": 30, -+ "window_minimum_threshold": 6, -+ }, -+ "latency_sata_ssd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, -+ "latency_nvme_ssd": {"read_tot_lim": 500, "write_tot_lim": 500}, -+ "latency_sata_hdd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, -+ } - - def __init__(self, config_file_name): -- 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 = None -- self.__stage = ConfigParser.DEFAULT_STAGE -- self.__iotype = ConfigParser.DEFAULT_IOTYPE -- -- self.__algorithm_type = get_threshold_type_enum( -- ConfigParser.DEFAULT_ALGORITHM_TYPE -- ) -- self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -- self.__train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -- self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -- self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -- -- self.__sliding_window_type = ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE -- self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -- self.__window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -- -- self.__config_file_name = config_file_name -+ self._conf = ConfigParser.DEFAULT_CONF -+ self._config_file_name = config_file_name - - def _get_config_value( - self, -@@ -156,30 +159,21 @@ class ConfigParser: - - return value - -- def __read_absolute_threshold(self, items_common: dict): -- self.__absolute_threshold = self._get_config_value( -- items_common, -- "absolute_threshold", -- float, -- ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD, -- gt=0, -- ) -- -- def __read__slow_io_detect_frequency(self, items_common: dict): -- self.__slow_io_detect_frequency = self._get_config_value( -+ def _read_slow_io_detect_frequency(self, items_common: dict): -+ self._conf["common"]["slow_io_detect_frequency"] = self._get_config_value( - items_common, - "slow_io_detect_frequency", - int, -- ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY, -+ self.DEFAULT_CONF["common"]["slow_io_detect_frequency"], - gt=0, - le=300, - ) - -- def __read__disks_to_detect(self, items_common: dict): -+ def _read_disks_to_detect(self, items_common: dict): - disks_to_detection = items_common.get("disk") - if disks_to_detection is None: - logging.warning("config of disk not found, the default value will be used.") -- self.__disks_to_detection = None -+ self._conf["common"]["disk"] = None - return - disks_to_detection = disks_to_detection.strip() - if not disks_to_detection: -@@ -189,40 +183,46 @@ class ConfigParser: - ) - exit(1) - disk_list = disks_to_detection.split(",") -+ disk_list = [disk.strip() for disk in disk_list] - if len(disk_list) == 1 and disk_list[0] == "default": -- self.__disks_to_detection = None -+ self._conf["common"]["disk"] = None - return -- self.__disks_to_detection = disk_list -+ self._conf["common"]["disk"] = disk_list - -- def __read__train_data_duration(self, items_algorithm: dict): -- self.__train_data_duration = self._get_config_value( -+ def _read_train_data_duration(self, items_algorithm: dict): -+ self._conf["common"]["train_data_duration"] = self._get_config_value( - items_algorithm, - "train_data_duration", - float, -- ConfigParser.DEFAULT_TRAIN_DATA_DURATION, -+ self.DEFAULT_CONF["algorithm"]["train_data_duration"], - gt=0, - le=720, - ) - -- def __read__train_update_duration(self, items_algorithm: dict): -- default_train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -- if default_train_update_duration > self.__train_data_duration: -- default_train_update_duration = self.__train_data_duration / 2 -- self.__train_update_duration = self._get_config_value( -+ def _read_train_update_duration(self, items_algorithm: dict): -+ default_train_update_duration = self.DEFAULT_CONF["algorithm"][ -+ "train_update_duration" -+ ] -+ if default_train_update_duration > self._conf["common"]["train_data_duration"]: -+ default_train_update_duration = ( -+ self._conf["common"]["train_data_duration"] / 2 -+ ) -+ self._conf["common"]["train_update_duration"] = self._get_config_value( - items_algorithm, - "train_update_duration", - float, - default_train_update_duration, - gt=0, -- le=self.__train_data_duration, -+ le=self._conf["common"]["train_data_duration"], - ) - -- def __read__algorithm_type_and_parameter(self, items_algorithm: dict): -- algorithm_type = items_algorithm.get( -- "algorithm_type", ConfigParser.DEFAULT_ALGORITHM_TYPE -- ) -- self.__algorithm_type = get_threshold_type_enum(algorithm_type) -- if self.__algorithm_type is None: -+ def _read_algorithm_type_and_parameter(self, items_algorithm: dict): -+ algorithm_type = items_algorithm.get("algorithm_type") -+ if algorithm_type is not None: -+ self._conf["algorithm"]["algorithm_type"] = get_threshold_type_enum( -+ algorithm_type -+ ) -+ if self._conf["algorithm"]["algorithm_type"] is None: - logging.critical( - "the algorithm_type: %s you set is invalid. ai_block_io plug will exit.", - algorithm_type, -@@ -231,129 +231,175 @@ class ConfigParser: - f"the algorithm_type: {algorithm_type} you set is invalid. ai_block_io plug will exit." - ) - exit(1) -- -- if self.__algorithm_type == ThresholdType.NSigmaThreshold: -- self.__n_sigma_parameter = self._get_config_value( -+ elif self._conf["algorithm"]["algorithm_type"] == ThresholdType.NSigmaThreshold: -+ self._conf["algorithm"]["n_sigma_parameter"] = self._get_config_value( - items_algorithm, - "n_sigma_parameter", - float, -- ConfigParser.DEFAULT_N_SIGMA_PARAMETER, -+ self.DEFAULT_CONF["algorithm"]["n_sigma_parameter"], - gt=0, - le=10, - ) -- elif self.__algorithm_type == ThresholdType.BoxplotThreshold: -- self.__boxplot_parameter = self._get_config_value( -+ elif ( -+ self._conf["algorithm"]["algorithm_type"] == ThresholdType.BoxplotThreshold -+ ): -+ self._conf["algorithm"]["boxplot_parameter"] = self._get_config_value( - items_algorithm, - "boxplot_parameter", - float, -- ConfigParser.DEFAULT_BOXPLOT_PARAMETER, -+ self.DEFAULT_CONF["algorithm"]["boxplot_parameter"], - gt=0, - le=10, - ) - -- def __read__stage(self, items_algorithm: dict): -- stage_str = items_algorithm.get('stage', ConfigParser.DEFAULT_STAGE) -- stage_list = stage_str.split(',') -- if len(stage_list) == 1 and stage_list[0] == '': -- logging.critical('stage value not allow is empty, exiting...') -+ def _read_stage(self, items_algorithm: dict): -+ stage_str = items_algorithm.get( -+ "stage", self.DEFAULT_CONF["common"]["stage"] -+ ).strip() -+ stage_list = stage_str.split(",") -+ stage_list = [stage.strip() for stage in stage_list] -+ if len(stage_list) == 1 and stage_list[0] == "": -+ logging.critical("stage value not allow is empty, exiting...") - exit(1) -- if len(stage_list) == 1 and stage_list[0] == 'default': -- logging.warning(f'stage will enable default value: {ConfigParser.DEFAULT_STAGE}') -- self.__stage = ALL_STAGE_LIST -+ if len(stage_list) == 1 and stage_list[0] == "default": -+ logging.warning( -+ "stage will enable default value: %s", -+ self.DEFAULT_CONF["common"]["stage"], -+ ) -+ self._conf["common"]["stage"] = ALL_STAGE_LIST - return - for stage in stage_list: - if stage not in ALL_STAGE_LIST: -- logging.critical(f'stage: {stage} is not valid stage, ai_block_io will exit...') -+ logging.critical( -+ "stage: %s is not valid stage, ai_block_io will exit...", stage -+ ) - exit(1) - dup_stage_list = set(stage_list) -- if 'bio' not in dup_stage_list: -- logging.critical('stage must contains bio stage, exiting...') -+ if "bio" not in dup_stage_list: -+ logging.critical("stage must contains bio stage, exiting...") - exit(1) -- self.__stage = dup_stage_list -- -- def __read__iotype(self, items_algorithm: dict): -- iotype_str = items_algorithm.get('iotype', ConfigParser.DEFAULT_IOTYPE) -- iotype_list = iotype_str.split(',') -- if len(iotype_list) == 1 and iotype_list[0] == '': -- logging.critical('iotype value not allow is empty, exiting...') -+ self._conf["common"]["stage"] = dup_stage_list -+ -+ def _read_iotype(self, items_algorithm: dict): -+ iotype_str = items_algorithm.get( -+ "iotype", self.DEFAULT_CONF["common"]["iotype"] -+ ).strip() -+ iotype_list = iotype_str.split(",") -+ iotype_list = [iotype.strip() for iotype in iotype_list] -+ if len(iotype_list) == 1 and iotype_list[0] == "": -+ logging.critical("iotype value not allow is empty, exiting...") - exit(1) -- if len(iotype_list) == 1 and iotype_list[0] == 'default': -- logging.warning(f'iotype will enable default value: {ConfigParser.DEFAULT_IOTYPE}') -- self.__iotype = ALL_IOTPYE_LIST -+ if len(iotype_list) == 1 and iotype_list[0] == "default": -+ logging.warning( -+ "iotype will enable default value: %s", -+ self.DEFAULT_CONF["common"]["iotype"], -+ ) -+ self._conf["common"]["iotype"] = ALL_IOTPYE_LIST - return - for iotype in iotype_list: - if iotype not in ALL_IOTPYE_LIST: -- logging.critical(f'iotype: {iotype} is not valid iotype, ai_block_io will exit...') -+ logging.critical( -+ "iotype: %s is not valid iotype, ai_block_io will exit...", iotype -+ ) - exit(1) - dup_iotype_list = set(iotype_list) -- self.__iotype = dup_iotype_list -+ self._conf["common"]["iotype"] = dup_iotype_list -+ -+ def _read_sliding_window_type(self, items_sliding_window: dict): -+ sliding_window_type = items_sliding_window.get("sliding_window_type") -+ if sliding_window_type is not None: -+ self._conf["sliding_window"]["sliding_window_type"] = ( -+ get_sliding_window_type_enum(sliding_window_type) -+ ) -+ if self._conf["sliding_window"]["sliding_window_type"] is None: -+ logging.critical( -+ "the sliding_window_type: %s you set is invalid. ai_block_io plug will exit.", -+ sliding_window_type, -+ ) -+ Report.report_pass( -+ f"the sliding_window_type: {sliding_window_type} you set is invalid. ai_block_io plug will exit." -+ ) -+ exit(1) - -- def __read__window_size(self, items_sliding_window: dict): -- self.__window_size = self._get_config_value( -+ def _read_window_size(self, items_sliding_window: dict): -+ self._conf["sliding_window"]["window_size"] = self._get_config_value( - items_sliding_window, - "window_size", - int, -- ConfigParser.DEFAULT_WINDOW_SIZE, -+ self.DEFAULT_CONF["sliding_window"]["window_size"], - gt=0, - le=3600, - ) - -- def __read__window_minimum_threshold(self, items_sliding_window: dict): -- default_window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -- if default_window_minimum_threshold > self.__window_size: -- default_window_minimum_threshold = self.__window_size / 2 -- self.__window_minimum_threshold = self._get_config_value( -- items_sliding_window, -- "window_minimum_threshold", -- int, -- default_window_minimum_threshold, -- gt=0, -- le=self.__window_size, -+ def _read_window_minimum_threshold(self, items_sliding_window: dict): -+ default_window_minimum_threshold = self.DEFAULT_CONF["sliding_window"][ -+ "window_minimum_threshold" -+ ] -+ if ( -+ default_window_minimum_threshold -+ > self._conf["sliding_window"]["window_size"] -+ ): -+ default_window_minimum_threshold = ( -+ self._conf["sliding_window"]["window_size"] / 2 -+ ) -+ self._conf["sliding_window"]["window_minimum_threshold"] = ( -+ self._get_config_value( -+ items_sliding_window, -+ "window_minimum_threshold", -+ int, -+ default_window_minimum_threshold, -+ gt=0, -+ le=self._conf["sliding_window"]["window_size"], -+ ) - ) - - def read_config_from_file(self): -- if not os.path.exists(self.__config_file_name): -- init_log_format(self.__log_level) -+ if not os.path.exists(self._config_file_name): -+ init_log_format(self._conf["log"]["level"]) - logging.critical( - "config file %s not found, ai_block_io plug will exit.", -- self.__config_file_name, -+ self._config_file_name, - ) - Report.report_pass( -- f"config file {self.__config_file_name} not found, ai_block_io plug will exit." -+ f"config file {self._config_file_name} not found, ai_block_io plug will exit." - ) - exit(1) - - con = configparser.ConfigParser() - try: -- con.read(self.__config_file_name, encoding="utf-8") -+ con.read(self._config_file_name, encoding="utf-8") - except configparser.Error as e: -- init_log_format(self.__log_level) -+ init_log_format(self._conf["log"]["level"]) - logging.critical( -- f"config file read error: %s, ai_block_io plug will exit.", e -+ "config file read error: %s, ai_block_io plug will exit.", e - ) - Report.report_pass( - f"config file read error: {e}, ai_block_io plug will exit." - ) - exit(1) - -- if con.has_section('log'): -- items_log = dict(con.items('log')) -+ if con.has_section("log"): -+ items_log = dict(con.items("log")) - # 情况一:没有log,则使用默认值 - # 情况二:有log,值为空或异常,使用默认值 - # 情况三:有log,值正常,则使用该值 -- self.__log_level = items_log.get('level', ConfigParser.DEFAULT_LOG_LEVEL) -- init_log_format(self.__log_level) -+ self._conf["log"]["level"] = items_log.get( -+ "level", self.DEFAULT_CONF["log"]["level"] -+ ) -+ init_log_format(self._conf["log"]["level"]) - else: -- init_log_format(self.__log_level) -- logging.warning(f"log section parameter not found, it will be set to default value.") -+ init_log_format(self._conf["log"]["level"]) -+ logging.warning( -+ "log section parameter not found, it will be set to default value." -+ ) - - if con.has_section("common"): - items_common = dict(con.items("common")) -- self.__read_absolute_threshold(items_common) -- self.__read__slow_io_detect_frequency(items_common) -- self.__read__disks_to_detect(items_common) -- self.__read__stage(items_common) -- self.__read__iotype(items_common) -+ -+ self._read_slow_io_detect_frequency(items_common) -+ self._read_disks_to_detect(items_common) -+ self._read_stage(items_common) -+ self._read_iotype(items_common) - else: - logging.warning( - "common section parameter not found, it will be set to default value." -@@ -361,9 +407,9 @@ class ConfigParser: - - if con.has_section("algorithm"): - items_algorithm = dict(con.items("algorithm")) -- self.__read__train_data_duration(items_algorithm) -- self.__read__train_update_duration(items_algorithm) -- self.__read__algorithm_type_and_parameter(items_algorithm) -+ self._read_train_data_duration(items_algorithm) -+ self._read_train_update_duration(items_algorithm) -+ self._read_algorithm_type_and_parameter(items_algorithm) - else: - logging.warning( - "algorithm section parameter not found, it will be set to default value." -@@ -371,101 +417,162 @@ class ConfigParser: - - if con.has_section("sliding_window"): - items_sliding_window = dict(con.items("sliding_window")) -- sliding_window_type = items_sliding_window.get( -- "sliding_window_type", ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE -+ -+ self._read_window_size(items_sliding_window) -+ self._read_window_minimum_threshold(items_sliding_window) -+ else: -+ logging.warning( -+ "sliding_window section parameter not found, it will be set to default value." -+ ) -+ -+ if con.has_section("latency_sata_ssd"): -+ items_latency_sata_ssd = dict(con.items("latency_sata_ssd")) -+ self._conf["latency_sata_ssd"]["read_tot_lim"] = self._get_config_value( -+ items_latency_sata_ssd, -+ "read_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_ssd"]["read_tot_lim"], -+ gt=0, - ) -- self.__sliding_window_type = get_sliding_window_type_enum( -- sliding_window_type -+ self._conf["latency_sata_ssd"]["write_tot_lim"] = self._get_config_value( -+ items_latency_sata_ssd, -+ "write_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_ssd"]["write_tot_lim"], -+ gt=0, - ) -- self.__read__window_size(items_sliding_window) -- self.__read__window_minimum_threshold(items_sliding_window) - else: - logging.warning( -- "sliding_window section parameter not found, it will be set to default value." -+ "latency_sata_ssd section parameter not found, it will be set to default value." -+ ) -+ if con.has_section("latency_nvme_ssd"): -+ items_latency_nvme_ssd = dict(con.items("latency_nvme_ssd")) -+ self._conf["latency_nvme_ssd"]["read_tot_lim"] = self._get_config_value( -+ items_latency_nvme_ssd, -+ "read_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_nvme_ssd"]["read_tot_lim"], -+ gt=0, -+ ) -+ self._conf["latency_nvme_ssd"]["write_tot_lim"] = self._get_config_value( -+ items_latency_nvme_ssd, -+ "write_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_nvme_ssd"]["write_tot_lim"], -+ gt=0, -+ ) -+ else: -+ logging.warning( -+ "latency_nvme_ssd section parameter not found, it will be set to default value." -+ ) -+ if con.has_section("latency_sata_hdd"): -+ items_latency_sata_hdd = dict(con.items("latency_sata_hdd")) -+ self._conf["latency_sata_hdd"]["read_tot_lim"] = self._get_config_value( -+ items_latency_sata_hdd, -+ "read_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_hdd"]["read_tot_lim"], -+ gt=0, -+ ) -+ self._conf["latency_sata_hdd"]["write_tot_lim"] = self._get_config_value( -+ items_latency_sata_hdd, -+ "write_tot_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_hdd"]["write_tot_lim"], -+ gt=0, -+ ) -+ else: -+ logging.warning( -+ "latency_sata_hdd section parameter not found, it will be set to default value." - ) - - self.__print_all_config_value() - -- def __repr__(self): -- config_str = { -- 'log.level': self.__log_level, -- 'common.absolute_threshold': self.__absolute_threshold, -- 'common.slow_io_detect_frequency': self.__slow_io_detect_frequency, -- 'common.disk': self.__disks_to_detection, -- 'common.stage': self.__stage, -- 'common.iotype': self.__iotype, -- 'algorithm.train_data_duration': self.__train_data_duration, -- 'algorithm.train_update_duration': self.__train_update_duration, -- 'algorithm.algorithm_type': self.__algorithm_type, -- 'algorithm.boxplot_parameter': self.__boxplot_parameter, -- 'algorithm.n_sigma_parameter': self.__n_sigma_parameter, -- 'sliding_window.sliding_window_type': self.__sliding_window_type, -- 'sliding_window.window_size': self.__window_size, -- 'sliding_window.window_minimum_threshold': self.__window_minimum_threshold -- } -- return str(config_str) -+ def __repr__(self) -> str: -+ return str(self._conf) -+ -+ def __str__(self) -> str: -+ return str(self._conf) - - def __print_all_config_value(self): -- logging.info(f"all config is follow:\n {self}") -+ logging.info("all config is follow:\n %s", self) -+ -+ def get_tot_lim(self, disk_type, io_type): -+ if io_type == "read": -+ return self._conf.get( -+ f"latency_{DISK_TYPE_MAP.get(disk_type, '')}", {} -+ ).get("read_tot_lim", None) -+ elif io_type == "write": -+ return self._conf.get( -+ f"latency_{DISK_TYPE_MAP.get(disk_type, '')}", {} -+ ).get("write_tot_lim", None) -+ else: -+ return None - - def get_train_data_duration_and_train_update_duration(self): -- return self.__train_data_duration, self.__train_update_duration -+ return ( -+ self._conf["common"]["train_data_duration"], -+ self._conf["common"]["train_update_duration"], -+ ) - - def get_window_size_and_window_minimum_threshold(self): -- return self.__window_size, self.__window_minimum_threshold -+ return ( -+ self._conf["sliding_window"]["window_size"], -+ self._conf["sliding_window"]["window_minimum_threshold"], -+ ) - - @property - def slow_io_detect_frequency(self): -- return self.__slow_io_detect_frequency -+ return self._conf["common"]["slow_io_detect_frequency"] - - @property - def algorithm_type(self): -- return self.__algorithm_type -+ return self._conf["algorithm"]["algorithm_type"] - - @property - def sliding_window_type(self): -- return self.__sliding_window_type -+ return self._conf["sliding_window"]["sliding_window_type"] - - @property - def train_data_duration(self): -- return self.__train_data_duration -+ return self._conf["common"]["train_data_duration"] - - @property - def train_update_duration(self): -- return self.__train_update_duration -+ return self._conf["common"]["train_update_duration"] - - @property - def window_size(self): -- return self.__window_size -+ return self._conf["sliding_window"]["window_size"] - - @property - def window_minimum_threshold(self): -- return self.__window_minimum_threshold -+ return self._conf["sliding_window"]["window_minimum_threshold"] - - @property - def absolute_threshold(self): -- return self.__absolute_threshold -+ return self._conf["common"]["absolute_threshold"] - - @property - def log_level(self): -- return self.__log_level -+ return self._conf["log"]["level"] - - @property - def disks_to_detection(self): -- return self.__disks_to_detection -+ return self._conf["common"]["disk"] - - @property - def stage(self): -- return self.__stage -+ return self._conf["common"]["stage"] - - @property - def iotype(self): -- return self.__iotype -+ return self._conf["common"]["iotype"] - - @property - def boxplot_parameter(self): -- return self.__boxplot_parameter -+ return self._conf["algorithm"]["boxplot_parameter"] - - @property - def n_sigma_parameter(self): -- return self.__n_sigma_parameter -+ return self._conf["algorithm"]["n_sigma_parameter"] -diff --git a/src/python/sentryPlugins/ai_block_io/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -index ed997e6..1bc5ed8 100644 ---- a/src/python/sentryPlugins/ai_block_io/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -16,6 +16,7 @@ from sentryCollector.collect_plugin import ( - Result_Messages, - get_io_data, - is_iocollect_valid, -+ get_disk_type - ) - - -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index e710ddd..87bd1dd 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -17,9 +17,6 @@ from .utils import get_metric_value_from_io_data_dict_by_metric_name - - - class Detector: -- _metric_name: MetricName = None -- _threshold: Threshold = None -- _slidingWindow: SlidingWindow = None - - def __init__(self, metric_name: MetricName, threshold: Threshold, sliding_window: SlidingWindow): - self._metric_name = metric_name -@@ -40,18 +37,24 @@ class Detector: - metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) - if metric_value is None: - logging.debug('not found metric value, so return None.') -- return False, None, None -+ return (False, False), None, None, None - logging.debug(f'input metric value: {str(metric_value)}') - self._threshold.push_latest_data_to_queue(metric_value) - detection_result = self._slidingWindow.is_slow_io_event(metric_value) -- logging.debug(f'Detection result: {str(detection_result)}') -+ # 检测到慢周期,由Detector负责打印info级别日志 -+ if detection_result[0][1]: -+ logging.info(f'[abnormal period happen]: disk info: {self._metric_name}, window: {detection_result[1]}, ' -+ f'current value: {metric_value}, ai threshold: {detection_result[2]}, ' -+ f'absolute threshold: {detection_result[3]}') -+ else: -+ logging.debug(f'Detection result: {str(detection_result)}') - logging.debug(f'exit Detector: {self}') - return detection_result - - def __repr__(self): -- return (f'disk_name: {self._metric_name.get_disk_name()}, stage_name: {self._metric_name.get_stage_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},' -+ return (f'disk_name: {self._metric_name.disk_name}, stage_name: {self._metric_name.stage_name},' -+ f' io_type_name: {self._metric_name.io_access_type_name},' -+ f' metric_name: {self._metric_name.metric_name}, threshold_type: {self._threshold},' - f' sliding_window_type: {self._slidingWindow}') - - -@@ -65,13 +68,38 @@ class DiskDetector: - self._detector_list.append(detector) - - def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -- # 只有bio阶段发生异常,就认为发生了慢IO事件 -- # todo:根因诊断 -+ """ -+ 根因诊断逻辑:只有bio阶段发生异常,才认为发生了慢IO事件,即bio阶段异常是慢IO事件的必要条件 -+ 情况一:bio异常,rq_driver也异常,则慢盘 -+ 情况二:bio异常,rq_driver无异常,且有内核IO栈任意阶段异常,则IO栈异常 -+ 情况三:bio异常,rq_driver无异常,且无内核IO栈任意阶段异常,则IO压力大 -+ 情况四:bio异常,则UNKNOWN -+ """ -+ diagnosis_info = {"bio": [], "rq_driver": [], "io_stage": []} - for detector in self._detector_list: -+ # result返回内容:(是否检测到慢IO,是否检测到慢周期)、窗口、ai阈值、绝对阈值 -+ # 示例: (False, False), self._io_data_queue, self._ai_threshold, self._abs_threshold - result = detector.is_slow_io_event(io_data_dict_with_disk_name) -- if result[0] and detector.get_metric_name().get_stage_name() == 'bio': -- return result[0], detector.get_metric_name(), result[1], result[2] -- return False, None, None, None -+ if result[0][0]: -+ if detector.get_metric_name().stage_name == "bio": -+ diagnosis_info["bio"].append((detector.get_metric_name(), result)) -+ elif detector.get_metric_name().stage_name == "rq_driver": -+ diagnosis_info["rq_driver"].append((detector.get_metric_name(), result)) -+ else: -+ diagnosis_info["io_stage"].append((detector.get_metric_name(), result)) -+ -+ # 返回内容:(1)是否检测到慢IO事件、(2)MetricName、(3)滑动窗口及阈值、(4)慢IO事件根因 -+ root_cause = None -+ if len(diagnosis_info["bio"]) == 0: -+ return False, None, None, None -+ elif len(diagnosis_info["rq_driver"]) != 0: -+ root_cause = "[Root Cause:disk slow]" -+ elif len(diagnosis_info["io_stage"]) != 0: -+ stage = diagnosis_info["io_stage"][0][1].get_stage_name() -+ root_cause = f"[Root Cause:io stage slow, stage: {stage}]" -+ if root_cause is None: -+ root_cause = "[Root Cause:high io pressure]" -+ return True, diagnosis_info["bio"][0][0], diagnosis_info["bio"][0][1], root_cause - - def __repr__(self): - msg = f'disk: {self._disk_name}, ' -diff --git a/src/python/sentryPlugins/ai_block_io/io_data.py b/src/python/sentryPlugins/ai_block_io/io_data.py -index 0e17051..d341b55 100644 ---- a/src/python/sentryPlugins/ai_block_io/io_data.py -+++ b/src/python/sentryPlugins/ai_block_io/io_data.py -@@ -45,30 +45,10 @@ class IOData: - time_stamp: float = field(default_factory=lambda: datetime.now().timestamp()) - - -+@dataclass(frozen=True) - class MetricName: -- _disk_name: str = None -- _stage_name: str = None -- _io_access_type_name: str = None -- _metric_name: str = None -- -- def __init__(self, disk_name: str, stage_name: str, io_access_type_name: str, metric_name: str): -- self._disk_name = disk_name -- self._stage_name = stage_name -- self._io_access_type_name = io_access_type_name -- self._metric_name = metric_name -- -- def get_disk_name(self): -- return self._disk_name -- -- def get_stage_name(self): -- return self._stage_name -- -- def get_io_access_type_name(self): -- return self._io_access_type_name -- -- def get_metric_name(self): -- return self._metric_name -- -- def __repr__(self): -- return (f'disk: {self._disk_name}, stage: {self._stage_name}, io_access_type: {self._io_access_type_name},' -- f'metric: {self._metric_name}') -+ disk_name: str -+ disk_type: str -+ stage_name: str -+ io_access_type_name: str -+ metric_name: str -diff --git a/src/python/sentryPlugins/ai_block_io/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py -index 89191e5..d7c402a 100644 ---- a/src/python/sentryPlugins/ai_block_io/sliding_window.py -+++ b/src/python/sentryPlugins/ai_block_io/sliding_window.py -@@ -21,15 +21,11 @@ class SlidingWindowType(Enum): - - - class SlidingWindow: -- _ai_threshold = None -- _queue_length = None -- _queue_threshold = None -- _io_data_queue: list = None -- _io_data_queue_abnormal_tag: list = None -- -- def __init__(self, queue_length: int, threshold: int): -+ def __init__(self, queue_length: int, threshold: int, abs_threshold: int = None): - self._queue_length = queue_length - self._queue_threshold = threshold -+ self._ai_threshold = None -+ self._abs_threshold = abs_threshold - self._io_data_queue = [] - self._io_data_queue_abnormal_tag = [] - -@@ -38,7 +34,12 @@ class SlidingWindow: - self._io_data_queue.pop(0) - self._io_data_queue_abnormal_tag.pop(0) - self._io_data_queue.append(data) -- self._io_data_queue_abnormal_tag.append(data >= self._ai_threshold if self._ai_threshold is not None else False) -+ tag = False -+ if ((self._ai_threshold is not None and data >= self._ai_threshold) or -+ (self._abs_threshold is not None and data >= self._abs_threshold)): -+ tag = True -+ self._io_data_queue_abnormal_tag.append(tag) -+ return tag - - def update(self, threshold): - if self._ai_threshold == threshold: -@@ -49,7 +50,7 @@ class SlidingWindow: - self._io_data_queue_abnormal_tag.append(data >= self._ai_threshold) - - def is_slow_io_event(self, data): -- return False, None, None -+ return False, None, None, None - - def __repr__(self): - return "[SlidingWindow]" -@@ -57,12 +58,13 @@ class SlidingWindow: - - class NotContinuousSlidingWindow(SlidingWindow): - def is_slow_io_event(self, data): -- super().push(data) -- if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -- return False, self._io_data_queue, self._ai_threshold -+ is_abnormal_period = super().push(data) -+ is_slow_io_event = False -+ if len(self._io_data_queue) < self._queue_length or (self._ai_threshold is None and self._abs_threshold is None): -+ is_slow_io_event = False - if self._io_data_queue_abnormal_tag.count(True) >= self._queue_threshold: -- return True, self._io_data_queue, self._ai_threshold -- return False, self._io_data_queue, self._ai_threshold -+ is_slow_io_event = True -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold - - def __repr__(self): - return f"[NotContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" -@@ -70,18 +72,20 @@ class NotContinuousSlidingWindow(SlidingWindow): - - class ContinuousSlidingWindow(SlidingWindow): - def is_slow_io_event(self, data): -- super().push(data) -- if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -- return False, self._io_data_queue, self._ai_threshold -+ is_abnormal_period = super().push(data) -+ is_slow_io_event = False -+ if len(self._io_data_queue) < self._queue_length or (self._ai_threshold is None and self._abs_threshold is None): -+ is_slow_io_event = False - consecutive_count = 0 - for tag in self._io_data_queue_abnormal_tag: - if tag: - consecutive_count += 1 - if consecutive_count >= self._queue_threshold: -- return True, self._io_data_queue, self._ai_threshold -+ is_slow_io_event = True -+ break - else: - consecutive_count = 0 -- return False, self._io_data_queue, self._ai_threshold -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold - - def __repr__(self): - return f"[ContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" -@@ -89,20 +93,23 @@ class ContinuousSlidingWindow(SlidingWindow): - - class MedianSlidingWindow(SlidingWindow): - def is_slow_io_event(self, data): -- super().push(data) -- if len(self._io_data_queue) < self._queue_length or self._ai_threshold is None: -- return False, self._io_data_queue, self._ai_threshold -+ is_abnormal_period = super().push(data) -+ is_slow_io_event = False -+ if len(self._io_data_queue) < self._queue_length or (self._ai_threshold is None and self._abs_threshold is None): -+ is_slow_io_event = False - median = np.median(self._io_data_queue) - if median >= self._ai_threshold: -- return True, self._io_data_queue, self._ai_threshold -- return False, self._io_data_queue, self._ai_threshold -+ is_slow_io_event = True -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold - - def __repr__(self): - return f"[MedianSlidingWindow, window size: {self._queue_length}]" - - - class SlidingWindowFactory: -- def get_sliding_window(self, sliding_window_type: SlidingWindowType, *args, **kwargs): -+ def get_sliding_window( -+ self, sliding_window_type: SlidingWindowType, *args, **kwargs -+ ): - if sliding_window_type == SlidingWindowType.NotContinuousSlidingWindow: - return NotContinuousSlidingWindow(*args, **kwargs) - elif sliding_window_type == SlidingWindowType.ContinuousSlidingWindow: -diff --git a/src/python/sentryPlugins/ai_block_io/utils.py b/src/python/sentryPlugins/ai_block_io/utils.py -index 0ed37b9..d6f4067 100644 ---- a/src/python/sentryPlugins/ai_block_io/utils.py -+++ b/src/python/sentryPlugins/ai_block_io/utils.py -@@ -19,53 +19,57 @@ from .io_data import MetricName, IOData - - - def get_threshold_type_enum(algorithm_type: str): -- if algorithm_type.lower() == 'absolute': -+ if algorithm_type.lower() == "absolute": - return ThresholdType.AbsoluteThreshold -- if algorithm_type.lower() == 'boxplot': -+ if algorithm_type.lower() == "boxplot": - return ThresholdType.BoxplotThreshold -- if algorithm_type.lower() == 'n_sigma': -+ if algorithm_type.lower() == "n_sigma": - return ThresholdType.NSigmaThreshold - return None - - - def get_sliding_window_type_enum(sliding_window_type: str): -- if sliding_window_type.lower() == 'not_continuous': -+ if sliding_window_type.lower() == "not_continuous": - return SlidingWindowType.NotContinuousSlidingWindow -- if sliding_window_type.lower() == 'continuous': -+ if sliding_window_type.lower() == "continuous": - return SlidingWindowType.ContinuousSlidingWindow -- if sliding_window_type.lower() == 'median': -+ if sliding_window_type.lower() == "median": - return SlidingWindowType.MedianSlidingWindow -- logging.warning(f"the sliding window type: {sliding_window_type} you set is invalid, use default value: not_continuous") -- return SlidingWindowType.NotContinuousSlidingWindow -+ return None - - --def get_metric_value_from_io_data_dict_by_metric_name(io_data_dict: dict, metric_name: MetricName): -+def get_metric_value_from_io_data_dict_by_metric_name( -+ io_data_dict: dict, metric_name: MetricName -+): - try: -- io_data: IOData = io_data_dict[metric_name.get_disk_name()] -- io_stage_data = asdict(io_data)[metric_name.get_stage_name()] -- base_data = io_stage_data[metric_name.get_io_access_type_name()] -- metric_value = base_data[metric_name.get_metric_name()] -+ io_data: IOData = io_data_dict[metric_name.disk_name] -+ io_stage_data = asdict(io_data)[metric_name.stage_name] -+ base_data = io_stage_data[metric_name.io_access_type_name] -+ metric_value = base_data[metric_name.metric_name] - return metric_value - except KeyError: - return None - - --def get_data_queue_size_and_update_size(training_data_duration: float, train_update_duration: float, -- slow_io_detect_frequency: int): -+def get_data_queue_size_and_update_size( -+ training_data_duration: float, -+ train_update_duration: float, -+ slow_io_detect_frequency: int, -+): - data_queue_size = int(training_data_duration * 60 * 60 / slow_io_detect_frequency) - update_size = int(train_update_duration * 60 * 60 / slow_io_detect_frequency) - return data_queue_size, update_size - - - def get_log_level(log_level: str): -- if log_level.lower() == 'debug': -+ if log_level.lower() == "debug": - return logging.DEBUG -- elif log_level.lower() == 'info': -+ elif log_level.lower() == "info": - return logging.INFO -- elif log_level.lower() == 'warning': -+ elif log_level.lower() == "warning": - return logging.WARNING -- elif log_level.lower() == 'error': -+ elif log_level.lower() == "error": - return logging.ERROR -- elif log_level.lower() == 'critical': -+ elif log_level.lower() == "critical": - return logging.CRITICAL - return logging.INFO --- -2.23.0 - diff --git a/add-sentryctl-get_alarm-module_name-s-time_range-d.patch b/add-sentryctl-get_alarm-module_name-s-time_range-d.patch deleted file mode 100644 index 0003219..0000000 --- a/add-sentryctl-get_alarm-module_name-s-time_range-d.patch +++ /dev/null @@ -1,438 +0,0 @@ -From 8fa9389a85763831ea85d94f179a305d7f95d585 Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Sun, 29 Sep 2024 02:04:52 +0000 -Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=91=8A=E8=AD=A6=E4=BA=8B?= - =?UTF-8?q?=E4=BB=B6=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD=EF=BC=9Asentryctl?= - =?UTF-8?q?=20get=5Falarm=20=20-s=20=20-d?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: jinsaihang ---- - src/python/syssentry/alarm.py | 142 ++++++++++++++++++ - .../src/python/syssentry/callbacks.py | 17 +++ - .../src/python/syssentry/global_values.py | 4 + - .../src/python/syssentry/load_mods.py | 16 ++ - .../src/python/syssentry/sentryctl | 20 ++- - .../src/python/syssentry/syssentry.py | 13 +- - .../src/python/syssentry/task_map.py | 5 +- - 7 files changed, 212 insertions(+), 5 deletions(-) - create mode 100644 src/python/syssentry/alarm.py - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -new file mode 100644 -index 0000000..74a2716 ---- /dev/null -+++ b/src/python/syssentry/alarm.py -@@ -0,0 +1,142 @@ -+# 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. -+ -+""" -+use for report alarm -+""" -+import threading -+from typing import Dict, List -+from datetime import datetime -+import time -+import logging -+import json -+ -+from xalarm.register_xalarm import xalarm_register,xalarm_getid,xalarm_getlevel,xalarm_gettype,xalarm_gettime,xalarm_getdesc -+from xalarm.xalarm_api import Xalarm -+ -+from .global_values import InspectTask -+from .task_map import TasksMap -+ -+# 告警ID映射字典,key为插件名,value为告警ID(类型为数字) -+task_alarm_id_dict: Dict[str, int] = {} -+ -+# 告警老化时间字典,key为告警ID,value为老化时间(类型为数字,单位为秒) -+alarm_id_clear_time_dict: Dict[int, int] = {} -+ -+# 告警事件列表,key为告警ID,value为告警ID对应的告警事件列表(类型为list) -+alarm_list_dict: Dict[int, List[Xalarm]] = {} -+# 告警事件列表锁 -+alarm_list_lock = threading.Lock() -+ -+id_filter = [] -+id_base = 1001 -+clientId = -1 -+ -+MILLISECONDS_UNIT_SECONDS = 1000 -+ -+def update_alarm_list(alarm_info: Xalarm): -+ alarm_id = xalarm_getid(alarm_info) -+ timestamp = xalarm_gettime(alarm_info) -+ if not timestamp: -+ logging.error("Retrieve timestamp failed") -+ return -+ alarm_list_lock.acquire() -+ try: -+ # new alarm is inserted into list head -+ if alarm_id not in alarm_list_dict: -+ logging.warning(f"update_alarm_list: alarm_id {alarm_id} not found in alarm_list_dict") -+ return -+ alarm_list = alarm_list_dict[alarm_id] -+ -+ alarm_list.insert(0, alarm_info) -+ # clear alarm_info older than clear time threshold -+ clear_index = -1 -+ clear_time = alarm_id_clear_time_dict[alarm_id] -+ for i in range(len(alarm_list)): -+ if (timestamp - xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > clear_time: -+ clear_index = i -+ break -+ if clear_index >= 0: -+ alarm_list_dict[alarm_id] = alarm_list[:clear_index] -+ finally: -+ alarm_list_lock.release() -+ -+def alarm_register(): -+ logging.debug(f"alarm_register: enter") -+ # 初始化告警ID映射字典、告警老化时间字典 -+ for task_type in TasksMap.tasks_dict: -+ for task_name in TasksMap.tasks_dict[task_type]: -+ logging.info(f"alarm_register: {task_name} is registered") -+ task = TasksMap.tasks_dict[task_type][task_name] -+ alarm_id = task.alarm_id -+ alarm_clear_time = task.alarm_clear_time -+ alarm_list_dict[alarm_id] = [] -+ task_alarm_id_dict[task_name] = alarm_id -+ if alarm_id not in alarm_id_clear_time_dict: -+ alarm_id_clear_time_dict[alarm_id] = alarm_clear_time -+ else: -+ alarm_id_clear_time_dict[alarm_id] = max(alarm_clear_time, alarm_id_clear_time_dict[alarm_id]) -+ # 注册告警回调 -+ id_filter = [True] * 128 -+ clientId = xalarm_register(update_alarm_list, id_filter) -+ if clientId < 0: -+ logging.info(f'register xalarm: failed') -+ return clientId -+ logging.info('register xalarm: success') -+ return clientId -+ -+def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Dict]: -+ alarm_list_lock.acquire() -+ try: -+ if task_name not in task_alarm_id_dict: -+ logging.debug("task_name does not exist") -+ return [] -+ alarm_id = task_alarm_id_dict[task_name] -+ if alarm_id not in alarm_list_dict: -+ logging.debug("alarm_id does not exist") -+ return [] -+ alarm_list = alarm_list_dict[alarm_id] -+ logging.debug(f"get_alarm_result: alarm_list of {alarm_id} has {len(alarm_list)} elements") -+ # clear alarm_info older than clear time threshold -+ stop_index = -1 -+ timestamp = int(datetime.now().timestamp()) -+ for i in range(len(alarm_list)): -+ logging.debug(f"timestamp, alarm_list[{i}].timestamp: {timestamp}, {xalarm_gettime(alarm_list[i])}") -+ if timestamp - (xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > int(time_range): -+ stop_index = i -+ break -+ if stop_index >= 0: -+ alarm_list = alarm_list[:stop_index] -+ logging.debug(f"get_alarm_result: final alarm_list of {alarm_id} has {len(alarm_list)} elements") -+ -+ def xalarm_to_dict(alarm_info: Xalarm) -> dict: -+ return { -+ 'alarm_id': xalarm_getid(alarm_info), -+ 'alarm_type': xalarm_gettype(alarm_info), -+ 'alarm_level': xalarm_getlevel(alarm_info), -+ 'timetamp': xalarm_gettime(alarm_info), -+ 'msg1': xalarm_getdesc(alarm_info) -+ } -+ -+ alarm_list = [xalarm_to_dict(alarm) for alarm in alarm_list] -+ -+ # keep detail -+ for alarm in alarm_list: -+ alarm_info = alarm['msg1'] -+ alarm_info = json.loads(alarm_info) -+ if not detailed: -+ if 'details' in alarm_info: -+ alarm_info.pop('details', None) -+ alarm.pop('msg1', None) -+ alarm['alarm_info'] = alarm_info -+ return alarm_list -+ finally: -+ alarm_list_lock.release() -diff --git a/src/python/syssentry/callbacks.py b/src/python/syssentry/callbacks.py -index b38b381..6ec2c29 100644 ---- a/src/python/syssentry/callbacks.py -+++ b/src/python/syssentry/callbacks.py -@@ -18,6 +18,7 @@ import logging - - from .task_map import TasksMap, ONESHOT_TYPE, PERIOD_TYPE - from .mod_status import EXITED_STATUS, RUNNING_STATUS, WAITING_STATUS, set_runtime_status -+from .alarm import get_alarm_result - - - def task_get_status(mod_name): -@@ -41,6 +42,22 @@ def task_get_result(mod_name): - - return "success", task.get_result() - -+def task_get_alarm(data): -+ """get alarm by mod name""" -+ task_name = data['task_name'] -+ time_range = data['time_range'] -+ try: -+ detailed = data['detailed'] -+ except KeyError: -+ logging.debug("Key 'detailed' does not exist in the dictionary") -+ detailed = None -+ task = TasksMap.get_task_by_name(task_name) -+ if not task: -+ return "failed", f"cannot find task by name {task_name}" -+ if not task.load_enabled: -+ return "failed", f"mod {task_name} is not enabled" -+ -+ return "success", get_alarm_result(task_name, time_range, detailed) - - def task_stop(mod_name): - """stop by mod name""" -diff --git a/src/python/syssentry/global_values.py b/src/python/syssentry/global_values.py -index 483d544..b123b2d 100644 ---- a/src/python/syssentry/global_values.py -+++ b/src/python/syssentry/global_values.py -@@ -27,6 +27,7 @@ CTL_SOCKET_PATH = "/var/run/sysSentry/control.sock" - SYSSENTRY_CONF_PATH = "/etc/sysSentry" - INSPECT_CONF_PATH = "/etc/sysSentry/inspect.conf" - TASK_LOG_DIR = "/var/log/sysSentry" -+DEFAULT_ALARM_CLEAR_TIME = 15 - - SENTRY_RUN_DIR_PERM = 0o750 - -@@ -76,6 +77,9 @@ class InspectTask: - self.env_file = "" - # start mode - self.conflict = "up" -+ # alarm id -+ self.alarm_id = -1 -+ self.alarm_clear_time = DEFAULT_ALARM_CLEAR_TIME - - def start(self): - """ -diff --git a/src/python/syssentry/load_mods.py b/src/python/syssentry/load_mods.py -index 48d7e66..ae05e57 100644 ---- a/src/python/syssentry/load_mods.py -+++ b/src/python/syssentry/load_mods.py -@@ -24,6 +24,7 @@ from .task_map import TasksMap, ONESHOT_TYPE, PERIOD_TYPE - from .cron_process import PeriodTask - from .mod_status import set_task_status - -+from xalarm.register_xalarm import MIN_ALARM_ID, MAX_ALARM_ID - ONESHOT_CONF = 'oneshot' - PERIOD_CONF = 'period' - -@@ -41,6 +42,8 @@ CONF_TASK_RESTART = 'task_restart' - CONF_ONSTART = 'onstart' - CONF_ENV_FILE = 'env_file' - CONF_CONFLICT = 'conflict' -+CONF_ALARM_ID = 'alarm_id' -+CONF_ALARM_CLEAR_TIME = 'alarm_clear_time' - - MOD_FILE_SUFFIX = '.mod' - MOD_SUFFIX_LEN = 4 -@@ -194,6 +197,18 @@ def parse_mod_conf(mod_name, mod_conf): - task.heartbeat_interval = heartbeat_interval - task.load_enabled = is_enabled - -+ try: -+ task.alarm_id = int(mod_conf.get(CONF_TASK, CONF_ALARM_ID)) -+ task.alarm_clear_time = int(mod_conf.get(CONF_TASK, CONF_ALARM_CLEAR_TIME)) -+ if not (MIN_ALARM_ID <= task.alarm_id <= MAX_ALARM_ID): -+ raise ValueError("Invalid alarm_id") -+ except ValueError: -+ task.alarm_id = -1 -+ logging.warning("Invalid alarm_id, set to -1") -+ except configparser.NoOptionError: -+ task.alarm_id = -1 -+ logging.warning("Unset alarm_id and alarm_clear_time, use -1 and 15s as default") -+ - if CONF_ONSTART in mod_conf.options(CONF_TASK): - is_onstart = (mod_conf.get(CONF_TASK, CONF_ONSTART) == 'yes') - if task_type == PERIOD_CONF: -@@ -327,3 +342,4 @@ def reload_single_mod(mod_name): - res, ret = reload_mod_by_name(mod_name) - - return res, ret -+ -diff --git a/src/python/syssentry/sentryctl b/src/python/syssentry/sentryctl -index e94491f..675c17a 100644 ---- a/src/python/syssentry/sentryctl -+++ b/src/python/syssentry/sentryctl -@@ -25,6 +25,7 @@ MAX_PARAM_LENGTH = 256 - - RESULT_MSG_DATA_LEN = 4 - CTL_MSG_LEN_LEN = 3 -+DEFAULT_ALARM_TIME_RANGE = 10 - - def status_output_format(res_data): - """format output""" -@@ -57,6 +58,8 @@ def res_output_handle(res_struct, req_type): - status_output_format(res_struct['data']) - elif req_type == 'get_result': - result_output_format(res_struct['data']) -+ elif req_type == 'get_alarm': -+ result_output_format(res_struct['data']) - elif res_struct['ret'] == "failed": - print(res_struct['data']) - -@@ -75,6 +78,7 @@ def client_send_and_recv(request_data, data_str_len): - print("sentryctl: client creat socket error") - return None - -+ # connect to syssentry - try: - client_socket.connect(CTL_SOCKET_PATH) - except OSError: -@@ -82,6 +86,7 @@ def client_send_and_recv(request_data, data_str_len): - print("sentryctl: client connect error") - return None - -+ # msg: CTL{len}{data} - req_data_len = len(request_data) - request_msg = "CTL" + str(req_data_len).zfill(3) + request_data - -@@ -94,8 +99,8 @@ def client_send_and_recv(request_data, data_str_len): - print("sentryctl: client communicate error") - return None - -+ # res: RES{len}{data} - res_magic = res_data[:3] -- - if res_magic != "RES": - print("res msg format error") - return None -@@ -128,6 +133,10 @@ if __name__ == '__main__': - parser_status.add_argument('task_name') - parser_get_result = subparsers.add_parser('get_result', help='get task result') - parser_get_result.add_argument('task_name') -+ parser_get_alarm = subparsers.add_parser('get_alarm', help='get task alarm') -+ parser_get_alarm.add_argument('task_name') -+ parser_get_alarm.add_argument('-s', '--time_range', type=str, default=DEFAULT_ALARM_TIME_RANGE, help='Specified time range') -+ parser_get_alarm.add_argument('-d', '--detailed', action='store_true', help='Print Detailed Information') - parser_list = subparsers.add_parser('list', help='show all loaded task mod') - - client_args = parser.parse_args() -@@ -142,6 +151,15 @@ if __name__ == '__main__': - req_msg_struct = {"type": "get_status", "data": client_args.task_name} - elif client_args.cmd_type == 'get_result': - req_msg_struct = {"type": "get_result", "data": client_args.task_name} -+ elif client_args.cmd_type == 'get_alarm': -+ req_msg_struct = { -+ "type": "get_alarm", -+ "data": { -+ 'task_name': client_args.task_name, -+ 'time_range': client_args.time_range, -+ 'detailed': client_args.detailed, -+ } -+ } - elif client_args.cmd_type == 'reload': - req_msg_struct = {"type": "reload", "data": client_args.task_name} - else: -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index 9ef0203..c2dee85 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -28,7 +28,7 @@ from .sentry_config import SentryConfig, get_log_level - from .task_map import TasksMap - from .global_values import SENTRY_RUN_DIR, CTL_SOCKET_PATH, SENTRY_RUN_DIR_PERM - from .cron_process import period_tasks_handle --from .callbacks import mod_list_show, task_start, task_get_status, task_stop, task_get_result -+from .callbacks import mod_list_show, task_start, task_get_status, task_stop, task_get_result, task_get_alarm - from .mod_status import get_task_by_pid, set_runtime_status - from .load_mods import load_tasks, reload_single_mod - from .heartbeat import (heartbeat_timeout_chk, heartbeat_fd_create, -@@ -36,7 +36,11 @@ from .heartbeat import (heartbeat_timeout_chk, heartbeat_fd_create, - from .result import RESULT_MSG_HEAD_LEN, RESULT_MSG_MAGIC_LEN, RESULT_MAGIC - from .result import RESULT_LEVEL_ERR_MSG_DICT, ResultLevel - from .utils import get_current_time_string -+from .alarm import alarm_register - -+from xalarm.register_xalarm import xalarm_unregister -+ -+clientId = -1 - - CPU_EXIST = True - try: -@@ -62,6 +66,7 @@ type_func = { - 'stop': task_stop, - 'get_status': task_get_status, - 'get_result': task_get_result, -+ 'get_alarm': task_get_alarm, - 'reload': reload_single_mod - } - -@@ -107,11 +112,12 @@ def msg_data_process(msg_data): - return "Invaild cmd type" - - cmd_param = data_struct['data'] -- logging.debug("msg_data_process cmd_type:%s cmd_param:%s", cmd_type, cmd_param) -+ logging.debug("msg_data_process cmd_type:%s cmd_param:%s", cmd_type, str(cmd_param)) - if cmd_type in type_func: - ret, res_data = type_func[cmd_type](cmd_param) - else: - ret, res_data = type_func_void[cmd_type]() -+ logging.debug("msg_data_process res_data:%s",str(res_data)) - res_msg_struct = {"ret": ret, "data": res_data} - res_msg = json.dumps(res_msg_struct) - -@@ -584,10 +590,13 @@ def main(): - _ = SentryConfig.init_param() - TasksMap.init_task_map() - load_tasks() -+ clientId = alarm_register() - main_loop() - - except Exception: - logging.error('%s', traceback.format_exc()) - finally: -+ if clientId != -1: -+ xalarm_unregister(clientId) - release_pidfile() - -diff --git a/src/python/syssentry/task_map.py b/src/python/syssentry/task_map.py -index 70aa19d..27e97ff 100644 ---- a/src/python/syssentry/task_map.py -+++ b/src/python/syssentry/task_map.py -@@ -13,16 +13,16 @@ - tasks map class and initialize function. - """ - import logging -+from typing import Dict - - ONESHOT_TYPE = "ONESHOT" - PERIOD_TYPE = "PERIOD" - - TASKS_MAP = None - -- - class TasksMap: - """task map class""" -- tasks_dict = {} -+ tasks_dict: Dict[str, Dict] = {} - - @classmethod - def init_task_map(cls): -@@ -65,3 +65,4 @@ class TasksMap: - logging.debug("getting task by name: %s", res) - break - return res -+ --- -2.27.0 - diff --git a/add-xalarm-cleanup-invalid-server-socket-peroidly.patch b/add-xalarm-cleanup-invalid-server-socket-peroidly.patch deleted file mode 100644 index 5ee845a..0000000 --- a/add-xalarm-cleanup-invalid-server-socket-peroidly.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 4fa9b250f56dc3f4f431fc091e25d8f2558a9bb2 Mon Sep 17 00:00:00 2001 -From: caixiaomeng -Date: Fri, 11 Oct 2024 18:12:21 +0800 -Subject: [PATCH] add xalarm cleanup invalid server socket peroidly - ---- - src/python/xalarm/xalarm_server.py | 20 +++++++++++++++----- - src/python/xalarm/xalarm_transfer.py | 8 ++++++++ - 2 files changed, 23 insertions(+), 5 deletions(-) - -diff --git a/src/python/xalarm/xalarm_server.py b/src/python/xalarm/xalarm_server.py -index 2882609..f90a0e2 100644 ---- a/src/python/xalarm/xalarm_server.py -+++ b/src/python/xalarm/xalarm_server.py -@@ -22,7 +22,12 @@ import threading - from struct import error as StructParseError - - from .xalarm_api import alarm_bin2stu --from .xalarm_transfer import check_filter, transmit_alarm, wait_for_connection -+from .xalarm_transfer import ( -+ check_filter, -+ transmit_alarm, -+ wait_for_connection, -+ peroid_task_to_cleanup_connections -+) - - - ALARM_DIR = "/var/run/xalarm" -@@ -66,9 +71,13 @@ def server_loop(alarm_config): - fd_to_socket = {alarm_sock.fileno(): alarm_sock,} - thread_should_stop = False - -- thread = threading.Thread(target=wait_for_connection, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) -- thread.daemon = True -- thread.start() -+ conn_thread = threading.Thread(target=wait_for_connection, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) -+ conn_thread.daemon = True -+ conn_thread.start() -+ -+ cleanup_thread = threading.Thread(target=peroid_task_to_cleanup_connections, args=(alarm_sock, epoll, fd_to_socket, thread_should_stop)) -+ cleanup_thread.daemon = True -+ cleanup_thread.start() - - while True: - try: -@@ -88,7 +97,8 @@ def server_loop(alarm_config): - logging.error(f"Error server:{e}") - - thread_should_stop = True -- thread.join() -+ conn_thread.join() -+ cleanup_thread.join() - - epoll.unregister(alarm_sock.fileno()) - epoll.close() -diff --git a/src/python/xalarm/xalarm_transfer.py b/src/python/xalarm/xalarm_transfer.py -index 90dccbc..75807e0 100644 ---- a/src/python/xalarm/xalarm_transfer.py -+++ b/src/python/xalarm/xalarm_transfer.py -@@ -17,11 +17,13 @@ Create: 2023-11-02 - import socket - import logging - import select -+from time import sleep - - MIN_ID_NUMBER = 1001 - MAX_ID_NUMBER = 1128 - MAX_CONNECTION_NUM = 100 - TEST_CONNECT_BUFFER_SIZE = 32 -+PEROID_SCANN_TIME = 60 - - - def check_filter(alarm_info, alarm_filter): -@@ -66,6 +68,12 @@ def cleanup_closed_connections(server_sock, epoll, fd_to_socket): - logging.info(f"cleaned up connection {fileno} for client lost connection.") - - -+def peroid_task_to_cleanup_connections(server_sock, epoll, fd_to_socket, thread_should_stop): -+ while not thread_should_stop: -+ sleep(PEROID_SCANN_TIME) -+ cleanup_closed_connections(server_sock, epoll, fd_to_socket) -+ -+ - def wait_for_connection(server_sock, epoll, fd_to_socket, thread_should_stop): - """ - thread function for catch and save client connection --- -2.27.0 - - diff --git a/ai_block_io-adapt-alarm-module.patch b/ai_block_io-adapt-alarm-module.patch deleted file mode 100644 index f24974b..0000000 --- a/ai_block_io-adapt-alarm-module.patch +++ /dev/null @@ -1,221 +0,0 @@ -From 367f8ab8a5ad26d80caf1bc4529c79d279ef0fb1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Thu, 10 Oct 2024 17:21:48 +0800 -Subject: [PATCH] ai_block_io adapt alarm module - ---- - config/tasks/ai_block_io.mod | 4 +- - .../sentryPlugins/ai_block_io/ai_block_io.py | 28 +++++--- - .../sentryPlugins/ai_block_io/alarm_report.py | 65 ++++++++++++++----- - .../sentryPlugins/ai_block_io/data_access.py | 5 +- - .../sentryPlugins/ai_block_io/detector.py | 2 +- - 5 files changed, 73 insertions(+), 31 deletions(-) - -diff --git a/config/tasks/ai_block_io.mod b/config/tasks/ai_block_io.mod -index 1971d7d..82f4f0b 100644 ---- a/config/tasks/ai_block_io.mod -+++ b/config/tasks/ai_block_io.mod -@@ -2,4 +2,6 @@ - enabled=yes - task_start=/usr/bin/python3 /usr/bin/ai_block_io - task_stop=pkill -f /usr/bin/ai_block_io --type=oneshot -\ No newline at end of file -+type=oneshot -+alarm_id=1002 -+alarm_clear_time=5 -\ No newline at end of file -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 3b00ef3..77104a9 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -20,14 +20,14 @@ 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 --from .alarm_report import AlarmReport -+from .alarm_report import Xalarm, Report - - CONFIG_FILE = "/etc/sysSentry/plugins/ai_block_io.ini" - - - def sig_handler(signum, frame): - logging.info("receive signal: %d", signum) -- AlarmReport().report_fail(f"receive signal: {signum}") -+ Report.report_pass(f"receive signal: {signum}, exiting...") - exit(signum) - - -@@ -44,6 +44,10 @@ class SlowIODetection: - - def __init_detector_name_list(self): - self._disk_list = check_collect_valid(self._config_parser.get_slow_io_detect_frequency()) -+ if self._disk_list is None: -+ Report.report_pass("get available disk error, please check if the collector plug is enable. exiting...") -+ exit(1) -+ - 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,则启用所有磁盘检测 -@@ -101,7 +105,8 @@ class SlowIODetection: - ) - logging.debug(f'step1. Get io data: {str(io_data_dict_with_disk_name)}') - if io_data_dict_with_disk_name is None: -- continue -+ Report.report_pass("get io data error, please check if the collector plug is enable. exitting...") -+ exit(1) - - # Step2:慢IO检测 - logging.debug('step2. Start to detection slow io event.') -@@ -117,13 +122,16 @@ class SlowIODetection: - for slow_io_event in slow_io_event_list: - metric_name: MetricName = slow_io_event[0] - result = slow_io_event[1] -- alarm_content = (f"disk {metric_name.get_disk_name()} has slow io event. " -- f"stage is: {metric_name.get_stage_name()}, " -- f"io access type is: {metric_name.get_io_access_type_name()}, " -- f"metric is: {metric_name.get_metric_name()}, " -- f"current window is: {result[1]}, " -- f"threshold is: {result[2]}") -- AlarmReport.report_major_alm(alarm_content) -+ alarm_content = { -+ "driver_name": f"{metric_name.get_disk_name()}", -+ "reason": "disk_slow", -+ "block_stack": f"{metric_name.get_stage_name()}", -+ "io_type": f"{metric_name.get_io_access_type_name()}", -+ "alarm_source": "ai_block_io", -+ "alarm_type": "latency", -+ "details": f"current window is: {result[1]}, threshold is: {result[2]}.", -+ } -+ Xalarm.major(alarm_content) - logging.warning(alarm_content) - - # Step4:等待检测时间 -diff --git a/src/python/sentryPlugins/ai_block_io/alarm_report.py b/src/python/sentryPlugins/ai_block_io/alarm_report.py -index 230c8cd..92bd6e3 100644 ---- a/src/python/sentryPlugins/ai_block_io/alarm_report.py -+++ b/src/python/sentryPlugins/ai_block_io/alarm_report.py -@@ -9,41 +9,72 @@ - # PURPOSE. - # See the Mulan PSL v2 for more details. - --from syssentry.result import ResultLevel, report_result - import logging - import json - -+from xalarm.sentry_notify import ( -+ xalarm_report, -+ MINOR_ALM, -+ MAJOR_ALM, -+ CRITICAL_ALM, -+ ALARM_TYPE_OCCUR, -+ ALARM_TYPE_RECOVER, -+) -+ -+from syssentry.result import ResultLevel, report_result -+ - --class AlarmReport: -+class Report: - TASK_NAME = "ai_block_io" - - @staticmethod - def report_pass(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.PASS, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} PASS: {info}') -+ report_result(Report.TASK_NAME, ResultLevel.PASS, json.dumps({"msg": info})) -+ logging.info(f'Report {Report.TASK_NAME} PASS: {info}') - - @staticmethod - def report_fail(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} FAIL: {info}') -+ report_result(Report.TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": info})) -+ logging.info(f'Report {Report.TASK_NAME} FAIL: {info}') - - @staticmethod - def report_skip(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.SKIP, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} SKIP: {info}') -+ report_result(Report.TASK_NAME, ResultLevel.SKIP, json.dumps({"msg": info})) -+ logging.info(f'Report {Report.TASK_NAME} SKIP: {info}') -+ -+ -+class Xalarm: -+ ALARM_ID = 1002 - - @staticmethod -- def report_minor_alm(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.MINOR_ALM, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} MINOR_ALM: {info}') -+ def minor(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, MINOR_ALM, ALARM_TYPE_OCCUR, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} MINOR_ALM: {info_str}") - - @staticmethod -- def report_major_alm(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.MAJOR_ALM, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} MAJOR_ALM: {info}') -+ def major(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, MAJOR_ALM, ALARM_TYPE_OCCUR, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} MAJOR_ALM: {info_str}") - - @staticmethod -- def report_critical_alm(info: str): -- report_result(AlarmReport.TASK_NAME, ResultLevel.CRITICAL_ALM, json.dumps({"msg": info})) -- logging.info(f'Report {AlarmReport.TASK_NAME} CRITICAL_ALM: {info}') -+ def critical(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, CRITICAL_ALM, ALARM_TYPE_OCCUR, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM: {info_str}") -+ -+ def minor_recover(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, MINOR_ALM, ALARM_TYPE_RECOVER, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} MINOR_ALM Recover: {info_str}") -+ -+ def major_recover(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, MAJOR_ALM, ALARM_TYPE_RECOVER, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} MAJOR_ALM Recover: {info_str}") - -+ def critical_recover(info: dict): -+ info_str = json.dumps(info) -+ xalarm_report(Xalarm.ALARM_ID, CRITICAL_ALM, ALARM_TYPE_RECOVER, info_str) -+ logging.info(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM Recover: {info_str}") -diff --git a/src/python/sentryPlugins/ai_block_io/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -index 01c5315..c7679cd 100644 ---- a/src/python/sentryPlugins/ai_block_io/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -42,10 +42,11 @@ def check_collect_valid(period): - data = json.loads(data_raw["message"]) - except Exception as e: - logging.warning(f"get io data failed, {e}") -- return [] -+ return None - return [k for k in data.keys()] - else: -- return [] -+ logging.warning(f"get io data failed, return {data_raw}") -+ return None - - - def _get_raw_data(period, disk_list): -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index a48144f..0ed282b 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -35,7 +35,7 @@ class Detector: - self._count += 1 - if self._count % 15 == 0: - self._count = 0 -- logging.info(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") -+ logging.debug(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") - logging.debug(f'enter Detector: {self}') - metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) - if metric_value is None: --- -2.23.0 - diff --git a/ai_block_io-fix-some-bugs.patch b/ai_block_io-fix-some-bugs.patch deleted file mode 100644 index b82b44d..0000000 --- a/ai_block_io-fix-some-bugs.patch +++ /dev/null @@ -1,235 +0,0 @@ -From 1e13bc31ae3aa94f36aa124eefdfc8773221eacd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Mon, 14 Oct 2024 23:16:46 +0800 -Subject: [PATCH] ai_block_io fix some bugs - ---- - .../sentryPlugins/ai_block_io/ai_block_io.py | 1 + - .../ai_block_io/config_parser.py | 20 ++++++++++--------- - .../sentryPlugins/ai_block_io/detector.py | 18 ++++++++++++----- - .../sentryPlugins/ai_block_io/io_data.py | 2 +- - .../sentryPlugins/ai_block_io/threshold.py | 17 +++++++++------- - 5 files changed, 36 insertions(+), 22 deletions(-) - -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 dd661a1..4eecd43 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -55,6 +55,7 @@ class SlowIODetection: - Report.report_pass( - "get available disk error, please check if the collector plug is enable. exiting..." - ) -+ logging.critical("get available disk error, please check if the collector plug is enable. exiting...") - exit(1) - - logging.info(f"ai_block_io plug has found disks: {self._disk_list}") -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 3388cd4..7b0cd29 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -190,7 +190,7 @@ class ConfigParser: - self._conf["common"]["disk"] = disk_list - - def _read_train_data_duration(self, items_algorithm: dict): -- self._conf["common"]["train_data_duration"] = self._get_config_value( -+ self._conf["algorithm"]["train_data_duration"] = self._get_config_value( - items_algorithm, - "train_data_duration", - float, -@@ -203,17 +203,17 @@ class ConfigParser: - default_train_update_duration = self.DEFAULT_CONF["algorithm"][ - "train_update_duration" - ] -- if default_train_update_duration > self._conf["common"]["train_data_duration"]: -+ if default_train_update_duration > self._conf["algorithm"]["train_data_duration"]: - default_train_update_duration = ( -- self._conf["common"]["train_data_duration"] / 2 -+ self._conf["algorithm"]["train_data_duration"] / 2 - ) -- self._conf["common"]["train_update_duration"] = self._get_config_value( -+ self._conf["algorithm"]["train_update_duration"] = self._get_config_value( - items_algorithm, - "train_update_duration", - float, - default_train_update_duration, - gt=0, -- le=self._conf["common"]["train_data_duration"], -+ le=self._conf["algorithm"]["train_data_duration"], - ) - - def _read_algorithm_type_and_parameter(self, items_algorithm: dict): -@@ -401,6 +401,8 @@ class ConfigParser: - self._read_stage(items_common) - self._read_iotype(items_common) - else: -+ self._conf["common"]["stage"] = ALL_STAGE_LIST -+ self._conf["common"]["iotype"] = ALL_IOTPYE_LIST - logging.warning( - "common section parameter not found, it will be set to default value." - ) -@@ -511,8 +513,8 @@ class ConfigParser: - - def get_train_data_duration_and_train_update_duration(self): - return ( -- self._conf["common"]["train_data_duration"], -- self._conf["common"]["train_update_duration"], -+ self._conf["algorithm"]["train_data_duration"], -+ self._conf["algorithm"]["train_update_duration"], - ) - - def get_window_size_and_window_minimum_threshold(self): -@@ -535,11 +537,11 @@ class ConfigParser: - - @property - def train_data_duration(self): -- return self._conf["common"]["train_data_duration"] -+ return self._conf["algorithm"]["train_data_duration"] - - @property - def train_update_duration(self): -- return self._conf["common"]["train_update_duration"] -+ return self._conf["algorithm"]["train_update_duration"] - - @property - def window_size(self): -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index 87bd1dd..5b21714 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -9,6 +9,7 @@ - # PURPOSE. - # See the Mulan PSL v2 for more details. - import logging -+from datetime import datetime - - from .io_data import MetricName - from .threshold import Threshold -@@ -21,18 +22,25 @@ class Detector: - def __init__(self, metric_name: MetricName, threshold: Threshold, sliding_window: SlidingWindow): - self._metric_name = metric_name - self._threshold = threshold -+ # for when threshold update, it can print latest threshold with metric name -+ self._threshold.set_metric_name(self._metric_name) - self._slidingWindow = sliding_window - self._threshold.attach_observer(self._slidingWindow) -- self._count = 0 -+ self._count = None - - def get_metric_name(self): - return self._metric_name - - def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -- self._count += 1 -- if self._count % 15 == 0: -- self._count = 0 -- logging.debug(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") -+ if self._count is None: -+ self._count = datetime.now() -+ else: -+ now_time = datetime.now() -+ time_diff = (now_time - self._count).total_seconds() -+ if time_diff >= 60: -+ logging.info(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") -+ self._count = None -+ - logging.debug(f'enter Detector: {self}') - metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) - if metric_value is None: -diff --git a/src/python/sentryPlugins/ai_block_io/io_data.py b/src/python/sentryPlugins/ai_block_io/io_data.py -index d341b55..6042911 100644 ---- a/src/python/sentryPlugins/ai_block_io/io_data.py -+++ b/src/python/sentryPlugins/ai_block_io/io_data.py -@@ -48,7 +48,7 @@ class IOData: - @dataclass(frozen=True) - class MetricName: - disk_name: str -- disk_type: str -+ disk_type: int - stage_name: str - io_access_type_name: str - metric_name: str -diff --git a/src/python/sentryPlugins/ai_block_io/threshold.py b/src/python/sentryPlugins/ai_block_io/threshold.py -index 3b7a5a8..600d041 100644 ---- a/src/python/sentryPlugins/ai_block_io/threshold.py -+++ b/src/python/sentryPlugins/ai_block_io/threshold.py -@@ -23,11 +23,6 @@ class ThresholdState(Enum): - - - class Threshold: -- threshold = None -- data_queue: queue.Queue = None -- data_queue_update_size: int = None -- new_data_size: int = None -- threshold_state: ThresholdState = None - - def __init__(self, data_queue_size: int = 10000, data_queue_update_size: int = 1000): - self._observer = None -@@ -36,12 +31,16 @@ class Threshold: - self.new_data_size = 0 - self.threshold_state = ThresholdState.INIT - self.threshold = math.inf -+ self.metric_name = None - - def set_threshold(self, threshold): - self.threshold = threshold - self.threshold_state = ThresholdState.START - self.notify_observer() - -+ def set_metric_name(self, metric_name): -+ self.metric_name = metric_name -+ - def get_threshold(self): - if self.threshold_state == ThresholdState.INIT: - return None -@@ -84,6 +83,7 @@ class BoxplotThreshold(Threshold): - self.parameter = boxplot_parameter - - def _update_threshold(self): -+ old_threshold = self.threshold - data = list(self.data_queue.queue) - q1 = np.percentile(data, 25) - q3 = np.percentile(data, 75) -@@ -91,6 +91,7 @@ class BoxplotThreshold(Threshold): - self.threshold = q3 + self.parameter * iqr - if self.threshold_state == ThresholdState.INIT: - self.threshold_state = ThresholdState.START -+ logging.info(f"MetricName: [{self.metric_name}]'s threshold update, old is: {old_threshold} -> new is: {self.threshold}") - self.notify_observer() - - def push_latest_data_to_queue(self, data): -@@ -109,7 +110,7 @@ class BoxplotThreshold(Threshold): - self.new_data_size = 0 - - def __repr__(self): -- return f"[BoxplotThreshold, param is: {self.parameter}]" -+ return f"[BoxplotThreshold, param is: {self.parameter}, train_size: {self.data_queue.maxsize}, update_size: {self.data_queue_update_size}]" - - - class NSigmaThreshold(Threshold): -@@ -118,12 +119,14 @@ class NSigmaThreshold(Threshold): - self.parameter = n_sigma_parameter - - def _update_threshold(self): -+ old_threshold = self.threshold - data = list(self.data_queue.queue) - mean = np.mean(data) - std = np.std(data) - self.threshold = mean + self.parameter * std - if self.threshold_state == ThresholdState.INIT: - self.threshold_state = ThresholdState.START -+ logging.info(f"MetricName: [{self.metric_name}]'s threshold update, old is: {old_threshold} -> new is: {self.threshold}") - self.notify_observer() - - def push_latest_data_to_queue(self, data): -@@ -142,7 +145,7 @@ class NSigmaThreshold(Threshold): - self.new_data_size = 0 - - def __repr__(self): -- return f"[NSigmaThreshold, param is: {self.parameter}]" -+ return f"[NSigmaThreshold, param is: {self.parameter}, train_size: {self.data_queue.maxsize}, update_size: {self.data_queue_update_size}]" - - - class ThresholdType(Enum): --- -2.23.0 - diff --git a/ai_block_io-fix-some-config-parameters-parse-bug.patch b/ai_block_io-fix-some-config-parameters-parse-bug.patch deleted file mode 100644 index bb84cad..0000000 --- a/ai_block_io-fix-some-config-parameters-parse-bug.patch +++ /dev/null @@ -1,626 +0,0 @@ -From f3a0738061e852c8125513f6222b4a5d6ea73270 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Fri, 25 Oct 2024 15:34:25 +0800 -Subject: [PATCH] ai_block_io fix some config parameters parse bug - ---- - .../sentryPlugins/ai_block_io/ai_block_io.py | 70 +++++---- - .../ai_block_io/config_parser.py | 135 ++++++++++++++---- - .../sentryPlugins/ai_block_io/data_access.py | 14 ++ - .../sentryPlugins/ai_block_io/detector.py | 16 ++- - .../ai_block_io/sliding_window.py | 2 +- - .../sentryPlugins/ai_block_io/threshold.py | 14 +- - src/python/sentryPlugins/ai_block_io/utils.py | 2 - - 7 files changed, 180 insertions(+), 73 deletions(-) - -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 74f246a..14f740d 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -23,6 +23,7 @@ from .data_access import ( - get_io_data_from_collect_plug, - check_collect_valid, - get_disk_type, -+ check_disk_is_available - ) - from .io_data import MetricName - from .alarm_report import Xalarm, Report -@@ -31,14 +32,14 @@ CONFIG_FILE = "/etc/sysSentry/plugins/ai_block_io.ini" - - - def sig_handler(signum, frame): -- logging.info("receive signal: %d", signum) - Report.report_pass(f"receive signal: {signum}, exiting...") -+ logging.info("Finished ai_block_io plugin running.") - exit(signum) - - - class SlowIODetection: - _config_parser = None -- _disk_list = None -+ _disk_list = [] - _detector_name_list = defaultdict(list) - _disk_detectors = {} - -@@ -48,32 +49,30 @@ class SlowIODetection: - self.__init_detector() - - def __init_detector_name_list(self): -- self._disk_list = check_collect_valid( -- self._config_parser.period_time -- ) -- if self._disk_list is None: -- Report.report_pass( -- "get available disk error, please check if the collector plug is enable. exiting..." -- ) -- logging.critical("get available disk error, please check if the collector plug is enable. exiting...") -- exit(1) -- -- logging.info(f"ai_block_io plug has found disks: {self._disk_list}") - disks: list = self._config_parser.disks_to_detection - stages: list = self._config_parser.stage - iotypes: list = self._config_parser.iotype -- # 情况1:None,则启用所有磁盘检测 -- # 情况2:is not None and len = 0,则不启动任何磁盘检测 -- # 情况3:len != 0,则取交集 -+ - if disks 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: -- if disks is not None: -- if disk not in disks: -- continue -- disks.remove(disk) -+ logging.warning("you not specify any disk or use default, so ai_block_io will enable all available disk.") -+ all_available_disk_list = check_collect_valid(self._config_parser.period_time) -+ if all_available_disk_list is None: -+ Report.report_pass("get available disk error, please check if the collector plug is enable. exiting...") -+ logging.critical("get available disk error, please check if the collector plug is enable. exiting...") -+ exit(1) -+ if len(all_available_disk_list) == 0: -+ Report.report_pass("not found available disk. exiting...") -+ logging.critical("not found available disk. exiting...") -+ exit(1) -+ disks = all_available_disk_list -+ logging.info(f"available disk list is follow: {disks}.") -+ -+ for disk in disks: -+ tmp_disk = [disk] -+ ret = check_disk_is_available(self._config_parser.period_time, tmp_disk) -+ if not ret: -+ logging.warning(f"disk: {disk} is not available, it will be ignored.") -+ continue - - disk_type_result = get_disk_type(disk) - if disk_type_result["ret"] == 0 and disk_type_result["message"] in ( -@@ -89,20 +88,15 @@ class SlowIODetection: - disk_type_result, - ) - continue -+ self._disk_list.append(disk) - for stage in stages: - for iotype in iotypes: - self._detector_name_list[disk].append(MetricName(disk, disk_type, stage, iotype, "latency")) - self._detector_name_list[disk].append(MetricName(disk, disk_type, stage, iotype, "io_dump")) -- if disks: -- logging.warning( -- "disks: %s not in available disk list, so they will be ignored.", -- disks, -- ) -+ - if not self._detector_name_list: -+ Report.report_pass("the disks to detection is empty, ai_block_io will exit.") - logging.critical("the disks to detection is empty, ai_block_io will exit.") -- Report.report_pass( -- "the disks to detection is empty, ai_block_io will exit." -- ) - exit(1) - - def __init_detector(self): -@@ -202,16 +196,20 @@ class SlowIODetection: - logging.debug("step3. Report slow io event to sysSentry.") - for slow_io_event in slow_io_event_list: - alarm_content = { -+ "alarm_source": "ai_block_io", - "driver_name": slow_io_event[1], -+ "io_type": slow_io_event[4], - "reason": slow_io_event[2], - "block_stack": slow_io_event[3], -- "io_type": slow_io_event[4], -- "alarm_source": "ai_block_io", - "alarm_type": slow_io_event[5], -- "details": slow_io_event[6], -+ "details": slow_io_event[6] - } - Xalarm.major(alarm_content) -- logging.warning("[SLOW IO] " + str(alarm_content)) -+ tmp_alarm_content = alarm_content.copy() -+ del tmp_alarm_content["details"] -+ logging.warning("[SLOW IO] " + str(tmp_alarm_content)) -+ logging.warning(f"latency: " + str(alarm_content.get("details").get("latency"))) -+ logging.warning(f"iodump: " + str(alarm_content.get("details").get("iodump"))) - - # Step4:等待检测时间 - logging.debug("step4. Wait to start next slow io event detection loop.") -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 91ec5c6..3049db2 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -105,21 +105,26 @@ class ConfigParser: - ge=None, - lt=None, - le=None, -+ section=None - ): -+ if section is not None: -+ print_key = section + "." + key -+ else: -+ print_key = key - value = config_items.get(key) - if value is None: - logging.warning( - "config of %s not found, the default value %s will be used.", -- key, -+ print_key, - default_value, - ) - value = default_value - if not value: - logging.critical( -- "the value of %s is empty, ai_block_io plug will exit.", key -+ "the value of %s is empty, ai_block_io plug will exit.", print_key - ) - Report.report_pass( -- f"the value of {key} is empty, ai_block_io plug will exit." -+ f"the value of {print_key} is empty, ai_block_io plug will exit." - ) - exit(1) - try: -@@ -127,51 +132,51 @@ class ConfigParser: - except ValueError: - logging.critical( - "the value of %s is not a valid %s, ai_block_io plug will exit.", -- key, -+ print_key, - value_type, - ) - Report.report_pass( -- f"the value of {key} is not a valid {value_type}, ai_block_io plug will exit." -+ f"the value of {print_key} is not a valid {value_type}, ai_block_io plug will exit." - ) - exit(1) - if gt is not None and value <= gt: - logging.critical( - "the value of %s is not greater than %s, ai_block_io plug will exit.", -- key, -+ print_key, - gt, - ) - Report.report_pass( -- f"the value of {key} is not greater than {gt}, ai_block_io plug will exit." -+ f"the value of {print_key} is not greater than {gt}, ai_block_io plug will exit." - ) - exit(1) - if ge is not None and value < ge: - logging.critical( - "the value of %s is not greater than or equal to %s, ai_block_io plug will exit.", -- key, -+ print_key, - ge, - ) - Report.report_pass( -- f"the value of {key} is not greater than or equal to {ge}, ai_block_io plug will exit." -+ f"the value of {print_key} is not greater than or equal to {ge}, ai_block_io plug will exit." - ) - exit(1) - if lt is not None and value >= lt: - logging.critical( - "the value of %s is not less than %s, ai_block_io plug will exit.", -- key, -+ print_key, - lt, - ) - Report.report_pass( -- f"the value of {key} is not less than {lt}, ai_block_io plug will exit." -+ f"the value of {print_key} is not less than {lt}, ai_block_io plug will exit." - ) - exit(1) - if le is not None and value > le: - logging.critical( - "the value of %s is not less than or equal to %s, ai_block_io plug will exit.", -- key, -+ print_key, - le, - ) - Report.report_pass( -- f"the value of {key} is not less than or equal to {le}, ai_block_io plug will exit." -+ f"the value of {print_key} is not less than or equal to {le}, ai_block_io plug will exit." - ) - exit(1) - -@@ -188,7 +193,7 @@ class ConfigParser: - frequency = self._conf["common"]["period_time"] - ret = check_detect_frequency_is_valid(frequency) - if ret is None: -- log = f"period_time: {frequency} is valid, "\ -+ log = f"period_time: {frequency} is invalid, "\ - f"Check whether the value range is too large or is not an "\ - f"integer multiple of period_time.. exiting..." - Report.report_pass(log) -@@ -202,6 +207,7 @@ class ConfigParser: - self._conf["common"]["disk"] = None - return - disks_to_detection = disks_to_detection.strip() -+ disks_to_detection = disks_to_detection.lower() - if not disks_to_detection: - logging.critical("the value of disk is empty, ai_block_io plug will exit.") - Report.report_pass( -@@ -213,7 +219,18 @@ class ConfigParser: - if len(disk_list) == 1 and disk_list[0] == "default": - self._conf["common"]["disk"] = None - return -- self._conf["common"]["disk"] = disk_list -+ if len(disk_list) > 10: -+ ten_disk_list = disk_list[0:10] -+ other_disk_list = disk_list[10:] -+ logging.warning(f"disk only support maximum is 10, disks: {ten_disk_list} will be retained, other: {other_disk_list} will be ignored.") -+ else: -+ ten_disk_list = disk_list -+ set_ten_disk_list = set(ten_disk_list) -+ if len(ten_disk_list) > len(set_ten_disk_list): -+ tmp = ten_disk_list -+ ten_disk_list = list(set_ten_disk_list) -+ logging.warning(f"disk exist duplicate, it will be deduplicate, before: {tmp}, after: {ten_disk_list}") -+ self._conf["common"]["disk"] = ten_disk_list - - def _read_train_data_duration(self, items_algorithm: dict): - self._conf["algorithm"]["train_data_duration"] = self._get_config_value( -@@ -244,10 +261,12 @@ class ConfigParser: - - def _read_algorithm_type_and_parameter(self, items_algorithm: dict): - algorithm_type = items_algorithm.get("algorithm_type") -- if algorithm_type is not None: -- self._conf["algorithm"]["algorithm_type"] = get_threshold_type_enum( -- algorithm_type -- ) -+ if algorithm_type is None: -+ default_algorithm_type = self._conf["algorithm"]["algorithm_type"] -+ logging.warning(f"algorithm_type not found, it will be set default: {default_algorithm_type}") -+ else: -+ self._conf["algorithm"]["algorithm_type"] = get_threshold_type_enum(algorithm_type) -+ - if self._conf["algorithm"]["algorithm_type"] is None: - logging.critical( - "the algorithm_type: %s you set is invalid. ai_block_io plug will exit.", -@@ -257,6 +276,7 @@ class ConfigParser: - f"the algorithm_type: {algorithm_type} you set is invalid. ai_block_io plug will exit." - ) - exit(1) -+ - elif self._conf["algorithm"]["algorithm_type"] == ThresholdType.NSigmaThreshold: - self._conf["algorithm"]["n_sigma_parameter"] = self._get_config_value( - items_algorithm, -@@ -279,9 +299,14 @@ class ConfigParser: - ) - - def _read_stage(self, items_algorithm: dict): -- stage_str = items_algorithm.get( -- "stage", self.DEFAULT_CONF["common"]["stage"] -- ).strip() -+ stage_str = items_algorithm.get("stage") -+ if stage_str is None: -+ stage_str = self.DEFAULT_CONF["common"]["stage"] -+ logging.warning(f"stage not found, it will be set default: {stage_str}") -+ else: -+ stage_str = stage_str.strip() -+ -+ stage_str = stage_str.lower() - stage_list = stage_str.split(",") - stage_list = [stage.strip() for stage in stage_list] - if len(stage_list) == 1 and stage_list[0] == "": -@@ -307,9 +332,14 @@ class ConfigParser: - self._conf["common"]["stage"] = dup_stage_list - - def _read_iotype(self, items_algorithm: dict): -- iotype_str = items_algorithm.get( -- "iotype", self.DEFAULT_CONF["common"]["iotype"] -- ).strip() -+ iotype_str = items_algorithm.get("iotype") -+ if iotype_str is None: -+ iotype_str = self.DEFAULT_CONF["common"]["iotype"] -+ logging.warning(f"iotype not found, it will be set default: {iotype_str}") -+ else: -+ iotype_str = iotype_str.strip() -+ -+ iotype_str = iotype_str.lower() - iotype_list = iotype_str.split(",") - iotype_list = [iotype.strip() for iotype in iotype_list] - if len(iotype_list) == 1 and iotype_list[0] == "": -@@ -333,6 +363,13 @@ class ConfigParser: - - def _read_sliding_window_type(self, items_sliding_window: dict): - sliding_window_type = items_sliding_window.get("win_type") -+ -+ if sliding_window_type is None: -+ default_sliding_window_type = self._conf["algorithm"]["win_type"] -+ logging.warning(f"win_type not found, it will be set default: {default_sliding_window_type}") -+ return -+ -+ sliding_window_type = sliding_window_type.strip() - if sliding_window_type is not None: - self._conf["algorithm"]["win_type"] = ( - get_sliding_window_type_enum(sliding_window_type) -@@ -439,6 +476,7 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_sata_ssd"]["read_tot_lim"], - gt=0, -+ section="latency_sata_ssd" - ) - self._conf["latency_sata_ssd"]["write_tot_lim"] = self._get_config_value( - items_latency_sata_ssd, -@@ -446,21 +484,32 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_sata_ssd"]["write_tot_lim"], - gt=0, -+ section="latency_sata_ssd" - ) - self._conf["latency_sata_ssd"]["read_avg_lim"] = self._get_config_value( - items_latency_sata_ssd, - "read_avg_lim", - int, - self.DEFAULT_CONF["latency_sata_ssd"]["read_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_sata_ssd" - ) - self._conf["latency_sata_ssd"]["write_avg_lim"] = self._get_config_value( - items_latency_sata_ssd, - "write_avg_lim", - int, - self.DEFAULT_CONF["latency_sata_ssd"]["write_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_sata_ssd" - ) -+ if self._conf["latency_sata_ssd"]["read_avg_lim"] >= self._conf["latency_sata_ssd"]["read_tot_lim"]: -+ Report.report_pass("latency_sata_ssd.read_avg_lim must < latency_sata_ssd.read_tot_lim . exiting...") -+ logging.critical("latency_sata_ssd.read_avg_lim must < latency_sata_ssd.read_tot_lim . exiting...") -+ exit(1) -+ if self._conf["latency_sata_ssd"]["write_avg_lim"] >= self._conf["latency_sata_ssd"]["write_tot_lim"]: -+ Report.report_pass("latency_sata_ssd.write_avg_lim must < latency_sata_ssd.write_tot_lim . exiting...") -+ logging.critical("latency_sata_ssd.read_avg_lim must < latency_sata_ssd.read_tot_lim . exiting...") -+ exit(1) - else: - Report.report_pass("not found latency_sata_ssd section. exiting...") - logging.critical("not found latency_sata_ssd section. exiting...") -@@ -474,6 +523,7 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_nvme_ssd"]["read_tot_lim"], - gt=0, -+ section="latency_nvme_ssd" - ) - self._conf["latency_nvme_ssd"]["write_tot_lim"] = self._get_config_value( - items_latency_nvme_ssd, -@@ -481,21 +531,32 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_nvme_ssd"]["write_tot_lim"], - gt=0, -+ section="latency_nvme_ssd" - ) - self._conf["latency_nvme_ssd"]["read_avg_lim"] = self._get_config_value( - items_latency_nvme_ssd, - "read_avg_lim", - int, - self.DEFAULT_CONF["latency_nvme_ssd"]["read_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_nvme_ssd" - ) - self._conf["latency_nvme_ssd"]["write_avg_lim"] = self._get_config_value( - items_latency_nvme_ssd, - "write_avg_lim", - int, - self.DEFAULT_CONF["latency_nvme_ssd"]["write_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_nvme_ssd" - ) -+ if self._conf["latency_nvme_ssd"]["read_avg_lim"] >= self._conf["latency_nvme_ssd"]["read_tot_lim"]: -+ Report.report_pass("latency_nvme_ssd.read_avg_lim must < latency_nvme_ssd.read_tot_lim . exiting...") -+ logging.critical("latency_nvme_ssd.read_avg_lim must < latency_nvme_ssd.read_tot_lim . exiting...") -+ exit(1) -+ if self._conf["latency_nvme_ssd"]["write_avg_lim"] >= self._conf["latency_nvme_ssd"]["write_tot_lim"]: -+ Report.report_pass("latency_nvme_ssd.write_avg_lim must < latency_nvme_ssd.write_tot_lim . exiting...") -+ logging.critical("latency_nvme_ssd.write_avg_lim must < latency_nvme_ssd.write_tot_lim . exiting...") -+ exit(1) - else: - Report.report_pass("not found latency_nvme_ssd section. exiting...") - logging.critical("not found latency_nvme_ssd section. exiting...") -@@ -509,6 +570,7 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_sata_hdd"]["read_tot_lim"], - gt=0, -+ section="latency_sata_hdd" - ) - self._conf["latency_sata_hdd"]["write_tot_lim"] = self._get_config_value( - items_latency_sata_hdd, -@@ -516,21 +578,32 @@ class ConfigParser: - int, - self.DEFAULT_CONF["latency_sata_hdd"]["write_tot_lim"], - gt=0, -+ section="latency_sata_hdd" - ) - self._conf["latency_sata_hdd"]["read_avg_lim"] = self._get_config_value( - items_latency_sata_hdd, - "read_avg_lim", - int, - self.DEFAULT_CONF["latency_sata_hdd"]["read_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_sata_hdd" - ) - self._conf["latency_sata_hdd"]["write_avg_lim"] = self._get_config_value( - items_latency_sata_hdd, - "write_avg_lim", - int, - self.DEFAULT_CONF["latency_sata_hdd"]["write_avg_lim"], -- gt=0 -+ gt=0, -+ section="latency_sata_hdd" - ) -+ if self._conf["latency_sata_hdd"]["read_avg_lim"] >= self._conf["latency_sata_hdd"]["read_tot_lim"]: -+ Report.report_pass("latency_sata_hdd.read_avg_lim must < latency_sata_hdd.read_tot_lim . exiting...") -+ logging.critical("latency_sata_hdd.read_avg_lim must < latency_sata_hdd.read_tot_lim . exiting...") -+ exit(1) -+ if self._conf["latency_sata_hdd"]["write_avg_lim"] >= self._conf["latency_sata_hdd"]["write_tot_lim"]: -+ Report.report_pass("latency_sata_hdd.write_avg_lim must < latency_sata_hdd.write_tot_lim . exiting...") -+ logging.critical("latency_sata_hdd.write_avg_lim must < latency_sata_hdd.write_tot_lim . exiting...") -+ exit(1) - else: - Report.report_pass("not found latency_sata_hdd section. exiting...") - logging.critical("not found latency_sata_hdd section. exiting...") -diff --git a/src/python/sentryPlugins/ai_block_io/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -index e4869d5..2f2d607 100644 ---- a/src/python/sentryPlugins/ai_block_io/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -67,6 +67,20 @@ def check_detect_frequency_is_valid(period): - return None - - -+def check_disk_is_available(period_time, disk): -+ data_raw = is_iocollect_valid(period_time, disk) -+ if data_raw["ret"] == 0: -+ try: -+ data = json.loads(data_raw["message"]) -+ except Exception as e: -+ return False -+ if not data: -+ return False -+ return True -+ else: -+ return False -+ -+ - def _get_raw_data(period, disk_list): - return get_io_data( - period, -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index e3a0952..496e032 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -75,6 +75,18 @@ class Detector: - f' sliding_window_type: {self._slidingWindow}') - - -+def set_to_str(parameter: set): -+ ret = "" -+ parameter = list(parameter) -+ length = len(parameter) -+ for i in range(length): -+ if i == 0: -+ ret += parameter[i] -+ else: -+ ret += "," + parameter[i] -+ return ret -+ -+ - class DiskDetector: - - def __init__(self, disk_name: str): -@@ -124,7 +136,7 @@ class DiskDetector: - alarm_type.add(metric_name.metric_name) - - latency_wins, iodump_wins = self.get_detector_list_window() -- details = f"latency: {latency_wins}, iodump: {iodump_wins}" -+ details = {"latency": latency_wins, "iodump": iodump_wins} - - io_press = {"throtl", "wbt", "iocost", "bfq"} - driver_slow = {"rq_driver"} -@@ -137,7 +149,7 @@ class DiskDetector: - elif not kernel_slow.isdisjoint(block_stack): - reason = "kernel_slow" - -- return True, driver_name, reason, str(block_stack), str(io_type), str(alarm_type), details -+ return True, driver_name, reason, set_to_str(block_stack), set_to_str(io_type), set_to_str(alarm_type), details - - def __repr__(self): - msg = f'disk: {self._disk_name}, ' -diff --git a/src/python/sentryPlugins/ai_block_io/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py -index 4083c43..ff3fa3b 100644 ---- a/src/python/sentryPlugins/ai_block_io/sliding_window.py -+++ b/src/python/sentryPlugins/ai_block_io/sliding_window.py -@@ -107,7 +107,7 @@ class MedianSlidingWindow(SlidingWindow): - if len(self._io_data_queue) < self._queue_length or (self._ai_threshold is None and self._abs_threshold is None): - is_slow_io_event = False - median = np.median(self._io_data_queue) -- if median >= self._ai_threshold: -+ if (self._ai_threshold is not None and median > self._ai_threshold) or (self._abs_threshold is not None and median > self._abs_threshold): - is_slow_io_event = True - return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold, self._avg_lim - -diff --git a/src/python/sentryPlugins/ai_block_io/threshold.py b/src/python/sentryPlugins/ai_block_io/threshold.py -index 600d041..e202bb8 100644 ---- a/src/python/sentryPlugins/ai_block_io/threshold.py -+++ b/src/python/sentryPlugins/ai_block_io/threshold.py -@@ -65,9 +65,12 @@ class Threshold: - def __repr__(self): - return "Threshold" - -+ def __str__(self): -+ return "Threshold" -+ - - class AbsoluteThreshold(Threshold): -- def __init__(self, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ def __init__(self, data_queue_size: int = 10000, data_queue_update_size: int = 1000, **kwargs): - super().__init__(data_queue_size, data_queue_update_size) - - def push_latest_data_to_queue(self, data): -@@ -76,6 +79,9 @@ class AbsoluteThreshold(Threshold): - def __repr__(self): - return "[AbsoluteThreshold]" - -+ def __str__(self): -+ return "absolute" -+ - - class BoxplotThreshold(Threshold): - def __init__(self, boxplot_parameter: float = 1.5, data_queue_size: int = 10000, data_queue_update_size: int = 1000, **kwargs): -@@ -112,6 +118,9 @@ class BoxplotThreshold(Threshold): - def __repr__(self): - return f"[BoxplotThreshold, param is: {self.parameter}, train_size: {self.data_queue.maxsize}, update_size: {self.data_queue_update_size}]" - -+ def __str__(self): -+ return "boxplot" -+ - - class NSigmaThreshold(Threshold): - def __init__(self, n_sigma_parameter: float = 3.0, data_queue_size: int = 10000, data_queue_update_size: int = 1000, **kwargs): -@@ -147,6 +156,9 @@ class NSigmaThreshold(Threshold): - def __repr__(self): - return f"[NSigmaThreshold, param is: {self.parameter}, train_size: {self.data_queue.maxsize}, update_size: {self.data_queue_update_size}]" - -+ def __str__(self): -+ return "n_sigma" -+ - - class ThresholdType(Enum): - AbsoluteThreshold = 0 -diff --git a/src/python/sentryPlugins/ai_block_io/utils.py b/src/python/sentryPlugins/ai_block_io/utils.py -index d6f4067..7d2390b 100644 ---- a/src/python/sentryPlugins/ai_block_io/utils.py -+++ b/src/python/sentryPlugins/ai_block_io/utils.py -@@ -19,8 +19,6 @@ from .io_data import MetricName, IOData - - - def get_threshold_type_enum(algorithm_type: str): -- if algorithm_type.lower() == "absolute": -- return ThresholdType.AbsoluteThreshold - if algorithm_type.lower() == "boxplot": - return ThresholdType.BoxplotThreshold - if algorithm_type.lower() == "n_sigma": --- -2.23.0 - diff --git a/ai_block_io-lack-section-exit.patch b/ai_block_io-lack-section-exit.patch deleted file mode 100644 index c226ee1..0000000 --- a/ai_block_io-lack-section-exit.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 8e4f39897dc8dc51cfa0bbf24667be1688876c15 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Mon, 21 Oct 2024 14:18:20 +0800 -Subject: [PATCH] ai_block_io lack section exit - ---- - .../ai_block_io/config_parser.py | 40 +++++++++---------- - 1 file changed, 20 insertions(+), 20 deletions(-) - -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 7b0cd29..447eccd 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -401,11 +401,9 @@ class ConfigParser: - self._read_stage(items_common) - self._read_iotype(items_common) - else: -- self._conf["common"]["stage"] = ALL_STAGE_LIST -- self._conf["common"]["iotype"] = ALL_IOTPYE_LIST -- logging.warning( -- "common section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found common section. exiting...") -+ logging.critical("not found common section. exiting...") -+ exit(1) - - if con.has_section("algorithm"): - items_algorithm = dict(con.items("algorithm")) -@@ -413,9 +411,9 @@ class ConfigParser: - self._read_train_update_duration(items_algorithm) - self._read_algorithm_type_and_parameter(items_algorithm) - else: -- logging.warning( -- "algorithm section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found algorithm section. exiting...") -+ logging.critical("not found algorithm section. exiting...") -+ exit(1) - - if con.has_section("sliding_window"): - items_sliding_window = dict(con.items("sliding_window")) -@@ -423,9 +421,9 @@ class ConfigParser: - self._read_window_size(items_sliding_window) - self._read_window_minimum_threshold(items_sliding_window) - else: -- logging.warning( -- "sliding_window section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found sliding_window section. exiting...") -+ logging.critical("not found sliding_window section. exiting...") -+ exit(1) - - if con.has_section("latency_sata_ssd"): - items_latency_sata_ssd = dict(con.items("latency_sata_ssd")) -@@ -444,9 +442,10 @@ class ConfigParser: - gt=0, - ) - else: -- logging.warning( -- "latency_sata_ssd section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found latency_sata_ssd section. exiting...") -+ logging.critical("not found latency_sata_ssd section. exiting...") -+ exit(1) -+ - if con.has_section("latency_nvme_ssd"): - items_latency_nvme_ssd = dict(con.items("latency_nvme_ssd")) - self._conf["latency_nvme_ssd"]["read_tot_lim"] = self._get_config_value( -@@ -464,9 +463,10 @@ class ConfigParser: - gt=0, - ) - else: -- logging.warning( -- "latency_nvme_ssd section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found latency_nvme_ssd section. exiting...") -+ logging.critical("not found latency_nvme_ssd section. exiting...") -+ exit(1) -+ - if con.has_section("latency_sata_hdd"): - items_latency_sata_hdd = dict(con.items("latency_sata_hdd")) - self._conf["latency_sata_hdd"]["read_tot_lim"] = self._get_config_value( -@@ -484,9 +484,9 @@ class ConfigParser: - gt=0, - ) - else: -- logging.warning( -- "latency_sata_hdd section parameter not found, it will be set to default value." -- ) -+ Report.report_pass("not found latency_sata_hdd section. exiting...") -+ logging.critical("not found latency_sata_hdd section. exiting...") -+ exit(1) - - self.__print_all_config_value() - --- -2.23.0 - diff --git a/ai_block_io-support-absolute-threshold-lower-limit.patch b/ai_block_io-support-absolute-threshold-lower-limit.patch deleted file mode 100644 index ccd8f17..0000000 --- a/ai_block_io-support-absolute-threshold-lower-limit.patch +++ /dev/null @@ -1,728 +0,0 @@ -From cedd862d4e4a97a6c4fa13cbff2af452910ea5b4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Thu, 24 Oct 2024 09:39:16 +0800 -Subject: [PATCH] ai_block_io support absolute threshold lower limit - ---- - config/plugins/ai_block_io.ini | 19 +- - .../sentryPlugins/ai_block_io/ai_block_io.py | 36 ++-- - .../sentryPlugins/ai_block_io/alarm_report.py | 18 +- - .../ai_block_io/config_parser.py | 168 ++++++++++++------ - .../sentryPlugins/ai_block_io/detector.py | 92 ++++++---- - .../ai_block_io/sliding_window.py | 21 ++- - 6 files changed, 222 insertions(+), 132 deletions(-) - -diff --git a/config/plugins/ai_block_io.ini b/config/plugins/ai_block_io.ini -index 040237d..d0b1e74 100644 ---- a/config/plugins/ai_block_io.ini -+++ b/config/plugins/ai_block_io.ini -@@ -2,9 +2,9 @@ - level=info - - [common] --slow_io_detect_frequency=1 -+period_time=1 - disk=default --stage=bio -+stage=default - iotype=read,write - - [algorithm] -@@ -12,22 +12,25 @@ train_data_duration=24 - train_update_duration=2 - algorithm_type=boxplot - boxplot_parameter=1.5 --n_sigma_parameter=3 -- --[sliding_window] --sliding_window_type=not_continuous --window_size=30 --window_minimum_threshold=6 -+win_type=not_continuous -+win_size=30 -+win_threshold=6 - - [latency_sata_ssd] -+read_avg_lim=10000 -+write_avg_lim=10000 - read_tot_lim=50000 - write_tot_lim=50000 - - [latency_nvme_ssd] -+read_avg_lim=300 -+write_avg_lim=300 - read_tot_lim=500 - write_tot_lim=500 - - [latency_sata_hdd] -+read_avg_lim=15000 -+write_avg_lim=15000 - read_tot_lim=50000 - write_tot_lim=50000 - -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 f25e6d5..74f246a 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -49,7 +49,7 @@ class SlowIODetection: - - def __init_detector_name_list(self): - self._disk_list = check_collect_valid( -- self._config_parser.slow_io_detect_frequency -+ self._config_parser.period_time - ) - if self._disk_list is None: - Report.report_pass( -@@ -109,7 +109,7 @@ class SlowIODetection: - train_data_duration, train_update_duration = ( - self._config_parser.get_train_data_duration_and_train_update_duration() - ) -- slow_io_detection_frequency = self._config_parser.slow_io_detect_frequency -+ slow_io_detection_frequency = self._config_parser.period_time - threshold_type = self._config_parser.algorithm_type - data_queue_size, update_size = get_data_queue_size_and_update_size( - train_data_duration, train_update_duration, slow_io_detection_frequency -@@ -131,10 +131,13 @@ class SlowIODetection: - data_queue_size=data_queue_size, - data_queue_update_size=update_size, - ) -- abs_threshold = self._config_parser.get_tot_lim( -+ tot_lim = self._config_parser.get_tot_lim( - metric_name.disk_type, metric_name.io_access_type_name - ) -- if abs_threshold is None: -+ avg_lim = self._config_parser.get_avg_lim( -+ metric_name.disk_type, metric_name.io_access_type_name -+ ) -+ if tot_lim is None: - logging.warning( - "disk %s, disk type %s, io type %s, get tot lim error, so it will be ignored.", - disk, -@@ -145,7 +148,8 @@ class SlowIODetection: - sliding_window_type, - queue_length=window_size, - threshold=window_threshold, -- abs_threshold=abs_threshold, -+ abs_threshold=tot_lim, -+ avg_lim=avg_lim - ) - detector = Detector(metric_name, threshold, sliding_window) - disk_detector.add_detector(detector) -@@ -176,7 +180,7 @@ class SlowIODetection: - - # Step1:获取IO数据 - io_data_dict_with_disk_name = get_io_data_from_collect_plug( -- self._config_parser.slow_io_detect_frequency, self._disk_list -+ self._config_parser.period_time, self._disk_list - ) - logging.debug(f"step1. Get io data: {str(io_data_dict_with_disk_name)}") - if io_data_dict_with_disk_name is None: -@@ -197,25 +201,21 @@ class SlowIODetection: - # Step3:慢IO事件上报 - logging.debug("step3. Report slow io event to sysSentry.") - for slow_io_event in slow_io_event_list: -- metric_name: MetricName = slow_io_event[1] -- window_info = slow_io_event[2] -- root_cause = slow_io_event[3] - alarm_content = { -- "driver_name": f"{metric_name.disk_name}", -- "reason": root_cause, -- "block_stack": f"{metric_name.stage_name}", -- "io_type": f"{metric_name.io_access_type_name}", -+ "driver_name": slow_io_event[1], -+ "reason": slow_io_event[2], -+ "block_stack": slow_io_event[3], -+ "io_type": slow_io_event[4], - "alarm_source": "ai_block_io", -- "alarm_type": "latency", -- "details": f"disk type: {metric_name.disk_type}, current window: {window_info[1]}, " -- f"ai threshold: {window_info[2]}, abs threshold: {window_info[3]}.", -+ "alarm_type": slow_io_event[5], -+ "details": slow_io_event[6], - } - Xalarm.major(alarm_content) -- logging.warning(alarm_content) -+ logging.warning("[SLOW IO] " + str(alarm_content)) - - # Step4:等待检测时间 - logging.debug("step4. Wait to start next slow io event detection loop.") -- time.sleep(self._config_parser.slow_io_detect_frequency) -+ time.sleep(self._config_parser.period_time) - - - def main(): -diff --git a/src/python/sentryPlugins/ai_block_io/alarm_report.py b/src/python/sentryPlugins/ai_block_io/alarm_report.py -index 92bd6e3..61bb145 100644 ---- a/src/python/sentryPlugins/ai_block_io/alarm_report.py -+++ b/src/python/sentryPlugins/ai_block_io/alarm_report.py -@@ -30,17 +30,17 @@ class Report: - @staticmethod - def report_pass(info: str): - report_result(Report.TASK_NAME, ResultLevel.PASS, json.dumps({"msg": info})) -- logging.info(f'Report {Report.TASK_NAME} PASS: {info}') -+ logging.debug(f'Report {Report.TASK_NAME} PASS: {info}') - - @staticmethod - def report_fail(info: str): - report_result(Report.TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": info})) -- logging.info(f'Report {Report.TASK_NAME} FAIL: {info}') -+ logging.debug(f'Report {Report.TASK_NAME} FAIL: {info}') - - @staticmethod - def report_skip(info: str): - report_result(Report.TASK_NAME, ResultLevel.SKIP, json.dumps({"msg": info})) -- logging.info(f'Report {Report.TASK_NAME} SKIP: {info}') -+ logging.debug(f'Report {Report.TASK_NAME} SKIP: {info}') - - - class Xalarm: -@@ -50,31 +50,31 @@ class Xalarm: - def minor(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, MINOR_ALM, ALARM_TYPE_OCCUR, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} MINOR_ALM: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} MINOR_ALM: {info_str}") - - @staticmethod - def major(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, MAJOR_ALM, ALARM_TYPE_OCCUR, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} MAJOR_ALM: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} MAJOR_ALM: {info_str}") - - @staticmethod - def critical(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, CRITICAL_ALM, ALARM_TYPE_OCCUR, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM: {info_str}") - - def minor_recover(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, MINOR_ALM, ALARM_TYPE_RECOVER, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} MINOR_ALM Recover: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} MINOR_ALM Recover: {info_str}") - - def major_recover(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, MAJOR_ALM, ALARM_TYPE_RECOVER, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} MAJOR_ALM Recover: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} MAJOR_ALM Recover: {info_str}") - - def critical_recover(info: dict): - info_str = json.dumps(info) - xalarm_report(Xalarm.ALARM_ID, CRITICAL_ALM, ALARM_TYPE_RECOVER, info_str) -- logging.info(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM Recover: {info_str}") -+ logging.debug(f"Report {Xalarm.ALARM_ID} CRITICAL_ALM Recover: {info_str}") -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 1117939..91ec5c6 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -52,7 +52,7 @@ class ConfigParser: - DEFAULT_CONF = { - "log": {"level": "info"}, - "common": { -- "slow_io_detect_frequency": 1, -+ "period_time": 1, - "disk": None, - "stage": "throtl,wbt,gettag,plug,deadline,hctx,requeue,rq_driver,bio", - "iotype": "read,write", -@@ -63,16 +63,32 @@ class ConfigParser: - "algorithm_type": get_threshold_type_enum("boxplot"), - "boxplot_parameter": 1.5, - "n_sigma_parameter": 3.0, -+ "win_type": get_sliding_window_type_enum("not_continuous"), -+ "win_size": 30, -+ "win_threshold": 6, - }, -- "sliding_window": { -- "sliding_window_type": get_sliding_window_type_enum("not_continuous"), -- "window_size": 30, -- "window_minimum_threshold": 6, -+ "latency_sata_ssd": { -+ "read_avg_lim": 10000, -+ "write_avg_lim": 10000, -+ "read_tot_lim": 50000, -+ "write_tot_lim": 50000 - }, -- "latency_sata_ssd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, -- "latency_nvme_ssd": {"read_tot_lim": 500, "write_tot_lim": 500}, -- "latency_sata_hdd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, -- "iodump": {"read_iodump_lim": 0, "write_iodump_lim": 0} -+ "latency_nvme_ssd": { -+ "read_avg_lim": 300, -+ "write_avg_lim": 300, -+ "read_tot_lim": 500, -+ "write_tot_lim": 500 -+ }, -+ "latency_sata_hdd": { -+ "read_avg_lim": 15000, -+ "write_avg_lim": 15000, -+ "read_tot_lim": 50000, -+ "write_tot_lim": 50000 -+ }, -+ "iodump": { -+ "read_iodump_lim": 0, -+ "write_iodump_lim": 0 -+ } - } - - def __init__(self, config_file_name): -@@ -161,18 +177,18 @@ class ConfigParser: - - return value - -- def _read_slow_io_detect_frequency(self, items_common: dict): -- self._conf["common"]["slow_io_detect_frequency"] = self._get_config_value( -+ def _read_period_time(self, items_common: dict): -+ self._conf["common"]["period_time"] = self._get_config_value( - items_common, -- "slow_io_detect_frequency", -+ "period_time", - int, -- self.DEFAULT_CONF["common"]["slow_io_detect_frequency"], -+ self.DEFAULT_CONF["common"]["period_time"], - gt=0 - ) -- frequency = self._conf["common"]["slow_io_detect_frequency"] -+ frequency = self._conf["common"]["period_time"] - ret = check_detect_frequency_is_valid(frequency) - if ret is None: -- log = f"slow io detect frequency: {frequency} is valid, "\ -+ log = f"period_time: {frequency} is valid, "\ - f"Check whether the value range is too large or is not an "\ - f"integer multiple of period_time.. exiting..." - Report.report_pass(log) -@@ -316,50 +332,41 @@ class ConfigParser: - self._conf["common"]["iotype"] = dup_iotype_list - - def _read_sliding_window_type(self, items_sliding_window: dict): -- sliding_window_type = items_sliding_window.get("sliding_window_type") -+ sliding_window_type = items_sliding_window.get("win_type") - if sliding_window_type is not None: -- self._conf["sliding_window"]["sliding_window_type"] = ( -+ self._conf["algorithm"]["win_type"] = ( - get_sliding_window_type_enum(sliding_window_type) - ) -- if self._conf["sliding_window"]["sliding_window_type"] is None: -+ if self._conf["algorithm"]["win_type"] is None: - logging.critical( -- "the sliding_window_type: %s you set is invalid. ai_block_io plug will exit.", -+ "the win_type: %s you set is invalid. ai_block_io plug will exit.", - sliding_window_type, - ) - Report.report_pass( -- f"the sliding_window_type: {sliding_window_type} you set is invalid. ai_block_io plug will exit." -+ f"the win_type: {sliding_window_type} you set is invalid. ai_block_io plug will exit." - ) - exit(1) - - def _read_window_size(self, items_sliding_window: dict): -- self._conf["sliding_window"]["window_size"] = self._get_config_value( -+ self._conf["algorithm"]["win_size"] = self._get_config_value( - items_sliding_window, -- "window_size", -+ "win_size", - int, -- self.DEFAULT_CONF["sliding_window"]["window_size"], -+ self.DEFAULT_CONF["algorithm"]["win_size"], - gt=0, -- le=3600, -+ le=300, - ) - - def _read_window_minimum_threshold(self, items_sliding_window: dict): -- default_window_minimum_threshold = self.DEFAULT_CONF["sliding_window"][ -- "window_minimum_threshold" -- ] -- if ( -- default_window_minimum_threshold -- > self._conf["sliding_window"]["window_size"] -- ): -- default_window_minimum_threshold = ( -- self._conf["sliding_window"]["window_size"] / 2 -- ) -- self._conf["sliding_window"]["window_minimum_threshold"] = ( -+ default_window_minimum_threshold = self.DEFAULT_CONF["algorithm"]["win_threshold"] -+ self._conf["algorithm"]["win_threshold"] = ( - self._get_config_value( - items_sliding_window, -- "window_minimum_threshold", -+ "win_threshold", - int, - default_window_minimum_threshold, - gt=0, -- le=self._conf["sliding_window"]["window_size"], -+ le=self._conf["algorithm"]["win_size"], - ) - ) - -@@ -406,7 +413,7 @@ class ConfigParser: - if con.has_section("common"): - items_common = dict(con.items("common")) - -- self._read_slow_io_detect_frequency(items_common) -+ self._read_period_time(items_common) - self._read_disks_to_detect(items_common) - self._read_stage(items_common) - self._read_iotype(items_common) -@@ -420,20 +427,9 @@ class ConfigParser: - self._read_train_data_duration(items_algorithm) - self._read_train_update_duration(items_algorithm) - self._read_algorithm_type_and_parameter(items_algorithm) -- else: -- Report.report_pass("not found algorithm section. exiting...") -- logging.critical("not found algorithm section. exiting...") -- exit(1) -- -- if con.has_section("sliding_window"): -- items_sliding_window = dict(con.items("sliding_window")) -- -- self._read_window_size(items_sliding_window) -- self._read_window_minimum_threshold(items_sliding_window) -- else: -- Report.report_pass("not found sliding_window section. exiting...") -- logging.critical("not found sliding_window section. exiting...") -- exit(1) -+ self._read_sliding_window_type(items_algorithm) -+ self._read_window_size(items_algorithm) -+ self._read_window_minimum_threshold(items_algorithm) - - if con.has_section("latency_sata_ssd"): - items_latency_sata_ssd = dict(con.items("latency_sata_ssd")) -@@ -451,6 +447,20 @@ class ConfigParser: - self.DEFAULT_CONF["latency_sata_ssd"]["write_tot_lim"], - gt=0, - ) -+ self._conf["latency_sata_ssd"]["read_avg_lim"] = self._get_config_value( -+ items_latency_sata_ssd, -+ "read_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_ssd"]["read_avg_lim"], -+ gt=0 -+ ) -+ self._conf["latency_sata_ssd"]["write_avg_lim"] = self._get_config_value( -+ items_latency_sata_ssd, -+ "write_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_ssd"]["write_avg_lim"], -+ gt=0 -+ ) - else: - Report.report_pass("not found latency_sata_ssd section. exiting...") - logging.critical("not found latency_sata_ssd section. exiting...") -@@ -472,6 +482,20 @@ class ConfigParser: - self.DEFAULT_CONF["latency_nvme_ssd"]["write_tot_lim"], - gt=0, - ) -+ self._conf["latency_nvme_ssd"]["read_avg_lim"] = self._get_config_value( -+ items_latency_nvme_ssd, -+ "read_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_nvme_ssd"]["read_avg_lim"], -+ gt=0 -+ ) -+ self._conf["latency_nvme_ssd"]["write_avg_lim"] = self._get_config_value( -+ items_latency_nvme_ssd, -+ "write_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_nvme_ssd"]["write_avg_lim"], -+ gt=0 -+ ) - else: - Report.report_pass("not found latency_nvme_ssd section. exiting...") - logging.critical("not found latency_nvme_ssd section. exiting...") -@@ -493,6 +517,20 @@ class ConfigParser: - self.DEFAULT_CONF["latency_sata_hdd"]["write_tot_lim"], - gt=0, - ) -+ self._conf["latency_sata_hdd"]["read_avg_lim"] = self._get_config_value( -+ items_latency_sata_hdd, -+ "read_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_hdd"]["read_avg_lim"], -+ gt=0 -+ ) -+ self._conf["latency_sata_hdd"]["write_avg_lim"] = self._get_config_value( -+ items_latency_sata_hdd, -+ "write_avg_lim", -+ int, -+ self.DEFAULT_CONF["latency_sata_hdd"]["write_avg_lim"], -+ gt=0 -+ ) - else: - Report.report_pass("not found latency_sata_hdd section. exiting...") - logging.critical("not found latency_sata_hdd section. exiting...") -@@ -542,6 +580,18 @@ class ConfigParser: - else: - return None - -+ def get_avg_lim(self, disk_type, io_type): -+ if io_type == "read": -+ return self._conf.get( -+ f"latency_{DISK_TYPE_MAP.get(disk_type, '')}", {} -+ ).get("read_avg_lim", None) -+ elif io_type == "write": -+ return self._conf.get( -+ f"latency_{DISK_TYPE_MAP.get(disk_type, '')}", {} -+ ).get("write_avg_lim", None) -+ else: -+ return None -+ - def get_train_data_duration_and_train_update_duration(self): - return ( - self._conf["algorithm"]["train_data_duration"], -@@ -550,13 +600,13 @@ class ConfigParser: - - def get_window_size_and_window_minimum_threshold(self): - return ( -- self._conf["sliding_window"]["window_size"], -- self._conf["sliding_window"]["window_minimum_threshold"], -+ self._conf["algorithm"]["win_size"], -+ self._conf["algorithm"]["win_threshold"], - ) - - @property -- def slow_io_detect_frequency(self): -- return self._conf["common"]["slow_io_detect_frequency"] -+ def period_time(self): -+ return self._conf["common"]["period_time"] - - @property - def algorithm_type(self): -@@ -564,7 +614,7 @@ class ConfigParser: - - @property - def sliding_window_type(self): -- return self._conf["sliding_window"]["sliding_window_type"] -+ return self._conf["algorithm"]["win_type"] - - @property - def train_data_duration(self): -@@ -576,11 +626,11 @@ class ConfigParser: - - @property - def window_size(self): -- return self._conf["sliding_window"]["window_size"] -+ return self._conf["algorithm"]["win_size"] - - @property - def window_minimum_threshold(self): -- return self._conf["sliding_window"]["window_minimum_threshold"] -+ return self._conf["algorithm"]["win_threshold"] - - @property - def absolute_threshold(self): -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index 8536f7a..e3a0952 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -28,9 +28,13 @@ class Detector: - self._threshold.attach_observer(self._slidingWindow) - self._count = None - -- def get_metric_name(self): -+ @property -+ def metric_name(self): - return self._metric_name - -+ def get_sliding_window_data(self): -+ return self._slidingWindow.get_data() -+ - def is_slow_io_event(self, io_data_dict_with_disk_name: dict): - if self._count is None: - self._count = datetime.now() -@@ -38,22 +42,27 @@ class Detector: - now_time = datetime.now() - time_diff = (now_time - self._count).total_seconds() - if time_diff >= 60: -- logging.info(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") -+ logging.info(f"({self._metric_name}) 's latest ai threshold is: {self._threshold.get_threshold()}.") - self._count = None - - logging.debug(f'enter Detector: {self}') - metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) - if metric_value is None: - logging.debug('not found metric value, so return None.') -- return (False, False), None, None, None -+ return (False, False), None, None, None, None - logging.debug(f'input metric value: {str(metric_value)}') - self._threshold.push_latest_data_to_queue(metric_value) - detection_result = self._slidingWindow.is_slow_io_event(metric_value) - # 检测到慢周期,由Detector负责打印info级别日志 - if detection_result[0][1]: -- logging.info(f'[abnormal period happen]: disk info: {self._metric_name}, window: {detection_result[1]}, ' -- f'current value: {metric_value}, ai threshold: {detection_result[2]}, ' -- f'absolute threshold: {detection_result[3]}') -+ logging.info(f'[abnormal_period]: disk: {self._metric_name.disk_name}, ' -+ f'stage: {self._metric_name.stage_name}, ' -+ f'iotype: {self._metric_name.io_access_type_name}, ' -+ f'metric: {self._metric_name.metric_name}, ' -+ f'current value: {metric_value}, ' -+ f'ai threshold: {detection_result[2]}, ' -+ f'absolute threshold upper limit: {detection_result[3]}, ' -+ f'lower limit: {detection_result[4]}') - else: - logging.debug(f'Detection result: {str(detection_result)}') - logging.debug(f'exit Detector: {self}') -@@ -75,41 +84,60 @@ class DiskDetector: - def add_detector(self, detector: Detector): - self._detector_list.append(detector) - -+ def get_detector_list_window(self): -+ latency_wins = {"read": {}, "write": {}} -+ iodump_wins = {"read": {}, "write": {}} -+ for detector in self._detector_list: -+ if detector.metric_name.metric_name == 'latency': -+ latency_wins[detector.metric_name.io_access_type_name][detector.metric_name.stage_name] = detector.get_sliding_window_data() -+ elif detector.metric_name.metric_name == 'io_dump': -+ iodump_wins[detector.metric_name.io_access_type_name][detector.metric_name.stage_name] = detector.get_sliding_window_data() -+ return latency_wins, iodump_wins -+ - def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -- """ -- 根因诊断逻辑:只有bio阶段发生异常,才认为发生了慢IO事件,即bio阶段异常是慢IO事件的必要条件 -- 情况一:bio异常,rq_driver也异常,则慢盘 -- 情况二:bio异常,rq_driver无异常,且有内核IO栈任意阶段异常,则IO栈异常 -- 情况三:bio异常,rq_driver无异常,且无内核IO栈任意阶段异常,则IO压力大 -- 情况四:bio异常,则UNKNOWN -- """ -- diagnosis_info = {"bio": [], "rq_driver": [], "io_stage": []} -+ diagnosis_info = {"bio": [], "rq_driver": [], "kernel_stack": []} - for detector in self._detector_list: - # result返回内容:(是否检测到慢IO,是否检测到慢周期)、窗口、ai阈值、绝对阈值 - # 示例: (False, False), self._io_data_queue, self._ai_threshold, self._abs_threshold - result = detector.is_slow_io_event(io_data_dict_with_disk_name) - if result[0][0]: -- if detector.get_metric_name().stage_name == "bio": -- diagnosis_info["bio"].append((detector.get_metric_name(), result)) -- elif detector.get_metric_name().stage_name == "rq_driver": -- diagnosis_info["rq_driver"].append((detector.get_metric_name(), result)) -+ if detector.metric_name.stage_name == "bio": -+ diagnosis_info["bio"].append(detector.metric_name) -+ elif detector.metric_name.stage_name == "rq_driver": -+ diagnosis_info["rq_driver"].append(detector.metric_name) - else: -- diagnosis_info["io_stage"].append((detector.get_metric_name(), result)) -+ diagnosis_info["kernel_stack"].append(detector.metric_name) - -- # 返回内容:(1)是否检测到慢IO事件、(2)MetricName、(3)滑动窗口及阈值、(4)慢IO事件根因 -- root_cause = None - if len(diagnosis_info["bio"]) == 0: -- return False, None, None, None -- elif len(diagnosis_info["rq_driver"]) != 0: -- root_cause = "[Root Cause: disk slow]" -- elif len(diagnosis_info["io_stage"]) != 0: -- stage_list = [] -- for io_stage in diagnosis_info["io_stage"]: -- stage_list.append(io_stage[0].stage_name) -- root_cause = f"[Root Cause: io stage slow, stage: {stage_list}]" -- if root_cause is None: -- root_cause = "[Root Cause: high io pressure]" -- return True, diagnosis_info["bio"][0][0], diagnosis_info["bio"][0][1], root_cause -+ return False, None, None, None, None, None, None -+ -+ driver_name = self._disk_name -+ reason = "unknown" -+ block_stack = set() -+ io_type = set() -+ alarm_type = set() -+ -+ for key, value in diagnosis_info.items(): -+ for metric_name in value: -+ block_stack.add(metric_name.stage_name) -+ io_type.add(metric_name.io_access_type_name) -+ alarm_type.add(metric_name.metric_name) -+ -+ latency_wins, iodump_wins = self.get_detector_list_window() -+ details = f"latency: {latency_wins}, iodump: {iodump_wins}" -+ -+ io_press = {"throtl", "wbt", "iocost", "bfq"} -+ driver_slow = {"rq_driver"} -+ kernel_slow = {"gettag", "plug", "deadline", "hctx", "requeue"} -+ -+ if not io_press.isdisjoint(block_stack): -+ reason = "io_press" -+ elif not driver_slow.isdisjoint(block_stack): -+ reason = "driver_slow" -+ elif not kernel_slow.isdisjoint(block_stack): -+ reason = "kernel_slow" -+ -+ return True, driver_name, reason, str(block_stack), str(io_type), str(alarm_type), details - - def __repr__(self): - msg = f'disk: {self._disk_name}, ' -diff --git a/src/python/sentryPlugins/ai_block_io/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py -index cebe41f..4083c43 100644 ---- a/src/python/sentryPlugins/ai_block_io/sliding_window.py -+++ b/src/python/sentryPlugins/ai_block_io/sliding_window.py -@@ -21,11 +21,12 @@ class SlidingWindowType(Enum): - - - class SlidingWindow: -- def __init__(self, queue_length: int, threshold: int, abs_threshold: int = None): -+ def __init__(self, queue_length: int, threshold: int, abs_threshold: int = None, avg_lim: int = None): - self._queue_length = queue_length - self._queue_threshold = threshold - self._ai_threshold = None - self._abs_threshold = abs_threshold -+ self._avg_lim = avg_lim - self._io_data_queue = [] - self._io_data_queue_abnormal_tag = [] - -@@ -35,8 +36,13 @@ class SlidingWindow: - self._io_data_queue_abnormal_tag.pop(0) - self._io_data_queue.append(data) - tag = False -- if ((self._ai_threshold is not None and data > self._ai_threshold) or -- (self._abs_threshold is not None and data > self._abs_threshold)): -+ if self._avg_lim is not None and data < self._avg_lim: -+ tag = False -+ self._io_data_queue_abnormal_tag.append(tag) -+ return tag -+ if self._ai_threshold is not None and data > self._ai_threshold: -+ tag = True -+ if self._abs_threshold is not None and data > self._abs_threshold: - tag = True - self._io_data_queue_abnormal_tag.append(tag) - return tag -@@ -52,6 +58,9 @@ class SlidingWindow: - def is_slow_io_event(self, data): - return False, None, None, None - -+ def get_data(self): -+ return self._io_data_queue -+ - def __repr__(self): - return "[SlidingWindow]" - -@@ -64,7 +73,7 @@ class NotContinuousSlidingWindow(SlidingWindow): - is_slow_io_event = False - if self._io_data_queue_abnormal_tag.count(True) >= self._queue_threshold: - is_slow_io_event = True -- return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold, self._avg_lim - - def __repr__(self): - return f"[NotContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" -@@ -85,7 +94,7 @@ class ContinuousSlidingWindow(SlidingWindow): - break - else: - consecutive_count = 0 -- return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold, self._avg_lim - - def __repr__(self): - return f"[ContinuousSlidingWindow, window size: {self._queue_length}, threshold: {self._queue_threshold}]" -@@ -100,7 +109,7 @@ class MedianSlidingWindow(SlidingWindow): - median = np.median(self._io_data_queue) - if median >= self._ai_threshold: - is_slow_io_event = True -- return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold -+ return (is_slow_io_event, is_abnormal_period), self._io_data_queue, self._ai_threshold, self._abs_threshold, self._avg_lim - - def __repr__(self): - return f"[MedianSlidingWindow, window size: {self._queue_length}]" --- -2.23.0 - diff --git a/ai_block_io-support-iodump.patch b/ai_block_io-support-iodump.patch deleted file mode 100644 index 990995e..0000000 --- a/ai_block_io-support-iodump.patch +++ /dev/null @@ -1,200 +0,0 @@ -From db97139c411e86d6dc07fe0e91ae38c1bef17a8d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Tue, 22 Oct 2024 16:37:52 +0800 -Subject: [PATCH] ai_block_io support iodump - ---- - config/plugins/ai_block_io.ini | 6 +- - .../sentryPlugins/ai_block_io/ai_block_io.py | 75 ++++++++++++------- - .../ai_block_io/config_parser.py | 30 ++++++++ - .../ai_block_io/sliding_window.py | 4 +- - 4 files changed, 84 insertions(+), 31 deletions(-) - -diff --git a/config/plugins/ai_block_io.ini b/config/plugins/ai_block_io.ini -index 422cfa3..040237d 100644 ---- a/config/plugins/ai_block_io.ini -+++ b/config/plugins/ai_block_io.ini -@@ -29,4 +29,8 @@ write_tot_lim=500 - - [latency_sata_hdd] - read_tot_lim=50000 --write_tot_lim=50000 -\ No newline at end of file -+write_tot_lim=50000 -+ -+[iodump] -+read_iodump_lim=0 -+write_iodump_lim=0 -\ No newline at end of file -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 4eecd43..f25e6d5 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -15,7 +15,7 @@ import logging - from collections import defaultdict - - from .detector import Detector, DiskDetector --from .threshold import ThresholdFactory -+from .threshold import ThresholdFactory, ThresholdType - from .sliding_window import SlidingWindowFactory - from .utils import get_data_queue_size_and_update_size - from .config_parser import ConfigParser -@@ -91,9 +91,8 @@ class SlowIODetection: - continue - for stage in stages: - for iotype in iotypes: -- self._detector_name_list[disk].append( -- MetricName(disk, disk_type, stage, iotype, "latency") -- ) -+ self._detector_name_list[disk].append(MetricName(disk, disk_type, stage, iotype, "latency")) -+ self._detector_name_list[disk].append(MetricName(disk, disk_type, stage, iotype, "io_dump")) - if disks: - logging.warning( - "disks: %s not in available disk list, so they will be ignored.", -@@ -123,31 +122,51 @@ class SlowIODetection: - for disk, metric_name_list in self._detector_name_list.items(): - disk_detector = DiskDetector(disk) - for metric_name in metric_name_list: -- threshold = ThresholdFactory().get_threshold( -- threshold_type, -- boxplot_parameter=self._config_parser.boxplot_parameter, -- n_sigma_paramter=self._config_parser.n_sigma_parameter, -- data_queue_size=data_queue_size, -- data_queue_update_size=update_size, -- ) -- abs_threshold = self._config_parser.get_tot_lim( -- metric_name.disk_type, metric_name.io_access_type_name -- ) -- if abs_threshold is None: -- logging.warning( -- "disk %s, disk type %s, io type %s, get tot lim error, so it will be ignored.", -- disk, -- metric_name.disk_type, -- metric_name.io_access_type_name, -+ -+ if metric_name.metric_name == 'latency': -+ threshold = ThresholdFactory().get_threshold( -+ threshold_type, -+ boxplot_parameter=self._config_parser.boxplot_parameter, -+ n_sigma_paramter=self._config_parser.n_sigma_parameter, -+ data_queue_size=data_queue_size, -+ data_queue_update_size=update_size, - ) -- sliding_window = SlidingWindowFactory().get_sliding_window( -- sliding_window_type, -- queue_length=window_size, -- threshold=window_threshold, -- abs_threshold=abs_threshold, -- ) -- detector = Detector(metric_name, threshold, sliding_window) -- disk_detector.add_detector(detector) -+ abs_threshold = self._config_parser.get_tot_lim( -+ metric_name.disk_type, metric_name.io_access_type_name -+ ) -+ if abs_threshold is None: -+ logging.warning( -+ "disk %s, disk type %s, io type %s, get tot lim error, so it will be ignored.", -+ disk, -+ metric_name.disk_type, -+ metric_name.io_access_type_name, -+ ) -+ sliding_window = SlidingWindowFactory().get_sliding_window( -+ sliding_window_type, -+ queue_length=window_size, -+ threshold=window_threshold, -+ abs_threshold=abs_threshold, -+ ) -+ detector = Detector(metric_name, threshold, sliding_window) -+ disk_detector.add_detector(detector) -+ continue -+ -+ elif metric_name.metric_name == 'io_dump': -+ threshold = ThresholdFactory().get_threshold(ThresholdType.AbsoluteThreshold) -+ abs_threshold = None -+ if metric_name.io_access_type_name == 'read': -+ abs_threshold = self._config_parser.read_iodump_lim -+ elif metric_name.io_access_type_name == 'write': -+ abs_threshold = self._config_parser.write_iodump_lim -+ sliding_window = SlidingWindowFactory().get_sliding_window( -+ sliding_window_type, -+ queue_length=window_size, -+ threshold=window_threshold -+ ) -+ detector = Detector(metric_name, threshold, sliding_window) -+ threshold.set_threshold(abs_threshold) -+ disk_detector.add_detector(detector) -+ - logging.info(f"disk: [{disk}] add detector:\n [{disk_detector}]") - self._disk_detectors[disk] = disk_detector - -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 274a31e..1117939 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -72,6 +72,7 @@ class ConfigParser: - "latency_sata_ssd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, - "latency_nvme_ssd": {"read_tot_lim": 500, "write_tot_lim": 500}, - "latency_sata_hdd": {"read_tot_lim": 50000, "write_tot_lim": 50000}, -+ "iodump": {"read_iodump_lim": 0, "write_iodump_lim": 0} - } - - def __init__(self, config_file_name): -@@ -497,6 +498,27 @@ class ConfigParser: - logging.critical("not found latency_sata_hdd section. exiting...") - exit(1) - -+ if con.has_section("iodump"): -+ items_iodump = dict(con.items("iodump")) -+ self._conf["iodump"]["read_iodump_lim"] = self._get_config_value( -+ items_iodump, -+ "read_iodump_lim", -+ int, -+ self.DEFAULT_CONF["iodump"]["read_iodump_lim"], -+ ge=0 -+ ) -+ self._conf["iodump"]["write_iodump_lim"] = self._get_config_value( -+ items_iodump, -+ "write_iodump_lim", -+ int, -+ self.DEFAULT_CONF["iodump"]["write_iodump_lim"], -+ ge=0 -+ ) -+ else: -+ Report.report_pass("not found iodump section. exiting...") -+ logging.critical("not found iodump section. exiting...") -+ exit(1) -+ - self.__print_all_config_value() - - def __repr__(self) -> str: -@@ -587,3 +609,11 @@ class ConfigParser: - @property - def n_sigma_parameter(self): - return self._conf["algorithm"]["n_sigma_parameter"] -+ -+ @property -+ def read_iodump_lim(self): -+ return self._conf["iodump"]["read_iodump_lim"] -+ -+ @property -+ def write_iodump_lim(self): -+ return self._conf["iodump"]["write_iodump_lim"] -\ No newline at end of file -diff --git a/src/python/sentryPlugins/ai_block_io/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py -index d7c402a..cebe41f 100644 ---- a/src/python/sentryPlugins/ai_block_io/sliding_window.py -+++ b/src/python/sentryPlugins/ai_block_io/sliding_window.py -@@ -35,8 +35,8 @@ class SlidingWindow: - self._io_data_queue_abnormal_tag.pop(0) - self._io_data_queue.append(data) - tag = False -- if ((self._ai_threshold is not None and data >= self._ai_threshold) or -- (self._abs_threshold is not None and data >= self._abs_threshold)): -+ if ((self._ai_threshold is not None and data > self._ai_threshold) or -+ (self._abs_threshold is not None and data > self._abs_threshold)): - tag = True - self._io_data_queue_abnormal_tag.append(tag) - return tag --- -2.23.0 - diff --git a/ai_block_io-support-stage-and-iotype.patch b/ai_block_io-support-stage-and-iotype.patch deleted file mode 100644 index 1fd7505..0000000 --- a/ai_block_io-support-stage-and-iotype.patch +++ /dev/null @@ -1,906 +0,0 @@ -From 13dc3712b4530a312aa43610f7696a4a62f30e96 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Fri, 11 Oct 2024 21:50:32 +0800 -Subject: [PATCH] ai_block_io support stage and iotype - ---- - config/plugins/ai_block_io.ini | 7 +- - .../sentryPlugins/ai_block_io/ai_block_io.py | 126 +++-- - .../ai_block_io/config_parser.py | 471 +++++++++++++----- - .../sentryPlugins/ai_block_io/data_access.py | 11 +- - .../sentryPlugins/ai_block_io/detector.py | 25 + - src/python/sentryPlugins/ai_block_io/utils.py | 3 +- - 6 files changed, 453 insertions(+), 190 deletions(-) - -diff --git a/config/plugins/ai_block_io.ini b/config/plugins/ai_block_io.ini -index 01ce266..a814d52 100644 ---- a/config/plugins/ai_block_io.ini -+++ b/config/plugins/ai_block_io.ini -@@ -1,7 +1,12 @@ -+[log] -+level=info -+ - [common] - absolute_threshold=40 - slow_io_detect_frequency=1 --log_level=info -+disk=default -+stage=bio -+iotype=read,write - - [algorithm] - train_data_duration=24 -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 77104a9..e1052ec 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -13,7 +13,7 @@ import time - import signal - import logging - --from .detector import Detector -+from .detector import Detector, DiskDetector - from .threshold import ThresholdFactory, AbsoluteThreshold - from .sliding_window import SlidingWindowFactory - from .utils import get_data_queue_size_and_update_size -@@ -34,8 +34,8 @@ def sig_handler(signum, frame): - class SlowIODetection: - _config_parser = None - _disk_list = None -- _detector_name_list = [] -- _detectors = {} -+ _detector_name_list = {} -+ _disk_detectors = {} - - def __init__(self, config_parser: ConfigParser): - self._config_parser = config_parser -@@ -43,85 +43,101 @@ class SlowIODetection: - self.__init_detector() - - def __init_detector_name_list(self): -- self._disk_list = check_collect_valid(self._config_parser.get_slow_io_detect_frequency()) -+ self._disk_list = check_collect_valid(self._config_parser.slow_io_detect_frequency) - if self._disk_list is None: - Report.report_pass("get available disk error, please check if the collector plug is enable. exiting...") - exit(1) - - logging.info(f"ai_block_io plug has found disks: {self._disk_list}") -- disks_to_detection: list = self._config_parser.get_disks_to_detection() -+ disks: list = self._config_parser.disks_to_detection -+ stages: list = self._config_parser.stage -+ iotypes: list = self._config_parser.iotype - # 情况1:None,则启用所有磁盘检测 - # 情况2:is not None and len = 0,则不启动任何磁盘检测 - # 情况3:len != 0,则取交集 -- if disks_to_detection is None: -+ if disks 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.') -+ for stage in stages: -+ for iotype in iotypes: -+ if disk not in self._detector_name_list: -+ self._detector_name_list[disk] = [] -+ self._detector_name_list[disk].append(MetricName(disk, stage, iotype, "latency")) - else: -- 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")) -+ for disk in disks: -+ if disk in self._disk_list: -+ for stage in stages: -+ for iotype in iotypes: -+ if disk not in self._detector_name_list: -+ self._detector_name_list[disk] = [] -+ self._detector_name_list[disk].append(MetricName(disk, stage, iotype, "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}') -+ logging.warning("disk: [%s] not in available disk list, so it will be ignored.", disk) -+ if len(self._detector_name_list) == 0: -+ logging.critical("the disks to detection is empty, ai_block_io will exit.") -+ Report.report_pass("the disks to detection is empty, ai_block_io will exit.") -+ exit(1) - - def __init_detector(self): -- train_data_duration, train_update_duration = (self._config_parser. -- get_train_data_duration_and_train_update_duration()) -- slow_io_detection_frequency = self._config_parser.get_slow_io_detect_frequency() -- threshold_type = self._config_parser.get_algorithm_type() -- data_queue_size, update_size = get_data_queue_size_and_update_size(train_data_duration, -- train_update_duration, -- slow_io_detection_frequency) -- sliding_window_type = self._config_parser.get_sliding_window_type() -- window_size, window_threshold = self._config_parser.get_window_size_and_window_minimum_threshold() -- -- for detector_name in self._detector_name_list: -- threshold = ThresholdFactory().get_threshold(threshold_type, -- boxplot_parameter=self._config_parser.get_boxplot_parameter(), -- n_sigma_paramter=self._config_parser.get_n_sigma_parameter(), -- data_queue_size=data_queue_size, -- data_queue_update_size=update_size) -- sliding_window = SlidingWindowFactory().get_sliding_window(sliding_window_type, queue_length=window_size, -- threshold=window_threshold) -- detector = Detector(detector_name, threshold, sliding_window) -- # 绝对阈值的阈值初始化 -- if isinstance(threshold, AbsoluteThreshold): -- threshold.set_threshold(self._config_parser.get_absolute_threshold()) -- self._detectors[detector_name] = detector -- logging.info(f"add detector: {detector}") -+ train_data_duration, train_update_duration = ( -+ self._config_parser.get_train_data_duration_and_train_update_duration() -+ ) -+ slow_io_detection_frequency = self._config_parser.slow_io_detect_frequency -+ threshold_type = self._config_parser.algorithm_type -+ data_queue_size, update_size = get_data_queue_size_and_update_size( -+ train_data_duration, train_update_duration, slow_io_detection_frequency -+ ) -+ sliding_window_type = self._config_parser.sliding_window_type -+ window_size, window_threshold = (self._config_parser.get_window_size_and_window_minimum_threshold()) -+ -+ for disk, metric_name_list in self._detector_name_list.items(): -+ threshold = ThresholdFactory().get_threshold( -+ threshold_type, -+ boxplot_parameter=self._config_parser.boxplot_parameter, -+ n_sigma_paramter=self._config_parser.n_sigma_parameter, -+ data_queue_size=data_queue_size, -+ data_queue_update_size=update_size, -+ ) -+ sliding_window = SlidingWindowFactory().get_sliding_window( -+ sliding_window_type, -+ queue_length=window_size, -+ threshold=window_threshold, -+ ) -+ disk_detector = DiskDetector(disk) -+ for metric_name in metric_name_list: -+ detector = Detector(metric_name, threshold, sliding_window) -+ disk_detector.add_detector(detector) -+ logging.info(f'disk: [{disk}] add detector:\n [{disk_detector}]') -+ self._disk_detectors[disk] = disk_detector - - def launch(self): - while True: -- logging.debug('step0. AI threshold slow io event detection is looping.') -+ logging.debug("step0. AI threshold slow io event detection is looping.") - - # Step1:获取IO数据 - io_data_dict_with_disk_name = get_io_data_from_collect_plug( -- self._config_parser.get_slow_io_detect_frequency(), self._disk_list -+ self._config_parser.slow_io_detect_frequency, self._disk_list - ) -- logging.debug(f'step1. Get io data: {str(io_data_dict_with_disk_name)}') -+ logging.debug(f"step1. Get io data: {str(io_data_dict_with_disk_name)}") - if io_data_dict_with_disk_name is None: -- Report.report_pass("get io data error, please check if the collector plug is enable. exitting...") -+ Report.report_pass( -+ "get io data error, please check if the collector plug is enable. exitting..." -+ ) - exit(1) - - # Step2:慢IO检测 -- logging.debug('step2. Start to detection slow io event.') -+ logging.debug("step2. Start to detection slow io event.") - slow_io_event_list = [] -- for metric_name, detector in self._detectors.items(): -- result = detector.is_slow_io_event(io_data_dict_with_disk_name) -+ for disk, disk_detector in self._disk_detectors.items(): -+ result = disk_detector.is_slow_io_event(io_data_dict_with_disk_name) - if result[0]: -- slow_io_event_list.append((detector.get_metric_name(), result)) -- logging.debug('step2. End to detection slow io event.') -+ slow_io_event_list.append(result) -+ logging.debug("step2. End to detection slow io event.") - - # Step3:慢IO事件上报 -- logging.debug('step3. Report slow io event to sysSentry.') -+ logging.debug("step3. Report slow io event to sysSentry.") - for slow_io_event in slow_io_event_list: -- metric_name: MetricName = slow_io_event[0] -- result = slow_io_event[1] -+ metric_name: MetricName = slow_io_event[1] - alarm_content = { - "driver_name": f"{metric_name.get_disk_name()}", - "reason": "disk_slow", -@@ -129,14 +145,14 @@ class SlowIODetection: - "io_type": f"{metric_name.get_io_access_type_name()}", - "alarm_source": "ai_block_io", - "alarm_type": "latency", -- "details": f"current window is: {result[1]}, threshold is: {result[2]}.", -+ "details": f"current window is: {slow_io_event[2]}, threshold is: {slow_io_event[3]}.", - } - Xalarm.major(alarm_content) - logging.warning(alarm_content) - - # Step4:等待检测时间 -- logging.debug('step4. Wait to start next slow io event detection loop.') -- time.sleep(self._config_parser.get_slow_io_detect_frequency()) -+ logging.debug("step4. Wait to start next slow io event detection loop.") -+ time.sleep(self._config_parser.slow_io_detect_frequency) - - - def main(): -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 354c122..a357766 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -9,44 +9,60 @@ - # PURPOSE. - # See the Mulan PSL v2 for more details. - -+import os - import configparser - import logging - -+from .alarm_report import Report - 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" - -+ALL_STAGE_LIST = ['throtl', 'wbt', 'gettag', 'plug', 'deadline', 'hctx', 'requeue', 'rq_driver', 'bio'] -+ALL_IOTPYE_LIST = ['read', 'write'] -+ - - def init_log_format(log_level: str): - 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.') -+ 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: - DEFAULT_ABSOLUTE_THRESHOLD = 40 - DEFAULT_SLOW_IO_DETECTION_FREQUENCY = 1 -- DEFAULT_LOG_LEVEL = 'info' -+ DEFAULT_LOG_LEVEL = "info" -+ -+ DEFAULT_STAGE = 'throtl,wbt,gettag,plug,deadline,hctx,requeue,rq_driver,bio' -+ DEFAULT_IOTYPE = 'read,write' - -- DEFAULT_ALGORITHM_TYPE = 'boxplot' -+ DEFAULT_ALGORITHM_TYPE = "boxplot" - DEFAULT_TRAIN_DATA_DURATION = 24 - DEFAULT_TRAIN_UPDATE_DURATION = 2 - DEFAULT_BOXPLOT_PARAMETER = 1.5 - DEFAULT_N_SIGMA_PARAMETER = 3 - -- DEFAULT_SLIDING_WINDOW_TYPE = 'not_continuous' -+ DEFAULT_SLIDING_WINDOW_TYPE = "not_continuous" - DEFAULT_WINDOW_SIZE = 30 - DEFAULT_WINDOW_MINIMUM_THRESHOLD = 6 - - def __init__(self, config_file_name): - self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -- self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -+ self.__slow_io_detect_frequency = ( -+ ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -+ ) - self.__log_level = ConfigParser.DEFAULT_LOG_LEVEL - self.__disks_to_detection = None -+ self.__stage = ConfigParser.DEFAULT_STAGE -+ self.__iotype = ConfigParser.DEFAULT_IOTYPE - -- self.__algorithm_type = ConfigParser.DEFAULT_ALGORITHM_TYPE -+ self.__algorithm_type = get_threshold_type_enum( -+ ConfigParser.DEFAULT_ALGORITHM_TYPE -+ ) - self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION - self.__train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION - self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -@@ -58,199 +74,398 @@ class ConfigParser: - - self.__config_file_name = config_file_name - -- def __read_absolute_threshold(self, items_common: dict): -+ def _get_config_value( -+ self, -+ config_items: dict, -+ key: str, -+ value_type, -+ default_value=None, -+ gt=None, -+ ge=None, -+ lt=None, -+ le=None, -+ ): -+ value = config_items.get(key) -+ if value is None: -+ logging.warning( -+ "config of %s not found, the default value %s will be used.", -+ key, -+ default_value, -+ ) -+ value = default_value -+ if not value: -+ logging.critical( -+ "the value of %s is empty, ai_block_io plug will exit.", key -+ ) -+ Report.report_pass( -+ f"the value of {key} is empty, ai_block_io plug will exit." -+ ) -+ exit(1) - try: -- self.__absolute_threshold = float(items_common.get('absolute_threshold', -- ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD)) -- if self.__absolute_threshold <= 0: -- logging.warning( -- f'the_absolute_threshold: {self.__absolute_threshold} you set is invalid, use default value: {ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD}.') -- self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -+ value = value_type(value) - except ValueError: -- self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -- logging.warning( -- f'the_absolute_threshold type conversion has error, use default value: {self.__absolute_threshold}.') -+ logging.critical( -+ "the value of %s is not a valid %s, ai_block_io plug will exit.", -+ key, -+ value_type, -+ ) -+ Report.report_pass( -+ f"the value of {key} is not a valid {value_type}, ai_block_io plug will exit." -+ ) -+ exit(1) -+ if gt is not None and value <= gt: -+ logging.critical( -+ "the value of %s is not greater than %s, ai_block_io plug will exit.", -+ key, -+ gt, -+ ) -+ Report.report_pass( -+ f"the value of {key} is not greater than {gt}, ai_block_io plug will exit." -+ ) -+ exit(1) -+ if ge is not None and value < ge: -+ logging.critical( -+ "the value of %s is not greater than or equal to %s, ai_block_io plug will exit.", -+ key, -+ ge, -+ ) -+ Report.report_pass( -+ f"the value of {key} is not greater than or equal to {ge}, ai_block_io plug will exit." -+ ) -+ exit(1) -+ if lt is not None and value >= lt: -+ logging.critical( -+ "the value of %s is not less than %s, ai_block_io plug will exit.", -+ key, -+ lt, -+ ) -+ Report.report_pass( -+ f"the value of {key} is not less than {lt}, ai_block_io plug will exit." -+ ) -+ exit(1) -+ if le is not None and value > le: -+ logging.critical( -+ "the value of %s is not less than or equal to %s, ai_block_io plug will exit.", -+ key, -+ le, -+ ) -+ Report.report_pass( -+ f"the value of {key} is not less than or equal to {le}, ai_block_io plug will exit." -+ ) -+ exit(1) -+ -+ return value -+ -+ def __read_absolute_threshold(self, items_common: dict): -+ self.__absolute_threshold = self._get_config_value( -+ items_common, -+ "absolute_threshold", -+ float, -+ ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD, -+ gt=0, -+ ) - - def __read__slow_io_detect_frequency(self, items_common: dict): -- try: -- self.__slow_io_detect_frequency = int(items_common.get('slow_io_detect_frequency', -- ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY)) -- if self.__slow_io_detect_frequency < 1 or self.__slow_io_detect_frequency > 10: -- logging.warning( -- f'the slow_io_detect_frequency: {self.__slow_io_detect_frequency} you set is invalid, use default value: {ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY}.') -- self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -- except ValueError: -- self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -- logging.warning(f'slow_io_detect_frequency type conversion has error, use default value: {self.__slow_io_detect_frequency}.') -+ self.__slow_io_detect_frequency = self._get_config_value( -+ items_common, -+ "slow_io_detect_frequency", -+ int, -+ ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY, -+ gt=0, -+ le=300, -+ ) - - def __read__disks_to_detect(self, items_common: dict): -- disks_to_detection = items_common.get('disk') -+ disks_to_detection = items_common.get("disk") - if disks_to_detection is None: -- logging.warning(f'config of disk not found, the default value will be used.') -+ logging.warning("config of disk not found, the default value will be used.") - self.__disks_to_detection = None - return -- 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': -+ disks_to_detection = disks_to_detection.strip() -+ if not disks_to_detection: -+ logging.critical("the value of disk is empty, ai_block_io plug will exit.") -+ Report.report_pass( -+ "the value of disk is empty, ai_block_io plug will exit." -+ ) -+ exit(1) -+ disk_list = disks_to_detection.split(",") -+ 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: -- self.__train_data_duration = float(items_algorithm.get('train_data_duration', -- ConfigParser.DEFAULT_TRAIN_DATA_DURATION)) -- if self.__train_data_duration <= 0 or self.__train_data_duration > 720: -- logging.warning( -- f'the train_data_duration: {self.__train_data_duration} you set is invalid, use default value: {ConfigParser.DEFAULT_TRAIN_DATA_DURATION}.') -- self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -- except ValueError: -- self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -- logging.warning(f'the train_data_duration type conversion has error, use default value: {self.__train_data_duration}.') -+ self.__train_data_duration = self._get_config_value( -+ items_algorithm, -+ "train_data_duration", -+ float, -+ ConfigParser.DEFAULT_TRAIN_DATA_DURATION, -+ gt=0, -+ le=720, -+ ) - - def __read__train_update_duration(self, items_algorithm: dict): - default_train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION - if default_train_update_duration > self.__train_data_duration: - default_train_update_duration = self.__train_data_duration / 2 -- -- try: -- self.__train_update_duration = float(items_algorithm.get('train_update_duration', -- ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION)) -- if self.__train_update_duration <= 0 or self.__train_update_duration > self.__train_data_duration: -- logging.warning( -- f'the train_update_duration: {self.__train_update_duration} you set is invalid, use default value: {default_train_update_duration}.') -- self.__train_update_duration = default_train_update_duration -- except ValueError: -- self.__train_update_duration = default_train_update_duration -- logging.warning(f'the train_update_duration type conversion has error, use default value: {self.__train_update_duration}.') -+ self.__train_update_duration = self._get_config_value( -+ items_algorithm, -+ "train_update_duration", -+ float, -+ default_train_update_duration, -+ gt=0, -+ le=self.__train_data_duration, -+ ) - - def __read__algorithm_type_and_parameter(self, items_algorithm: dict): -- algorithm_type = items_algorithm.get('algorithm_type', ConfigParser.DEFAULT_ALGORITHM_TYPE) -+ algorithm_type = items_algorithm.get( -+ "algorithm_type", ConfigParser.DEFAULT_ALGORITHM_TYPE -+ ) - self.__algorithm_type = get_threshold_type_enum(algorithm_type) -+ if self.__algorithm_type is None: -+ logging.critical( -+ "the algorithm_type: %s you set is invalid. ai_block_io plug will exit.", -+ algorithm_type, -+ ) -+ Report.report_pass( -+ f"the algorithm_type: {algorithm_type} you set is invalid. ai_block_io plug will exit." -+ ) -+ exit(1) - - if self.__algorithm_type == ThresholdType.NSigmaThreshold: -- try: -- self.__n_sigma_parameter = float(items_algorithm.get('n_sigma_parameter', -- ConfigParser.DEFAULT_N_SIGMA_PARAMETER)) -- if self.__n_sigma_parameter <= 0 or self.__n_sigma_parameter > 10: -- logging.warning( -- f'the n_sigma_parameter: {self.__n_sigma_parameter} you set is invalid, use default value: {ConfigParser.DEFAULT_N_SIGMA_PARAMETER}.') -- self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -- except ValueError: -- self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -- logging.warning(f'the n_sigma_parameter type conversion has error, use default value: {self.__n_sigma_parameter}.') -+ self.__n_sigma_parameter = self._get_config_value( -+ items_algorithm, -+ "n_sigma_parameter", -+ float, -+ ConfigParser.DEFAULT_N_SIGMA_PARAMETER, -+ gt=0, -+ le=10, -+ ) - elif self.__algorithm_type == ThresholdType.BoxplotThreshold: -- try: -- self.__boxplot_parameter = float(items_algorithm.get('boxplot_parameter', -- ConfigParser.DEFAULT_BOXPLOT_PARAMETER)) -- if self.__boxplot_parameter <= 0 or self.__boxplot_parameter > 10: -- logging.warning( -- f'the boxplot_parameter: {self.__boxplot_parameter} you set is invalid, use default value: {ConfigParser.DEFAULT_BOXPLOT_PARAMETER}.') -- self.__n_sigma_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -- except ValueError: -- self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -- logging.warning(f'the boxplot_parameter type conversion has error, use default value: {self.__boxplot_parameter}.') -+ self.__boxplot_parameter = self._get_config_value( -+ items_algorithm, -+ "boxplot_parameter", -+ float, -+ ConfigParser.DEFAULT_BOXPLOT_PARAMETER, -+ gt=0, -+ le=10, -+ ) -+ -+ def __read__stage(self, items_algorithm: dict): -+ stage_str = items_algorithm.get('stage', ConfigParser.DEFAULT_STAGE) -+ stage_list = stage_str.split(',') -+ if len(stage_list) == 1 and stage_list[0] == '': -+ logging.critical('stage value not allow is empty, exiting...') -+ exit(1) -+ if len(stage_list) == 1 and stage_list[0] == 'default': -+ logging.warning(f'stage will enable default value: {ConfigParser.DEFAULT_STAGE}') -+ self.__stage = ALL_STAGE_LIST -+ return -+ for stage in stage_list: -+ if stage not in ALL_STAGE_LIST: -+ logging.critical(f'stage: {stage} is not valid stage, ai_block_io will exit...') -+ exit(1) -+ dup_stage_list = set(stage_list) -+ if 'bio' not in dup_stage_list: -+ logging.critical('stage must contains bio stage, exiting...') -+ exit(1) -+ self.__stage = dup_stage_list -+ -+ def __read__iotype(self, items_algorithm: dict): -+ iotype_str = items_algorithm.get('iotype', ConfigParser.DEFAULT_IOTYPE) -+ iotype_list = iotype_str.split(',') -+ if len(iotype_list) == 1 and iotype_list[0] == '': -+ logging.critical('iotype value not allow is empty, exiting...') -+ exit(1) -+ if len(iotype_list) == 1 and iotype_list[0] == 'default': -+ logging.warning(f'iotype will enable default value: {ConfigParser.DEFAULT_IOTYPE}') -+ self.__iotype = ALL_IOTPYE_LIST -+ return -+ for iotype in iotype_list: -+ if iotype not in ALL_IOTPYE_LIST: -+ logging.critical(f'iotype: {iotype} is not valid iotype, ai_block_io will exit...') -+ exit(1) -+ dup_iotype_list = set(iotype_list) -+ self.__iotype = dup_iotype_list - - def __read__window_size(self, items_sliding_window: dict): -- try: -- self.__window_size = int(items_sliding_window.get('window_size', -- ConfigParser.DEFAULT_WINDOW_SIZE)) -- if self.__window_size < 1 or self.__window_size > 3600: -- logging.warning( -- f'the window_size: {self.__window_size} you set is invalid, use default value: {ConfigParser.DEFAULT_WINDOW_SIZE}.') -- self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -- except ValueError: -- self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -- logging.warning(f'window_size type conversion has error, use default value: {self.__window_size}.') -+ self.__window_size = self._get_config_value( -+ items_sliding_window, -+ "window_size", -+ int, -+ ConfigParser.DEFAULT_WINDOW_SIZE, -+ gt=0, -+ le=3600, -+ ) - - def __read__window_minimum_threshold(self, items_sliding_window: dict): - default_window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD - if default_window_minimum_threshold > self.__window_size: - default_window_minimum_threshold = self.__window_size / 2 -- try: -- self.__window_minimum_threshold = ( -- int(items_sliding_window.get('window_minimum_threshold', -- ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD))) -- if self.__window_minimum_threshold < 1 or self.__window_minimum_threshold > self.__window_size: -- logging.warning( -- f'the window_minimum_threshold: {self.__window_minimum_threshold} you set is invalid, use default value: {default_window_minimum_threshold}.') -- self.__window_minimum_threshold = default_window_minimum_threshold -- except ValueError: -- self.__window_minimum_threshold = default_window_minimum_threshold -- logging.warning(f'window_minimum_threshold type conversion has error, use default value: {self.__window_minimum_threshold}.') -+ self.__window_minimum_threshold = self._get_config_value( -+ items_sliding_window, -+ "window_minimum_threshold", -+ int, -+ default_window_minimum_threshold, -+ gt=0, -+ le=self.__window_size, -+ ) - - def read_config_from_file(self): -+ if not os.path.exists(self.__config_file_name): -+ init_log_format(self.__log_level) -+ logging.critical( -+ "config file %s not found, ai_block_io plug will exit.", -+ self.__config_file_name, -+ ) -+ Report.report_pass( -+ f"config file {self.__config_file_name} not found, ai_block_io plug will exit." -+ ) -+ exit(1) -+ - con = configparser.ConfigParser() - try: -- con.read(self.__config_file_name, encoding='utf-8') -+ 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.') -+ logging.critical( -+ f"config file read error: %s, ai_block_io plug will exit.", e -+ ) -+ Report.report_pass( -+ 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')) -- self.__log_level = items_common.get('log_level', ConfigParser.DEFAULT_LOG_LEVEL) -+ if con.has_section('log'): -+ items_log = dict(con.items('log')) -+ # 情况一:没有log,则使用默认值 -+ # 情况二:有log,值为空或异常,使用默认值 -+ # 情况三:有log,值正常,则使用该值 -+ self.__log_level = items_log.get('level', ConfigParser.DEFAULT_LOG_LEVEL) - init_log_format(self.__log_level) -+ else: -+ init_log_format(self.__log_level) -+ logging.warning(f"log section parameter not found, it will be set to default value.") -+ -+ if con.has_section("common"): -+ items_common = dict(con.items("common")) - self.__read_absolute_threshold(items_common) - self.__read__slow_io_detect_frequency(items_common) - self.__read__disks_to_detect(items_common) -+ self.__read__stage(items_common) -+ self.__read__iotype(items_common) - else: -- init_log_format(self.__log_level) -- logging.warning("common section parameter not found, it will be set to default value.") -+ logging.warning( -+ "common section parameter not found, it will be set to default value." -+ ) - -- if con.has_section('algorithm'): -- items_algorithm = dict(con.items('algorithm')) -+ if con.has_section("algorithm"): -+ items_algorithm = dict(con.items("algorithm")) - self.__read__train_data_duration(items_algorithm) - self.__read__train_update_duration(items_algorithm) - self.__read__algorithm_type_and_parameter(items_algorithm) - else: -- logging.warning("algorithm section parameter not found, it will be set to default value.") -- -- if con.has_section('sliding_window'): -- items_sliding_window = dict(con.items('sliding_window')) -- sliding_window_type = items_sliding_window.get('sliding_window_type', -- ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE) -- self.__sliding_window_type = get_sliding_window_type_enum(sliding_window_type) -+ logging.warning( -+ "algorithm section parameter not found, it will be set to default value." -+ ) -+ -+ if con.has_section("sliding_window"): -+ items_sliding_window = dict(con.items("sliding_window")) -+ sliding_window_type = items_sliding_window.get( -+ "sliding_window_type", ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE -+ ) -+ self.__sliding_window_type = get_sliding_window_type_enum( -+ sliding_window_type -+ ) - self.__read__window_size(items_sliding_window) - self.__read__window_minimum_threshold(items_sliding_window) - else: -- logging.warning("sliding_window section parameter not found, it will be set to default value.") -+ logging.warning( -+ "sliding_window section parameter not found, it will be set to default value." -+ ) - - self.__print_all_config_value() - -+ def __repr__(self): -+ config_str = { -+ 'log.level': self.__log_level, -+ 'common.absolute_threshold': self.__absolute_threshold, -+ 'common.slow_io_detect_frequency': self.__slow_io_detect_frequency, -+ 'common.disk': self.__disks_to_detection, -+ 'common.stage': self.__stage, -+ 'common.iotype': self.__iotype, -+ 'algorithm.train_data_duration': self.__train_data_duration, -+ 'algorithm.train_update_duration': self.__train_update_duration, -+ 'algorithm.algorithm_type': self.__algorithm_type, -+ 'algorithm.boxplot_parameter': self.__boxplot_parameter, -+ 'algorithm.n_sigma_parameter': self.__n_sigma_parameter, -+ 'sliding_window.sliding_window_type': self.__sliding_window_type, -+ 'sliding_window.window_size': self.__window_size, -+ 'sliding_window.window_minimum_threshold': self.__window_minimum_threshold -+ } -+ return str(config_str) -+ - def __print_all_config_value(self): -- pass -+ logging.info(f"all config is follow:\n {self}") -+ -+ def get_train_data_duration_and_train_update_duration(self): -+ return self.__train_data_duration, self.__train_update_duration - -- def get_slow_io_detect_frequency(self): -+ def get_window_size_and_window_minimum_threshold(self): -+ return self.__window_size, self.__window_minimum_threshold -+ -+ @property -+ def slow_io_detect_frequency(self): - return self.__slow_io_detect_frequency - -- def get_algorithm_type(self): -+ @property -+ def algorithm_type(self): - return self.__algorithm_type - -- def get_sliding_window_type(self): -+ @property -+ def sliding_window_type(self): - return self.__sliding_window_type - -- def get_train_data_duration_and_train_update_duration(self): -- return self.__train_data_duration, self.__train_update_duration -+ @property -+ def train_data_duration(self): -+ return self.__train_data_duration - -- def get_window_size_and_window_minimum_threshold(self): -- return self.__window_size, self.__window_minimum_threshold -+ @property -+ def train_update_duration(self): -+ return self.__train_update_duration -+ -+ @property -+ def window_size(self): -+ return self.__window_size - -- def get_absolute_threshold(self): -+ @property -+ def window_minimum_threshold(self): -+ return self.__window_minimum_threshold -+ -+ @property -+ def absolute_threshold(self): - return self.__absolute_threshold - -- def get_log_level(self): -+ @property -+ def log_level(self): - return self.__log_level - -- def get_disks_to_detection(self): -+ @property -+ def disks_to_detection(self): - return self.__disks_to_detection - -- def get_boxplot_parameter(self): -+ @property -+ def stage(self): -+ return self.__stage -+ -+ @property -+ def iotype(self): -+ return self.__iotype -+ -+ @property -+ def boxplot_parameter(self): - return self.__boxplot_parameter - -- def get_n_sigma_parameter(self): -+ @property -+ def n_sigma_parameter(self): - return self.__n_sigma_parameter -diff --git a/src/python/sentryPlugins/ai_block_io/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -index c7679cd..ed997e6 100644 ---- a/src/python/sentryPlugins/ai_block_io/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -41,11 +41,14 @@ def check_collect_valid(period): - try: - data = json.loads(data_raw["message"]) - except Exception as e: -- logging.warning(f"get io data failed, {e}") -+ logging.warning(f"get valid devices failed, occur exception: {e}") -+ return None -+ if not data: -+ logging.warning(f"get valid devices failed, return {data_raw}") - return None - return [k for k in data.keys()] - else: -- logging.warning(f"get io data failed, return {data_raw}") -+ logging.warning(f"get valid devices failed, return {data_raw}") - return None - - -@@ -60,7 +63,7 @@ def _get_raw_data(period, disk_list): - - def _get_io_stage_data(data): - io_stage_data = IOStageData() -- for data_type in ('read', 'write', 'flush', 'discard'): -+ for data_type in ("read", "write", "flush", "discard"): - if data_type in data: - getattr(io_stage_data, data_type).latency = data[data_type][0] - getattr(io_stage_data, data_type).io_dump = data[data_type][1] -@@ -87,7 +90,7 @@ def get_io_data_from_collect_plug(period, disk_list): - getattr(disk_ret, k) - setattr(disk_ret, k, _get_io_stage_data(v)) - except AttributeError: -- logging.debug(f'no attr {k}') -+ logging.debug(f"no attr {k}") - continue - ret[disk] = disk_ret - return ret -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index 0ed282b..e710ddd 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -53,3 +53,28 @@ class Detector: - 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}') -+ -+ -+class DiskDetector: -+ -+ def __init__(self, disk_name: str): -+ self._disk_name = disk_name -+ self._detector_list = [] -+ -+ def add_detector(self, detector: Detector): -+ self._detector_list.append(detector) -+ -+ def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -+ # 只有bio阶段发生异常,就认为发生了慢IO事件 -+ # todo:根因诊断 -+ for detector in self._detector_list: -+ result = detector.is_slow_io_event(io_data_dict_with_disk_name) -+ if result[0] and detector.get_metric_name().get_stage_name() == 'bio': -+ return result[0], detector.get_metric_name(), result[1], result[2] -+ return False, None, None, None -+ -+ def __repr__(self): -+ msg = f'disk: {self._disk_name}, ' -+ for detector in self._detector_list: -+ msg += f'\n detector: [{detector}]' -+ return msg -diff --git a/src/python/sentryPlugins/ai_block_io/utils.py b/src/python/sentryPlugins/ai_block_io/utils.py -index 8dbba06..0ed37b9 100644 ---- a/src/python/sentryPlugins/ai_block_io/utils.py -+++ b/src/python/sentryPlugins/ai_block_io/utils.py -@@ -25,8 +25,7 @@ def get_threshold_type_enum(algorithm_type: str): - return ThresholdType.BoxplotThreshold - if algorithm_type.lower() == 'n_sigma': - return ThresholdType.NSigmaThreshold -- logging.warning(f"the algorithm type: {algorithm_type} you set is invalid, use default value: boxplot") -- return ThresholdType.BoxplotThreshold -+ return None - - - def get_sliding_window_type_enum(sliding_window_type: str): --- -2.23.0 - diff --git a/avg_block_io-send-alarm-to-xalarmd.patch b/avg_block_io-send-alarm-to-xalarmd.patch deleted file mode 100644 index 3995d08..0000000 --- a/avg_block_io-send-alarm-to-xalarmd.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 7d5ad8f2dd87432b8f46ea5002400ee46cb6756a Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 9 Oct 2024 14:22:38 +0800 -Subject: [PATCH] avg_block_io send alarm to xalarmd - ---- - config/tasks/avg_block_io.mod | 2 ++ - .../sentryPlugins/avg_block_io/module_conn.py | 23 +++++++++++++++---- - 2 files changed, 21 insertions(+), 4 deletions(-) - -diff --git a/config/tasks/avg_block_io.mod b/config/tasks/avg_block_io.mod -index b9b6f34..bcd063b 100644 ---- a/config/tasks/avg_block_io.mod -+++ b/config/tasks/avg_block_io.mod -@@ -3,3 +3,5 @@ enabled=yes - task_start=/usr/bin/python3 /usr/bin/avg_block_io - task_stop=pkill -f /usr/bin/avg_block_io - type=oneshot -+alarm_id=1002 -+alarm_clear_time=5 -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -index 0da4208..2fc5a83 100644 ---- a/src/python/sentryPlugins/avg_block_io/module_conn.py -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -16,6 +16,7 @@ import time - from .utils import is_abnormal - from sentryCollector.collect_plugin import is_iocollect_valid, get_io_data, Result_Messages - from syssentry.result import ResultLevel, report_result -+from xalarm.sentry_notify import xalarm_report, MINOR_ALM, ALARM_TYPE_OCCUR - - - TASK_NAME = "avg_block_io" -@@ -68,19 +69,33 @@ def process_report_data(disk_name, rw, io_data): - if not is_abnormal((disk_name, 'bio', rw), io_data): - return - -+ msg = {"alarm_source": TASK_NAME, "driver_name": disk_name, "io_type": rw} -+ - ctrl_stage = ['throtl', 'wbt', 'iocost', 'bfq'] - for stage_name in ctrl_stage: - if is_abnormal((disk_name, stage_name, rw), io_data): -- logging.warning("{} - {} - {} report IO press".format(time.ctime(), disk_name, rw)) -+ msg["reason"] = "IO press slow" -+ msg["block_stack"] = f"bio,{stage_name}" -+ logging.warning("{} - {} report IO press slow".format(disk_name, rw)) -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) - return - - if is_abnormal((disk_name, 'rq_driver', rw), io_data): -- logging.warning("{} - {} - {} report driver".format(time.ctime(), disk_name, rw)) -+ msg["reason"] = "driver slow" -+ msg["block_stack"] = "bio,rq_driver" -+ logging.warning("{} - {} report driver slow".format(disk_name, rw)) -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) - return - - kernel_stage = ['gettag', 'plug', 'deadline', 'hctx', 'requeue'] - 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)) -+ msg["reason"] = "kernel slow" -+ msg["block_stack"] = f"bio,{stage_name}" -+ logging.warning("{} - {} report kernel slow".format(disk_name, rw)) -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) - return -- logging.warning("{} - {} - {} report IO press".format(time.ctime(), disk_name, rw)) -+ msg["reason"] = "unknown" -+ msg["block_stack"] = "bio" -+ logging.warning("{} - {} report UNKNOWN slow".format(disk_name, rw)) -+ xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) --- -2.33.0 - diff --git a/bugfix-typo.patch b/bugfix-typo.patch deleted file mode 100644 index 946a0cb..0000000 --- a/bugfix-typo.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 7d5ad8f2dd87432b8f46ea5002400ee46cb6756a Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 9 Oct 2024 14:22:38 +0800 -Subject: [PATCH] bugfix typo - ---- - src/python/sentryPlugins/avg_block_io/avg_block_io.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index b6b3b28..26a60c5 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -114,7 +114,7 @@ def read_config_lat_iodump(io_dic, config): - common_param = {} - lat_sec = None - if not config.has_section("latency"): -- logging.warning("Cannot find algorithm section in config file") -+ logging.warning("Cannot find latency section in config file") - else: - lat_sec = config["latency"] - -@@ -122,7 +122,7 @@ def read_config_lat_iodump(io_dic, config): - if not config.has_section("iodump"): - logging.warning("Cannot find iodump section in config file") - else: -- lat_sec = config["iodump"] -+ iodump_sec = config["iodump"] - - if not lat_sec and not iodump_sec: - return common_param --- -2.27.0 - diff --git a/change-alarm-length.patch b/change-alarm-length.patch deleted file mode 100644 index 27c49ed..0000000 --- a/change-alarm-length.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 67439c0040b1fb0614ac009bf53062e9ec2880aa Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Wed, 9 Oct 2024 11:55:35 +0800 -Subject: [PATCH 1/2] change alarm length - -Signed-off-by: jinsaihang ---- - src/python/syssentry/sentryctl | 3 +++ - src/python/syssentry/syssentry.py | 3 +++ - 2 files changed, 6 insertions(+) - -diff --git a/src/python/syssentry/sentryctl b/src/python/syssentry/sentryctl -index 675c17a..3de93d0 100644 ---- a/src/python/syssentry/sentryctl -+++ b/src/python/syssentry/sentryctl -@@ -25,6 +25,7 @@ MAX_PARAM_LENGTH = 256 - - RESULT_MSG_DATA_LEN = 4 - CTL_MSG_LEN_LEN = 3 -+ALARM_MSG_DATA_LEN = 6 - DEFAULT_ALARM_TIME_RANGE = 10 - - def status_output_format(res_data): -@@ -173,6 +174,8 @@ if __name__ == '__main__': - request_message = json.dumps(req_msg_struct) - if client_args.cmd_type == 'get_result': - result_message = client_send_and_recv(request_message, RESULT_MSG_DATA_LEN) -+ elif client_args.cmd_type == 'get_alarm': -+ result_message = client_send_and_recv(request_message, ALARM_MSG_DATA_LEN) - else: - result_message = client_send_and_recv(request_message, CTL_MSG_LEN_LEN) - if not result_message: -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index c2dee85..ea09095 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -56,6 +56,7 @@ CTL_MSG_MAGIC_LEN = 3 - CTL_MSG_LEN_LEN = 3 - CTL_MAGIC = "CTL" - RES_MAGIC = "RES" -+ALARM_MSG_DATA_LEN = 6 - - CTL_LISTEN_QUEUE_LEN = 5 - SERVER_EPOLL_TIMEOUT = 0.3 -@@ -256,6 +257,8 @@ def server_recv(server_socket: socket.socket): - res_head = RES_MAGIC - if cmd_type == "get_result": - res_data_len = str(len(res_data)).zfill(RESULT_MSG_HEAD_LEN - RESULT_MSG_MAGIC_LEN) -+ elif cmd_type == "get_alarm": -+ res_data_len = str(len(res_data)).zfill(ALARM_MSG_DATA_LEN) - else: - res_data_len = str(len(res_data)).zfill(CTL_MSG_MAGIC_LEN) - res_head += res_data_len --- -2.27.0 - diff --git a/change-avg_block_io-config.patch b/change-avg_block_io-config.patch deleted file mode 100644 index 09d8b47..0000000 --- a/change-avg_block_io-config.patch +++ /dev/null @@ -1,55 +0,0 @@ -From aaff413d6954003a3c21af21003c3bc134f940e2 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Tue, 5 Nov 2024 10:31:10 +0800 -Subject: [PATCH] change avg_block_io config - ---- - config/plugins/avg_block_io.ini | 8 ++++---- - .../src/python/sentryPlugins/avg_block_io/config.py | 8 ++++---- - 2 files changed, 8 insertions(+), 8 deletions(-) - -diff --git a/config/plugins/avg_block_io.ini b/config/plugins/avg_block_io.ini -index 5c4b9b0..3b4ee33 100644 ---- a/config/plugins/avg_block_io.ini -+++ b/config/plugins/avg_block_io.ini -@@ -12,12 +12,12 @@ win_size=30 - win_threshold=6 - - [latency_nvme_ssd] --read_avg_lim=300 --write_avg_lim=300 -+read_avg_lim=10000 -+write_avg_lim=10000 - read_avg_time=3 - write_avg_time=3 --read_tot_lim=500 --write_tot_lim=500 -+read_tot_lim=50000 -+write_tot_lim=50000 - - [latency_sata_ssd] - read_avg_lim=10000 -diff --git a/src/python/sentryPlugins/avg_block_io/config.py b/src/python/sentryPlugins/avg_block_io/config.py -index c8f45ce..c1e8ab1 100644 ---- a/src/python/sentryPlugins/avg_block_io/config.py -+++ b/src/python/sentryPlugins/avg_block_io/config.py -@@ -42,12 +42,12 @@ DEFAULT_PARAM = { - CONF_ALGO_SIZE: 30, - CONF_ALGO_THRE: 6 - }, 'latency_nvme_ssd': { -- 'read_avg_lim': 300, -- 'write_avg_lim': 300, -+ 'read_avg_lim': 10000, -+ 'write_avg_lim': 10000, - 'read_avg_time': 3, - 'write_avg_time': 3, -- 'read_tot_lim': 500, -- 'write_tot_lim': 500, -+ 'read_tot_lim': 50000, -+ 'write_tot_lim': 50000, - }, 'latency_sata_ssd' : { - 'read_avg_lim': 10000, - 'write_avg_lim': 10000, --- -2.39.5 (Apple Git-154) - diff --git a/change-status-of-period-task-and-sort-mod-file.patch b/change-status-of-period-task-and-sort-mod-file.patch deleted file mode 100644 index 12aab0e..0000000 --- a/change-status-of-period-task-and-sort-mod-file.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 8cc13a422ed29e48b0c5b86b2da2a5dc8ad4aa59 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Fri, 13 Dec 2024 11:20:55 +0800 -Subject: [PATCH] change status of period task and sort mod file - ---- - src/python/syssentry/cron_process.py | 1 + - src/python/syssentry/load_mods.py | 1 + - 2 files changed, 2 insertions(+) - -diff --git a/src/python/syssentry/cron_process.py b/src/python/syssentry/cron_process.py -index 50780b3..5543d67 100644 ---- a/src/python/syssentry/cron_process.py -+++ b/src/python/syssentry/cron_process.py -@@ -144,6 +144,7 @@ def period_tasks_handle(): - - if not task.onstart: - logging.debug("period onstart not enabled, task: %s", task.name) -+ task.runtime_status = EXITED_STATUS - continue - - if task.runtime_status == WAITING_STATUS and \ -diff --git a/src/python/syssentry/load_mods.py b/src/python/syssentry/load_mods.py -index 48d7e66..5be5540 100644 ---- a/src/python/syssentry/load_mods.py -+++ b/src/python/syssentry/load_mods.py -@@ -224,6 +224,7 @@ def load_tasks(): - return "failed", "" - - mod_files = os.listdir(TASKS_STORAGE_PATH) -+ mod_files.sort() - for mod_file in mod_files: - logging.debug("find mod, path is %s", mod_file) - if not mod_file.endswith(MOD_FILE_SUFFIX): --- -2.33.0 diff --git a/cpu_utility-and-cpu_patrol-must-be-an-integer.patch b/cpu_utility-and-cpu_patrol-must-be-an-integer.patch deleted file mode 100644 index 3780958..0000000 --- a/cpu_utility-and-cpu_patrol-must-be-an-integer.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 6e98b2e5008ffabfda8d1c10778717f972b54398 Mon Sep 17 00:00:00 2001 -From: jwolf <523083921@qq.com> -Date: Mon, 22 Jul 2024 14:58:27 +0800 -Subject: [PATCH] cpu_utility and cpu_patrol musht be an integer - ---- - src/c/catcli/catlib/cli_param_checker.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/c/catcli/catlib/cli_param_checker.c b/src/c/catcli/catlib/cli_param_checker.c -index a1aa636..e400428 100644 ---- a/src/c/catcli/catlib/cli_param_checker.c -+++ b/src/c/catcli/catlib/cli_param_checker.c -@@ -2,6 +2,7 @@ - #include - #include - #include -+#include - #include - #include - #include "cli_common.h" -@@ -13,7 +14,7 @@ - void checkset_cpu_usage_percentage(char *getopt_optarg, catcli_request_body *p_request_body, struct option_errs *errs) - { - long cpu_utility = strtol(getopt_optarg, NULL, DECIMAL); -- if (cpu_utility <= 0 || cpu_utility > CPU_USAGE_PERCENTAGE_MAX) { -+ if (cpu_utility <= 0 || cpu_utility > CPU_USAGE_PERCENTAGE_MAX || strchr(getopt_optarg, '.') != NULL) { - strncpy(errs->patrol_module_err, - "\"cpu_utility \" must be an integer greater in the range (0,100],correct \"-u, --cpu_utility\"\n", MAX_ERR_LEN); - } -@@ -68,7 +69,7 @@ void checkset_cpulist(char *getopt_optarg, catcli_request_body *p_request_body, - void checkset_patrol_time(char *getopt_optarg, catcli_request_body *p_request_body, struct option_errs *errs) - { - long second = strtol(getopt_optarg, NULL, DECIMAL); -- if (second <= 0 || second > INT_MAX) { -+ if (second <= 0 || second > INT_MAX || strchr(getopt_optarg, '.') != NULL) { - strncpy(errs->patrol_time_err, - "\"patrol_second\" must be a number in the range of (0,INT_MAX] ,correct \"-t, --patrol_second\"\n", - MAX_ERR_LEN); --- -Gitee diff --git a/diff-disk-type-use-diff-config.patch b/diff-disk-type-use-diff-config.patch deleted file mode 100644 index 70976d3..0000000 --- a/diff-disk-type-use-diff-config.patch +++ /dev/null @@ -1,430 +0,0 @@ -From e7c1b0095e16369fb09ae62ffa3158be5e8893a1 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Fri, 11 Oct 2024 10:48:35 +0800 -Subject: [PATCH] diff disk type use diff config - ---- - config/plugins/avg_block_io.ini | 26 +++- - src/python/sentryCollector/collect_plugin.py | 6 + - .../avg_block_io/avg_block_io.py | 144 ++++++++---------- - .../sentryPlugins/avg_block_io/module_conn.py | 19 ++- - .../sentryPlugins/avg_block_io/utils.py | 43 ++++++ - 5 files changed, 146 insertions(+), 92 deletions(-) - -diff --git a/config/plugins/avg_block_io.ini b/config/plugins/avg_block_io.ini -index 858db18..5c4b9b0 100644 ---- a/config/plugins/avg_block_io.ini -+++ b/config/plugins/avg_block_io.ini -@@ -11,13 +11,29 @@ period_time=1 - win_size=30 - win_threshold=6 - --[latency] --read_avg_lim=10 --write_avg_lim=10 -+[latency_nvme_ssd] -+read_avg_lim=300 -+write_avg_lim=300 - read_avg_time=3 - write_avg_time=3 --read_tot_lim=50 --write_tot_lim=50 -+read_tot_lim=500 -+write_tot_lim=500 -+ -+[latency_sata_ssd] -+read_avg_lim=10000 -+write_avg_lim=10000 -+read_avg_time=3 -+write_avg_time=3 -+read_tot_lim=50000 -+write_tot_lim=50000 -+ -+[latency_sata_hdd] -+read_avg_lim=15000 -+write_avg_lim=15000 -+read_avg_time=3 -+write_avg_time=3 -+read_tot_lim=50000 -+write_tot_lim=50000 - - [iodump] - read_iodump_lim=0 -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 31bf11b..bec405a 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -79,6 +79,12 @@ class DiskType(): - TYPE_SATA_SSD = 1 - TYPE_SATA_HDD = 2 - -+Disk_Type = { -+ DiskType.TYPE_NVME_SSD: "nvme_ssd", -+ DiskType.TYPE_SATA_SSD: "sata_ssd", -+ DiskType.TYPE_SATA_HDD: "sata_hdd" -+} -+ - def client_send_and_recv(request_data, data_str_len, protocol): - """client socket send and recv message""" - try: -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index cf2ded3..fdad995 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -14,8 +14,9 @@ import configparser - import time - - from .stage_window import IoWindow, IoDumpWindow --from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler --from .utils import update_avg_and_check_abnormal, get_log_level -+from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler, get_disk_type_by_name -+from .utils import update_avg_and_check_abnormal, get_log_level, get_section_value -+from sentryCollector.collect_plugin import Disk_Type - - CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" - -@@ -37,44 +38,40 @@ def read_config_common(config): - disk = [] if disk_name == "default" else disk_name.split(",") - except configparser.NoOptionError: - disk = [] -- logging.warning("Unset disk, set to default") -+ logging.warning("Unset common.disk, set to default") - - try: - stage_name = config.get("common", "stage") - stage = [] if stage_name == "default" else stage_name.split(",") - except configparser.NoOptionError: - stage = [] -- logging.warning("Unset stage, set to read,write") -+ logging.warning("Unset common.stage, set to default") - - if len(disk) > 10: -- logging.warning("Too many disks, record only max 10 disks") -+ logging.warning("Too many common.disks, record only max 10 disks") - disk = disk[:10] - - try: - iotype_name = config.get("common", "iotype").split(",") -- iotype_list = [rw.lower() for rw in iotype_name if rw.lower() in ['read', 'write', 'flush', 'discard']] -- err_iotype = [rw.lower() for rw in iotype_name if rw.lower() not in ['read', 'write', 'flush', 'discard']] -+ iotype_list = [rw.lower() for rw in iotype_name if rw.lower() in ['read', 'write']] -+ err_iotype = [rw.lower() for rw in iotype_name if rw.lower() not in ['read', 'write']] - -- if iotype_list in [None, []]: -- iotype_list = ["read", "write"] -- except configparser.NoOptionError: -- iotype = ["read", "write"] -- logging.warning("Unset iotype, set to default") -+ if err_iotype: -+ report_alarm_fail("Invalid common.iotype config") - -- if err_iotype: -- logging.warning("{} in common.iotype are not valid, set iotype={}".format(err_iotype, iotype_list)) -- -+ except configparser.NoOptionError: -+ iotype_list = ["read", "write"] -+ logging.warning("Unset common.iotype, set to read,write") - - try: - period_time = int(config.get("common", "period_time")) - if not (1 <= period_time <= 300): - raise ValueError("Invalid period_time") - except ValueError: -- period_time = 1 -- logging.warning("Invalid period_time, set to 1s") -+ report_alarm_fail("Invalid common.period_time") - except configparser.NoOptionError: - period_time = 1 -- logging.warning("Unset period_time, use 1s as default") -+ logging.warning("Unset common.period_time, use 1s as default") - - return period_time, disk, stage, iotype_list - -@@ -87,76 +84,56 @@ def read_config_algorithm(config): - try: - win_size = int(config.get("algorithm", "win_size")) - if not (1 <= win_size <= 300): -- raise ValueError("Invalid win_size") -+ raise ValueError("Invalid algorithm.win_size") - except ValueError: -- win_size = 30 -- logging.warning("Invalid win_size, set to 30") -+ report_alarm_fail("Invalid algorithm.win_size config") - except configparser.NoOptionError: - win_size = 30 -- logging.warning("Unset win_size, use 30 as default") -+ logging.warning("Unset algorithm.win_size, use 30 as default") - - try: - win_threshold = int(config.get("algorithm", "win_threshold")) - if win_threshold < 1 or win_threshold > 300 or win_threshold > win_size: -- raise ValueError("Invalid win_threshold") -+ raise ValueError("Invalid algorithm.win_threshold") - except ValueError: -- win_threshold = 6 -- logging.warning("Invalid win_threshold, set to 6") -+ report_alarm_fail("Invalid algorithm.win_threshold config") - except configparser.NoOptionError: - win_threshold = 6 -- logging.warning("Unset win_threshold, use 6 as default") -+ logging.warning("Unset algorithm.win_threshold, use 6 as default") - - return win_size, win_threshold - - --def read_config_lat_iodump(io_dic, config): -- """read config file, get [latency] [iodump] section value""" -+def read_config_latency(config): -+ """read config file, get [latency_xxx] section value""" - common_param = {} -- lat_sec = None -- if not config.has_section("latency"): -- logging.warning("Cannot find latency section in config file") -- else: -- lat_sec = config["latency"] -- -- iodump_sec = None -- if not config.has_section("iodump"): -- logging.warning("Cannot find iodump section in config file") -- else: -- iodump_sec = config["iodump"] -- -- if not lat_sec and not iodump_sec: -- return common_param -- -- for io_type in io_dic["iotype_list"]: -- common_param[io_type] = {} -- -- latency_keys = { -- "avg_lim": "{}_avg_lim".format(io_type), -- "avg_time": "{}_avg_time".format(io_type), -- "tot_lim": "{}_tot_lim".format(io_type), -- } -- iodump_key = "{}_iodump_lim".format(io_type) -+ for type_name in Disk_Type: -+ section_name = f"latency_{Disk_Type[type_name]}" -+ if not config.has_section(section_name): -+ report_alarm_fail(f"Cannot find {section_name} section in config file") - -- if iodump_sec and iodump_key in iodump_sec and iodump_sec[iodump_key].isdecimal(): -- common_param[io_type][iodump_key] = int(iodump_sec[iodump_key]) -+ common_param[Disk_Type[type_name]] = get_section_value(section_name, config) -+ return common_param - -- if not lat_sec: -- continue - -- for key_suffix, key_template in latency_keys.items(): -- if key_template in lat_sec and lat_sec[key_template].isdecimal(): -- common_param[io_type][key_template] = int(lat_sec[key_template]) -+def read_config_iodump(config): -+ """read config file, get [iodump] section value""" -+ common_param = {} -+ section_name = "iodump" -+ if not config.has_section(section_name): -+ report_alarm_fail(f"Cannot find {section_name} section in config file") - -- return common_param -+ return get_section_value(section_name, config) - - --def read_config_stage(config, stage, iotype_list): -- """read config file, get [STAGE_NAME] section value""" -+def read_config_stage(config, stage, iotype_list, curr_disk_type): -+ """read config file, get [STAGE_NAME_diskType] section value""" - res = {} -- if not stage in config: -+ section_name = f"{stage}_{curr_disk_type}" -+ if not config.has_section(section_name): - return res - -- for key in config[stage]: -+ for key in config[section_name]: - if config[stage][key].isdecimal(): - res[key] = int(config[stage][key]) - -@@ -171,11 +148,12 @@ def init_io_win(io_dic, config, common_param): - for disk_name in io_dic["disk_list"]: - io_data[disk_name] = {} - io_avg_value[disk_name] = {} -+ curr_disk_type = get_disk_type_by_name(disk_name) - for stage_name in io_dic["stage_list"]: - io_data[disk_name][stage_name] = {} - io_avg_value[disk_name][stage_name] = {} -- # step3. 解析stage配置 -- curr_stage_param = read_config_stage(config, stage_name, iotype_list) -+ # 解析stage配置 -+ curr_stage_param = read_config_stage(config, stage_name, iotype_list, curr_disk_type) - for rw in iotype_list: - io_data[disk_name][stage_name][rw] = {} - io_avg_value[disk_name][stage_name][rw] = [0, 0] -@@ -187,10 +165,10 @@ def init_io_win(io_dic, config, common_param): - iodump_lim_key = "{}_iodump_lim".format(rw) - - # 获取值,优先从 curr_stage_param 获取,如果不存在,则从 common_param 获取 -- avg_lim_value = curr_stage_param.get(avg_lim_key, common_param.get(rw, {}).get(avg_lim_key)) -- avg_time_value = curr_stage_param.get(avg_time_key, common_param.get(rw, {}).get(avg_time_key)) -- tot_lim_value = curr_stage_param.get(tot_lim_key, common_param.get(rw, {}).get(tot_lim_key)) -- iodump_lim_value = curr_stage_param.get(iodump_lim_key, common_param.get(rw, {}).get(iodump_lim_key)) -+ avg_lim_value = curr_stage_param.get(avg_lim_key, common_param.get(curr_disk_type, {}).get(avg_lim_key)) -+ avg_time_value = curr_stage_param.get(avg_time_key, common_param.get(curr_disk_type, {}).get(avg_time_key)) -+ tot_lim_value = curr_stage_param.get(tot_lim_key, common_param.get(curr_disk_type, {}).get(tot_lim_key)) -+ iodump_lim_value = curr_stage_param.get(iodump_lim_key, common_param.get("iodump", {}).get(iodump_lim_key)) - - if avg_lim_value and avg_time_value and tot_lim_value: - io_data[disk_name][stage_name][rw]["latency"] = IoWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_multiple=avg_time_value, abnormal_multiple_lim=avg_lim_value, abnormal_time=tot_lim_value) -@@ -217,28 +195,21 @@ def get_valid_disk_stage_list(io_dic, config_disk, config_stage): - stage_list = [key for key in all_stage_set if key in config_stage] - not_in_stage_list = [key for key in config_stage if key not in all_stage_set] - -- if not config_disk: -+ if not_in_stage_list: -+ report_alarm_fail(f"Invalid common.stage_list config, cannot set {not_in_stage_list}") -+ -+ if not config_disk and not not_in_disk_list: - disk_list = [key for key in all_disk_set] - -- if not config_stage: -+ if not config_stage and not not_in_stage_list: - stage_list = [key for key in all_stage_set] - - disk_list = disk_list[:10] if len(disk_list) > 10 else disk_list -- stage_list = stage_list[:15] if len(stage_list) > 15 else stage_list -- -- if config_disk and not disk_list: -- logging.warning("Cannot get valid disk by disk={}, set to default".format(config_disk)) -- disk_list, stage_list = get_valid_disk_stage_list(io_dic, [], config_stage) -- -- if config_stage and not stage_list: -- logging.warning("Cannot get valid stage by stage={}, set to default".format(config_stage)) -- disk_list, stage_list = get_valid_disk_stage_list(io_dic, config_disk, []) - - if not stage_list or not disk_list: - report_alarm_fail("Cannot get valid disk name or stage name.") - - log_invalid_keys(not_in_disk_list, 'disk', config_disk, disk_list) -- log_invalid_keys(not_in_stage_list, 'stage', config_stage, stage_list) - - return disk_list, stage_list - -@@ -310,8 +281,13 @@ def main(): - # step1. 解析公共配置 --- algorithm - io_dic["win_size"], io_dic["win_threshold"] = read_config_algorithm(config) - -- # step2. 循环创建窗口 -- common_param = read_config_lat_iodump(io_dic, config) -+ # step2. 解析公共配置 --- latency_xxx -+ common_param = read_config_latency(config) -+ -+ # step3. 解析公共配置 --- iodump -+ common_param['iodump'] = read_config_iodump(config) -+ -+ # step4. 循环创建窗口 - io_data, io_avg_value = init_io_win(io_dic, config, common_param) - - main_loop(io_dic, io_data, io_avg_value) -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -index 40b3fcc..8d6f429 100644 ---- a/src/python/sentryPlugins/avg_block_io/module_conn.py -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -14,7 +14,7 @@ import sys - import time - - from .utils import is_abnormal, get_win_data, log_slow_win --from sentryCollector.collect_plugin import is_iocollect_valid, get_io_data, Result_Messages -+from sentryCollector.collect_plugin import is_iocollect_valid, get_io_data, Result_Messages, get_disk_type, Disk_Type - from syssentry.result import ResultLevel, report_result - from xalarm.sentry_notify import xalarm_report, MINOR_ALM, ALARM_TYPE_OCCUR - -@@ -51,7 +51,7 @@ def check_result_validation(res, reason): - try: - json_data = json.loads(res['message']) - except json.JSONDecodeError: -- err_msg = "Failed to {}: invalid return message".format(reason) -+ err_msg = f"Failed to {reason}: invalid return message" - report_alarm_fail(err_msg) - - return json_data -@@ -60,7 +60,7 @@ def check_result_validation(res, reason): - def report_alarm_fail(alarm_info): - """report result to xalarmd""" - report_result(TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": alarm_info})) -- logging.error(alarm_info) -+ logging.critical(alarm_info) - sys.exit(1) - - -@@ -114,3 +114,16 @@ def process_report_data(disk_name, rw, io_data): - - log_slow_win(msg, "unknown") - xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) -+ -+ -+def get_disk_type_by_name(disk_name): -+ res = get_disk_type(disk_name) -+ disk_type_str = check_result_validation(get_disk_type(disk_name), f'Invalid disk type {disk_name}') -+ try: -+ curr_disk_type = int(disk_type_str) -+ if curr_disk_type not in Disk_Type: -+ raise ValueError -+ except ValueError: -+ report_alarm_fail(f"Failed to get disk type for {disk_name}") -+ -+ return Disk_Type[curr_disk_type] -\ No newline at end of file -diff --git a/src/python/sentryPlugins/avg_block_io/utils.py b/src/python/sentryPlugins/avg_block_io/utils.py -index 3b7f027..cef1edd 100644 ---- a/src/python/sentryPlugins/avg_block_io/utils.py -+++ b/src/python/sentryPlugins/avg_block_io/utils.py -@@ -26,6 +26,49 @@ LogLevel = { - } - - -+DEFAULT_PARAM = { -+ 'latency_nvme_ssd': { -+ 'read_avg_lim': 300, -+ 'write_avg_lim': 300, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 500, -+ 'write_tot_lim': 500, -+ }, 'latency_sata_ssd' : { -+ 'read_avg_lim': 10000, -+ 'write_avg_lim': 10000, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 50000, -+ 'write_tot_lim': 50000, -+ }, 'latency_sata_hdd' : { -+ 'read_avg_lim': 15000, -+ 'write_avg_lim': 15000, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 50000, -+ 'write_tot_lim': 50000 -+ }, 'iodump': { -+ 'read_iodump_lim': 0, -+ 'write_iodump_lim': 0 -+ } -+} -+ -+ -+def get_section_value(section_name, config): -+ common_param = {} -+ config_sec = config[section_name] -+ for config_key in DEFAULT_PARAM[section_name]: -+ if config_key in config_sec: -+ if not config_sec[config_key].isdecimal(): -+ report_alarm_fail(f"Invalid {section_name}.{config_key} config.") -+ common_param[config_key] = int(config_sec[config_key]) -+ else: -+ logging.warning(f"Unset {section_name}.{config_key} in config file, use {DEFAULT_PARAM[section_name][config_key]} as default") -+ common_param[config_key] = DEFAULT_PARAM[section_name][config_key] -+ return common_param -+ -+ - def get_log_level(filename): - if not os.path.exists(filename): - return logging.INFO --- -2.27.0 diff --git a/enrich-alert-info-about-kernel-stack.patch b/enrich-alert-info-about-kernel-stack.patch deleted file mode 100644 index bf04a6e..0000000 --- a/enrich-alert-info-about-kernel-stack.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 41bf507ca6cbbdf5e646a405de6b8d5b9be4bd28 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, 16 Oct 2024 17:20:01 +0800 -Subject: [PATCH] enrich alert info about kernel stack - ---- - src/python/sentryPlugins/ai_block_io/detector.py | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index ed8b64a..8536f7a 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -103,8 +103,10 @@ class DiskDetector: - elif len(diagnosis_info["rq_driver"]) != 0: - root_cause = "[Root Cause: disk slow]" - elif len(diagnosis_info["io_stage"]) != 0: -- stage = diagnosis_info["io_stage"][0][1].stage_name -- root_cause = f"[Root Cause: io stage slow, stage: {stage}]" -+ stage_list = [] -+ for io_stage in diagnosis_info["io_stage"]: -+ stage_list.append(io_stage[0].stage_name) -+ root_cause = f"[Root Cause: io stage slow, stage: {stage_list}]" - if root_cause is None: - root_cause = "[Root Cause: high io pressure]" - return True, diagnosis_info["bio"][0][0], diagnosis_info["bio"][0][1], root_cause --- -2.23.0 - diff --git a/feature-add-avg_block_io-plugin.patch b/feature-add-avg_block_io-plugin.patch deleted file mode 100644 index 5477f18..0000000 --- a/feature-add-avg_block_io-plugin.patch +++ /dev/null @@ -1,572 +0,0 @@ -From acb77d6a69aa9269b0f691613bef53efd0c01e53 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Thu, 12 Sep 2024 11:31:34 +0800 -Subject: [PATCH 2/2] add avg_block_io plugin - ---- - config/plugins/avg_block_io.ini | 21 ++ - config/tasks/avg_block_io.mod | 5 + - src/python/sentryPlugins/__init__.py | 0 - .../sentryPlugins/avg_block_io/__init__.py | 0 - .../avg_block_io/avg_block_io.py | 257 ++++++++++++++++++ - .../sentryPlugins/avg_block_io/module_conn.py | 86 ++++++ - .../avg_block_io/stage_window.py | 47 ++++ - .../sentryPlugins/avg_block_io/utils.py | 86 ++++++ - 8 files changed, 502 insertions(+) - create mode 100644 config/plugins/avg_block_io.ini - create mode 100644 config/tasks/avg_block_io.mod - create mode 100644 src/python/sentryPlugins/__init__.py - create mode 100644 src/python/sentryPlugins/avg_block_io/__init__.py - create mode 100644 src/python/sentryPlugins/avg_block_io/avg_block_io.py - create mode 100644 src/python/sentryPlugins/avg_block_io/module_conn.py - create mode 100644 src/python/sentryPlugins/avg_block_io/stage_window.py - create mode 100644 src/python/sentryPlugins/avg_block_io/utils.py - -diff --git a/config/plugins/avg_block_io.ini b/config/plugins/avg_block_io.ini -new file mode 100644 -index 0000000..bc33dde ---- /dev/null -+++ b/config/plugins/avg_block_io.ini -@@ -0,0 +1,21 @@ -+[common] -+disk=default -+stage=default -+iotype=read,write -+period_time=1 -+ -+[algorithm] -+win_size=30 -+win_threshold=6 -+ -+[latency] -+read_avg_lim=10 -+write_avg_lim=10 -+read_avg_time=3 -+write_avg_time=3 -+read_tot_lim=50 -+write_tot_lim=50 -+ -+[iodump] -+read_iodump_lim=0 -+write_iodump_lim=0 -diff --git a/config/tasks/avg_block_io.mod b/config/tasks/avg_block_io.mod -new file mode 100644 -index 0000000..814c483 ---- /dev/null -+++ b/config/tasks/avg_block_io.mod -@@ -0,0 +1,5 @@ -+[common] -+enabled=yes -+task_start=/usr/bin/python3 /usr/bin/avg_block_io -+task_stop=pkill avg_block_io -+type=oneshot -\ No newline at end of file -diff --git a/src/python/sentryPlugins/__init__.py b/src/python/sentryPlugins/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/src/python/sentryPlugins/avg_block_io/__init__.py b/src/python/sentryPlugins/avg_block_io/__init__.py -new file mode 100644 -index 0000000..e69de29 -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -new file mode 100644 -index 0000000..ff2071d ---- /dev/null -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -0,0 +1,257 @@ -+# 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. -+import logging -+import signal -+import configparser -+import time -+ -+from .stage_window import IoWindow, IoDumpWindow -+from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler -+from .utils import update_avg_and_check_abnormal -+ -+CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" -+ -+def log_invalid_keys(not_in_list, keys_name, config_list, default_list): -+ """print invalid log""" -+ if config_list and default_list: -+ logging.warning("{} in common.{} are not valid, set {}={}".format(not_in_list, keys_name, keys_name, default_list)) -+ elif config_list == ["default"]: -+ logging.warning("Default {} use {}".format(keys_name, default_list)) -+ -+ -+def read_config_common(config): -+ """read config file, get [common] section value""" -+ try: -+ common_sec = config['common'] -+ except configparser.NoSectionError: -+ report_alarm_fail("Cannot find common section in config file") -+ -+ try: -+ period_time = int(common_sec.get("period_time", 1)) -+ if not (1 <= period_time <= 300): -+ raise ValueError("Invalid period_time") -+ except ValueError: -+ period_time = 1 -+ logging.warning("Invalid period_time, set to 1s") -+ -+ disk = common_sec.get('disk').split(",") if common_sec.get('disk') not in [None, 'default'] else [] -+ stage = common_sec.get('stage').split(",") if common_sec.get('stage') not in [None, 'default'] else [] -+ -+ if len(disk) > 10: -+ logging.warning("Too many disks, record only max 10 disks") -+ disk = disk[:10] -+ -+ iotype = common_sec.get('iotype', 'read,write').split(",") -+ iotype_list = [rw.lower() for rw in iotype if rw.lower() in ['read', 'write', 'flush', 'discard']] -+ err_iotype = [rw for rw in iotype if rw.lower() not in ['read', 'write', 'flush', 'discard']] -+ -+ if err_iotype: -+ logging.warning("{} in common.iotype are not valid, set iotype={}".format(err_iotype, iotype_list)) -+ -+ return period_time, disk, stage, iotype_list -+ -+ -+def read_config_algorithm(config): -+ """read config file, get [algorithm] section value""" -+ if not config.has_section("algorithm"): -+ report_alarm_fail("Cannot find algorithm section in config file") -+ -+ try: -+ win_size = int(config.get("algorithm", "win_size")) -+ if not (1 <= win_size <= 300): -+ raise ValueError("Invalid win_size") -+ win_threshold = int(config.get("algorithm", "win_threshold")) -+ 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") -+ -+ return win_size, win_threshold -+ -+ -+def read_config_lat_iodump(io_dic, config): -+ """read config file, get [latency] [iodump] section value""" -+ common_param = {} -+ for io_type in io_dic["iotype_list"]: -+ common_param[io_type] = {} -+ -+ latency_keys = { -+ "avg_lim": "{}_avg_lim".format(io_type), -+ "avg_time": "{}_avg_time".format(io_type), -+ "tot_lim": "{}_tot_lim".format(io_type), -+ } -+ iodump_key = "{}_iodump_lim".format(io_type) -+ -+ for key_suffix, key_template in latency_keys.items(): -+ if key_template in config["latency"] and config["latency"][key_template].isdecimal(): -+ common_param[io_type][key_template] = int(config["latency"][key_template]) -+ -+ if iodump_key in config["iodump"] and config["iodump"][iodump_key].isdecimal(): -+ common_param[io_type][iodump_key] = int(config["iodump"][iodump_key]) -+ -+ return common_param -+ -+ -+def read_config_stage(config, stage, iotype_list): -+ """read config file, get [STAGE_NAME] section value""" -+ res = {} -+ if not stage in config: -+ return res -+ -+ for key in config[stage]: -+ if config[stage][key].isdecimal(): -+ res[key] = int(config[stage][key]) -+ -+ return res -+ -+ -+def init_io_win(io_dic, config, common_param): -+ """initialize windows of latency, iodump, and dict of avg_value""" -+ iotype_list = io_dic["iotype_list"] -+ io_data = {} -+ io_avg_value = {} -+ for disk_name in io_dic["disk_list"]: -+ io_data[disk_name] = {} -+ io_avg_value[disk_name] = {} -+ for stage_name in io_dic["stage_list"]: -+ io_data[disk_name][stage_name] = {} -+ io_avg_value[disk_name][stage_name] = {} -+ # step3. 解析stage配置 -+ curr_stage_param = read_config_stage(config, stage_name, iotype_list) -+ for rw in iotype_list: -+ io_data[disk_name][stage_name][rw] = {} -+ io_avg_value[disk_name][stage_name][rw] = [0, 0] -+ -+ # 对每个rw创建latency和iodump窗口 -+ avg_lim_key = "{}_avg_lim".format(rw) -+ avg_time_key = "{}_avg_time".format(rw) -+ tot_lim_key = "{}_tot_lim".format(rw) -+ iodump_lim_key = "{}_iodump_lim".format(rw) -+ -+ # 获取值,优先从 curr_stage_param 获取,如果不存在,则从 common_param 获取 -+ avg_lim_value = curr_stage_param.get(avg_lim_key, common_param.get(rw, {}).get(avg_lim_key)) -+ avg_time_value = curr_stage_param.get(avg_time_key, common_param.get(rw, {}).get(avg_time_key)) -+ tot_lim_value = curr_stage_param.get(tot_lim_key, common_param.get(rw, {}).get(tot_lim_key)) -+ iodump_lim_value = curr_stage_param.get(iodump_lim_key, common_param.get(rw, {}).get(iodump_lim_key)) -+ -+ if avg_lim_value and avg_time_value and tot_lim_value: -+ io_data[disk_name][stage_name][rw]["latency"] = IoWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_multiple=avg_time_value, abnormal_multiple_lim=avg_lim_value, abnormal_time=tot_lim_value) -+ -+ if iodump_lim_value is not None: -+ io_data[disk_name][stage_name][rw]["iodump"] = IoDumpWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_time=iodump_lim_value) -+ return io_data, io_avg_value -+ -+ -+def get_valid_disk_stage_list(io_dic, config_disk, config_stage): -+ """get disk_list and stage_list by sentryCollector""" -+ json_data = avg_is_iocollect_valid(io_dic, config_disk, config_stage) -+ -+ all_disk_set = json_data.keys() -+ all_stage_set = set() -+ for disk_stage_list in json_data.values(): -+ all_stage_set.update(disk_stage_list) -+ -+ disk_list = [key for key in config_disk if key in all_disk_set] -+ not_in_disk_list = [key for key in config_disk if key not in all_disk_set] -+ -+ stage_list = [key for key in config_stage if key in all_stage_set] -+ not_in_stage_list = [key for key in config_stage if key not in all_stage_set] -+ -+ if not config_disk: -+ disk_list = [key for key in all_disk_set] -+ -+ if not config_stage: -+ stage_list = [key for key in all_stage_set] -+ -+ if config_disk and not disk_list: -+ logging.warning("Cannot get valid disk by disk={}, set to default".format(config_disk)) -+ disk_list, stage_list = get_valid_disk_stage_list(io_dic, [], config_stage) -+ -+ if config_stage and not stage_list: -+ logging.warning("Cannot get valid stage by stage={}, set to default".format(config_stage)) -+ disk_list, stage_list = get_valid_disk_stage_list(io_dic, config_disk, []) -+ -+ if not stage_list or not disk_list: -+ report_alarm_fail("Cannot get valid disk name or stage name.") -+ -+ log_invalid_keys(not_in_disk_list, 'disk', config_disk, disk_list) -+ log_invalid_keys(not_in_stage_list, 'stage', config_stage, stage_list) -+ -+ return disk_list, stage_list -+ -+ -+def main_loop(io_dic, io_data, io_avg_value): -+ """main loop of avg_block_io""" -+ period_time = io_dic["period_time"] -+ disk_list = io_dic["disk_list"] -+ stage_list = io_dic["stage_list"] -+ iotype_list = io_dic["iotype_list"] -+ win_size = io_dic["win_size"] -+ # 开始循环 -+ while True: -+ # 等待x秒 -+ time.sleep(period_time) -+ -+ # 采集模块对接,获取周期数据 -+ curr_period_data = avg_get_io_data(io_dic) -+ -+ # 处理周期数据 -+ reach_size = False -+ for disk_name in disk_list: -+ for stage_name in stage_list: -+ for rw in iotype_list: -+ if disk_name in curr_period_data and stage_name in curr_period_data[disk_name] and rw in curr_period_data[disk_name][stage_name]: -+ io_key = (disk_name, stage_name, rw) -+ reach_size = update_avg_and_check_abnormal(curr_period_data, io_key, win_size, io_avg_value, io_data) -+ -+ # win_size不满时不进行告警判断 -+ if not reach_size: -+ continue -+ -+ # 判断异常窗口、异常场景 -+ for disk_name in disk_list: -+ for rw in iotype_list: -+ process_report_data(disk_name, rw, io_data) -+ -+ -+def main(): -+ """main func""" -+ # 注册停止信号-2/-15 -+ signal.signal(signal.SIGINT, sig_handler) -+ signal.signal(signal.SIGTERM, sig_handler) -+ -+ # 初始化配置读取 -+ config = configparser.ConfigParser(comment_prefixes=('#', ';')) -+ try: -+ config.read(CONFIG_FILE) -+ except configparser.Error: -+ report_alarm_fail("Failed to read config file") -+ -+ io_dic = {} -+ -+ # 读取配置文件 -- common段 -+ io_dic["period_time"], disk, stage, io_dic["iotype_list"] = read_config_common(config) -+ -+ # 采集模块对接,is_iocollect_valid() -+ io_dic["disk_list"], io_dic["stage_list"] = get_valid_disk_stage_list(io_dic, disk, stage) -+ -+ if "bio" not in io_dic["stage_list"]: -+ report_alarm_fail("Cannot run avg_block_io without bio stage") -+ -+ # 初始化窗口 -- config读取,对应is_iocollect_valid返回的结果 -+ # step1. 解析公共配置 --- algorithm -+ io_dic["win_size"], io_dic["win_threshold"] = read_config_algorithm(config) -+ -+ # step2. 循环创建窗口 -+ common_param = read_config_lat_iodump(io_dic, config) -+ io_data, io_avg_value = init_io_win(io_dic, config, common_param) -+ -+ main_loop(io_dic, io_data, io_avg_value) -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -new file mode 100644 -index 0000000..caa0191 ---- /dev/null -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -0,0 +1,86 @@ -+# 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. -+import json -+import logging -+import sys -+import time -+ -+from .utils import is_abnormal -+from sentryCollector.collect_plugin import is_iocollect_valid, get_io_data, Result_Messages -+from syssentry.result import ResultLevel, report_result -+ -+ -+TASK_NAME = "avg_block_io" -+ -+def sig_handler(signum, _f): -+ """stop avg_block_io""" -+ report_result(TASK_NAME, ResultLevel.PASS, json.dumps({})) -+ logging.info("Finished avg_block_io plugin running.") -+ sys.exit(0) -+ -+def avg_get_io_data(io_dic): -+ """get_io_data from sentryCollector""" -+ res = get_io_data(io_dic["period_time"], io_dic["disk_list"], io_dic["stage_list"], io_dic["iotype_list"]) -+ return check_result_validation(res, 'get io data') -+ -+ -+def avg_is_iocollect_valid(io_dic, config_disk, config_stage): -+ """is_iocollect_valid from sentryCollector""" -+ res = is_iocollect_valid(io_dic["period_time"], config_disk, config_stage) -+ return check_result_validation(res, 'check config validation') -+ -+ -+def check_result_validation(res, reason): -+ """check validation of result from sentryCollector""" -+ if not 'ret' in res or not 'message' in res: -+ err_msg = "Failed to {}: Cannot connect to sentryCollector.".format(reason) -+ report_alarm_fail(err_msg) -+ if res['ret'] != 0: -+ err_msg = "Failed to {}: {}".format(reason, Result_Messages[res['ret']]) -+ report_alarm_fail(err_msg) -+ -+ try: -+ json_data = json.loads(res['message']) -+ except json.JSONDecodeError: -+ err_msg = "Failed to {}: invalid return message".format(reason) -+ report_alarm_fail(err_msg) -+ -+ return json_data -+ -+ -+def report_alarm_fail(alarm_info): -+ """report result to xalarmd""" -+ report_result(TASK_NAME, ResultLevel.FAIL, json.dumps({"msg": alarm_info})) -+ logging.error(alarm_info) -+ sys.exit(1) -+ -+ -+def process_report_data(disk_name, rw, io_data): -+ """check abnormal window and report to xalarm""" -+ if not is_abnormal((disk_name, 'bio', rw), io_data): -+ return -+ -+ ctrl_stage = ['throtl', 'wbt', 'iocost', 'bfq'] -+ for stage_name in ctrl_stage: -+ if is_abnormal((disk_name, stage_name, rw), io_data): -+ logging.warning("{} - {} - {} report IO press".format(time.ctime(), disk_name, rw)) -+ return -+ -+ if is_abnormal((disk_name, 'rq_driver', rw), io_data): -+ logging.warning("{} - {} - {} report driver".format(time.ctime(), disk_name, rw)) -+ return -+ -+ kernel_stage = ['gettag', 'plug', 'deadline', 'hctx', 'requeue'] -+ 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/src/python/sentryPlugins/avg_block_io/stage_window.py b/src/python/sentryPlugins/avg_block_io/stage_window.py -new file mode 100644 -index 0000000..9b0ce79 ---- /dev/null -+++ b/src/python/sentryPlugins/avg_block_io/stage_window.py -@@ -0,0 +1,47 @@ -+# 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. -+ -+class AbnormalWindowBase: -+ def __init__(self, window_size=10, window_threshold=7): -+ self.window_size = window_size -+ self.window_threshold = window_threshold -+ self.abnormal_window = [False] * window_size -+ -+ def append_new_period(self, ab_res, avg_val=0): -+ self.abnormal_window.pop(0) -+ if self.is_abnormal_period(ab_res, avg_val): -+ self.abnormal_window.append(True) -+ else: -+ self.abnormal_window.append(False) -+ -+ def is_abnormal_window(self): -+ return sum(self.abnormal_window) > self.window_threshold -+ -+ -+class IoWindow(AbnormalWindowBase): -+ def __init__(self, window_size=10, window_threshold=7, abnormal_multiple=5, abnormal_multiple_lim=30, abnormal_time=40): -+ super().__init__(window_size, window_threshold) -+ self.abnormal_multiple = abnormal_multiple -+ self.abnormal_multiple_lim = abnormal_multiple_lim -+ self.abnormal_time = abnormal_time -+ -+ def is_abnormal_period(self, value, avg_val): -+ return (value > avg_val * self.abnormal_multiple and value > self.abnormal_multiple_lim) or \ -+ (value > self.abnormal_time) -+ -+ -+class IoDumpWindow(AbnormalWindowBase): -+ def __init__(self, window_size=10, window_threshold=7, abnormal_time=40): -+ super().__init__(window_size, window_threshold) -+ self.abnormal_time = abnormal_time -+ -+ def is_abnormal_period(self, value, avg_val=0): -+ return value > self.abnormal_time -diff --git a/src/python/sentryPlugins/avg_block_io/utils.py b/src/python/sentryPlugins/avg_block_io/utils.py -new file mode 100644 -index 0000000..54ed080 ---- /dev/null -+++ b/src/python/sentryPlugins/avg_block_io/utils.py -@@ -0,0 +1,86 @@ -+# 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. -+AVG_VALUE = 0 -+AVG_COUNT = 1 -+ -+ -+def get_nested_value(data, keys): -+ """get data from nested dict""" -+ for key in keys: -+ if key in data: -+ data = data[key] -+ else: -+ return None -+ return data -+ -+ -+def set_nested_value(data, keys, value): -+ """set data to nested dict""" -+ for key in keys[:-1]: -+ if key in data: -+ data = data[key] -+ else: -+ return False -+ data[keys[-1]] = value -+ return True -+ -+ -+def is_abnormal(io_key, io_data): -+ """check if latency and iodump win abnormal""" -+ for key in ['latency', 'iodump']: -+ all_keys = get_nested_value(io_data, io_key) -+ if all_keys and key in all_keys: -+ win = get_nested_value(io_data, io_key + (key,)) -+ if win and win.is_abnormal_window(): -+ return True -+ return False -+ -+ -+def update_io_avg(old_avg, period_value, win_size): -+ """update average of latency window""" -+ if old_avg[AVG_COUNT] < win_size: -+ new_avg_count = old_avg[AVG_COUNT] + 1 -+ new_avg_value = (old_avg[AVG_VALUE] * old_avg[AVG_COUNT] + period_value[0]) / new_avg_count -+ else: -+ new_avg_count = old_avg[AVG_COUNT] -+ new_avg_value = (old_avg[AVG_VALUE] * (old_avg[AVG_COUNT] - 1) + period_value[0]) / new_avg_count -+ return [new_avg_value, new_avg_count] -+ -+ -+def update_io_data(old_avg, period_value, win_size, io_data, io_key): -+ """update data of latency and iodump window""" -+ all_wins = get_nested_value(io_data, io_key) -+ if all_wins and "latency" in all_wins: -+ io_data[io_key[0]][io_key[1]][io_key[2]]["latency"].append_new_period(period_value[0], old_avg[AVG_VALUE]) -+ if all_wins and "iodump" in all_wins: -+ io_data[io_key[0]][io_key[1]][io_key[2]]["iodump"].append_new_period(period_value[1]) -+ -+ -+def update_avg_and_check_abnormal(data, io_key, win_size, io_avg_value, io_data): -+ """update avg and check abonrmal, return true if win_size full""" -+ period_value = get_nested_value(data, io_key) -+ old_avg = get_nested_value(io_avg_value, io_key) -+ -+ # 更新avg数据 -+ if old_avg[AVG_COUNT] < win_size: -+ set_nested_value(io_avg_value, io_key, update_io_avg(old_avg, period_value, win_size)) -+ return False -+ -+ # 更新win数据 -- 判断异常周期 -+ update_io_data(old_avg, period_value, win_size, io_data, io_key) -+ all_wins = get_nested_value(io_data, io_key) -+ if all_wins and 'latency' not in all_wins: -+ return True -+ period = get_nested_value(io_data, io_key + ("latency",)) -+ if period and period.is_abnormal_period(period_value[0], old_avg[AVG_VALUE]): -+ return True -+ set_nested_value(io_avg_value, io_key, update_io_avg(old_avg, period_value, win_size)) -+ return True --- -2.33.0 - diff --git a/fix-ai_block_io-root-cause-bug.patch b/fix-ai_block_io-root-cause-bug.patch deleted file mode 100644 index f6de787..0000000 --- a/fix-ai_block_io-root-cause-bug.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ac9ce326dee20edde2451946e34ea9a13bd8c338 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, 16 Oct 2024 11:50:46 +0800 -Subject: [PATCH] fix ai_block_io root cause bug - ---- - src/python/sentryPlugins/ai_block_io/detector.py | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index 5b21714..ed8b64a 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -101,12 +101,12 @@ class DiskDetector: - if len(diagnosis_info["bio"]) == 0: - return False, None, None, None - elif len(diagnosis_info["rq_driver"]) != 0: -- root_cause = "[Root Cause:disk slow]" -+ root_cause = "[Root Cause: disk slow]" - elif len(diagnosis_info["io_stage"]) != 0: -- stage = diagnosis_info["io_stage"][0][1].get_stage_name() -- root_cause = f"[Root Cause:io stage slow, stage: {stage}]" -+ stage = diagnosis_info["io_stage"][0][1].stage_name -+ root_cause = f"[Root Cause: io stage slow, stage: {stage}]" - if root_cause is None: -- root_cause = "[Root Cause:high io pressure]" -+ root_cause = "[Root Cause: high io pressure]" - return True, diagnosis_info["bio"][0][0], diagnosis_info["bio"][0][1], root_cause - - def __repr__(self): --- -2.23.0 - diff --git a/fix-ai_block_io-some-issues.patch b/fix-ai_block_io-some-issues.patch deleted file mode 100644 index d80cbe8..0000000 --- a/fix-ai_block_io-some-issues.patch +++ /dev/null @@ -1,832 +0,0 @@ -From 35ba8fe8e241c5e3508c5dadc82a777065a5cc4d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Mon, 30 Sep 2024 00:15:29 +0800 -Subject: [PATCH] fix ai_block_io some issues - ---- - ..._slow_io_detection.ini => ai_block_io.ini} | 6 +- - config/tasks/ai_block_io.mod | 5 + - .../tasks/ai_threshold_slow_io_detection.mod | 5 - - ...ow_io_detection.py => test_ai_block_io.py} | 0 - .../README.md | 0 - .../__init__.py | 0 - .../ai_block_io.py} | 57 ++-- - .../alarm_report.py | 2 +- - .../ai_block_io/config_parser.py | 256 ++++++++++++++++++ - .../data_access.py | 3 + - .../detector.py | 17 +- - .../io_data.py | 0 - .../sliding_window.py | 0 - .../threshold.py | 13 +- - .../utils.py | 15 +- - .../config_parser.py | 141 ---------- - src/python/setup.py | 2 +- - 17 files changed, 336 insertions(+), 186 deletions(-) - rename config/plugins/{ai_threshold_slow_io_detection.ini => ai_block_io.ini} (66%) - create mode 100644 config/tasks/ai_block_io.mod - delete mode 100644 config/tasks/ai_threshold_slow_io_detection.mod - rename selftest/test/{test_ai_threshold_slow_io_detection.py => test_ai_block_io.py} (100%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/README.md (100%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/__init__.py (100%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection/slow_io_detection.py => ai_block_io/ai_block_io.py} (66%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/alarm_report.py (98%) - create mode 100644 src/python/sentryPlugins/ai_block_io/config_parser.py - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/data_access.py (99%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/detector.py (77%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/io_data.py (100%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/sliding_window.py (100%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/threshold.py (92%) - rename src/python/sentryPlugins/{ai_threshold_slow_io_detection => ai_block_io}/utils.py (86%) - delete mode 100644 src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py - -diff --git a/config/plugins/ai_threshold_slow_io_detection.ini b/config/plugins/ai_block_io.ini -similarity index 66% -rename from config/plugins/ai_threshold_slow_io_detection.ini -rename to config/plugins/ai_block_io.ini -index 44eb928..01ce266 100644 ---- a/config/plugins/ai_threshold_slow_io_detection.ini -+++ b/config/plugins/ai_block_io.ini -@@ -4,9 +4,9 @@ slow_io_detect_frequency=1 - log_level=info - - [algorithm] --train_data_duration=0.1 --train_update_duration=0.02 --algorithm_type=n_sigma -+train_data_duration=24 -+train_update_duration=2 -+algorithm_type=boxplot - boxplot_parameter=1.5 - n_sigma_parameter=3 - -diff --git a/config/tasks/ai_block_io.mod b/config/tasks/ai_block_io.mod -new file mode 100644 -index 0000000..1971d7d ---- /dev/null -+++ b/config/tasks/ai_block_io.mod -@@ -0,0 +1,5 @@ -+[common] -+enabled=yes -+task_start=/usr/bin/python3 /usr/bin/ai_block_io -+task_stop=pkill -f /usr/bin/ai_block_io -+type=oneshot -\ No newline at end of file -diff --git a/config/tasks/ai_threshold_slow_io_detection.mod b/config/tasks/ai_threshold_slow_io_detection.mod -deleted file mode 100644 -index 2729f72..0000000 ---- a/config/tasks/ai_threshold_slow_io_detection.mod -+++ /dev/null -@@ -1,5 +0,0 @@ --[common] --enabled=yes --task_start=/usr/bin/python3 /usr/bin/ai_threshold_slow_io_detection --task_stop=pkill -f /usr/bin/ai_threshold_slow_io_detection --type=oneshot -\ No newline at end of file -diff --git a/selftest/test/test_ai_threshold_slow_io_detection.py b/selftest/test/test_ai_block_io.py -similarity index 100% -rename from selftest/test/test_ai_threshold_slow_io_detection.py -rename to selftest/test/test_ai_block_io.py -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md b/src/python/sentryPlugins/ai_block_io/README.md -similarity index 100% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/README.md -rename to src/python/sentryPlugins/ai_block_io/README.md -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/__init__.py b/src/python/sentryPlugins/ai_block_io/__init__.py -similarity index 100% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/__init__.py -rename to src/python/sentryPlugins/ai_block_io/__init__.py -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -similarity index 66% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py -rename to src/python/sentryPlugins/ai_block_io/ai_block_io.py -index 43cf770..31b8a97 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/slow_io_detection.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -23,7 +23,7 @@ from .data_access import get_io_data_from_collect_plug, check_collect_valid - from .io_data import MetricName - from .alarm_report import AlarmReport - --CONFIG_FILE = "/etc/sysSentry/plugins/ai_threshold_slow_io_detection.ini" -+CONFIG_FILE = "/etc/sysSentry/plugins/ai_block_io.ini" - - - def sig_handler(signum, frame): -@@ -40,34 +40,48 @@ class SlowIODetection: - - def __init__(self, config_parser: ConfigParser): - self._config_parser = config_parser -- self.__set_log_format() - self.__init_detector_name_list() - self.__init_detector() - -- def __set_log_format(self): -- log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -- log_level = get_log_level(self._config_parser.get_log_level()) -- logging.basicConfig(level=log_level, format=log_format) -- - def __init_detector_name_list(self): - self._disk_list = check_collect_valid(self._config_parser.get_slow_io_detect_frequency()) -- 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")) -+ 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: -+ 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.') -+ 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")) -+ logging.info(f'start to detection follow disk and it\'s metric: {self._detector_name_list}') - - def __init_detector(self): - train_data_duration, train_update_duration = (self._config_parser. - get_train_data_duration_and_train_update_duration()) - slow_io_detection_frequency = self._config_parser.get_slow_io_detect_frequency() -- threshold_type = get_threshold_type_enum(self._config_parser.get_algorithm_type()) -+ threshold_type = self._config_parser.get_algorithm_type() - data_queue_size, update_size = get_data_queue_size_and_update_size(train_data_duration, - train_update_duration, - slow_io_detection_frequency) -- sliding_window_type = get_sliding_window_type_enum(self._config_parser.get_sliding_window_type()) -+ sliding_window_type = self._config_parser.get_sliding_window_type() - window_size, window_threshold = self._config_parser.get_window_size_and_window_minimum_threshold() - - for detector_name in self._detector_name_list: -- threshold = ThresholdFactory().get_threshold(threshold_type, data_queue_size=data_queue_size, -+ threshold = ThresholdFactory().get_threshold(threshold_type, -+ boxplot_parameter=self._config_parser.get_boxplot_parameter(), -+ n_sigma_paramter=self._config_parser.get_n_sigma_parameter(), -+ data_queue_size=data_queue_size, - data_queue_update_size=update_size) - sliding_window = SlidingWindowFactory().get_sliding_window(sliding_window_type, queue_length=window_size, - threshold=window_threshold) -@@ -89,6 +103,7 @@ class SlowIODetection: - logging.debug(f'step1. Get io data: {str(io_data_dict_with_disk_name)}') - if io_data_dict_with_disk_name is None: - continue -+ - # Step2:慢IO检测 - logging.debug('step2. Start to detection slow io event.') - slow_io_event_list = [] -@@ -103,13 +118,14 @@ class SlowIODetection: - for slow_io_event in slow_io_event_list: - metric_name: MetricName = slow_io_event[0] - result = slow_io_event[1] -- AlarmReport.report_major_alm(f"disk {metric_name.get_disk_name()} has slow io event." -- f"stage: {metric_name.get_metric_name()}," -- f"type: {metric_name.get_io_access_type_name()}," -- f"metric: {metric_name.get_metric_name()}," -- f"current window: {result[1]}," -- f"threshold: {result[2]}") -- logging.error(f"slow io event happen: {str(slow_io_event)}") -+ alarm_content = (f"disk {metric_name.get_disk_name()} has slow io event. " -+ f"stage is: {metric_name.get_stage_name()}, " -+ f"io access type is: {metric_name.get_io_access_type_name()}, " -+ f"metric is: {metric_name.get_metric_name()}, " -+ f"current window is: {result[1]}, " -+ f"threshold is: {result[2]}") -+ AlarmReport.report_major_alm(alarm_content) -+ logging.warning(alarm_content) - - # Step4:等待检测时间 - logging.debug('step4. Wait to start next slow io event detection loop.') -@@ -120,6 +136,7 @@ def main(): - # Step1:注册消息处理函数 - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) -+ - # Step2:断点恢复 - # todo: - -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py b/src/python/sentryPlugins/ai_block_io/alarm_report.py -similarity index 98% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py -rename to src/python/sentryPlugins/ai_block_io/alarm_report.py -index 3f4f34e..230c8cd 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/alarm_report.py -+++ b/src/python/sentryPlugins/ai_block_io/alarm_report.py -@@ -15,7 +15,7 @@ import json - - - class AlarmReport: -- TASK_NAME = "SLOW_IO_DETECTION" -+ TASK_NAME = "ai_block_io" - - @staticmethod - def report_pass(info: str): -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -new file mode 100644 -index 0000000..632391d ---- /dev/null -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -0,0 +1,256 @@ -+# 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. -+ -+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) -+ -+ -+class ConfigParser: -+ DEFAULT_ABSOLUTE_THRESHOLD = 40 -+ DEFAULT_SLOW_IO_DETECTION_FREQUENCY = 1 -+ DEFAULT_LOG_LEVEL = 'info' -+ -+ DEFAULT_ALGORITHM_TYPE = 'boxplot' -+ DEFAULT_TRAIN_DATA_DURATION = 24 -+ DEFAULT_TRAIN_UPDATE_DURATION = 2 -+ DEFAULT_BOXPLOT_PARAMETER = 1.5 -+ DEFAULT_N_SIGMA_PARAMETER = 3 -+ -+ DEFAULT_SLIDING_WINDOW_TYPE = 'not_continuous' -+ DEFAULT_WINDOW_SIZE = 30 -+ DEFAULT_WINDOW_MINIMUM_THRESHOLD = 6 -+ -+ def __init__(self, config_file_name): -+ 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.__algorithm_type = ConfigParser.DEFAULT_ALGORITHM_TYPE -+ self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -+ self.__train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -+ self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -+ self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -+ -+ self.__sliding_window_type = ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE -+ self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -+ self.__window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -+ -+ self.__config_file_name = config_file_name -+ -+ def __read_absolute_threshold(self, items_common: dict): -+ try: -+ self.__absolute_threshold = float(items_common.get('absolute_threshold', -+ ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD)) -+ if self.__absolute_threshold <= 0: -+ logging.warning( -+ f'the_absolute_threshold: {self.__absolute_threshold} you set is invalid, use default value: {ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD}.') -+ self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -+ except ValueError: -+ self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -+ logging.warning( -+ f'the_absolute_threshold type conversion has error, use default value: {self.__absolute_threshold}.') -+ -+ def __read__slow_io_detect_frequency(self, items_common: dict): -+ try: -+ self.__slow_io_detect_frequency = int(items_common.get('slow_io_detect_frequency', -+ ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY)) -+ if self.__slow_io_detect_frequency < 1 or self.__slow_io_detect_frequency > 10: -+ logging.warning( -+ f'the slow_io_detect_frequency: {self.__slow_io_detect_frequency} you set is invalid, use default value: {ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY}.') -+ self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -+ except ValueError: -+ self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -+ 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') -+ if disks_to_detection is None: -+ logging.warning(f'config of disks_to_detect not found, the default value 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.') -+ self.__disks_to_detection = None -+ -+ def __read__train_data_duration(self, items_algorithm: dict): -+ try: -+ self.__train_data_duration = float(items_algorithm.get('train_data_duration', -+ ConfigParser.DEFAULT_TRAIN_DATA_DURATION)) -+ if self.__train_data_duration <= 0 or self.__train_data_duration > 720: -+ logging.warning( -+ f'the train_data_duration: {self.__train_data_duration} you set is invalid, use default value: {ConfigParser.DEFAULT_TRAIN_DATA_DURATION}.') -+ self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -+ except ValueError: -+ self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -+ logging.warning(f'the train_data_duration type conversion has error, use default value: {self.__train_data_duration}.') -+ -+ def __read__train_update_duration(self, items_algorithm: dict): -+ default_train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -+ if default_train_update_duration > self.__train_data_duration: -+ default_train_update_duration = self.__train_data_duration / 2 -+ -+ try: -+ self.__train_update_duration = float(items_algorithm.get('train_update_duration', -+ ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION)) -+ if self.__train_update_duration <= 0 or self.__train_update_duration > self.__train_data_duration: -+ logging.warning( -+ f'the train_update_duration: {self.__train_update_duration} you set is invalid, use default value: {default_train_update_duration}.') -+ self.__train_update_duration = default_train_update_duration -+ except ValueError: -+ self.__train_update_duration = default_train_update_duration -+ logging.warning(f'the train_update_duration type conversion has error, use default value: {self.__train_update_duration}.') -+ -+ def __read__algorithm_type_and_parameter(self, items_algorithm: dict): -+ algorithm_type = items_algorithm.get('algorithm_type', ConfigParser.DEFAULT_ALGORITHM_TYPE) -+ self.__algorithm_type = get_threshold_type_enum(algorithm_type) -+ -+ if self.__algorithm_type == ThresholdType.NSigmaThreshold: -+ try: -+ self.__n_sigma_parameter = float(items_algorithm.get('n_sigma_parameter', -+ ConfigParser.DEFAULT_N_SIGMA_PARAMETER)) -+ if self.__n_sigma_parameter <= 0 or self.__n_sigma_parameter > 10: -+ logging.warning( -+ f'the n_sigma_parameter: {self.__n_sigma_parameter} you set is invalid, use default value: {ConfigParser.DEFAULT_N_SIGMA_PARAMETER}.') -+ self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -+ except ValueError: -+ self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -+ logging.warning(f'the n_sigma_parameter type conversion has error, use default value: {self.__n_sigma_parameter}.') -+ elif self.__algorithm_type == ThresholdType.BoxplotThreshold: -+ try: -+ self.__boxplot_parameter = float(items_algorithm.get('boxplot_parameter', -+ ConfigParser.DEFAULT_BOXPLOT_PARAMETER)) -+ if self.__boxplot_parameter <= 0 or self.__boxplot_parameter > 10: -+ logging.warning( -+ f'the boxplot_parameter: {self.__boxplot_parameter} you set is invalid, use default value: {ConfigParser.DEFAULT_BOXPLOT_PARAMETER}.') -+ self.__n_sigma_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -+ except ValueError: -+ self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -+ logging.warning(f'the boxplot_parameter type conversion has error, use default value: {self.__boxplot_parameter}.') -+ -+ def __read__window_size(self, items_sliding_window: dict): -+ try: -+ self.__window_size = int(items_sliding_window.get('window_size', -+ ConfigParser.DEFAULT_WINDOW_SIZE)) -+ if self.__window_size < 1 or self.__window_size > 3600: -+ logging.warning( -+ f'the window_size: {self.__window_size} you set is invalid, use default value: {ConfigParser.DEFAULT_WINDOW_SIZE}.') -+ self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -+ except ValueError: -+ self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -+ logging.warning(f'window_size type conversion has error, use default value: {self.__window_size}.') -+ -+ def __read__window_minimum_threshold(self, items_sliding_window: dict): -+ default_window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -+ if default_window_minimum_threshold > self.__window_size: -+ default_window_minimum_threshold = self.__window_size / 2 -+ try: -+ self.__window_minimum_threshold = ( -+ int(items_sliding_window.get('window_minimum_threshold', -+ ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD))) -+ if self.__window_minimum_threshold < 1 or self.__window_minimum_threshold > self.__window_size: -+ logging.warning( -+ f'the window_minimum_threshold: {self.__window_minimum_threshold} you set is invalid, use default value: {default_window_minimum_threshold}.') -+ self.__window_minimum_threshold = default_window_minimum_threshold -+ except ValueError: -+ self.__window_minimum_threshold = default_window_minimum_threshold -+ logging.warning(f'window_minimum_threshold type conversion has error, use default value: {self.__window_minimum_threshold}.') -+ -+ def read_config_from_file(self): -+ con = configparser.ConfigParser() -+ con.read(self.__config_file_name, encoding='utf-8') -+ -+ if con.has_section('common'): -+ items_common = dict(con.items('common')) -+ self.__log_level = items_common.get('log_level', ConfigParser.DEFAULT_LOG_LEVEL) -+ init_log_format(self.__log_level) -+ self.__read_absolute_threshold(items_common) -+ self.__read__slow_io_detect_frequency(items_common) -+ self.__read__disks_to_detect(items_common) -+ else: -+ init_log_format(self.__log_level) -+ logging.warning("common section parameter not found, it will be set to default value.") -+ -+ if con.has_section('algorithm'): -+ items_algorithm = dict(con.items('algorithm')) -+ self.__read__train_data_duration(items_algorithm) -+ self.__read__train_update_duration(items_algorithm) -+ self.__read__algorithm_type_and_parameter(items_algorithm) -+ else: -+ logging.warning("algorithm section parameter not found, it will be set to default value.") -+ -+ if con.has_section('sliding_window'): -+ items_sliding_window = dict(con.items('sliding_window')) -+ sliding_window_type = items_sliding_window.get('sliding_window_type', -+ ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE) -+ self.__sliding_window_type = get_sliding_window_type_enum(sliding_window_type) -+ self.__read__window_size(items_sliding_window) -+ self.__read__window_minimum_threshold(items_sliding_window) -+ else: -+ logging.warning("sliding_window section parameter not found, it will be set to default value.") -+ -+ self.__print_all_config_value() -+ -+ def __print_all_config_value(self): -+ pass -+ -+ def get_slow_io_detect_frequency(self): -+ return self.__slow_io_detect_frequency -+ -+ def get_algorithm_type(self): -+ return self.__algorithm_type -+ -+ def get_sliding_window_type(self): -+ return self.__sliding_window_type -+ -+ def get_train_data_duration_and_train_update_duration(self): -+ return self.__train_data_duration, self.__train_update_duration -+ -+ def get_window_size_and_window_minimum_threshold(self): -+ return self.__window_size, self.__window_minimum_threshold -+ -+ def get_absolute_threshold(self): -+ return self.__absolute_threshold -+ -+ def get_log_level(self): -+ return self.__log_level -+ -+ def get_disks_to_detection(self): -+ return self.__disks_to_detection -+ -+ def get_boxplot_parameter(self): -+ return self.__boxplot_parameter -+ -+ def get_n_sigma_parameter(self): -+ return self.__n_sigma_parameter -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -similarity index 99% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py -rename to src/python/sentryPlugins/ai_block_io/data_access.py -index d9f3460..01c5315 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -17,6 +17,8 @@ from sentryCollector.collect_plugin import ( - get_io_data, - is_iocollect_valid, - ) -+ -+ - from .io_data import IOStageData, IOData - - COLLECT_STAGES = [ -@@ -32,6 +34,7 @@ COLLECT_STAGES = [ - "iocost", - ] - -+ - def check_collect_valid(period): - data_raw = is_iocollect_valid(period) - if data_raw["ret"] == 0: -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -similarity index 77% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py -rename to src/python/sentryPlugins/ai_block_io/detector.py -index eda9825..bcf62cb 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -26,19 +26,26 @@ class Detector: - self._threshold = threshold - self._slidingWindow = sliding_window - self._threshold.attach_observer(self._slidingWindow) -+ self._count = 0 - - def get_metric_name(self): - return self._metric_name - - def is_slow_io_event(self, io_data_dict_with_disk_name: dict): -- logging.debug(f'Enter Detector: {self}') -+ self._count += 1 -+ if self._count % 15 == 0: -+ self._count = 0 -+ logging.info(f"({self._metric_name}) 's latest threshold is: {self._threshold.get_threshold()}.") -+ logging.debug(f'enter Detector: {self}') - metric_value = get_metric_value_from_io_data_dict_by_metric_name(io_data_dict_with_disk_name, self._metric_name) -- if metric_value > 1e-6: -- logging.debug(f'Input metric value: {str(metric_value)}') -- self._threshold.push_latest_data_to_queue(metric_value) -+ if metric_value is None: -+ logging.debug('not found metric value, so return None.') -+ return False, None, None -+ logging.debug(f'input metric value: {str(metric_value)}') -+ self._threshold.push_latest_data_to_queue(metric_value) - detection_result = self._slidingWindow.is_slow_io_event(metric_value) - logging.debug(f'Detection result: {str(detection_result)}') -- logging.debug(f'Exit Detector: {self}') -+ logging.debug(f'exit Detector: {self}') - return detection_result - - def __repr__(self): -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/io_data.py b/src/python/sentryPlugins/ai_block_io/io_data.py -similarity index 100% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/io_data.py -rename to src/python/sentryPlugins/ai_block_io/io_data.py -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py b/src/python/sentryPlugins/ai_block_io/sliding_window.py -similarity index 100% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/sliding_window.py -rename to src/python/sentryPlugins/ai_block_io/sliding_window.py -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py b/src/python/sentryPlugins/ai_block_io/threshold.py -similarity index 92% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py -rename to src/python/sentryPlugins/ai_block_io/threshold.py -index 9e1ca7b..ff85d85 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/threshold.py -+++ b/src/python/sentryPlugins/ai_block_io/threshold.py -@@ -79,9 +79,9 @@ class AbsoluteThreshold(Threshold): - - - class BoxplotThreshold(Threshold): -- def __init__(self, parameter: float = 1.5, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ def __init__(self, boxplot_parameter: float = 1.5, data_queue_size: int = 10000, data_queue_update_size: int = 1000, **kwargs): - super().__init__(data_queue_size, data_queue_update_size) -- self.parameter = parameter -+ self.parameter = boxplot_parameter - - def _update_threshold(self): - data = list(self.data_queue.queue) -@@ -94,6 +94,8 @@ class BoxplotThreshold(Threshold): - self.notify_observer() - - def push_latest_data_to_queue(self, data): -+ if data < 1e-6: -+ return - try: - self.data_queue.put(data, block=False) - except queue.Full: -@@ -111,9 +113,9 @@ class BoxplotThreshold(Threshold): - - - class NSigmaThreshold(Threshold): -- def __init__(self, parameter: float = 2.0, data_queue_size: int = 10000, data_queue_update_size: int = 1000): -+ def __init__(self, n_sigma_parameter: float = 3.0, data_queue_size: int = 10000, data_queue_update_size: int = 1000, **kwargs): - super().__init__(data_queue_size, data_queue_update_size) -- self.parameter = parameter -+ self.parameter = n_sigma_parameter - - def _update_threshold(self): - data = list(self.data_queue.queue) -@@ -125,6 +127,8 @@ class NSigmaThreshold(Threshold): - self.notify_observer() - - def push_latest_data_to_queue(self, data): -+ if data < 1e-6: -+ return - try: - self.data_queue.put(data, block=False) - except queue.Full: -@@ -157,4 +161,3 @@ class ThresholdFactory: - return NSigmaThreshold(*args, **kwargs) - else: - raise ValueError(f"Invalid threshold type: {threshold_type}") -- -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py b/src/python/sentryPlugins/ai_block_io/utils.py -similarity index 86% -rename from src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py -rename to src/python/sentryPlugins/ai_block_io/utils.py -index f66e5ed..8dbba06 100644 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/utils.py -+++ b/src/python/sentryPlugins/ai_block_io/utils.py -@@ -8,13 +8,16 @@ - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. - # See the Mulan PSL v2 for more details. -+ - import logging - from dataclasses import asdict - -+ - from .threshold import ThresholdType - from .sliding_window import SlidingWindowType - from .io_data import MetricName, IOData - -+ - def get_threshold_type_enum(algorithm_type: str): - if algorithm_type.lower() == 'absolute': - return ThresholdType.AbsoluteThreshold -@@ -22,7 +25,7 @@ def get_threshold_type_enum(algorithm_type: str): - return ThresholdType.BoxplotThreshold - if algorithm_type.lower() == 'n_sigma': - return ThresholdType.NSigmaThreshold -- logging.info('not found correct algorithm type, use default: boxplot.') -+ logging.warning(f"the algorithm type: {algorithm_type} you set is invalid, use default value: boxplot") - return ThresholdType.BoxplotThreshold - - -@@ -33,7 +36,7 @@ def get_sliding_window_type_enum(sliding_window_type: str): - return SlidingWindowType.ContinuousSlidingWindow - if sliding_window_type.lower() == 'median': - return SlidingWindowType.MedianSlidingWindow -- logging.info('not found correct sliding window type, use default: not_continuous.') -+ logging.warning(f"the sliding window type: {sliding_window_type} you set is invalid, use default value: not_continuous") - return SlidingWindowType.NotContinuousSlidingWindow - - -@@ -62,6 +65,8 @@ def get_log_level(log_level: str): - return logging.INFO - elif log_level.lower() == 'warning': - return logging.WARNING -- elif log_level.lower() == 'fatal': -- return logging.FATAL -- return None -+ elif log_level.lower() == 'error': -+ return logging.ERROR -+ elif log_level.lower() == 'critical': -+ return logging.CRITICAL -+ return logging.INFO -diff --git a/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py b/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py -deleted file mode 100644 -index cd4e6f1..0000000 ---- a/src/python/sentryPlugins/ai_threshold_slow_io_detection/config_parser.py -+++ /dev/null -@@ -1,141 +0,0 @@ --# 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. -- --import configparser --import logging -- -- --class ConfigParser: -- -- DEFAULT_ABSOLUTE_THRESHOLD = 40 -- DEFAULT_SLOW_IO_DETECTION_FREQUENCY = 1 -- DEFAULT_LOG_LEVEL = 'info' -- DEFAULT_TRAIN_DATA_DURATION = 24 -- DEFAULT_TRAIN_UPDATE_DURATION = 2 -- DEFAULT_ALGORITHM_TYPE = 'boxplot' -- DEFAULT_N_SIGMA_PARAMETER = 3 -- DEFAULT_BOXPLOT_PARAMETER = 1.5 -- DEFAULT_SLIDING_WINDOW_TYPE = 'not_continuous' -- DEFAULT_WINDOW_SIZE = 30 -- DEFAULT_WINDOW_MINIMUM_THRESHOLD = 6 -- -- def __init__(self, config_file_name): -- self.__boxplot_parameter = None -- self.__window_minimum_threshold = None -- self.__window_size = None -- self.__sliding_window_type = None -- self.__n_sigma_parameter = None -- self.__algorithm_type = None -- self.__train_update_duration = None -- self.__log_level = None -- self.__slow_io_detect_frequency = None -- self.__absolute_threshold = None -- self.__train_data_duration = None -- self.__config_file_name = config_file_name -- -- def read_config_from_file(self): -- -- con = configparser.ConfigParser() -- con.read(self.__config_file_name, encoding='utf-8') -- -- items_common = dict(con.items('common')) -- items_algorithm = dict(con.items('algorithm')) -- items_sliding_window = dict(con.items('sliding_window')) -- -- try: -- self.__absolute_threshold = int(items_common.get('absolute_threshold', -- ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD)) -- except ValueError: -- self.__absolute_threshold = ConfigParser.DEFAULT_ABSOLUTE_THRESHOLD -- logging.warning('absolute threshold type conversion has error, use default value.') -- -- try: -- self.__slow_io_detect_frequency = int(items_common.get('slow_io_detect_frequency', -- ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY)) -- except ValueError: -- self.__slow_io_detect_frequency = ConfigParser.DEFAULT_SLOW_IO_DETECTION_FREQUENCY -- logging.warning('slow_io_detect_frequency type conversion has error, use default value.') -- -- self.__log_level = items_common.get('log_level', ConfigParser.DEFAULT_LOG_LEVEL) -- -- try: -- self.__train_data_duration = float(items_algorithm.get('train_data_duration', -- ConfigParser.DEFAULT_TRAIN_DATA_DURATION)) -- except ValueError: -- self.__train_data_duration = ConfigParser.DEFAULT_TRAIN_DATA_DURATION -- logging.warning('train_data_duration type conversion has error, use default value.') -- -- try: -- self.__train_update_duration = float(items_algorithm.get('train_update_duration', -- ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION)) -- except ValueError: -- self.__train_update_duration = ConfigParser.DEFAULT_TRAIN_UPDATE_DURATION -- logging.warning('train_update_duration type conversion has error, use default value.') -- -- try: -- self.__algorithm_type = items_algorithm.get('algorithm_type', ConfigParser.DEFAULT_ALGORITHM_TYPE) -- except ValueError: -- self.__algorithm_type = ConfigParser.DEFAULT_ALGORITHM_TYPE -- logging.warning('algorithmType type conversion has error, use default value.') -- -- if self.__algorithm_type == 'n_sigma': -- try: -- self.__n_sigma_parameter = float(items_algorithm.get('n_sigma_parameter', -- ConfigParser.DEFAULT_N_SIGMA_PARAMETER)) -- except ValueError: -- self.__n_sigma_parameter = ConfigParser.DEFAULT_N_SIGMA_PARAMETER -- logging.warning('n_sigma_parameter type conversion has error, use default value.') -- elif self.__algorithm_type == 'boxplot': -- try: -- self.__boxplot_parameter = float(items_algorithm.get('boxplot_parameter', -- ConfigParser.DEFAULT_BOXPLOT_PARAMETER)) -- except ValueError: -- self.__boxplot_parameter = ConfigParser.DEFAULT_BOXPLOT_PARAMETER -- logging.warning('boxplot_parameter type conversion has error, use default value.') -- -- self.__sliding_window_type = items_sliding_window.get('sliding_window_type', -- ConfigParser.DEFAULT_SLIDING_WINDOW_TYPE) -- -- try: -- self.__window_size = int(items_sliding_window.get('window_size', -- ConfigParser.DEFAULT_WINDOW_SIZE)) -- except ValueError: -- self.__window_size = ConfigParser.DEFAULT_WINDOW_SIZE -- logging.warning('window_size type conversion has error, use default value.') -- -- try: -- self.__window_minimum_threshold = ( -- int(items_sliding_window.get('window_minimum_threshold', -- ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD))) -- except ValueError: -- self.__window_minimum_threshold = ConfigParser.DEFAULT_WINDOW_MINIMUM_THRESHOLD -- logging.warning('window_minimum_threshold type conversion has error, use default value.') -- -- def get_slow_io_detect_frequency(self): -- return self.__slow_io_detect_frequency -- -- def get_algorithm_type(self): -- return self.__algorithm_type -- -- def get_sliding_window_type(self): -- return self.__sliding_window_type -- -- def get_train_data_duration_and_train_update_duration(self): -- return self.__train_data_duration, self.__train_update_duration -- -- def get_window_size_and_window_minimum_threshold(self): -- return self.__window_size, self.__window_minimum_threshold -- -- def get_absolute_threshold(self): -- return self.__absolute_threshold -- -- def get_log_level(self): -- return self.__log_level -diff --git a/src/python/setup.py b/src/python/setup.py -index dac6481..9e26a10 100644 ---- a/src/python/setup.py -+++ b/src/python/setup.py -@@ -34,7 +34,7 @@ setup( - 'xalarmd=xalarm.xalarm_daemon:alarm_process_create', - 'sentryCollector=sentryCollector.collectd:main', - 'avg_block_io=sentryPlugins.avg_block_io.avg_block_io:main', -- 'ai_threshold_slow_io_detection=sentryPlugins.ai_threshold_slow_io_detection.slow_io_detection:main' -+ 'ai_block_io=sentryPlugins.ai_block_io.ai_block_io:main' - ] - }, - ) --- -2.23.0 - diff --git a/fix-alarm_info-newline-break-error.patch b/fix-alarm_info-newline-break-error.patch deleted file mode 100644 index ba3d3b1..0000000 --- a/fix-alarm_info-newline-break-error.patch +++ /dev/null @@ -1,48 +0,0 @@ -From fe1bb401c1f77860616e74c1dbf5fe6aa862b17d Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Sat, 26 Oct 2024 07:18:16 +0000 -Subject: [PATCH] fix alarm_info newline break error - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 23 +++++++++++++++++++ - 1 file changed, 23 insertions(+) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index 2575307..b35a126 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -180,7 +180,30 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - if 'details' in alarm_info: - alarm_info.pop('details', None) - alarm.pop('msg1', None) -+ -+ # dump each {key,value} of details in one line -+ if 'details' in alarm_info and isinstance(alarm_info['details'], dict): -+ for key in alarm_info['details']: -+ alarm_info['details'][key] = json.dumps(alarm_info['details'][key], indent=None) -+ - alarm['alarm_info'] = alarm_info -+ alarm_list = [alarm for alarm in alarm_list if 'alarm_source' in alarm['alarm_info'] and alarm['alarm_info']['alarm_source'] == task_name] -+ -+ alarm_level_mapping = { -+ 1: 'MINOR_ALM', -+ 2: 'MAJOR_ALM', -+ 3: 'CRITICAL_ALM' -+ } -+ -+ alarm_type_mapping = { -+ 1: 'ALARM_TYPE_OCCUR', -+ 2: 'ALARM_TYPE_RECOVER' -+ } -+ -+ for alarm in alarm_list: -+ alarm['alarm_level'] = alarm_level_mapping.get(alarm['alarm_level'], 'UNKNOWN_LEVEL') -+ alarm['alarm_type'] = alarm_type_mapping.get(alarm['alarm_type'], 'UNKNOWN_TYPE') - return alarm_list -+ - finally: - alarm_list_lock.release() --- -2.27.0 - diff --git a/fix-bug-step-2-about-collect-module-and-avg-block-io.patch b/fix-bug-step-2-about-collect-module-and-avg-block-io.patch deleted file mode 100644 index 6b80cb9..0000000 --- a/fix-bug-step-2-about-collect-module-and-avg-block-io.patch +++ /dev/null @@ -1,323 +0,0 @@ -From e6eb39799b3ca15fb385c572863417ea26bdfa66 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Wed, 25 Sep 2024 11:03:29 +0800 -Subject: [PATCH] fix-bug-step-2-about-collect-module-and-avg-block-io - ---- - src/python/sentryCollector/collect_config.py | 11 ++- - src/python/sentryCollector/collect_io.py | 25 ++--- - src/python/sentryCollector/collect_plugin.py | 6 +- - src/python/sentryCollector/collect_server.py | 1 - - src/python/sentryCollector/collectd.py | 4 +- - .../avg_block_io/avg_block_io.py | 92 ++++++++++++++----- - 6 files changed, 96 insertions(+), 43 deletions(-) - -diff --git a/src/python/sentryCollector/collect_config.py b/src/python/sentryCollector/collect_config.py -index b6cc75c..0fdd9f0 100644 ---- a/src/python/sentryCollector/collect_config.py -+++ b/src/python/sentryCollector/collect_config.py -@@ -49,14 +49,14 @@ class CollectConfig: - self.config = configparser.ConfigParser() - self.config.read(self.filename) - except configparser.Error: -- logging.error("collectd configure file read failed") -+ logging.error("collect configure file read failed") - return - - try: - common_config = self.config[CONF_COMMON] -- modules_str = common_config[CONF_MODULES] -+ modules_str = common_config[CONF_MODULES].lower() - # remove space -- modules_list = modules_str.replace(" ", "").split(',') -+ modules_list = set(modules_str.replace(" ", "").split(',')) - except KeyError as e: - logging.error("read config data failed, %s", e) - return -@@ -98,7 +98,7 @@ class CollectConfig: - CONF_IO, CONF_IO_MAX_SAVE, CONF_IO_MAX_SAVE_DEFAULT) - result_io_config[CONF_IO_MAX_SAVE] = CONF_IO_MAX_SAVE_DEFAULT - # disk -- disk = io_map_value.get(CONF_IO_DISK) -+ disk = io_map_value.get(CONF_IO_DISK).lower() - if disk: - disk_str = disk.replace(" ", "") - pattern = r'^[a-zA-Z0-9-_,]+$' -@@ -106,12 +106,13 @@ class CollectConfig: - 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 -+ disk_str = ",".join(set(disk_str.split(','))) - result_io_config[CONF_IO_DISK] = disk_str - else: - logging.warning("module_name = %s section, field = %s is incorrect, use default %s", - CONF_IO, CONF_IO_DISK, CONF_IO_DISK_DEFAULT) - result_io_config[CONF_IO_DISK] = CONF_IO_DISK_DEFAULT -- logging.info("config get_io_config: %s", result_io_config) -+ logging.debug("config get_io_config: %s", result_io_config) - return result_io_config - - def get_common_config(self): -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index 104b734..9c8dae7 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -177,10 +177,8 @@ class CollectIo(): - - def is_kernel_avaliable(self): - base_path = '/sys/kernel/debug/block' -+ all_disk = [] - for disk_name in os.listdir(base_path): -- if not self.loop_all and disk_name not in self.disk_list: -- continue -- - disk_path = os.path.join(base_path, disk_name) - blk_io_hierarchy_path = os.path.join(disk_path, 'blk_io_hierarchy') - -@@ -190,12 +188,18 @@ class CollectIo(): - - for file_name in os.listdir(blk_io_hierarchy_path): - file_path = os.path.join(blk_io_hierarchy_path, file_name) -- - if file_name == 'stats': -- stage_list = self.extract_first_column(file_path) -- self.disk_map_stage[disk_name] = stage_list -- self.window_value[disk_name] = {} -- IO_GLOBAL_DATA[disk_name] = {} -+ all_disk.append(disk_name) -+ -+ for disk_name in self.disk_list: -+ if not self.loop_all and disk_name not in all_disk: -+ logging.warning("the %s disk not exist!", disk_name) -+ continue -+ stats_file = '/sys/kernel/debug/block/{}/blk_io_hierarchy/stats'.format(disk_name) -+ stage_list = self.extract_first_column(stats_file) -+ self.disk_map_stage[disk_name] = stage_list -+ self.window_value[disk_name] = {} -+ IO_GLOBAL_DATA[disk_name] = {} - - return len(IO_GLOBAL_DATA) != 0 - -@@ -203,7 +207,7 @@ class CollectIo(): - logging.info("collect io thread start") - - if not self.is_kernel_avaliable() or len(self.disk_map_stage) == 0: -- logging.warning("no disks meet the requirements. collect io thread exits") -+ logging.warning("no disks meet the requirements. collect io thread exit") - return - - for disk_name, stage_list in self.disk_map_stage.items(): -@@ -239,5 +243,4 @@ class CollectIo(): - - # set stop event, notify thread exit - def stop_thread(self): -- logging.debug("collect io thread is preparing to exit") -- self.stop_event.set() -+ self.stop_event.set() -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 9132473..1faa5e3 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -10,7 +10,7 @@ - # See the Mulan PSL v2 for more details. - - """ --collcet plugin -+collect plugin - """ - import json - import socket -@@ -75,7 +75,7 @@ def client_send_and_recv(request_data, data_str_len, protocol): - try: - client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - except socket.error: -- print("collect_plugin: client creat socket error") -+ print("collect_plugin: client create socket error") - return None - - try: -@@ -128,7 +128,7 @@ def client_send_and_recv(request_data, data_str_len, protocol): - def validate_parameters(param, len_limit, char_limit): - ret = ResultMessage.RESULT_SUCCEED - if not param: -- print("parm is invalid") -+ print("param is invalid") - ret = ResultMessage.RESULT_NOT_PARAM - return [False, ret] - -diff --git a/src/python/sentryCollector/collect_server.py b/src/python/sentryCollector/collect_server.py -index bab4e56..11d1af0 100644 ---- a/src/python/sentryCollector/collect_server.py -+++ b/src/python/sentryCollector/collect_server.py -@@ -281,5 +281,4 @@ class CollectServer(): - pass - - def stop_thread(self): -- logging.debug("collect listen thread is preparing to exit") - self.stop_event.set() -diff --git a/src/python/sentryCollector/collectd.py b/src/python/sentryCollector/collectd.py -index 3a836df..d9d8862 100644 ---- a/src/python/sentryCollector/collectd.py -+++ b/src/python/sentryCollector/collectd.py -@@ -79,7 +79,7 @@ def main(): - for info in module_list: - class_name = Module_Map_Class.get(info) - if not class_name: -- logging.info("%s correspond to class is not exists", info) -+ logging.info("%s correspond to class is not exist", info) - continue - cn = class_name(module_config) - collect_thread = threading.Thread(target=cn.main_loop) -@@ -94,4 +94,4 @@ def main(): - finally: - pass - -- logging.info("All threads have finished. Main thread is exiting.") -\ No newline at end of file -+ logging.info("all threads have finished. main thread exit.") -\ No newline at end of file -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index 73f0b22..ac35be2 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -28,33 +28,53 @@ def log_invalid_keys(not_in_list, keys_name, config_list, default_list): - - - def read_config_common(config): -- """read config file, get [common] section value""" -- try: -- common_sec = config['common'] -- except configparser.NoSectionError: -+ """read config file, get [common] section value""" -+ if not config.has_section("common"): - report_alarm_fail("Cannot find common section in config file") - - try: -- period_time = int(common_sec.get("period_time", 1)) -- if not (1 <= period_time <= 300): -- raise ValueError("Invalid period_time") -- except ValueError: -- period_time = 1 -- logging.warning("Invalid period_time, set to 1s") -+ disk_name = config.get("common", "disk") -+ disk = [] if disk_name == "default" else disk_name.split(",") -+ except configparser.NoOptionError: -+ disk = [] -+ logging.warning("Unset disk, set to default") - -- disk = common_sec.get('disk').split(",") if common_sec.get('disk') not in [None, 'default'] else [] -- stage = common_sec.get('stage').split(",") if common_sec.get('stage') not in [None, 'default'] else [] -+ try: -+ stage_name = config.get("common", "stage") -+ stage = [] if stage_name == "default" else stage_name.split(",") -+ except configparser.NoOptionError: -+ stage = [] -+ logging.warning("Unset stage, set to read,write") - - if len(disk) > 10: - logging.warning("Too many disks, record only max 10 disks") - disk = disk[:10] - -- iotype = common_sec.get('iotype', 'read,write').split(",") -- iotype_list = [rw.lower() for rw in iotype if rw.lower() in ['read', 'write', 'flush', 'discard']] -- err_iotype = [rw for rw in iotype if rw.lower() not in ['read', 'write', 'flush', 'discard']] -+ try: -+ iotype_name = config.get("common", "iotype").split(",") -+ iotype_list = [rw.lower() for rw in iotype_name if rw.lower() in ['read', 'write', 'flush', 'discard']] -+ err_iotype = [rw.lower() for rw in iotype_name if rw.lower() not in ['read', 'write', 'flush', 'discard']] -+ -+ if iotype_list in [None, []]: -+ iotype_list = ["read", "write"] -+ except configparser.NoOptionError: -+ iotype = ["read", "write"] -+ logging.warning("Unset iotype, set to default") - - if err_iotype: - logging.warning("{} in common.iotype are not valid, set iotype={}".format(err_iotype, iotype_list)) -+ -+ -+ try: -+ period_time = int(config.get("common", "period_time")) -+ if not (1 <= period_time <= 300): -+ raise ValueError("Invalid period_time") -+ except ValueError: -+ period_time = 1 -+ logging.warning("Invalid period_time, set to 1s") -+ except configparser.NoOptionError: -+ period_time = 1 -+ logging.warning("Unset period_time, use 1s as default") - - return period_time, disk, stage, iotype_list - -@@ -68,11 +88,23 @@ def read_config_algorithm(config): - win_size = int(config.get("algorithm", "win_size")) - if not (1 <= win_size <= 300): - raise ValueError("Invalid win_size") -+ except ValueError: -+ win_size = 30 -+ logging.warning("Invalid win_size, set to 30") -+ except configparser.NoOptionError: -+ win_size = 30 -+ logging.warning("Unset win_size, use 30 as default") -+ -+ try: - win_threshold = int(config.get("algorithm", "win_threshold")) - 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") -+ win_threshold = 6 -+ logging.warning("Invalid win_threshold, set to 6") -+ except configparser.NoOptionError: -+ win_threshold = 6 -+ logging.warning("Unset win_threshold, use 6 as default") - - return win_size, win_threshold - -@@ -80,6 +112,21 @@ def read_config_algorithm(config): - def read_config_lat_iodump(io_dic, config): - """read config file, get [latency] [iodump] section value""" - common_param = {} -+ lat_sec = None -+ if not config.has_section("latency"): -+ logging.warning("Cannot find algorithm section in config file") -+ else: -+ lat_sec = config["latency"] -+ -+ iodump_sec = None -+ if not config.has_section("iodump"): -+ logging.warning("Cannot find iodump section in config file") -+ else: -+ lat_sec = config["iodump"] -+ -+ if not lat_sec and not iodump_sec: -+ return common_param -+ - for io_type in io_dic["iotype_list"]: - common_param[io_type] = {} - -@@ -90,13 +137,16 @@ def read_config_lat_iodump(io_dic, config): - } - iodump_key = "{}_iodump_lim".format(io_type) - -+ if iodump_sec and iodump_key in iodump_sec and iodump_sec[iodump_key].isdecimal(): -+ common_param[io_type][iodump_key] = int(iodump_sec[iodump_key]) -+ -+ if not lat_sec: -+ continue -+ - for key_suffix, key_template in latency_keys.items(): -- if key_template in config["latency"] and config["latency"][key_template].isdecimal(): -- common_param[io_type][key_template] = int(config["latency"][key_template]) -+ if key_template in lat_sec and lat_sec[key_template].isdecimal(): -+ common_param[io_type][key_template] = int(lat_sec[key_template]) - -- if iodump_key in config["iodump"] and config["iodump"][iodump_key].isdecimal(): -- common_param[io_type][iodump_key] = int(config["iodump"][iodump_key]) -- - return common_param - - --- -2.33.0 - diff --git a/fix-config-relative-some-issues.patch b/fix-config-relative-some-issues.patch deleted file mode 100644 index dbc0815..0000000 --- a/fix-config-relative-some-issues.patch +++ /dev/null @@ -1,243 +0,0 @@ -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 - diff --git a/fix-configparser.InterpolationSyntaxError.patch b/fix-configparser.InterpolationSyntaxError.patch deleted file mode 100644 index 8dfd67b..0000000 --- a/fix-configparser.InterpolationSyntaxError.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 65ceade489c4018c3f315104d70be0550a28d9d9 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Wed, 11 Sep 2024 10:23:41 +0800 -Subject: [PATCH] fix configparser.InterpolationSyntaxError - ---- - src/python/syssentry/sentry_config.py | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/python/syssentry/sentry_config.py b/src/python/syssentry/sentry_config.py -index 01f3df8..a0e7b79 100644 ---- a/src/python/syssentry/sentry_config.py -+++ b/src/python/syssentry/sentry_config.py -@@ -103,14 +103,18 @@ class CpuPluginsParamsConfig: - """read config file""" - config_param_section_args = {} - if os.path.exists(self.config_file): -- self.config.read(self.config_file) - try: -+ self.config.read(self.config_file) - config_param_section_args = dict(self.config[self.param_section_name]) -- except (ValueError, KeyError): -+ except (ValueError, KeyError, configparser.InterpolationSyntaxError): - config_param_section_args = {} -+ logging.error("Failed to parse cpu_sentry.ini!") - return config_param_section_args - - def join_cpu_start_cmd(self, cpu_param_dict: dict) -> str: -+ if not cpu_param_dict: -+ return "" -+ - cpu_list = cpu_param_dict.get("cpu_list", "default") - if cpu_list == "default": - cpu_list = CpuPluginsParamsConfig.get_cpu_info() --- -2.27.0 - diff --git a/fix-error-handling.patch b/fix-error-handling.patch deleted file mode 100644 index faadc7a..0000000 --- a/fix-error-handling.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 370b22b032dce9290eebca1cf8d48bd155164b6a Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Wed, 24 Jul 2024 17:53:58 +0800 -Subject: [PATCH] fix error handling - ---- - src/python/syssentry/cpu_sentry.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/python/syssentry/cpu_sentry.py b/src/python/syssentry/cpu_sentry.py -index 3c4d58d..d0bafa8 100644 ---- a/src/python/syssentry/cpu_sentry.py -+++ b/src/python/syssentry/cpu_sentry.py -@@ -87,7 +87,7 @@ class CpuSentry: - } - - def handle_cpu_output(self, stdout: str): -- if "" in stdout: -+ if "ERROR" in stdout: - self.send_result["result"] = ResultLevel.FAIL - self.send_result["details"]["code"] = 1004 - self.send_result["details"]["msg"] = stdout.split("\n")[0] --- -2.27.0 - diff --git a/fix-excessive-CPU-usage.patch b/fix-excessive-CPU-usage.patch deleted file mode 100644 index b72ed52..0000000 --- a/fix-excessive-CPU-usage.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 815537382fc0d5164fe57b0d984ca4a1ed8254ea Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Thu, 31 Oct 2024 16:00:50 +0800 -Subject: [PATCH] excessive CPU usage - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/xalarm/xalarm_transfer.py | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/src/python/xalarm/xalarm_transfer.py b/src/python/xalarm/xalarm_transfer.py -index b072007..4bebe5d 100644 ---- a/src/python/xalarm/xalarm_transfer.py -+++ b/src/python/xalarm/xalarm_transfer.py -@@ -62,7 +62,6 @@ def cleanup_closed_connections(server_sock, epoll, fd_to_socket): - to_remove.append(fileno) - - for fileno in to_remove: -- epoll.unregister(fileno) - fd_to_socket[fileno].close() - del fd_to_socket[fileno] - logging.info(f"cleaned up connection {fileno} for client lost connection.") -@@ -97,7 +96,6 @@ def wait_for_connection(server_sock, epoll, fd_to_socket, thread_should_stop): - logging.info(f"connection reach max num of {MAX_CONNECTION_NUM}, closed current connection!") - connection.close() - continue -- epoll.register(connection.fileno(), select.EPOLLOUT) - fd_to_socket[connection.fileno()] = connection - except socket.error as e: - logging.debug(f"socket error, reason is {e}") -@@ -122,7 +120,6 @@ def transmit_alarm(server_sock, epoll, fd_to_socket, bin_data): - except (BrokenPipeError, ConnectionResetError): - to_remove.append(fileno) - for fileno in to_remove: -- epoll.unregister(fileno) - fd_to_socket[fileno].close() - del fd_to_socket[fileno] - logging.info(f"cleaned up connection {fileno} for client lost connection.") --- -2.27.0 - diff --git a/fix-frequency-param-check-bug.patch b/fix-frequency-param-check-bug.patch deleted file mode 100644 index 06d4b4a..0000000 --- a/fix-frequency-param-check-bug.patch +++ /dev/null @@ -1,70 +0,0 @@ -From a06ad0c944b093a71f49cc9fccd5097c1493ca5e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E8=B4=BA=E6=9C=89=E5=BF=97?= <1037617413@qq.com> -Date: Mon, 21 Oct 2024 17:31:32 +0800 -Subject: [PATCH] fix frequency param check bug - ---- - .../sentryPlugins/ai_block_io/config_parser.py | 13 +++++++++++-- - .../sentryPlugins/ai_block_io/data_access.py | 14 ++++++++++++++ - 2 files changed, 25 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 447eccd..274a31e 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -16,6 +16,7 @@ import logging - from .alarm_report import Report - from .threshold import ThresholdType - from .utils import get_threshold_type_enum, get_sliding_window_type_enum, get_log_level -+from .data_access import check_detect_frequency_is_valid - - - LOG_FORMAT = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -@@ -165,9 +166,17 @@ class ConfigParser: - "slow_io_detect_frequency", - int, - self.DEFAULT_CONF["common"]["slow_io_detect_frequency"], -- gt=0, -- le=300, -+ gt=0 - ) -+ frequency = self._conf["common"]["slow_io_detect_frequency"] -+ ret = check_detect_frequency_is_valid(frequency) -+ if ret is None: -+ log = f"slow io detect frequency: {frequency} is valid, "\ -+ f"Check whether the value range is too large or is not an "\ -+ f"integer multiple of period_time.. exiting..." -+ Report.report_pass(log) -+ logging.critical(log) -+ exit(1) - - def _read_disks_to_detect(self, items_common: dict): - disks_to_detection = items_common.get("disk") -diff --git a/src/python/sentryPlugins/ai_block_io/data_access.py b/src/python/sentryPlugins/ai_block_io/data_access.py -index 1bc5ed8..e4869d5 100644 ---- a/src/python/sentryPlugins/ai_block_io/data_access.py -+++ b/src/python/sentryPlugins/ai_block_io/data_access.py -@@ -53,6 +53,20 @@ def check_collect_valid(period): - return None - - -+def check_detect_frequency_is_valid(period): -+ data_raw = is_iocollect_valid(period) -+ if data_raw["ret"] == 0: -+ try: -+ data = json.loads(data_raw["message"]) -+ except Exception as e: -+ return None -+ if not data: -+ return None -+ return [k for k in data.keys()] -+ else: -+ return None -+ -+ - def _get_raw_data(period, disk_list): - return get_io_data( - period, --- -2.23.0 - diff --git a/fix-get_alarm-error.patch b/fix-get_alarm-error.patch deleted file mode 100644 index 19d8dcc..0000000 --- a/fix-get_alarm-error.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 8f28a40ffd7dc7aa969a7bfc0a170ed0c8f03bce Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Tue, 22 Oct 2024 20:28:59 +0800 -Subject: [PATCH] fix get_alarm error - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index c3f2ee1..2575307 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -139,8 +139,6 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - return [] - alarm_id = task_alarm_id_dict[task_name] - clear_time = alarm_id_clear_time_dict[alarm_id] -- if clear_time < int(time_range): -- return [] - if alarm_id not in alarm_list_dict: - logging.debug("alarm_id does not exist") - return [] -@@ -154,6 +152,9 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - if timestamp - (xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > time_range: - stop_index = i - break -+ if timestamp - (xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > clear_time: -+ stop_index = i -+ break - if stop_index >= 0: - alarm_list = alarm_list[:stop_index] - logging.debug(f"get_alarm_result: final alarm_list of {alarm_id} has {len(alarm_list)} elements") --- -2.27.0 - diff --git a/fix-hbm-online-repair-notice-and-efi-create.patch b/fix-hbm-online-repair-notice-and-efi-create.patch deleted file mode 100644 index 9b0fa99..0000000 --- a/fix-hbm-online-repair-notice-and-efi-create.patch +++ /dev/null @@ -1,508 +0,0 @@ -From 85d6dae9d7c6148f2699ef7da7d2d784043a2ee1 Mon Sep 17 00:00:00 2001 -From: luckky -Date: Wed, 30 Oct 2024 10:41:11 +0800 -Subject: [PATCH] fix hbm online repair notice and efi create - ---- - src/c/hbm_online_repair/hbm_online_repair.c | 5 +- - .../non-standard-hbm-repair.c | 194 +++++++++--------- - .../non-standard-hbm-repair.h | 2 +- - src/c/hbm_online_repair/ras-events.c | 1 - - .../ras-non-standard-handler.c | 33 +-- - .../ras-non-standard-handler.h | 1 + - 6 files changed, 116 insertions(+), 120 deletions(-) - -diff --git a/src/c/hbm_online_repair/hbm_online_repair.c b/src/c/hbm_online_repair/hbm_online_repair.c -index 3ace206..b3b2742 100644 ---- a/src/c/hbm_online_repair/hbm_online_repair.c -+++ b/src/c/hbm_online_repair/hbm_online_repair.c -@@ -127,10 +127,7 @@ int main(int argc, char *argv[]) - return -1; - } - -- ret = init_all_flash(); -- if (ret < 0) { -- log(LOG_ERROR, "flash writer init failed\n"); -- } -+ get_flash_total_size(); - - handle_ras_events(ras); - -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.c b/src/c/hbm_online_repair/non-standard-hbm-repair.c -index b175e14..f26d8ae 100644 ---- a/src/c/hbm_online_repair/non-standard-hbm-repair.c -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.c -@@ -15,7 +15,7 @@ - #include "non-standard-hbm-repair.h" - - extern int page_isolation_threshold; --size_t total_size = 0; -+size_t flash_total_size = 0; - struct hisi_common_error_section { - uint32_t val_bits; - uint8_t version; -@@ -122,28 +122,58 @@ static void parse_fault_addr_info(struct fault_addr_info* info_struct, unsigned - info_struct->crc8 = (uint32_t)fault_addr; - } - --static bool variable_existed(char *name, char *guid) -+static bool is_variable_existing(char *name, char *guid) - { -+ char filename[PATH_MAX]; -+ snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -+ -+ return access(filename, F_OK | R_OK) == 0; -+} -+ -+static size_t get_var_size(char *name, char *guid) { - char filename[PATH_MAX]; - int fd; -+ struct stat stat; - - snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); - - // open var file - fd = open(filename, O_RDONLY); - if (fd < 0) { -- log(LOG_WARNING, "open file %s failed\n", filename); -- return false; -+ log(LOG_WARNING, "open %s failed\n", filename); -+ goto err; -+ } -+ // read stat -+ if (fstat(fd, &stat) != 0) { -+ log(LOG_WARNING, "fstat %s failed\n", filename); -+ goto err; - } - close(fd); -- return true; -+ return stat.st_size; -+err: -+ if (fd >= 0) -+ close(fd); -+ return (size_t)-1; - } - --static uint32_t read_variable_attribute(char *name, char *guid) { -+void get_flash_total_size() { -+ for (int i = 0; i < FLASH_ENTRY_NUM; i++) { -+ if (is_variable_existing(flash_names[i], flash_guids[i])) { -+ flash_total_size += get_var_size(flash_names[i], flash_guids[i]); -+ } -+ } -+ // check total entry size -+ log(LOG_DEBUG, "current fault info total size: %luKB, flash max threshold: %uKB\n", -+ flash_total_size / KB_SIZE, MAX_VAR_SIZE / KB_SIZE); -+ if (flash_total_size > MAX_VAR_SIZE) { -+ log(LOG_WARNING, "fault info storage %zu reach threshold, cannot save new record\n", flash_total_size); -+ } -+} -+ -+static int read_variable_attribute(char *name, char *guid, uint32_t *attribute) { - char filename[PATH_MAX]; - int fd; - size_t readsize; -- uint32_t attribute = (uint32_t)-1; - - snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); - -@@ -151,17 +181,18 @@ static uint32_t read_variable_attribute(char *name, char *guid) { - fd = open(filename, O_RDONLY); - if (fd < 0) { - log(LOG_ERROR, "open %s failed\n", filename); -- return attribute; -+ return -1; - } - - // read attributes from first 4 bytes -- readsize = read(fd, &attribute, sizeof(uint32_t)); -+ readsize = read(fd, attribute, sizeof(uint32_t)); - if (readsize != sizeof(uint32_t)) { - log(LOG_ERROR, "read attribute of %s failed\n", filename); -+ return -1; - } - - close(fd); -- return attribute; -+ return 0; - } - - static int efivarfs_set_mutable(char *name, char *guid, bool mutable) -@@ -205,8 +236,8 @@ err: - return -1; - } - --static int write_variable(char *name, char *guid, void *value, unsigned long size, uint32_t attribute) { -- int fd, mode; -+static int write_variable(char *name, char *guid, void *value, unsigned long size, uint32_t attribute, bool is_existing) { -+ int fd = -1, mode; - size_t writesize; - void *buffer; - unsigned long total; -@@ -225,16 +256,13 @@ static int write_variable(char *name, char *guid, void *value, unsigned long siz - memcpy(buffer + sizeof(uint32_t), value, size); - - // change attr -- if (efivarfs_set_mutable(name, guid, 1) != 0) { -+ if (is_existing && efivarfs_set_mutable(name, guid, 1) != 0) { - log(LOG_ERROR, "set mutable for %s failed\n", filename); - goto err; - } - - mode = O_WRONLY; -- if (attribute & EFI_VARIABLE_APPEND_WRITE) -- mode |= O_APPEND; -- else -- mode |= O_CREAT; -+ mode |= is_existing ? O_APPEND : O_CREAT; - - // open var file - fd = open(filename, mode, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); -@@ -252,7 +280,7 @@ static int write_variable(char *name, char *guid, void *value, unsigned long siz - - close(fd); - free(buffer); -- if (efivarfs_set_mutable(name, guid, 0) != 0) { -+ if (is_existing && efivarfs_set_mutable(name, guid, 0) != 0) { - log(LOG_ERROR, "set immutable for %s failed\n", filename); - } - return 0; -@@ -261,86 +289,21 @@ err: - close(fd); - if (buffer) - free(buffer); -- if (efivarfs_set_mutable(name, guid, 0) != 0) { -+ if (is_existing && efivarfs_set_mutable(name, guid, 0) != 0) { - log(LOG_ERROR, "set immutable for %s failed\n", filename); - } - return -1; - } - --static int append_variable(char *name, char *guid, void *data, unsigned long size) { -- // prepare append attribute -- uint32_t attribute = read_variable_attribute(name, guid); -- if (attribute == (uint32_t)-1) { -- log(LOG_ERROR, "read %s-%s attribute failed\n", name, guid); -- return -1; -- } -- attribute |= EFI_VARIABLE_APPEND_WRITE; -- -- return write_variable(name, guid, data, size, attribute); --} -- --static size_t get_var_size(char *name, char *guid) { -- char filename[PATH_MAX]; -- int fd; -- struct stat stat; -- -- snprintf(filename, PATH_MAX - 1, "%s/%s-%s", EFIVARFS_PATH, name, guid); -- -- // open var file -- fd = open(filename, O_RDONLY); -- if (fd < 0) { -- log(LOG_WARNING, "open %s failed\n", filename); -- goto err; -- } -- // read stat -- if (fstat(fd, &stat) != 0) { -- log(LOG_WARNING, "fstat %s failed\n", filename); -- goto err; -- } -- close(fd); -- return stat.st_size; --err: -- if (fd >= 0) -- close(fd); -- return (size_t)-1; --} -- --int init_all_flash() { -- for (int i = 0; i < FLASH_ENTRY_NUM; i++) { -- // check existed entry -- if (variable_existed(flash_names[i], flash_guids[i])) { -- total_size += get_var_size(flash_names[i], flash_guids[i]); -- continue; -- } -- // create new entry -- uint32_t attribute = EFI_VARIABLE_NON_VOLATILE | -- EFI_VARIABLE_BOOTSERVICE_ACCESS | -- EFI_VARIABLE_RUNTIME_ACCESS; -- char *data = ""; -- unsigned long size = 1; -- int ret = write_variable(flash_names[i], flash_guids[i], data, size, attribute); -- if (ret) { -- log(LOG_ERROR, "init %s-%s failed, fault info storage funtion not enabled\n", flash_names[i], flash_guids[i]); -- return -1; -- } -- total_size += sizeof(uint32_t) + 1; -- } -- // check total entry size -- log(LOG_DEBUG, "current fault info total size: %luKB, flash max threshold: %uKB\n", -- total_size / KB_SIZE, MAX_VAR_SIZE / KB_SIZE); -- if (total_size > MAX_VAR_SIZE) { -- log(LOG_ERROR, "fault info storage reach threshold, cannot save new record\n"); -- } -- return 0; --} -- - static int write_fault_info_to_flash(const struct hisi_common_error_section *err) { - int ret, guid_index; - uint32_t reg_size; - uint64_t fault_addr; -+ bool is_existing; -+ uint32_t attribute = -1; - - // check flash usage threshold -- if (total_size + sizeof(uint64_t) > MAX_VAR_SIZE) { -+ if (flash_total_size + sizeof(uint64_t) > MAX_VAR_SIZE) { - log(LOG_WARNING, "fault info storage reach threshold, cannot save new record into flash\n"); - return -1; - } -@@ -359,14 +322,29 @@ static int write_fault_info_to_flash(const struct hisi_common_error_section *err - log(LOG_ERROR, "invalid fault info\n"); - return -1; - } -+ -+ // judge if the efivar is existing to set the attribute -+ is_existing = is_variable_existing(flash_names[guid_index], flash_guids[guid_index]); -+ attribute = EFI_VARIABLE_NON_VOLATILE | -+ EFI_VARIABLE_BOOTSERVICE_ACCESS | -+ EFI_VARIABLE_RUNTIME_ACCESS; -+ if (is_existing) { -+ ret = read_variable_attribute(flash_names[guid_index], flash_guids[guid_index], &attribute); -+ if (ret < 0) { -+ log(LOG_ERROR, "read variable %s-%s attribute failed, stop writing\n", flash_names[guid_index], flash_guids[guid_index]); -+ return -1; -+ } -+ attribute |= EFI_VARIABLE_APPEND_WRITE; -+ } -+ - // record physical addr in flash -- ret = append_variable(flash_names[guid_index], flash_guids[guid_index], &fault_addr, sizeof(uint64_t)); -+ ret = write_variable(flash_names[guid_index], flash_guids[guid_index], &fault_addr, sizeof(uint64_t), attribute, is_existing); - if (ret < 0) { -- log(LOG_ERROR, "append to %s-%s failed\n", flash_names[guid_index], flash_guids[guid_index]); -+ log(LOG_ERROR, "write to %s-%s failed\n", flash_names[guid_index], flash_guids[guid_index]); - return -1; - } -- total_size += sizeof(uint64_t); -- log(LOG_INFO, "write hbm fault info to flash success\n"); -+ flash_total_size += sizeof(uint64_t); -+ log(LOG_INFO, "write hbm fault info to flash %s-%s success\n", flash_names[guid_index], flash_guids[guid_index]); - return 0; - } - -@@ -421,7 +399,7 @@ static int get_hardware_corrupted_size() - return hardware_corrupted_size; - } - --static uint8_t get_repair_result_code(int ret) -+static uint8_t get_repair_failed_result_code(int ret) - { - if (ret == -ENOSPC) { - return REPAIR_FAILED_NO_RESOURCE; -@@ -582,11 +560,11 @@ static int hbmc_hbm_page_isolate(const struct hisi_common_error_section *err) - static int hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsigned long long paddr) - { - int ret; -- if (repair_ret < 0) { -+ if (repair_ret <= 0) { - log(LOG_WARNING, "HBM %s: Keep page (0x%llx) offline\n", is_acls ? "ACLS" : "SPPR", paddr); - /* not much we can do about errors here */ - (void)write_file("/sys/kernel/page_eject", "remove_page", paddr); -- return get_repair_result_code(repair_ret); -+ return get_repair_failed_result_code(repair_ret); - } - - ret = write_file("/sys/kernel/page_eject", "online_page", paddr); -@@ -615,9 +593,13 @@ static uint8_t hbmc_hbm_repair(const struct hisi_common_error_section *err, char - err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_PSUE_ACLS; - - ret = write_file(path, is_acls ? "acls_query" : "sppr_query", paddr); -- if (ret < 0) { -- notice_BMC(err, get_repair_result_code(ret)); -- log(LOG_WARNING, "HBM: Address 0x%llx is not supported to %s repair\n", paddr, is_acls ? "ACLS" : "SPPR"); -+ -+ /* Only positive num means the error is supported to repair */ -+ if (ret <= 0) { -+ if (ret != -ENXIO) { -+ notice_BMC(err, get_repair_failed_result_code(ret)); -+ log(LOG_WARNING, "HBM: Address 0x%llx is not supported to %s repair\n", paddr, is_acls ? "ACLS" : "SPPR"); -+ } - return ret; - } - -@@ -642,8 +624,9 @@ static uint8_t hbmc_hbm_repair(const struct hisi_common_error_section *err, char - all_online_success = false; - } - } -- if (ret < 0) { -- notice_BMC(err, get_repair_result_code(ret)); -+ /* The ret is from the acls/sppr repair, and only positive num means the error is repaired successfully */ -+ if (ret <= 0) { -+ notice_BMC(err, get_repair_failed_result_code(ret)); - return ret; - } else if (all_online_success) { - notice_BMC(err, ISOLATE_REPAIR_ONLINE_SUCCESS); -@@ -698,7 +681,7 @@ static void hbm_repair_handler(const struct hisi_common_error_section *err) - struct dirent *dent; - DIR *dir; - int ret; -- bool find_device = false, find_hbm_mem = false; -+ bool find_device = false, find_hbm_mem = false, addr_in_hbm_device = false; - - ret = hbmc_hbm_page_isolate(err); - if (ret < 0) { -@@ -723,10 +706,13 @@ static void hbm_repair_handler(const struct hisi_common_error_section *err) - if (hbmc_get_memory_type(path) == HBM_HBM_MEMORY) { - find_hbm_mem = true; - ret = hbmc_hbm_repair(err, path); -- if (ret != -ENXIO) -+ if (ret != -ENXIO) { -+ addr_in_hbm_device = true; - break; -+ } - } - } -+ - if (!find_device) { - log(LOG_ERROR, "Repair driver is not loaded, skip error, error_type is %u\n", - err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK); -@@ -735,6 +721,10 @@ static void hbm_repair_handler(const struct hisi_common_error_section *err) - log(LOG_ERROR, "No HBM device memory type found, skip error, error_type is %u\n", - err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK); - notice_BMC(err, REPAIR_FAILED_OTHER_REASON); -+ } else if (!addr_in_hbm_device) { -+ log(LOG_ERROR, "Err addr is not in device, skip error, error_type is %u\n", -+ err->reg_array[HBM_REPAIR_REQ_TYPE] & HBM_ERROR_MASK); -+ notice_BMC(err, REPAIR_FAILED_INVALID_PARAM); - } - - closedir(dir); -@@ -769,7 +759,7 @@ static bool hbm_repair_validate(const struct hisi_common_error_section *err) - (err->reg_array_size == HBM_CACHE_ARRAY_SIZE); - - if (!(is_acls_valid || is_sppr_valid || is_cache_mode)) { -- log(LOG_DEBUG, "err type (%u) is unknown or address array length (%u) is invalid\n", -+ log(LOG_WARNING, "err type (%u) is unknown or address array length (%u) is invalid\n", - hbm_repair_reg_type, err->reg_array_size); - return false; - } -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.h b/src/c/hbm_online_repair/non-standard-hbm-repair.h -index 7e8e448..ecb04fe 100644 ---- a/src/c/hbm_online_repair/non-standard-hbm-repair.h -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.h -@@ -84,6 +84,6 @@ - #define FLASH_ENTRY_NUM 8 - #define KB_SIZE 1024 - --extern int init_all_flash(); -+extern void get_flash_total_size(); - - #endif -diff --git a/src/c/hbm_online_repair/ras-events.c b/src/c/hbm_online_repair/ras-events.c -index 0b12329..4d281ad 100644 ---- a/src/c/hbm_online_repair/ras-events.c -+++ b/src/c/hbm_online_repair/ras-events.c -@@ -348,7 +348,6 @@ static int read_ras_event_all_cpus(struct pcpu_data *pdata, - "Error on CPU %i\n", i); - warnonce[i]++; - } -- continue; - } - if (!(fds[i].revents & POLLIN)) { - count_nready++; -diff --git a/src/c/hbm_online_repair/ras-non-standard-handler.c b/src/c/hbm_online_repair/ras-non-standard-handler.c -index 1d1fd04..48ffa70 100644 ---- a/src/c/hbm_online_repair/ras-non-standard-handler.c -+++ b/src/c/hbm_online_repair/ras-non-standard-handler.c -@@ -7,17 +7,21 @@ - #include "ras-non-standard-handler.h" - #include "logger.h" - --static char *uuid_le(const char *uu) -+static int uuid_le(const char *uu, char* uuid) - { -- static char uuid[sizeof("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]; - if (!uu) { - log(LOG_ERROR, "uuid_le failed: uu is empty"); -- return uuid; -+ return -1; - } - size_t uu_len = strlen(uu); -- if (uu_len < SECTION_TYPE_UUID_LEN) { -- log(LOG_ERROR, "uuid_le failed: uu is too short"); -- return uuid; -+ if (uu_len != SECTION_TYPE_UUID_LEN) { -+ log(LOG_ERROR, "uuid_le failed: uu len is incorrect"); -+ return -1; -+ } -+ size_t uuid_len = strlen(uuid); -+ if (uuid_len != strlen(UUID_STR_TYPE)) { -+ log(LOG_ERROR, "uuid_le failed: uuid len is incorrect"); -+ return -1; - } - - char *p = uuid; -@@ -38,7 +42,7 @@ static char *uuid_le(const char *uu) - - *p = 0; - -- return uuid; -+ return 0; - } - - int ras_non_standard_event_handler(struct trace_seq *s, -@@ -52,15 +56,20 @@ int ras_non_standard_event_handler(struct trace_seq *s, - ev.sec_type = tep_get_field_raw(s, event, "sec_type", - record, &len, 1); - if(!ev.sec_type) { -- log(LOG_WARNING, "get event section type failed"); -+ log(LOG_WARNING, "get event section type failed\n"); - return -1; - } - - trace_seq_printf(s, "\n"); -- trace_seq_printf(s, "sec_type: %s\n", uuid_le(ev.sec_type)); -+ char uuid[sizeof(UUID_STR_TYPE)] = UUID_STR_TYPE; -+ if (uuid_le(ev.sec_type, uuid) < 0) { -+ log(LOG_WARNING, "get uuid failed\n"); -+ return -1; -+ } -+ trace_seq_printf(s, "sec_type: %s\n", uuid); - - if (tep_get_field_val(s, event, "len", record, &val, 1) < 0) { -- log(LOG_WARNING, "tep get field val failed"); -+ log(LOG_WARNING, "tep get field val failed\n"); - return -1; - } - -@@ -69,11 +78,11 @@ int ras_non_standard_event_handler(struct trace_seq *s, - - ev.error = tep_get_field_raw(s, event, "buf", record, &len, 1); - if(!ev.error || ev.length != len) { -- log(LOG_WARNING, "get event error failed"); -+ log(LOG_WARNING, "get event error failed\n"); - return -1; - } - -- if (strcmp(uuid_le(ev.sec_type), HISI_COMMON_SECTION_TYPE_UUID) == 0) { -+ if (strcmp(uuid, HISI_COMMON_SECTION_TYPE_UUID) == 0) { - decode_hisi_common_section(&ev); - } - -diff --git a/src/c/hbm_online_repair/ras-non-standard-handler.h b/src/c/hbm_online_repair/ras-non-standard-handler.h -index 0272dc1..15a37ee 100644 ---- a/src/c/hbm_online_repair/ras-non-standard-handler.h -+++ b/src/c/hbm_online_repair/ras-non-standard-handler.h -@@ -7,6 +7,7 @@ - #define BIT(nr) (1UL << (nr)) - - #define SECTION_TYPE_UUID_LEN 16 -+#define UUID_STR_TYPE "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - #define HISI_COMMON_SECTION_TYPE_UUID "c8b328a8-9917-4af6-9a13-2e08ab2e7586" - - struct ras_non_standard_event { --- -2.43.0 - diff --git a/fix-io_dump-for-collect-module.patch b/fix-io_dump-for-collect-module.patch deleted file mode 100644 index 452ba0a..0000000 --- a/fix-io_dump-for-collect-module.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 6307a1ff4068a541658e3312ca938c6fdd9a5c1a Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Sat, 12 Oct 2024 14:51:51 +0800 -Subject: [PATCH] fix io_dump for collect module - ---- - src/python/sentryCollector/collect_io.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index d734734..11c9d9a 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -154,7 +154,7 @@ class CollectIo(): - try: - with open(io_dump_file, 'r') as file: - for line in file: -- count += line.count('.op=' + Io_Category[category]) -+ count += line.count('.op=' + Io_Category[category].upper()) - if count > 0: - logging.info(f"io_dump info : {disk_name}, {stage}, {category}, {count}") - except FileNotFoundError: --- -2.33.0 - diff --git a/fix-python-3.7-not-support-list-bool-type.patch b/fix-python-3.7-not-support-list-bool-type.patch deleted file mode 100644 index 6214cda..0000000 --- a/fix-python-3.7-not-support-list-bool-type.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 878bcf61467bfd9d015a8089a8367f4333ba76f6 Mon Sep 17 00:00:00 2001 -From: PshySimon -Date: Wed, 9 Oct 2024 10:20:34 +0800 -Subject: [PATCH] fix python 3.7 not support list[bool] type - ---- - src/python/xalarm/register_xalarm.py | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/python/xalarm/register_xalarm.py b/src/python/xalarm/register_xalarm.py -index e58343d..6756b1b 100644 ---- a/src/python/xalarm/register_xalarm.py -+++ b/src/python/xalarm/register_xalarm.py -@@ -26,7 +26,7 @@ ALARM_REGISTER_INFO = None - - - class AlarmRegister: -- def __init__(self, id_filter: list[bool], callback: callable): -+ def __init__(self, id_filter: list, callback: callable): - self.id_filter = id_filter - self.callback = callback - self.socket = self.create_unix_socket() -@@ -49,7 +49,7 @@ class AlarmRegister: - return False - return True - -- def set_id_filter(self, id_filter: list[bool]) -> bool: -+ def set_id_filter(self, id_filter: list) -> bool: - if (len(id_filter) > MAX_NUM_OF_ALARM_ID): - sys.stderr.write("set_id_filter: invalid param id_filter\n") - return False -@@ -118,7 +118,7 @@ class AlarmRegister: - self.socket.close() - - --def xalarm_register(callback: callable, id_filter: list[bool]) -> int: -+def xalarm_register(callback: callable, id_filter: list) -> int: - global ALARM_REGISTER_INFO - - if ALARM_REGISTER_INFO is not None: -@@ -148,7 +148,7 @@ def xalarm_unregister(clientId: int) -> None: - ALARM_REGISTER_INFO = None - - --def xalarm_upgrade(clientId: int, id_filter: list[bool]) -> None: -+def xalarm_upgrade(clientId: int, id_filter: list) -> None: - global ALARM_REGISTER_INFO - if clientId < 0: - sys.stderr.write("xalarm_unregister: invalid client\n") --- -2.27.0 - - diff --git a/fix-result-when-process-output-is-None.patch b/fix-result-when-process-output-is-None.patch deleted file mode 100644 index 9d22700..0000000 --- a/fix-result-when-process-output-is-None.patch +++ /dev/null @@ -1,36 +0,0 @@ -From e8e4fa5fd9e78508567782e17b7b1cb6ace3ef0d Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Fri, 26 Jul 2024 15:59:42 +0800 -Subject: [PATCH] fix result when process output is None - ---- - src/python/syssentry/cpu_sentry.py | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/src/python/syssentry/cpu_sentry.py b/src/python/syssentry/cpu_sentry.py -index d0bafa8..9287e2f 100644 ---- a/src/python/syssentry/cpu_sentry.py -+++ b/src/python/syssentry/cpu_sentry.py -@@ -87,11 +87,19 @@ class CpuSentry: - } - - def handle_cpu_output(self, stdout: str): -+ if not stdout: -+ logging.error("%s process output is None, it may be killed!", LOW_LEVEL_INSPECT_CMD) -+ self.send_result["result"] = ResultLevel.FAIL -+ self.send_result["details"]["code"] = 1005 -+ self.send_result["details"]["msg"] = "cpu_sentry task is killed!" -+ return -+ - if "ERROR" in stdout: - self.send_result["result"] = ResultLevel.FAIL - self.send_result["details"]["code"] = 1004 - self.send_result["details"]["msg"] = stdout.split("\n")[0] - return -+ - out_split = stdout.split("\n") - isolated_cores_number = 0 - found_fault_cores_list = [] --- -2.27.0 - diff --git a/fix-some-about-collect-module-and-avg-block-io.patch b/fix-some-about-collect-module-and-avg-block-io.patch deleted file mode 100644 index a32e5c7..0000000 --- a/fix-some-about-collect-module-and-avg-block-io.patch +++ /dev/null @@ -1,226 +0,0 @@ -From dea58a559f3dbad3dbce3b681639ee89c20b1cee Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Fri, 20 Sep 2024 14:35:39 +0800 -Subject: [PATCH] fix some about collect module and avg block io - ---- - config/tasks/avg_block_io.mod | 4 ++-- - src/python/sentryCollector/collect_io.py | 18 +++++++++++------- - src/python/sentryCollector/collect_plugin.py | 17 ++++++++--------- - src/python/sentryCollector/collect_server.py | 6 +++--- - src/python/sentryCollector/collectd.py | 2 -- - .../sentryPlugins/avg_block_io/avg_block_io.py | 13 ++++++++++--- - 6 files changed, 34 insertions(+), 26 deletions(-) - -diff --git a/config/tasks/avg_block_io.mod b/config/tasks/avg_block_io.mod -index 814c483..b9b6f34 100644 ---- a/config/tasks/avg_block_io.mod -+++ b/config/tasks/avg_block_io.mod -@@ -1,5 +1,5 @@ - [common] - enabled=yes - task_start=/usr/bin/python3 /usr/bin/avg_block_io --task_stop=pkill avg_block_io --type=oneshot -\ No newline at end of file -+task_stop=pkill -f /usr/bin/avg_block_io -+type=oneshot -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index b826dc4..104b734 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -175,8 +175,7 @@ class CollectIo(): - - threading.Timer(self.period_time, self.task_loop).start() - -- def main_loop(self): -- logging.info("collect io thread start") -+ def is_kernel_avaliable(self): - base_path = '/sys/kernel/debug/block' - for disk_name in os.listdir(base_path): - if not self.loop_all and disk_name not in self.disk_list: -@@ -198,8 +197,13 @@ class CollectIo(): - self.window_value[disk_name] = {} - IO_GLOBAL_DATA[disk_name] = {} - -- if len(self.disk_map_stage) == 0: -- logging.warning("no disks meet the requirements. the thread exits") -+ return len(IO_GLOBAL_DATA) != 0 -+ -+ def main_loop(self): -+ logging.info("collect io thread start") -+ -+ if not self.is_kernel_avaliable() or len(self.disk_map_stage) == 0: -+ logging.warning("no disks meet the requirements. collect io thread exits") - return - - for disk_name, stage_list in self.disk_map_stage.items(): -@@ -213,7 +217,7 @@ class CollectIo(): - start_time = time.time() - - if self.stop_event.is_set(): -- logging.info("collect io thread exit") -+ logging.debug("collect io thread exit") - return - - for disk_name, stage_list in self.disk_map_stage.items(): -@@ -227,7 +231,7 @@ class CollectIo(): - continue - while sleep_time > 1: - if self.stop_event.is_set(): -- logging.info("collect io thread exit") -+ logging.debug("collect io thread exit") - return - time.sleep(1) - sleep_time -= 1 -@@ -235,5 +239,5 @@ class CollectIo(): - - # set stop event, notify thread exit - def stop_thread(self): -- logging.info("collect io thread is preparing to exit") -+ logging.debug("collect io thread is preparing to exit") - self.stop_event.set() -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 49ce0a8..9132473 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -142,22 +142,21 @@ def validate_parameters(param, len_limit, char_limit): - 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] - -+ # length of len_limit is exceeded, keep len_limit -+ if len(param) > len_limit: -+ print(f"{param} length more than {len_limit}, keep the first {len_limit}") -+ param[:] = param[0:len_limit] -+ -+ # only keep elements under the char_limit length -+ param[:] = [elem for elem in param if len(elem) <= char_limit] -+ - return [True, ret] - - def is_iocollect_valid(period, disk_list=None, stage=None): -diff --git a/src/python/sentryCollector/collect_server.py b/src/python/sentryCollector/collect_server.py -index fa49781..bab4e56 100644 ---- a/src/python/sentryCollector/collect_server.py -+++ b/src/python/sentryCollector/collect_server.py -@@ -256,7 +256,7 @@ class CollectServer(): - - def server_loop(self): - """main loop""" -- logging.info("collect server thread start") -+ logging.info("collect listen thread start") - server_fd = self.server_fd_create() - if not server_fd: - return -@@ -267,7 +267,7 @@ class CollectServer(): - logging.debug("start server_loop loop") - while True: - if self.stop_event.is_set(): -- logging.info("collect server thread exit") -+ logging.debug("collect listen thread exit") - server_fd = None - return - try: -@@ -281,5 +281,5 @@ class CollectServer(): - pass - - def stop_thread(self): -- logging.info("collect server thread is preparing to exit") -+ logging.debug("collect listen thread is preparing to exit") - self.stop_event.set() -diff --git a/src/python/sentryCollector/collectd.py b/src/python/sentryCollector/collectd.py -index b77c642..3a836df 100644 ---- a/src/python/sentryCollector/collectd.py -+++ b/src/python/sentryCollector/collectd.py -@@ -49,7 +49,6 @@ def sig_handler(signum, _f): - Thread_List[i][0].stop_thread() - - remove_sock_file() -- sys.exit(0) - - def main(): - """main -@@ -64,7 +63,6 @@ def main(): - try: - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) -- signal.signal(signal.SIGHUP, sig_handler) - - logging.info("finish main parse_args") - -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index ff2071d..73f0b22 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -21,7 +21,7 @@ CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" - - def log_invalid_keys(not_in_list, keys_name, config_list, default_list): - """print invalid log""" -- if config_list and default_list: -+ if config_list and not_in_list: - logging.warning("{} in common.{} are not valid, set {}={}".format(not_in_list, keys_name, keys_name, default_list)) - elif config_list == ["default"]: - logging.warning("Default {} use {}".format(keys_name, default_list)) -@@ -144,9 +144,11 @@ def init_io_win(io_dic, config, common_param): - - if avg_lim_value and avg_time_value and tot_lim_value: - io_data[disk_name][stage_name][rw]["latency"] = IoWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_multiple=avg_time_value, abnormal_multiple_lim=avg_lim_value, abnormal_time=tot_lim_value) -+ logging.debug("Successfully create {}-{}-{} latency window".format(disk_name, stage_name, rw)) - - if iodump_lim_value is not None: - io_data[disk_name][stage_name][rw]["iodump"] = IoDumpWindow(window_size=io_dic["win_size"], window_threshold=io_dic["win_threshold"], abnormal_time=iodump_lim_value) -+ logging.debug("Successfully create {}-{}-{} iodump window".format(disk_name, stage_name, rw)) - return io_data, io_avg_value - - -@@ -159,10 +161,10 @@ def get_valid_disk_stage_list(io_dic, config_disk, config_stage): - for disk_stage_list in json_data.values(): - all_stage_set.update(disk_stage_list) - -- disk_list = [key for key in config_disk if key in all_disk_set] -+ disk_list = [key for key in all_disk_set if key in config_disk] - not_in_disk_list = [key for key in config_disk if key not in all_disk_set] - -- stage_list = [key for key in config_stage if key in all_stage_set] -+ stage_list = [key for key in all_stage_set if key in config_stage] - not_in_stage_list = [key for key in config_stage if key not in all_stage_set] - - if not config_disk: -@@ -171,6 +173,9 @@ def get_valid_disk_stage_list(io_dic, config_disk, config_stage): - if not config_stage: - stage_list = [key for key in all_stage_set] - -+ disk_list = disk_list[:10] if len(disk_list) > 10 else disk_list -+ stage_list = stage_list[:15] if len(stage_list) > 15 else stage_list -+ - if config_disk and not disk_list: - logging.warning("Cannot get valid disk by disk={}, set to default".format(config_disk)) - disk_list, stage_list = get_valid_disk_stage_list(io_dic, [], config_stage) -@@ -228,6 +233,8 @@ def main(): - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - -+ logging.basicConfig(level=logging.INFO) -+ - # 初始化配置读取 - config = configparser.ConfigParser(comment_prefixes=('#', ';')) - try: --- -2.33.0 - diff --git a/fix-syssentry-fails-to-be-started-when-cpu_sentry-is.patch b/fix-syssentry-fails-to-be-started-when-cpu_sentry-is.patch deleted file mode 100644 index 675277f..0000000 --- a/fix-syssentry-fails-to-be-started-when-cpu_sentry-is.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 497b3124f017ce4ae99b34261c4fd5dd2a358f5b Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Sat, 14 Sep 2024 09:28:00 +0800 -Subject: [PATCH] fix syssentry fails to be started when cpu_sentry is not - installed - ---- - src/python/syssentry/syssentry.py | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index f93956e..776971f 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -43,7 +43,6 @@ try: - from .cpu_alarm import cpu_alarm_recv - except ImportError: - CPU_EXIST = False -- logging.debug("Cannot find cpu sentry mod") - - - INSPECTOR = None -@@ -563,20 +562,21 @@ def main(): - if not os.path.exists(SENTRY_RUN_DIR): - os.mkdir(SENTRY_RUN_DIR) - os.chmod(SENTRY_RUN_DIR, mode=SENTRY_RUN_DIR_PERM) -- if not chk_and_set_pidfile(): -- logging.error("get pid file lock failed, exist") -- sys.exit(17) - - logging.basicConfig(filename=SYSSENTRY_LOG_FILE, level=logging.INFO) - os.chmod(SYSSENTRY_LOG_FILE, 0o600) - -+ if not chk_and_set_pidfile(): -+ logging.error("get pid file lock failed, exist") -+ sys.exit(17) -+ - try: - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - signal.signal(signal.SIGHUP, sig_handler) - signal.signal(signal.SIGCHLD, sigchld_handler) - -- logging.debug("finish main parse_args") -+ logging.info("finish main parse_args") - - _ = SentryConfig.init_param() - TasksMap.init_task_map() -@@ -587,3 +587,4 @@ def main(): - logging.error('%s', traceback.format_exc()) - finally: - release_pidfile() -+ --- -2.33.0 - diff --git a/fix-test_ai_block_io-fail.patch b/fix-test_ai_block_io-fail.patch deleted file mode 100644 index a83d535..0000000 --- a/fix-test_ai_block_io-fail.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 874daf9627c74aa31f1063c250b5477b2eb322e8 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Sat, 28 Dec 2024 11:31:23 +0800 -Subject: [PATCH] fix test_ai_block_io fail - ---- - selftest/test/test_ai_block_io.py | 26 +++++++++++++------------- - 1 file changed, 13 insertions(+), 13 deletions(-) - -diff --git a/selftest/test/test_ai_block_io.py b/selftest/test/test_ai_block_io.py -index c36fef5..58ab096 100644 ---- a/selftest/test/test_ai_block_io.py -+++ b/selftest/test/test_ai_block_io.py -@@ -12,9 +12,9 @@ - import unittest - import numpy as np - --from sentryPlugins.ai_threshold_slow_io_detection.threshold import AbsoluteThreshold, BoxplotThreshold, NSigmaThreshold --from sentryPlugins.ai_threshold_slow_io_detection.sliding_window import (NotContinuousSlidingWindow, -- ContinuousSlidingWindow, MedianSlidingWindow) -+from sentryPlugins.ai_block_io.threshold import AbsoluteThreshold, BoxplotThreshold, NSigmaThreshold -+from sentryPlugins.ai_block_io.sliding_window import (NotContinuousSlidingWindow, -+ ContinuousSlidingWindow, MedianSlidingWindow) - - - def _get_boxplot_threshold(data_list: list, parameter): -@@ -98,11 +98,11 @@ class Test(unittest.TestCase): - for data in data_list1: - boxplot_threshold.push_latest_data_to_queue(data) - result = not_continuous.is_slow_io_event(data) -- self.assertFalse(result[0]) -+ self.assertFalse(result[0][0]) - self.assertEqual(23.75, boxplot_threshold.get_threshold()) - boxplot_threshold.push_latest_data_to_queue(24) - result = not_continuous.is_slow_io_event(24) -- self.assertFalse(result[0]) -+ self.assertFalse(result[0][0]) - boxplot_threshold.push_latest_data_to_queue(25) - result = not_continuous.is_slow_io_event(25) - self.assertTrue(result[0]) -@@ -110,7 +110,7 @@ class Test(unittest.TestCase): - for data in data_list2: - boxplot_threshold.push_latest_data_to_queue(data) - result = not_continuous.is_slow_io_event(data) -- self.assertFalse(result[0]) -+ self.assertFalse(result[0][0]) - self.assertEqual(25.625, boxplot_threshold.get_threshold()) - - def test_continuous_sliding_window(self): -@@ -121,14 +121,14 @@ class Test(unittest.TestCase): - for data in data_list: - boxplot_threshold.push_latest_data_to_queue(data) - result = continuous.is_slow_io_event(data) -- self.assertFalse(result[0]) -+ self.assertFalse(result[0][0]) - self.assertEqual(23.75, boxplot_threshold.get_threshold()) - # 没有三个异常点 -- self.assertFalse(continuous.is_slow_io_event(25)[0]) -+ self.assertFalse(continuous.is_slow_io_event(25)[0][0]) - # 不连续的三个异常点 -- self.assertFalse(continuous.is_slow_io_event(25)[0]) -+ self.assertFalse(continuous.is_slow_io_event(25)[0][0]) - # 连续的三个异常点 -- self.assertTrue(continuous.is_slow_io_event(25)[0]) -+ self.assertTrue(continuous.is_slow_io_event(25)[0][0]) - - def test_median_sliding_window(self): - median = MedianSlidingWindow(5, 3) -@@ -137,7 +137,7 @@ class Test(unittest.TestCase): - absolute_threshold.set_threshold(24.5) - data_list = [24, 24, 24, 25, 25] - for data in data_list: -- self.assertFalse(median.is_slow_io_event(data)[0]) -+ self.assertFalse(median.is_slow_io_event(data)[0][0]) - self.assertTrue(median.is_slow_io_event(25)[0]) - - def test_parse_collect_data(self): -@@ -147,8 +147,8 @@ class Test(unittest.TestCase): - "flush": [9.0, 10.0, 11.0, 12.0], - "discard": [13.0, 14.0, 15.0, 16.0], - } -- from io_data import BaseData -- from data_access import _get_io_stage_data -+ from sentryPlugins.ai_block_io.io_data import BaseData -+ from sentryPlugins.ai_block_io.data_access import _get_io_stage_data - - io_data = _get_io_stage_data(collect) - self.assertEqual( --- -2.27.0 - diff --git a/fix-uint8-bug-and-change-isolation-default-value.patch b/fix-uint8-bug-and-change-isolation-default-value.patch deleted file mode 100644 index 959acf7..0000000 --- a/fix-uint8-bug-and-change-isolation-default-value.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 00ea35472d50faea89c881eb45b6d9d11f6b6632 Mon Sep 17 00:00:00 2001 -From: luckky -Date: Fri, 1 Nov 2024 15:09:57 +0800 -Subject: [PATCH] fix uint8 bug and change isolation default value - ---- - src/c/hbm_online_repair/hbm_online_repair.env | 2 +- - src/c/hbm_online_repair/non-standard-hbm-repair.c | 8 ++++---- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/src/c/hbm_online_repair/hbm_online_repair.env b/src/c/hbm_online_repair/hbm_online_repair.env -index de56079..7166c8d 100644 ---- a/src/c/hbm_online_repair/hbm_online_repair.env -+++ b/src/c/hbm_online_repair/hbm_online_repair.env -@@ -1,2 +1,2 @@ - HBM_ONLINE_REPAIR_LOG_LEVEL=1 --PAGE_ISOLATION_THRESHOLD=128 -+PAGE_ISOLATION_THRESHOLD=3355443 -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.c b/src/c/hbm_online_repair/non-standard-hbm-repair.c -index f26d8ae..b8dde7a 100644 ---- a/src/c/hbm_online_repair/non-standard-hbm-repair.c -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.c -@@ -359,7 +359,7 @@ static int write_file(char *path, const char *name, unsigned long long value) - - fd = open(fname, O_WRONLY); - if (fd < 0) { -- log(LOG_WARNING, "HBM ACLS: Cannot to open '%s': %s\n", -+ log(LOG_WARNING, "HBM: Cannot to open '%s': %s\n", - fname, strerror(errno)); - return -errno; - } -@@ -367,7 +367,7 @@ static int write_file(char *path, const char *name, unsigned long long value) - snprintf(buf, sizeof(buf), "0x%llx\n", value); - ret = write(fd, buf, strlen(buf)); - if (ret <= 0) -- log(LOG_WARNING, "HBM ACLS: Failed to set %s (0x%llx): %s\n", -+ log(LOG_WARNING, "HBM: Failed to set %s (0x%llx): %s\n", - fname, value, strerror(errno)); - - close(fd); -@@ -557,7 +557,7 @@ static int hbmc_hbm_page_isolate(const struct hisi_common_error_section *err) - return ret < 0 ? ret : 0; - } - --static int hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsigned long long paddr) -+static uint8_t hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsigned long long paddr) - { - int ret; - if (repair_ret <= 0) { -@@ -577,7 +577,7 @@ static int hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsig - } - } - --static uint8_t hbmc_hbm_repair(const struct hisi_common_error_section *err, char *path) -+static int hbmc_hbm_repair(const struct hisi_common_error_section *err, char *path) - { - unsigned long long paddr; - int ret; --- -2.43.0 - diff --git a/fix-version-in-setup.py.patch b/fix-version-in-setup.py.patch deleted file mode 100644 index 42816db..0000000 --- a/fix-version-in-setup.py.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 7baf2815f515c54bc33f41f495ec7c26988b5c44 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Tue, 11 Jun 2024 16:47:46 +0800 -Subject: [PATCH] fix version in setup.py - ---- - src/python/setup.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/python/setup.py b/src/python/setup.py -index 21dbe9f..f96a96e 100644 ---- a/src/python/setup.py -+++ b/src/python/setup.py -@@ -17,7 +17,7 @@ from setuptools import setup, find_packages - - setup( - name="syssentry", -- version="1.0.1", -+ version="1.0.2", - description="System inspection framework tool set", - packages=find_packages(), - include_package_data=True, --- -2.27.0 - diff --git a/fix-word-error.patch b/fix-word-error.patch deleted file mode 100644 index 1e7de89..0000000 --- a/fix-word-error.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 5be0d121c6fde185d323dc4bcf3026e2c3ee8757 Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Mon, 14 Oct 2024 11:30:58 +0800 -Subject: [PATCH] fix word error - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index d012901..bff527c 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -49,7 +49,7 @@ MAX_ALARM_ID = (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) - def update_alarm_list(alarm_info: Xalarm): - alarm_id = xalarm_getid(alarm_info) - if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -- logging.warnning(f"Invalid alarm_id {alarm_id}") -+ logging.warning(f"Invalid alarm_id {alarm_id}") - return - timestamp = xalarm_gettime(alarm_info) - if not timestamp: -@@ -97,14 +97,14 @@ def alarm_register(): - task = TasksMap.tasks_dict[task_type][task_name] - alarm_id = task.alarm_id - if not check_alarm_id_if_number(alarm_id): -- logging.warnning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ logging.warning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") - continue - if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -- logging.warnning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ logging.warning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") - continue - alarm_clear_time = task.alarm_clear_time - if not check_alarm_clear_time_if_positive_integer(alarm_clear_time): -- logging.warnning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -+ logging.warning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") - continue - try: - alarm_clear_time = int(alarm_clear_time) -@@ -113,7 +113,7 @@ def alarm_register(): - if alarm_clear_time > sys.maxsize: - raise ValueError("Exceeds maximum value for int") - except (ValueError, OverflowError, TypeError) as e: -- logging.warnning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -+ logging.warning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") - continue - alarm_list_dict[alarm_id] = [] - task_alarm_id_dict[task_name] = alarm_id --- -2.27.0 - diff --git a/fix-write-file-return-code-bug.patch b/fix-write-file-return-code-bug.patch deleted file mode 100644 index f059224..0000000 --- a/fix-write-file-return-code-bug.patch +++ /dev/null @@ -1,69 +0,0 @@ -From cea094acea79b88e6458cfa264a03c51f08c72fc Mon Sep 17 00:00:00 2001 -From: luckky -Date: Mon, 4 Nov 2024 20:18:05 +0800 -Subject: [PATCH] fix write file return code bug -Set the return code 0 to -EINVAL to unify the processing of return code. - ---- - .../hbm_online_repair/non-standard-hbm-repair.c | 17 ++++++++++------- - 1 file changed, 10 insertions(+), 7 deletions(-) - -diff --git a/src/c/hbm_online_repair/non-standard-hbm-repair.c b/src/c/hbm_online_repair/non-standard-hbm-repair.c -index b8dde7a..97cb9a7 100644 ---- a/src/c/hbm_online_repair/non-standard-hbm-repair.c -+++ b/src/c/hbm_online_repair/non-standard-hbm-repair.c -@@ -112,7 +112,7 @@ static void parse_fault_addr_info(struct fault_addr_info* info_struct, unsigned - info_struct->row_id = fault_addr & FAULT_ADDR_ROW_ID_MASK; - fault_addr >>= FAULT_ADDR_ROW_ID_LEN; - info_struct->column_id = fault_addr & FAULT_ADDR_COLUMN_ID_MASK; -- fault_addr >>= FAULT_ADDR_CHANNEL_ID_LEN; -+ fault_addr >>= FAULT_ADDR_COLUMN_ID_LEN; - info_struct->error_type = fault_addr & FAULT_ADDR_ERROR_TYPE_MASK; - fault_addr >>= FAULT_ADDR_ERROR_TYPE_LEN; - info_struct->repair_type = fault_addr & FAULT_ADDR_REPAIR_TYPE_MASK; -@@ -371,7 +371,12 @@ static int write_file(char *path, const char *name, unsigned long long value) - fname, value, strerror(errno)); - - close(fd); -- return ret > 0 ? 0 : -errno; -+ if (ret == 0) { -+ ret = -EINVAL; -+ } else if (ret < 0) { -+ ret = -errno; -+ } -+ return ret; - } - - static int get_hardware_corrupted_size() -@@ -560,7 +565,7 @@ static int hbmc_hbm_page_isolate(const struct hisi_common_error_section *err) - static uint8_t hbmc_hbm_after_repair(bool is_acls, const int repair_ret, const unsigned long long paddr) - { - int ret; -- if (repair_ret <= 0) { -+ if (repair_ret < 0) { - log(LOG_WARNING, "HBM %s: Keep page (0x%llx) offline\n", is_acls ? "ACLS" : "SPPR", paddr); - /* not much we can do about errors here */ - (void)write_file("/sys/kernel/page_eject", "remove_page", paddr); -@@ -594,8 +599,7 @@ static int hbmc_hbm_repair(const struct hisi_common_error_section *err, char *pa - - ret = write_file(path, is_acls ? "acls_query" : "sppr_query", paddr); - -- /* Only positive num means the error is supported to repair */ -- if (ret <= 0) { -+ if (ret < 0) { - if (ret != -ENXIO) { - notice_BMC(err, get_repair_failed_result_code(ret)); - log(LOG_WARNING, "HBM: Address 0x%llx is not supported to %s repair\n", paddr, is_acls ? "ACLS" : "SPPR"); -@@ -624,8 +628,7 @@ static int hbmc_hbm_repair(const struct hisi_common_error_section *err, char *pa - all_online_success = false; - } - } -- /* The ret is from the acls/sppr repair, and only positive num means the error is repaired successfully */ -- if (ret <= 0) { -+ if (ret < 0) { - notice_BMC(err, get_repair_failed_result_code(ret)); - return ret; - } else if (all_online_success) { --- -2.43.0 - diff --git a/fix-xalarm-non-uniform-log-formatting.patch b/fix-xalarm-non-uniform-log-formatting.patch deleted file mode 100644 index 34f579b..0000000 --- a/fix-xalarm-non-uniform-log-formatting.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 3eba5dcde10e05e7badc99852f76488e667d56e6 Mon Sep 17 00:00:00 2001 -From: caixiaomeng -Date: Mon, 21 Oct 2024 11:57:37 +0800 -Subject: [PATCH] fix xalarm non-uniform log formatting - ---- - src/python/xalarm/sentry_notify.py | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/src/python/xalarm/sentry_notify.py b/src/python/xalarm/sentry_notify.py -index 5838473..ffe4147 100644 ---- a/src/python/xalarm/sentry_notify.py -+++ b/src/python/xalarm/sentry_notify.py -@@ -2,6 +2,7 @@ import os - import sys - import time - import socket -+import logging - from struct import error as StructParseError - - from .xalarm_api import alarm_stu2bin, Xalarm -@@ -27,21 +28,21 @@ ALARM_SOCKET_PERMISSION = 0o700 - - def check_params(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: - if not os.path.exists(DIR_XALARM): -- sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed\n") -+ logging.error(f"check_params: {DIR_XALARM} not exist, failed") - return False - - if not os.path.exists(PATH_REPORT_ALARM): -- sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed\n") -+ logging.error(f"check_params: {PATH_REPORT_ALARM} not exist, failed") - return False - - if (alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID or - alarm_level < MINOR_ALM or alarm_level > CRITICAL_ALM or - alarm_type < ALARM_TYPE_OCCUR or alarm_type > ALARM_TYPE_RECOVER): -- sys.stderr.write("check_params: alarm info invalid\n") -+ logging.error("check_params: alarm info invalid") - return False - - if len(puc_paras) >= MAX_PUC_PARAS_LEN: -- sys.stderr.write(f"check_params: alarm msg should be less than {MAX_PUC_PARAS_LEN}\n") -+ logging.error(f"check_params: alarm msg should be less than {MAX_PUC_PARAS_LEN}") - return False - - return True -@@ -61,7 +62,7 @@ def xalarm_report(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: - - sock.sendto(alarm_stu2bin(alarm_info), PATH_REPORT_ALARM) - except (FileNotFoundError, StructParseError, socket.error, OSError, UnicodeError) as e: -- sys.stderr.write(f"check_params: error occurs when sending msg.{e}\n") -+ logging.error(f"error occurs when sending msg.") - return False - finally: - sock.close() --- -2.27.0 - - diff --git a/fix-xalarm_Report-function-not-refuse-alarm-msg-exce.patch b/fix-xalarm_Report-function-not-refuse-alarm-msg-exce.patch deleted file mode 100644 index 1bf5c3b..0000000 --- a/fix-xalarm_Report-function-not-refuse-alarm-msg-exce.patch +++ /dev/null @@ -1,76 +0,0 @@ -From f6a26ea0759f36ebcaebe05d4d24c7234a110c63 Mon Sep 17 00:00:00 2001 -From: caixiaomeng -Date: Fri, 11 Oct 2024 12:12:53 +0800 -Subject: [PATCH] fix xalarm_Report function not refuse alarm msg exceeds - maximum - ---- - src/libso/xalarm/register_xalarm.c | 5 +++++ - src/python/xalarm/register_xalarm.py | 6 +++--- - src/python/xalarm/sentry_notify.py | 4 ++-- - 3 files changed, 10 insertions(+), 5 deletions(-) - -diff --git a/src/libso/xalarm/register_xalarm.c b/src/libso/xalarm/register_xalarm.c -index 5aff2bc..952a28b 100644 ---- a/src/libso/xalarm/register_xalarm.c -+++ b/src/libso/xalarm/register_xalarm.c -@@ -339,6 +339,11 @@ int xalarm_Report(unsigned short usAlarmId, unsigned char ucAlarmLevel, - return -1; - } - -+ if (pucParas == NULL || (int)strlen(pucParas) > MAX_PARAS_LEN) { -+ fprintf(stderr, "%s: alarm info invalid\n", __func__); -+ return -1; -+ } -+ - if (memset(&info, 0, sizeof(struct alarm_info)) == NULL) { - fprintf(stderr, "%s: memset info failed, ret: %d\n", __func__, ret); - return -1; -diff --git a/src/python/xalarm/register_xalarm.py b/src/python/xalarm/register_xalarm.py -index edd9994..39623bd 100644 ---- a/src/python/xalarm/register_xalarm.py -+++ b/src/python/xalarm/register_xalarm.py -@@ -45,7 +45,7 @@ class AlarmRegister: - return False - - if self.socket is None: -- sys.stderr.write("check_params: scoket create failed\n") -+ sys.stderr.write("check_params: socket create failed\n") - return False - return True - -@@ -151,10 +151,10 @@ def xalarm_unregister(clientId: int) -> None: - def xalarm_upgrade(clientId: int, id_filter: list) -> None: - global ALARM_REGISTER_INFO - if clientId < 0: -- sys.stderr.write("xalarm_unregister: invalid client\n") -+ sys.stderr.write("xalarm_upgrade: invalid client\n") - return - if ALARM_REGISTER_INFO is None: -- sys.stderr.write("xalarm_unregister: alarm has not registered\n") -+ sys.stderr.write("xalarm_upgrade: alarm has not registered\n") - return - ALARM_REGISTER_INFO.id_filter = id_filter - -diff --git a/src/python/xalarm/sentry_notify.py b/src/python/xalarm/sentry_notify.py -index c763a24..5838473 100644 ---- a/src/python/xalarm/sentry_notify.py -+++ b/src/python/xalarm/sentry_notify.py -@@ -27,11 +27,11 @@ ALARM_SOCKET_PERMISSION = 0o700 - - def check_params(alarm_id, alarm_level, alarm_type, puc_paras) -> bool: - if not os.path.exists(DIR_XALARM): -- sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed") -+ sys.stderr.write(f"check_params: {DIR_XALARM} not exist, failed\n") - return False - - if not os.path.exists(PATH_REPORT_ALARM): -- sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed") -+ sys.stderr.write(f"check_params: {PATH_REPORT_ALARM} not exist, failed\n") - return False - - if (alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID or --- -2.27.0 - - diff --git a/fix-xalarm_upgrade-not-return-val-and-fail-when-thre.patch b/fix-xalarm_upgrade-not-return-val-and-fail-when-thre.patch deleted file mode 100644 index 5b1f231..0000000 --- a/fix-xalarm_upgrade-not-return-val-and-fail-when-thre.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 624efd60495403743fc251b7d689d920841e44c8 Mon Sep 17 00:00:00 2001 -From: caixiaomeng -Date: Fri, 11 Oct 2024 17:54:04 +0800 -Subject: [PATCH] fix xalarm_upgrade not return val and fail when thread - stopped - ---- - src/libso/xalarm/register_xalarm.c | 11 ++++++++++- - src/python/xalarm/register_xalarm.py | 10 +++++++--- - 2 files changed, 17 insertions(+), 4 deletions(-) - -diff --git a/src/libso/xalarm/register_xalarm.c b/src/libso/xalarm/register_xalarm.c -index 952a28b..6768242 100644 ---- a/src/libso/xalarm/register_xalarm.c -+++ b/src/libso/xalarm/register_xalarm.c -@@ -156,7 +156,11 @@ static void *alarm_recv(void *arg) - continue; - } - printf("recv error len:%d errno:%d\n", recvlen, errno); -- } -+ } else if (recvlen == 0) { -+ printf("connection closed by xalarmd, maybe connections reach max num or service stopped.\n"); -+ g_register_info.thread_should_stop = 1; -+ break; -+ } - } - return NULL; - } -@@ -211,6 +215,11 @@ bool xalarm_Upgrade(struct alarm_subscription_info id_filter, int client_id) - printf("%s: invalid args\n", __func__); - return false; - } -+ -+ if (g_register_info.thread_should_stop) { -+ printf("%s: upgrade failed, alarm thread has stopped\n", __func__); -+ return false; -+ } - set_alarm_id(id_filter); - - return true; -diff --git a/src/python/xalarm/register_xalarm.py b/src/python/xalarm/register_xalarm.py -index 39623bd..2a6dabf 100644 ---- a/src/python/xalarm/register_xalarm.py -+++ b/src/python/xalarm/register_xalarm.py -@@ -148,15 +148,19 @@ def xalarm_unregister(clientId: int) -> None: - ALARM_REGISTER_INFO = None - - --def xalarm_upgrade(clientId: int, id_filter: list) -> None: -+def xalarm_upgrade(id_filter: list, clientId: int) -> bool: - global ALARM_REGISTER_INFO - if clientId < 0: - sys.stderr.write("xalarm_upgrade: invalid client\n") -- return -+ return False - if ALARM_REGISTER_INFO is None: - sys.stderr.write("xalarm_upgrade: alarm has not registered\n") -- return -+ return False -+ if ALARM_REGISTER_INFO.thread_should_stop: -+ sys.stderr.write("xalarm_upgrade: upgrade failed, alarm thread has stopped\n") -+ return False - ALARM_REGISTER_INFO.id_filter = id_filter -+ return True - - - def xalarm_getid(alarm_info: Xalarm) -> int: --- -2.27.0 - - diff --git a/get_alarm-d-abnomal-display.patch b/get_alarm-d-abnomal-display.patch deleted file mode 100644 index 8a7924a..0000000 --- a/get_alarm-d-abnomal-display.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 132334913c4afebefd6afa835f790fa8a5fbf123 Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Mon, 28 Oct 2024 09:22:53 +0800 -Subject: [PATCH] get_alarm -d abnomal display - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index b35a126..e5cc313 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -184,7 +184,7 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - # dump each {key,value} of details in one line - if 'details' in alarm_info and isinstance(alarm_info['details'], dict): - for key in alarm_info['details']: -- alarm_info['details'][key] = json.dumps(alarm_info['details'][key], indent=None) -+ alarm_info['details'][key] = str(alarm_info['details'][key]) - - alarm['alarm_info'] = alarm_info - alarm_list = [alarm for alarm in alarm_list if 'alarm_source' in alarm['alarm_info'] and alarm['alarm_info']['alarm_source'] == task_name] --- -2.27.0 - diff --git a/get_io_data-failed-wont-stop-avg_block_io-and-del-di.patch b/get_io_data-failed-wont-stop-avg_block_io-and-del-di.patch deleted file mode 100644 index ec2aaf2..0000000 --- a/get_io_data-failed-wont-stop-avg_block_io-and-del-di.patch +++ /dev/null @@ -1,168 +0,0 @@ -From b21607fcec4b290bc78c9f6c4a26db1a2df32a66 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Tue, 15 Oct 2024 21:21:10 +0800 -Subject: [PATCH] get_io_data failed wont stop avg_block_io and del disk not - support - ---- - src/python/sentryCollector/collect_plugin.py | 14 ++++----- - .../avg_block_io/avg_block_io.py | 9 ++++-- - .../sentryPlugins/avg_block_io/module_conn.py | 31 +++++++++++++------ - 3 files changed, 35 insertions(+), 19 deletions(-) - -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index bec405a..53dddec 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -90,14 +90,14 @@ def client_send_and_recv(request_data, data_str_len, protocol): - try: - client_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - except socket.error: -- logging.error("collect_plugin: client create socket error") -+ logging.debug("collect_plugin: client create socket error") - return None - - try: - client_socket.connect(COLLECT_SOCKET_PATH) - except OSError: - client_socket.close() -- logging.error("collect_plugin: client connect error") -+ logging.debug("collect_plugin: client connect error") - return None - - req_data_len = len(request_data) -@@ -109,23 +109,23 @@ def client_send_and_recv(request_data, data_str_len, protocol): - res_data = res_data.decode() - except (OSError, UnicodeError): - client_socket.close() -- logging.error("collect_plugin: client communicate error") -+ logging.debug("collect_plugin: client communicate error") - return None - - res_magic = res_data[:CLT_MSG_MAGIC_LEN] - if res_magic != "RES": -- logging.error("res msg format error") -+ logging.debug("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: -- logging.error("recv msg protocol id is invalid %s", protocol_str) -+ logging.debug("recv msg protocol id is invalid %s", protocol_str) - return None - - if protocol_id >= ClientProtocol.PRO_END: -- logging.error("protocol id is invalid") -+ logging.debug("protocol id is invalid") - return None - - try: -@@ -134,7 +134,7 @@ def client_send_and_recv(request_data, data_str_len, protocol): - res_msg_data = res_msg_data.decode() - return res_msg_data - except (OSError, ValueError, UnicodeError): -- logging.error("collect_plugin: client recv res msg error") -+ logging.debug("collect_plugin: client recv res msg error") - finally: - client_socket.close() - -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index cd47919..899d517 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -15,7 +15,7 @@ import time - - from .config import read_config_log, read_config_common, read_config_algorithm, read_config_latency, read_config_iodump, read_config_stage - from .stage_window import IoWindow, IoDumpWindow --from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler, get_disk_type_by_name -+from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler, get_disk_type_by_name, check_disk_list_validation - from .utils import update_avg_and_check_abnormal - - CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" -@@ -79,6 +79,8 @@ def get_valid_disk_stage_list(io_dic, config_disk, config_stage): - if not disk_list: - report_alarm_fail("Cannot get valid disk name") - -+ disk_list = check_disk_list_validation(disk_list) -+ - disk_list = disk_list[:10] if len(disk_list) > 10 else disk_list - - if not config_disk: -@@ -117,7 +119,10 @@ def main_loop(io_dic, io_data, io_avg_value): - time.sleep(period_time) - - # 采集模块对接,获取周期数据 -- curr_period_data = avg_get_io_data(io_dic) -+ is_success, curr_period_data = avg_get_io_data(io_dic) -+ if not is_success: -+ logging.error(f"{curr_period_data['msg']}") -+ continue - - # 处理周期数据 - reach_size = False -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -index cbdaad4..a67ef45 100644 ---- a/src/python/sentryPlugins/avg_block_io/module_conn.py -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -40,25 +40,25 @@ def avg_is_iocollect_valid(io_dic, config_disk, config_stage): - logging.debug(f"send to sentryCollector is_iocollect_valid: period={io_dic['period_time']}, " - f"disk={config_disk}, stage={config_stage}") - res = is_iocollect_valid(io_dic["period_time"], config_disk, config_stage) -- return check_result_validation(res, 'check config validation') -+ is_success, data = check_result_validation(res, 'check config validation') -+ if not is_success: -+ report_alarm_fail(f"{data['msg']}") -+ return data - - - def check_result_validation(res, reason): - """check validation of result from sentryCollector""" - if not 'ret' in res or not 'message' in res: -- err_msg = "Failed to {}: Cannot connect to sentryCollector.".format(reason) -- report_alarm_fail(err_msg) -+ return False, {'msg': f"Failed to {reason}: Cannot connect to sentryCollector"} - if res['ret'] != 0: -- err_msg = "Failed to {}: {}".format(reason, Result_Messages[res['ret']]) -- report_alarm_fail(err_msg) -+ return False, {'msg': f"Failed to {reason}: {Result_Messages[res['ret']]}"} - - try: - json_data = json.loads(res['message']) - except json.JSONDecodeError: -- err_msg = f"Failed to {reason}: invalid return message" -- report_alarm_fail(err_msg) -+ return False, {'msg': f"Failed to {reason}: invalid return message"} - -- return json_data -+ return True, json_data - - - def report_alarm_fail(alarm_info): -@@ -120,10 +120,21 @@ def process_report_data(disk_name, rw, io_data): - xalarm_report(1002, MINOR_ALM, ALARM_TYPE_OCCUR, json.dumps(msg)) - - -+def check_disk_list_validation(disk_list): -+ valid_disk_list = [] -+ for disk_name in disk_list: -+ is_success, _ = check_result_validation(get_disk_type(disk_name), "") -+ if not is_success: -+ continue -+ valid_disk_list.append(disk_name) -+ return valid_disk_list -+ -+ - def get_disk_type_by_name(disk_name): - logging.debug(f"send to sentryCollector get_disk_type: disk_name={disk_name}") -- res = get_disk_type(disk_name) -- disk_type_str = check_result_validation(get_disk_type(disk_name), f'Invalid disk type {disk_name}') -+ is_success, disk_type_str = check_result_validation(get_disk_type(disk_name), f'Invalid disk type {disk_name}') -+ if not is_success: -+ report_alarm_fail(f"{disk_type_str['msg']}") - try: - curr_disk_type = int(disk_type_str) - if curr_disk_type not in Disk_Type: --- -2.27.0 diff --git a/hbm_online_repair-add-unload-driver.patch b/hbm_online_repair-add-unload-driver.patch deleted file mode 100644 index dd7a269..0000000 --- a/hbm_online_repair-add-unload-driver.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 74f18b0e1fd4f99fa7d1d95e08894b408dcafe51 Mon Sep 17 00:00:00 2001 -From: luckky -Date: Wed, 18 Dec 2024 14:31:04 +0800 -Subject: [PATCH] hbm_online_repair add unload driver - ---- - src/c/hbm_online_repair/hbm_online_repair.c | 47 +++++++++++++-------- - 1 file changed, 29 insertions(+), 18 deletions(-) - -diff --git a/src/c/hbm_online_repair/hbm_online_repair.c b/src/c/hbm_online_repair/hbm_online_repair.c -index 00c9c0b..6783485 100644 ---- a/src/c/hbm_online_repair/hbm_online_repair.c -+++ b/src/c/hbm_online_repair/hbm_online_repair.c -@@ -11,6 +11,8 @@ - #define DEFAULT_LOG_LEVEL LOG_INFO - #define DEFAULT_PAGE_ISOLATION_THRESHOLD 3355443 - -+#define DRIVER_COMMAND_LEN 32 -+ - int global_level_setting; - int page_isolation_threshold; - -@@ -57,25 +59,31 @@ int execute_command(const char *command) - return -1; - } - -- ret = WEXITSTATUS(ret); -+ ret = -WEXITSTATUS(ret); - log(LOG_DEBUG, "command %s exited with status: %d\n", command, ret); - return ret; - } - --int load_required_driver(void) -+int handle_driver(char* driver_name, bool load) - { - int ret; -- ret = execute_command("modprobe hisi_mem_ras 2>&1"); -- if (ret < 0) { -- log(LOG_ERROR, "load repair driver failed\n"); -- return ret; -- } -- ret = execute_command("modprobe page_eject 2>&1"); -- if (ret < 0) { -- log(LOG_ERROR, "load page driver failed\n"); -+ char command[DRIVER_COMMAND_LEN]; -+ -+ snprintf(command, DRIVER_COMMAND_LEN, "%s %s 2>&1", load ? "modprobe" : "rmmod", driver_name); -+ ret = execute_command(command); -+ log(ret < 0 ? LOG_ERROR : LOG_DEBUG, "%s %s %s\n", load ? "load" : "unload", driver_name, ret < 0 ? "failed" : "success"); -+ return ret; -+} -+ -+int handle_all_drivers(bool load) -+{ -+ int ret; -+ -+ ret = handle_driver("hisi_mem_ras", load); -+ if (ret < 0) - return ret; -- } -- log(LOG_INFO, "load required driver success\n"); -+ -+ ret = handle_driver("page_eject", load); - return ret; - } - -@@ -116,21 +124,21 @@ int main(int argc, char *argv[]) - - hbm_param_init(); - -- ret = load_required_driver(); -+ ret = handle_all_drivers(true); - if (ret < 0) { -- log(LOG_DEBUG, "load required driver failed\n"); - return ret; - } - - struct ras_events *ras = init_trace_instance(); -- if (!ras) -- return -1; -+ if (!ras) { -+ ret = -1; -+ goto err_unload; -+ } - - ret = toggle_ras_event(ras->tracing, "ras", "non_standard_event", 1); - if (ret < 0) { - log(LOG_WARNING, "unable to enable ras non_standard_event.\n"); -- free(ras); -- return -1; -+ goto err_free; - } - - get_flash_total_size(); -@@ -142,6 +150,9 @@ int main(int argc, char *argv[]) - log(LOG_WARNING, "unable to disable ras non_standard_event.\n"); - } - -+err_free: - free(ras); -+err_unload: -+ handle_all_drivers(false); - return ret; - } --- -2.43.0 - diff --git a/listen-thread-of-collect-module-exits-occasionally.patch b/listen-thread-of-collect-module-exits-occasionally.patch deleted file mode 100644 index b667ea0..0000000 --- a/listen-thread-of-collect-module-exits-occasionally.patch +++ /dev/null @@ -1,104 +0,0 @@ -From 2135b4e41666d99922eda79e9ee04bbc2b557fea Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Wed, 16 Oct 2024 12:13:21 +0800 -Subject: [PATCH] listen thread of collect module exits occasionally - ---- - src/python/sentryCollector/collect_io.py | 4 +--- - src/python/sentryCollector/collect_server.py | 18 ++++++++---------- - 2 files changed, 9 insertions(+), 13 deletions(-) - -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index 5fe1efc..de308b3 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -231,9 +231,7 @@ class CollectIo(): - if self.get_blk_io_hierarchy(disk_name, stage_list) < 0: - continue - self.append_period_lat(disk_name, stage_list) -- -- logging.debug(f"no-lock collect data : {IO_GLOBAL_DATA}") -- -+ - elapsed_time = time.time() - start_time - sleep_time = self.period_time - elapsed_time - if sleep_time < 0: -diff --git a/src/python/sentryCollector/collect_server.py b/src/python/sentryCollector/collect_server.py -index 11d1af0..ad3ac0e 100644 ---- a/src/python/sentryCollector/collect_server.py -+++ b/src/python/sentryCollector/collect_server.py -@@ -64,7 +64,7 @@ class CollectServer(): - self.io_global_data = IO_GLOBAL_DATA - - if len(IO_CONFIG_DATA) == 0: -- logging.error("the collect thread is not started, the data is invalid. ") -+ logging.error("the collect thread is not started, the data is invalid.") - return json.dumps(result_rev) - - period_time = IO_CONFIG_DATA[0] -@@ -75,7 +75,7 @@ class CollectServer(): - stage_list = json.loads(data_struct['stage']) - - if (period < period_time) or (period > period_time * max_save) or (period % period_time): -- logging.error("is_iocollect_valid: period time: %d is invalid", period) -+ logging.error("is_iocollect_valid: period time is invalid, user period: %d, config period_time: %d", period, period_time) - return json.dumps(result_rev) - - for disk_name, stage_info in self.io_global_data.items(): -@@ -96,7 +96,7 @@ class CollectServer(): - self.io_global_data = IO_GLOBAL_DATA - - if len(IO_CONFIG_DATA) == 0: -- logging.error("the collect thread is not started, the data is invalid. ") -+ logging.error("the collect thread is not started, the data is invalid.") - return json.dumps(result_rev) - period_time = IO_CONFIG_DATA[0] - max_save = IO_CONFIG_DATA[1] -@@ -107,11 +107,11 @@ class CollectServer(): - iotype_list = json.loads(data_struct['iotype']) - - if (period < period_time) or (period > period_time * max_save) or (period % period_time): -- logging.error("get_io_data: period time: %d is invalid", period) -+ logging.error("get_io_data: period time is invalid, user period: %d, config period_time: %d", period, period_time) - return json.dumps(result_rev) - - collect_index = period // period_time - 1 -- logging.debug("period: %d, collect_index: %d", period, collect_index) -+ logging.debug("user period: %d, config period_time: %d, collect_index: %d", period, period_time, collect_index) - - for disk_name, stage_info in self.io_global_data.items(): - if disk_name not in disk_list: -@@ -124,7 +124,7 @@ class CollectServer(): - for iotype_name, iotype_info in iotype_info.items(): - if iotype_name not in iotype_list: - continue -- if len(iotype_info) < collect_index: -+ if len(iotype_info) - 1 < collect_index: - continue - result_rev[disk_name][stage_name][iotype_name] = iotype_info[collect_index] - -@@ -250,10 +250,8 @@ class CollectServer(): - except socket.error: - logging.error("server fd create failed") - server_fd = None -- - return server_fd - -- - def server_loop(self): - """main loop""" - logging.info("collect listen thread start") -@@ -277,8 +275,8 @@ class CollectServer(): - self.server_recv(server_fd) - else: - continue -- except socket.error: -- pass -+ except Exception: -+ logging.error('collect listen exception : %s', traceback.format_exc()) - - def stop_thread(self): - self.stop_event.set() --- -2.33.0 - diff --git a/make-debug-msg-clear.patch b/make-debug-msg-clear.patch deleted file mode 100644 index 540750d..0000000 --- a/make-debug-msg-clear.patch +++ /dev/null @@ -1,69 +0,0 @@ -From edbe32637a939d0788bcbde9211a61cfded436bf Mon Sep 17 00:00:00 2001 -From: luckky -Date: Tue, 5 Nov 2024 17:22:27 +0800 -Subject: [PATCH] make debug msg clear -1. Change the page_isolation_threshold default value for 128(kb) to 3355443(kb) -to synchronize the modification of the .mod file. -2. Add specific command info in debug message to make debug message clear. -3. Update the commit of the log level and format of syssentry. -4. Change the interval 180 to 10 to short the restart time. - ---- - config/tasks/hbm_online_repair.mod | 2 +- - .../src/c/hbm_online_repair/hbm_online_repair.c | 8 ++++---- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/config/tasks/hbm_online_repair.mod b/config/tasks/hbm_online_repair.mod -index 77dd73e..4dcef43 100644 ---- a/config/tasks/hbm_online_repair.mod -+++ b/config/tasks/hbm_online_repair.mod -@@ -3,7 +3,7 @@ enabled=yes - task_start=/usr/bin/hbm_online_repair - task_stop=kill $pid - type=period --interval=180 -+interval=10 - onstart=yes - env_file=/etc/sysconfig/hbm_online_repair.env - conflict=up -\ No newline at end of file -diff --git a/src/c/hbm_online_repair/hbm_online_repair.c b/src/c/hbm_online_repair/hbm_online_repair.c -index b3b2742..943f201 100644 ---- a/src/c/hbm_online_repair/hbm_online_repair.c -+++ b/src/c/hbm_online_repair/hbm_online_repair.c -@@ -9,7 +9,7 @@ - #include "non-standard-hbm-repair.h" - - #define DEFAULT_LOG_LEVEL LOG_INFO --#define DEFAULT_PAGE_ISOLATION_THRESHOLD 128 -+#define DEFAULT_PAGE_ISOLATION_THRESHOLD 3355443 - - int global_level_setting; - int page_isolation_threshold; -@@ -44,7 +44,7 @@ int execute_command(const char *command) - } - - fgets(buffer, sizeof(buffer), fp); -- log(LOG_DEBUG, "output of command is: %s\n", buffer); -+ log(LOG_DEBUG, "output of command %s is: %s\n", command, buffer); - - ret = pclose(fp); - if (ret < 0) { -@@ -53,12 +53,12 @@ int execute_command(const char *command) - } - - if (!WIFEXITED(ret)) { -- log(LOG_ERROR, "command did not terminate normally\n"); -+ log(LOG_ERROR, "command %s did not terminate normally\n", command); - return -1; - } - - ret = WEXITSTATUS(ret); -- log(LOG_DEBUG, "command exited with status: %d\n", ret); -+ log(LOG_DEBUG, "command %s exited with status: %d\n", command, ret); - return ret; - } - --- -2.43.0 - diff --git a/modify-abnormal-stack-when-the-disk-field-is-not-con.patch b/modify-abnormal-stack-when-the-disk-field-is-not-con.patch deleted file mode 100644 index 5b0084b..0000000 --- a/modify-abnormal-stack-when-the-disk-field-is-not-con.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b5794ef43f768d7ea9bbbac450deaabbdcff4997 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Sat, 12 Oct 2024 17:57:01 +0800 -Subject: [PATCH] modify abnormal stack when the disk field is not configured - ---- - src/python/sentryCollector/collect_config.py | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryCollector/collect_config.py b/src/python/sentryCollector/collect_config.py -index 5aa38ec..7ca9898 100644 ---- a/src/python/sentryCollector/collect_config.py -+++ b/src/python/sentryCollector/collect_config.py -@@ -127,9 +127,9 @@ class CollectConfig: - CONF_IO, CONF_IO_MAX_SAVE, CONF_IO_MAX_SAVE_DEFAULT) - result_io_config[CONF_IO_MAX_SAVE] = CONF_IO_MAX_SAVE_DEFAULT - # disk -- disk = io_map_value.get(CONF_IO_DISK).lower() -+ disk = io_map_value.get(CONF_IO_DISK) - if disk: -- disk_str = disk.replace(" ", "") -+ disk_str = disk.lower().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", --- -2.33.0 - diff --git a/modify-logrotate-rule.patch b/modify-logrotate-rule.patch deleted file mode 100644 index be0ddd2..0000000 --- a/modify-logrotate-rule.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0d3323d13797f3f9d3124e3938787d2573bf249d Mon Sep 17 00:00:00 2001 -From: zhangnan -Date: Mon, 28 Oct 2024 17:32:49 +0800 -Subject: [PATCH] modify logrotate rule - ---- - config/logrotate | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/config/logrotate b/config/logrotate -index f54e7b3..e855118 100644 ---- a/config/logrotate -+++ b/config/logrotate -@@ -1,8 +1,9 @@ - /var/log/sysSentry/*.log { -- nocompress -+ compress - missingok - notifempty - copytruncate - rotate 2 - size +4096k -+ hourly - } --- -2.33.0 - diff --git a/optimize-log-printing.patch b/optimize-log-printing.patch deleted file mode 100644 index 591ae9f..0000000 --- a/optimize-log-printing.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 91c37cec1639c79b2b5ddcd6b173b4d7aa0ce9db Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Wed, 16 Oct 2024 14:51:24 +0800 -Subject: [PATCH] optimize log printing - -Signed-off-by: jinsaihang ---- - src/python/syssentry/alarm.py | 53 ++++++++++++++++--------------- - src/python/syssentry/load_mods.py | 15 +++++---- - 2 files changed, 35 insertions(+), 33 deletions(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index bff527c..c3f2ee1 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -76,16 +76,26 @@ def update_alarm_list(alarm_info: Xalarm): - finally: - alarm_list_lock.release() - --def check_alarm_id_if_number(alarm_id): -- if isinstance(alarm_id, int): -- return True -- else: -+def validate_alarm_id(alarm_id): -+ if alarm_id is None: -+ return False -+ try: -+ alarm_id = int(alarm_id) -+ if MIN_ALARM_ID <= alarm_id <= MAX_ALARM_ID: -+ return True -+ else: -+ return False -+ except ValueError: - return False - --def check_alarm_clear_time_if_positive_integer(alarm_clear_time): -- if isinstance(alarm_clear_time, int) and alarm_clear_time > 0: -- return True -- else: -+def validate_alarm_clear_time(alarm_clear_time): -+ try: -+ alarm_clear_time = int(alarm_clear_time) -+ if alarm_clear_time > 0 and alarm_clear_time <= sys.maxsize: -+ return True -+ else: -+ return False -+ except ValueError: - return False - - def alarm_register(): -@@ -93,34 +103,25 @@ def alarm_register(): - # 初始化告警ID映射字典、告警老化时间字典 - for task_type in TasksMap.tasks_dict: - for task_name in TasksMap.tasks_dict[task_type]: -- logging.info(f"alarm_register: {task_name} is registered") - task = TasksMap.tasks_dict[task_type][task_name] -- alarm_id = task.alarm_id -- if not check_alarm_id_if_number(alarm_id): -- logging.warning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ if not validate_alarm_id(task.alarm_id): -+ logging.warning(f"Invalid alarm_id {task.alarm_id}: ignore {task_name} alarm") - continue -- if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: -- logging.warning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ if not validate_alarm_clear_time(task.alarm_clear_time): -+ logging.warning(f"Invalid alarm_clear_time {task.alarm_clear_time}: ignore {task_name} alarm") - continue -+ task.alarm_id = int(task.alarm_id) -+ task.alarm_clear_time = int(task.alarm_clear_time) -+ alarm_id = task.alarm_id - alarm_clear_time = task.alarm_clear_time -- if not check_alarm_clear_time_if_positive_integer(alarm_clear_time): -- logging.warning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -- continue -- try: -- alarm_clear_time = int(alarm_clear_time) -- if alarm_clear_time <= 0: -- raise ValueError("Not a positive integer") -- if alarm_clear_time > sys.maxsize: -- raise ValueError("Exceeds maximum value for int") -- except (ValueError, OverflowError, TypeError) as e: -- logging.warning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -- continue -+ - alarm_list_dict[alarm_id] = [] - task_alarm_id_dict[task_name] = alarm_id - if alarm_id not in alarm_id_clear_time_dict: - alarm_id_clear_time_dict[alarm_id] = alarm_clear_time - else: - alarm_id_clear_time_dict[alarm_id] = max(alarm_clear_time, alarm_id_clear_time_dict[alarm_id]) -+ logging.info(f"alarm_register: {task_name} is registered") - # 注册告警回调 - id_filter = [True] * 128 - clientId = xalarm_register(update_alarm_list, id_filter) -diff --git a/src/python/syssentry/load_mods.py b/src/python/syssentry/load_mods.py -index f74f165..78db446 100644 ---- a/src/python/syssentry/load_mods.py -+++ b/src/python/syssentry/load_mods.py -@@ -198,15 +198,16 @@ def parse_mod_conf(mod_name, mod_conf): - task.load_enabled = is_enabled - - try: -- task.alarm_id = int(mod_conf.get(CONF_TASK, CONF_ALARM_ID)) -- task.alarm_clear_time = int(mod_conf.get(CONF_TASK, CONF_ALARM_CLEAR_TIME)) -- if not (MIN_ALARM_ID <= task.alarm_id <= MAX_ALARM_ID): -- raise ValueError("Invalid alarm_id") -- except ValueError: - task.alarm_id = mod_conf.get(CONF_TASK, CONF_ALARM_ID) -- task.alarm_clear_time = mod_conf.get(CONF_TASK, CONF_ALARM_CLEAR_TIME) - except configparser.NoOptionError: -- logging.warning("Unset alarm_clear_time, use 15s as default") -+ task.alarm_id = None -+ logging.warning(f"{mod_name} alarm_id not set, alarm_id is None") -+ -+ if task.alarm_id is not None: -+ try: -+ task.alarm_clear_time = mod_conf.get(CONF_TASK, CONF_ALARM_CLEAR_TIME) -+ except configparser.NoOptionError: -+ logging.warning(f"{mod_name} not set alarm_clear_time, use 15s as default") - - if CONF_ONSTART in mod_conf.options(CONF_TASK): - is_onstart = (mod_conf.get(CONF_TASK, CONF_ONSTART) == 'yes') --- -2.27.0 - diff --git a/optimize-the-handing-of-cat-cli-error-msg-in-cpu_sentry.patch b/optimize-the-handing-of-cat-cli-error-msg-in-cpu_sentry.patch deleted file mode 100644 index 7bacd26..0000000 --- a/optimize-the-handing-of-cat-cli-error-msg-in-cpu_sentry.patch +++ /dev/null @@ -1,77 +0,0 @@ -From cb3d0ea18eed3d48f2753f878d9726f58fe616b1 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Sat, 21 Sep 2024 09:53:42 +0800 -Subject: [PATCH] optimize the handing of cat-cli error msg in cpu_sentry - ---- - src/python/syssentry/cpu_sentry.py | 36 +++++++++++++++++------------- - 1 file changed, 21 insertions(+), 15 deletions(-) - -diff --git a/src/python/syssentry/cpu_sentry.py b/src/python/syssentry/cpu_sentry.py -index 99af127..582d4b3 100644 ---- a/src/python/syssentry/cpu_sentry.py -+++ b/src/python/syssentry/cpu_sentry.py -@@ -26,6 +26,8 @@ CPU_SENTRY_PARAM_CONFIG = "/etc/sysSentry/plugins/cpu_sentry.ini" - # Inspection commands running at the bottom layer - LOW_LEVEL_INSPECT_CMD = "cat-cli" - -+# max length of msg in details -+DETAILS_LOG_MSG_MAX_LEN = 255 - - class CpuSentry: - """ -@@ -94,22 +96,10 @@ class CpuSentry: - self.send_result["details"]["msg"] = "cpu_sentry task is killed!" - return - -- if "ERROR" in stdout: -- self.send_result["result"] = ResultLevel.FAIL -- self.send_result["details"]["code"] = 1004 -- -- # Remove ANSI escape sequences -- error_info = stdout.split("\n")[0] -- if error_info.startswith("\u001b"): -- ansi_escape = r'\x1b\[([0-9]+)(;[0-9]+)*([A-Za-z])' -- error_info = re.sub(ansi_escape, '', error_info) -- -- self.send_result["details"]["msg"] = error_info -- return -- - out_split = stdout.split("\n") -- isolated_cores_number = 0 -+ isolated_cores_number = -1 - found_fault_cores_list = [] -+ error_msg_list = [] - for out_line_i in out_split: - if "handle_patrol_result: Found fault cores" in out_line_i: - cores_number_tmp = out_line_i.split("Found fault cores:")[1] -@@ -121,9 +111,25 @@ class CpuSentry: - elif out_line_i.startswith(''): - self.send_result["details"]["isolated_cpu_list"] = out_line_i.split(':')[1] - break -+ elif "ERROR" in out_line_i: -+ logging.error("[cat-cli error] - %s\n", out_line_i) -+ error_msg_list.append(out_line_i) - - found_fault_cores_number = len(set(found_fault_cores_list)) -- if found_fault_cores_number == 0: -+ if isolated_cores_number == -1: -+ self.send_result["result"] = ResultLevel.FAIL -+ self.send_result["details"]["code"] = 1004 -+ -+ send_error_msg = "" -+ # Remove ANSI escape sequences -+ for error_info in error_msg_list: -+ if error_info.startswith("\u001b"): -+ ansi_escape = r'\x1b\[([0-9]+)(;[0-9]+)*([A-Za-z])' -+ error_info = re.sub(ansi_escape, '', error_info) -+ if len(send_error_msg) + len(error_info) < DETAILS_LOG_MSG_MAX_LEN: -+ send_error_msg += error_info -+ self.send_result["details"]["msg"] = send_error_msg -+ elif found_fault_cores_number == 0: - self.send_result["details"]["code"] = 0 - self.send_result["result"] = ResultLevel.PASS - elif 0 in found_fault_cores_list: --- -2.27.0 - diff --git a/over-threshold-should-be-warn-level-log-in-cat-cli.patch b/over-threshold-should-be-warn-level-log-in-cat-cli.patch deleted file mode 100644 index 53a2739..0000000 --- a/over-threshold-should-be-warn-level-log-in-cat-cli.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 3dda5f68db38b63b1e45a28558a9fcd341c1f945 Mon Sep 17 00:00:00 2001 -From: jwolf <523083921@qq.com> -Date: Fri, 20 Sep 2024 15:59:40 +0800 -Subject: [PATCH] should be warn-level log - ---- - src/c/catcli/catlib/plugin/cpu_patrol/cpu_patrol_result.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/c/catcli/catlib/plugin/cpu_patrol/cpu_patrol_result.c b/src/c/catcli/catlib/plugin/cpu_patrol/cpu_patrol_result.c -index 9f8d80c..f4f3172 100644 ---- a/src/c/catcli/catlib/plugin/cpu_patrol/cpu_patrol_result.c -+++ b/src/c/catcli/catlib/plugin/cpu_patrol/cpu_patrol_result.c -@@ -23,7 +23,7 @@ static cat_return_t insert_core_to_list(core_list_st *core_list, int coreid) - return CAT_OK; - } - if ((core_list->current_nums == MAX_ISOLATE_CORES_PER_PATROL) || (coreid < 0)) { -- CAT_LOG_E("Insert error, core id(%d)", coreid); -+ CAT_LOG_W("Too many cores need to isolate,do not isolate core(%d)", coreid); - return CAT_ERR; - } - --- -2.27.0 - diff --git a/param-must-be-integer.patch b/param-must-be-integer.patch deleted file mode 100644 index d9b7ac1..0000000 --- a/param-must-be-integer.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 34febf57060060d1f8262941af49e3beeb1f7f5d Mon Sep 17 00:00:00 2001 -From: jwolf <523083921@qq.com> -Date: Fri, 30 Aug 2024 16:59:56 +0800 -Subject: [PATCH] param must be integer - ---- - src/c/catcli/catlib/cli_param_checker.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/c/catcli/catlib/cli_param_checker.c b/src/c/catcli/catlib/cli_param_checker.c -index 5b38402..71edf17 100644 ---- a/src/c/catcli/catlib/cli_param_checker.c -+++ b/src/c/catcli/catlib/cli_param_checker.c -@@ -17,6 +17,7 @@ void checkset_cpu_usage_percentage(char *getopt_optarg, catcli_request_body *p_r - if (cpu_utility <= 0 || cpu_utility > CPU_USAGE_PERCENTAGE_MAX || strchr(getopt_optarg, '.') != NULL) { - strncpy(errs->patrol_module_err, - "\"cpu_utility \" must be an integer greater in the range (0,100],correct \"-u, --cpu_utility\"\n", MAX_ERR_LEN); -+ p_request_body->cpu_utility = 0; - } else { - p_request_body->cpu_utility = (int)cpu_utility; - } --- -Gitee diff --git a/precise-alarm-query-time.patch b/precise-alarm-query-time.patch deleted file mode 100644 index f69a2d4..0000000 --- a/precise-alarm-query-time.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 7fa9e80531bb3d4fa587e5fb7a99e3af59feda7e Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Sat, 12 Oct 2024 16:51:37 +0800 -Subject: [PATCH] precise alarm query time - -Signed-off-by: jinsaihang ---- - sysSentry-1.0.2/src/python/syssentry/alarm.py | 25 +++++++++++++++++-- - .../src/python/syssentry/load_mods.py | 3 ++- - 2 files changed, 25 insertions(+), 3 deletions(-) - -diff --git a/src/python/syssentry/alarm.py b/src/python/syssentry/alarm.py -index 43c1065..d012901 100644 ---- a/src/python/syssentry/alarm.py -+++ b/src/python/syssentry/alarm.py -@@ -76,6 +76,18 @@ def update_alarm_list(alarm_info: Xalarm): - finally: - alarm_list_lock.release() - -+def check_alarm_id_if_number(alarm_id): -+ if isinstance(alarm_id, int): -+ return True -+ else: -+ return False -+ -+def check_alarm_clear_time_if_positive_integer(alarm_clear_time): -+ if isinstance(alarm_clear_time, int) and alarm_clear_time > 0: -+ return True -+ else: -+ return False -+ - def alarm_register(): - logging.debug(f"alarm_register: enter") - # 初始化告警ID映射字典、告警老化时间字典 -@@ -84,10 +96,16 @@ def alarm_register(): - logging.info(f"alarm_register: {task_name} is registered") - task = TasksMap.tasks_dict[task_type][task_name] - alarm_id = task.alarm_id -+ if not check_alarm_id_if_number(alarm_id): -+ logging.warnning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") -+ continue - if alarm_id < MIN_ALARM_ID or alarm_id > MAX_ALARM_ID: - logging.warnning(f"Invalid alarm_id {alarm_id}: ignore {task_name} alarm") - continue - alarm_clear_time = task.alarm_clear_time -+ if not check_alarm_clear_time_if_positive_integer(alarm_clear_time): -+ logging.warnning(f"Invalid alarm_clear_time {alarm_clear_time}: ignore {task_name} alarm") -+ continue - try: - alarm_clear_time = int(alarm_clear_time) - if alarm_clear_time <= 0: -@@ -119,6 +137,9 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - logging.debug("task_name does not exist") - return [] - alarm_id = task_alarm_id_dict[task_name] -+ clear_time = alarm_id_clear_time_dict[alarm_id] -+ if clear_time < int(time_range): -+ return [] - if alarm_id not in alarm_list_dict: - logging.debug("alarm_id does not exist") - return [] -@@ -126,10 +147,10 @@ def get_alarm_result(task_name: str, time_range: int, detailed: bool) -> List[Di - logging.debug(f"get_alarm_result: alarm_list of {alarm_id} has {len(alarm_list)} elements") - # clear alarm_info older than clear time threshold - stop_index = -1 -- timestamp = int(datetime.now().timestamp()) -+ timestamp = datetime.now().timestamp() - for i in range(len(alarm_list)): - logging.debug(f"timestamp, alarm_list[{i}].timestamp: {timestamp}, {xalarm_gettime(alarm_list[i])}") -- if timestamp - (xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > int(time_range): -+ if timestamp - (xalarm_gettime(alarm_list[i])) / MILLISECONDS_UNIT_SECONDS > time_range: - stop_index = i - break - if stop_index >= 0: -diff --git a/src/python/syssentry/load_mods.py b/src/python/syssentry/load_mods.py -index 7daf17d..f74f165 100644 ---- a/src/python/syssentry/load_mods.py -+++ b/src/python/syssentry/load_mods.py -@@ -203,7 +203,8 @@ def parse_mod_conf(mod_name, mod_conf): - if not (MIN_ALARM_ID <= task.alarm_id <= MAX_ALARM_ID): - raise ValueError("Invalid alarm_id") - except ValueError: -- logging.warning("Invalid alarm_id") -+ task.alarm_id = mod_conf.get(CONF_TASK, CONF_ALARM_ID) -+ task.alarm_clear_time = mod_conf.get(CONF_TASK, CONF_ALARM_CLEAR_TIME) - except configparser.NoOptionError: - logging.warning("Unset alarm_clear_time, use 15s as default") - --- -2.27.0 - diff --git a/refactor-config.py-and-bugfix-uncorrect-slow-io-repo.patch b/refactor-config.py-and-bugfix-uncorrect-slow-io-repo.patch deleted file mode 100644 index a0be948..0000000 --- a/refactor-config.py-and-bugfix-uncorrect-slow-io-repo.patch +++ /dev/null @@ -1,566 +0,0 @@ -From d5cb115a97e27c8270e8fb385fb3914af9ba3c34 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Tue, 15 Oct 2024 10:00:07 +0000 -Subject: [PATCH] refactor config.py and bugfix uncorrect slow io report - -Signed-off-by: gaoruoshu ---- - .../avg_block_io/avg_block_io.py | 155 ++----------- - .../sentryPlugins/avg_block_io/config.py | 208 ++++++++++++++++++ - .../sentryPlugins/avg_block_io/module_conn.py | 9 +- - .../sentryPlugins/avg_block_io/utils.py | 72 ------ - 4 files changed, 238 insertions(+), 206 deletions(-) - create mode 100644 src/python/sentryPlugins/avg_block_io/config.py - -diff --git a/src/python/sentryPlugins/avg_block_io/avg_block_io.py b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -index f3ade09..cd47919 100644 ---- a/src/python/sentryPlugins/avg_block_io/avg_block_io.py -+++ b/src/python/sentryPlugins/avg_block_io/avg_block_io.py -@@ -13,132 +13,13 @@ import signal - import configparser - import time - -+from .config import read_config_log, read_config_common, read_config_algorithm, read_config_latency, read_config_iodump, read_config_stage - from .stage_window import IoWindow, IoDumpWindow - from .module_conn import avg_is_iocollect_valid, avg_get_io_data, report_alarm_fail, process_report_data, sig_handler, get_disk_type_by_name --from .utils import update_avg_and_check_abnormal, get_log_level, get_section_value --from sentryCollector.collect_plugin import Disk_Type -+from .utils import update_avg_and_check_abnormal - - CONFIG_FILE = "/etc/sysSentry/plugins/avg_block_io.ini" - --def log_invalid_keys(not_in_list, keys_name, config_list, default_list): -- """print invalid log""" -- if config_list and not_in_list: -- logging.warning("{} in common.{} are not valid, set {}={}".format(not_in_list, keys_name, keys_name, default_list)) -- elif config_list == ["default"]: -- logging.warning("Default {} use {}".format(keys_name, default_list)) -- -- --def read_config_common(config): -- """read config file, get [common] section value""" -- if not config.has_section("common"): -- report_alarm_fail("Cannot find common section in config file") -- -- try: -- disk_name = config.get("common", "disk") -- disk = [] if disk_name == "default" else disk_name.split(",") -- except configparser.NoOptionError: -- disk = [] -- logging.warning("Unset common.disk, set to default") -- -- try: -- stage_name = config.get("common", "stage") -- stage = [] if stage_name == "default" else stage_name.split(",") -- except configparser.NoOptionError: -- stage = [] -- logging.warning("Unset common.stage, set to default") -- -- if len(disk) > 10: -- logging.warning("Too many common.disks, record only max 10 disks") -- disk = disk[:10] -- -- try: -- iotype_name = config.get("common", "iotype").split(",") -- iotype_list = [rw.lower() for rw in iotype_name if rw.lower() in ['read', 'write']] -- err_iotype = [rw.lower() for rw in iotype_name if rw.lower() not in ['read', 'write']] -- -- if err_iotype: -- report_alarm_fail("Invalid common.iotype config") -- -- except configparser.NoOptionError: -- iotype_list = ["read", "write"] -- logging.warning("Unset common.iotype, set to read,write") -- -- try: -- period_time = int(config.get("common", "period_time")) -- if not (1 <= period_time <= 300): -- raise ValueError("Invalid period_time") -- except ValueError: -- report_alarm_fail("Invalid common.period_time") -- except configparser.NoOptionError: -- period_time = 1 -- logging.warning("Unset common.period_time, use 1s as default") -- -- return period_time, disk, stage, iotype_list -- -- --def read_config_algorithm(config): -- """read config file, get [algorithm] section value""" -- if not config.has_section("algorithm"): -- report_alarm_fail("Cannot find algorithm section in config file") -- -- try: -- win_size = int(config.get("algorithm", "win_size")) -- if not (1 <= win_size <= 300): -- raise ValueError("Invalid algorithm.win_size") -- except ValueError: -- report_alarm_fail("Invalid algorithm.win_size config") -- except configparser.NoOptionError: -- win_size = 30 -- logging.warning("Unset algorithm.win_size, use 30 as default") -- -- try: -- win_threshold = int(config.get("algorithm", "win_threshold")) -- if win_threshold < 1 or win_threshold > 300 or win_threshold > win_size: -- raise ValueError("Invalid algorithm.win_threshold") -- except ValueError: -- report_alarm_fail("Invalid algorithm.win_threshold config") -- except configparser.NoOptionError: -- win_threshold = 6 -- logging.warning("Unset algorithm.win_threshold, use 6 as default") -- -- return win_size, win_threshold -- -- --def read_config_latency(config): -- """read config file, get [latency_xxx] section value""" -- common_param = {} -- for type_name in Disk_Type: -- section_name = f"latency_{Disk_Type[type_name]}" -- if not config.has_section(section_name): -- report_alarm_fail(f"Cannot find {section_name} section in config file") -- -- common_param[Disk_Type[type_name]] = get_section_value(section_name, config) -- return common_param -- -- --def read_config_iodump(config): -- """read config file, get [iodump] section value""" -- common_param = {} -- section_name = "iodump" -- if not config.has_section(section_name): -- report_alarm_fail(f"Cannot find {section_name} section in config file") -- -- return get_section_value(section_name, config) -- -- --def read_config_stage(config, stage, iotype_list, curr_disk_type): -- """read config file, get [STAGE_NAME_diskType] section value""" -- res = {} -- section_name = f"{stage}_{curr_disk_type}" -- if not config.has_section(section_name): -- return res -- -- for key in config[section_name]: -- if config[stage][key].isdecimal(): -- res[key] = int(config[stage][key]) -- -- return res -- - - def init_io_win(io_dic, config, common_param): - """initialize windows of latency, iodump, and dict of avg_value""" -@@ -192,24 +73,33 @@ def get_valid_disk_stage_list(io_dic, config_disk, config_stage): - disk_list = [key for key in all_disk_set if key in config_disk] - not_in_disk_list = [key for key in config_disk if key not in all_disk_set] - -+ if not config_disk and not not_in_disk_list: -+ disk_list = [key for key in all_disk_set] -+ -+ if not disk_list: -+ report_alarm_fail("Cannot get valid disk name") -+ -+ disk_list = disk_list[:10] if len(disk_list) > 10 else disk_list -+ -+ if not config_disk: -+ logging.info(f"Default common.disk using disk={disk_list}") -+ elif sorted(disk_list) != sorted(config_disk): -+ logging.warning(f"Set common.disk to {disk_list}") -+ - stage_list = [key for key in all_stage_set if key in config_stage] - not_in_stage_list = [key for key in config_stage if key not in all_stage_set] - - if not_in_stage_list: - report_alarm_fail(f"Invalid common.stage_list config, cannot set {not_in_stage_list}") - -- if not config_disk and not not_in_disk_list: -- disk_list = [key for key in all_disk_set] -- -- if not config_stage and not not_in_stage_list: -+ if not config_stage: - stage_list = [key for key in all_stage_set] - -- disk_list = disk_list[:10] if len(disk_list) > 10 else disk_list -- -- if not stage_list or not disk_list: -- report_alarm_fail("Cannot get valid disk name or stage name.") -+ if not stage_list: -+ report_alarm_fail("Cannot get valid stage name.") - -- log_invalid_keys(not_in_disk_list, 'disk', config_disk, disk_list) -+ if not config_stage: -+ logging.info(f"Default common.stage using stage={stage_list}") - - return disk_list, stage_list - -@@ -254,9 +144,8 @@ def main(): - signal.signal(signal.SIGINT, sig_handler) - signal.signal(signal.SIGTERM, sig_handler) - -- log_level = get_log_level(CONFIG_FILE) -+ log_level = read_config_log(CONFIG_FILE) - log_format = "%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s" -- - logging.basicConfig(level=log_level, format=log_format) - - # 初始化配置读取 -@@ -274,6 +163,8 @@ def main(): - # 采集模块对接,is_iocollect_valid() - io_dic["disk_list"], io_dic["stage_list"] = get_valid_disk_stage_list(io_dic, disk, stage) - -+ logging.debug(f"disk={io_dic['disk_list']}, stage={io_dic['stage_list']}") -+ - if "bio" not in io_dic["stage_list"]: - report_alarm_fail("Cannot run avg_block_io without bio stage") - -diff --git a/src/python/sentryPlugins/avg_block_io/config.py b/src/python/sentryPlugins/avg_block_io/config.py -new file mode 100644 -index 0000000..c8f45ce ---- /dev/null -+++ b/src/python/sentryPlugins/avg_block_io/config.py -@@ -0,0 +1,208 @@ -+import configparser -+import logging -+import os -+ -+from .module_conn import report_alarm_fail -+from sentryCollector.collect_plugin import Disk_Type -+ -+ -+CONF_LOG = 'log' -+CONF_LOG_LEVEL = 'level' -+LogLevel = { -+ "debug": logging.DEBUG, -+ "info": logging.INFO, -+ "warning": logging.WARNING, -+ "error": logging.ERROR, -+ "critical": logging.CRITICAL -+} -+ -+CONF_COMMON = 'common' -+CONF_COMMON_DISK = 'disk' -+CONF_COMMON_STAGE = 'stage' -+CONF_COMMON_IOTYPE = 'iotype' -+CONF_COMMON_PER_TIME = 'period_time' -+ -+CONF_ALGO = 'algorithm' -+CONF_ALGO_SIZE = 'win_size' -+CONF_ALGO_THRE = 'win_threshold' -+ -+CONF_LATENCY = 'latency_{}' -+CONF_IODUMP = 'iodump' -+ -+ -+DEFAULT_PARAM = { -+ CONF_LOG: { -+ CONF_LOG_LEVEL: 'info' -+ }, CONF_COMMON: { -+ CONF_COMMON_DISK: 'default', -+ CONF_COMMON_STAGE: 'default', -+ CONF_COMMON_IOTYPE: 'read,write', -+ CONF_COMMON_PER_TIME: 1 -+ }, CONF_ALGO: { -+ CONF_ALGO_SIZE: 30, -+ CONF_ALGO_THRE: 6 -+ }, 'latency_nvme_ssd': { -+ 'read_avg_lim': 300, -+ 'write_avg_lim': 300, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 500, -+ 'write_tot_lim': 500, -+ }, 'latency_sata_ssd' : { -+ 'read_avg_lim': 10000, -+ 'write_avg_lim': 10000, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 50000, -+ 'write_tot_lim': 50000, -+ }, 'latency_sata_hdd' : { -+ 'read_avg_lim': 15000, -+ 'write_avg_lim': 15000, -+ 'read_avg_time': 3, -+ 'write_avg_time': 3, -+ 'read_tot_lim': 50000, -+ 'write_tot_lim': 50000 -+ }, CONF_IODUMP: { -+ 'read_iodump_lim': 0, -+ 'write_iodump_lim': 0 -+ } -+} -+ -+ -+def get_section_value(section_name, config): -+ common_param = {} -+ config_sec = config[section_name] -+ for config_key in DEFAULT_PARAM[section_name]: -+ if config_key in config_sec: -+ if not config_sec[config_key].isdecimal(): -+ report_alarm_fail(f"Invalid {section_name}.{config_key} config.") -+ common_param[config_key] = int(config_sec[config_key]) -+ else: -+ common_param[config_key] = DEFAULT_PARAM[section_name][config_key] -+ logging.warning(f"Unset {section_name}.{config_key} in config file, use {common_param[config_key]} as default") -+ return common_param -+ -+ -+def read_config_log(filename): -+ """read config file, get [log] section value""" -+ default_log_level = DEFAULT_PARAM[CONF_LOG][CONF_LOG_LEVEL] -+ if not os.path.exists(filename): -+ return LogLevel.get(default_log_level) -+ -+ config = configparser.ConfigParser() -+ config.read(filename) -+ -+ log_level = config.get(CONF_LOG, CONF_LOG_LEVEL, fallback=default_log_level) -+ if log_level.lower() in LogLevel: -+ return LogLevel.get(log_level.lower()) -+ return LogLevel.get(default_log_level) -+ -+ -+def read_config_common(config): -+ """read config file, get [common] section value""" -+ if not config.has_section(CONF_COMMON): -+ report_alarm_fail(f"Cannot find {CONF_COMMON} section in config file") -+ -+ try: -+ disk_name = config.get(CONF_COMMON, CONF_COMMON_DISK).lower() -+ disk = [] if disk_name == "default" else disk_name.split(",") -+ except configparser.NoOptionError: -+ disk = [] -+ logging.warning(f"Unset {CONF_COMMON}.{CONF_COMMON_DISK}, set to default") -+ -+ try: -+ stage_name = config.get(CONF_COMMON, CONF_COMMON_STAGE).lower() -+ stage = [] if stage_name == "default" else stage_name.split(",") -+ except configparser.NoOptionError: -+ stage = [] -+ logging.warning(f"Unset {CONF_COMMON}.{CONF_COMMON_STAGE}, set to default") -+ -+ if len(disk) > 10: -+ logging.warning(f"Too many {CONF_COMMON}.disks, record only max 10 disks") -+ disk = disk[:10] -+ -+ try: -+ iotype_name = config.get(CONF_COMMON, CONF_COMMON_IOTYPE).lower().split(",") -+ iotype_list = [rw.lower() for rw in iotype_name if rw.lower() in ['read', 'write']] -+ err_iotype = [rw.lower() for rw in iotype_name if rw.lower() not in ['read', 'write']] -+ -+ if err_iotype: -+ report_alarm_fail(f"Invalid {CONF_COMMON}.{CONF_COMMON_IOTYPE} config") -+ -+ except configparser.NoOptionError: -+ iotype_list = DEFAULT_PARAM[CONF_COMMON][CONF_COMMON_IOTYPE] -+ logging.warning(f"Unset {CONF_COMMON}.{CONF_COMMON_IOTYPE}, use {iotupe_list} as default") -+ -+ try: -+ period_time = int(config.get(CONF_COMMON, CONF_COMMON_PER_TIME)) -+ if not (1 <= period_time <= 300): -+ raise ValueError("Invalid period_time") -+ except ValueError: -+ report_alarm_fail(f"Invalid {CONF_COMMON}.{CONF_COMMON_PER_TIME}") -+ except configparser.NoOptionError: -+ period_time = DEFAULT_PARAM[CONF_COMMON][CONF_COMMON_PER_TIME] -+ logging.warning(f"Unset {CONF_COMMON}.{CONF_COMMON_PER_TIME}, use {period_time} as default") -+ -+ return period_time, disk, stage, iotype_list -+ -+ -+def read_config_algorithm(config): -+ """read config file, get [algorithm] section value""" -+ if not config.has_section(CONF_ALGO): -+ report_alarm_fail(f"Cannot find {CONF_ALGO} section in config file") -+ -+ try: -+ win_size = int(config.get(CONF_ALGO, CONF_ALGO_SIZE)) -+ if not (1 <= win_size <= 300): -+ raise ValueError(f"Invalid {CONF_ALGO}.{CONF_ALGO_SIZE}") -+ except ValueError: -+ report_alarm_fail(f"Invalid {CONF_ALGO}.{CONF_ALGO_SIZE} config") -+ except configparser.NoOptionError: -+ win_size = DEFAULT_PARAM[CONF_ALGO][CONF_ALGO_SIZE] -+ logging.warning(f"Unset {CONF_ALGO}.{CONF_ALGO_SIZE}, use {win_size} as default") -+ -+ try: -+ win_threshold = int(config.get(CONF_ALGO, CONF_ALGO_THRE)) -+ if win_threshold < 1 or win_threshold > 300 or win_threshold > win_size: -+ raise ValueError(f"Invalid {CONF_ALGO}.{CONF_ALGO_THRE}") -+ except ValueError: -+ report_alarm_fail(f"Invalid {CONF_ALGO}.{CONF_ALGO_THRE} config") -+ except configparser.NoOptionError: -+ win_threshold = DEFAULT_PARAM[CONF_ALGO]['win_threshold'] -+ logging.warning(f"Unset {CONF_ALGO}.{CONF_ALGO_THRE}, use {win_threshold} as default") -+ -+ return win_size, win_threshold -+ -+ -+def read_config_latency(config): -+ """read config file, get [latency_xxx] section value""" -+ common_param = {} -+ for type_name in Disk_Type: -+ section_name = CONF_LATENCY.format(Disk_Type[type_name]) -+ if not config.has_section(section_name): -+ report_alarm_fail(f"Cannot find {section_name} section in config file") -+ -+ common_param[Disk_Type[type_name]] = get_section_value(section_name, config) -+ return common_param -+ -+ -+def read_config_iodump(config): -+ """read config file, get [iodump] section value""" -+ if not config.has_section(CONF_IODUMP): -+ report_alarm_fail(f"Cannot find {CONF_IODUMP} section in config file") -+ -+ return get_section_value(CONF_IODUMP, config) -+ -+ -+def read_config_stage(config, stage, iotype_list, curr_disk_type): -+ """read config file, get [STAGE_NAME_diskType] section value""" -+ res = {} -+ section_name = f"{stage}_{curr_disk_type}" -+ if not config.has_section(section_name): -+ return res -+ -+ for key in config[section_name]: -+ if config[stage][key].isdecimal(): -+ res[key] = int(config[stage][key]) -+ -+ return res -diff --git a/src/python/sentryPlugins/avg_block_io/module_conn.py b/src/python/sentryPlugins/avg_block_io/module_conn.py -index 8d6f429..cbdaad4 100644 ---- a/src/python/sentryPlugins/avg_block_io/module_conn.py -+++ b/src/python/sentryPlugins/avg_block_io/module_conn.py -@@ -29,12 +29,16 @@ def sig_handler(signum, _f): - - def avg_get_io_data(io_dic): - """get_io_data from sentryCollector""" -+ logging.debug(f"send to sentryCollector get_io_data: period={io_dic['period_time']}, " -+ f"disk={io_dic['disk_list']}, stage={io_dic['stage_list']}, iotype={io_dic['iotype_list']}") - res = get_io_data(io_dic["period_time"], io_dic["disk_list"], io_dic["stage_list"], io_dic["iotype_list"]) - return check_result_validation(res, 'get io data') - - - def avg_is_iocollect_valid(io_dic, config_disk, config_stage): - """is_iocollect_valid from sentryCollector""" -+ logging.debug(f"send to sentryCollector is_iocollect_valid: period={io_dic['period_time']}, " -+ f"disk={config_disk}, stage={config_stage}") - res = is_iocollect_valid(io_dic["period_time"], config_disk, config_stage) - return check_result_validation(res, 'check config validation') - -@@ -79,7 +83,7 @@ def process_report_data(disk_name, rw, io_data): - # io press - ctrl_stage = ['throtl', 'wbt', 'iocost', 'bfq'] - for stage_name in ctrl_stage: -- abnormal, abnormal_list = is_abnormal((disk_name, 'bio', rw), io_data) -+ abnormal, abnormal_list = is_abnormal((disk_name, stage_name, rw), io_data) - if not abnormal: - continue - msg["reason"] = "IO press" -@@ -117,6 +121,7 @@ def process_report_data(disk_name, rw, io_data): - - - def get_disk_type_by_name(disk_name): -+ logging.debug(f"send to sentryCollector get_disk_type: disk_name={disk_name}") - res = get_disk_type(disk_name) - disk_type_str = check_result_validation(get_disk_type(disk_name), f'Invalid disk type {disk_name}') - try: -@@ -126,4 +131,4 @@ def get_disk_type_by_name(disk_name): - except ValueError: - report_alarm_fail(f"Failed to get disk type for {disk_name}") - -- return Disk_Type[curr_disk_type] -\ No newline at end of file -+ return Disk_Type[curr_disk_type] -diff --git a/src/python/sentryPlugins/avg_block_io/utils.py b/src/python/sentryPlugins/avg_block_io/utils.py -index c381c07..1bfd4e8 100644 ---- a/src/python/sentryPlugins/avg_block_io/utils.py -+++ b/src/python/sentryPlugins/avg_block_io/utils.py -@@ -8,84 +8,12 @@ - # IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - # PURPOSE. - # See the Mulan PSL v2 for more details. --import configparser - import logging - import os - - AVG_VALUE = 0 - AVG_COUNT = 1 - --CONF_LOG = 'log' --CONF_LOG_LEVEL = 'level' --LogLevel = { -- "debug": logging.DEBUG, -- "info": logging.INFO, -- "warning": logging.WARNING, -- "error": logging.ERROR, -- "critical": logging.CRITICAL --} -- -- --DEFAULT_PARAM = { -- 'latency_nvme_ssd': { -- 'read_avg_lim': 300, -- 'write_avg_lim': 300, -- 'read_avg_time': 3, -- 'write_avg_time': 3, -- 'read_tot_lim': 500, -- 'write_tot_lim': 500, -- }, 'latency_sata_ssd' : { -- 'read_avg_lim': 10000, -- 'write_avg_lim': 10000, -- 'read_avg_time': 3, -- 'write_avg_time': 3, -- 'read_tot_lim': 50000, -- 'write_tot_lim': 50000, -- }, 'latency_sata_hdd' : { -- 'read_avg_lim': 15000, -- 'write_avg_lim': 15000, -- 'read_avg_time': 3, -- 'write_avg_time': 3, -- 'read_tot_lim': 50000, -- 'write_tot_lim': 50000 -- }, 'iodump': { -- 'read_iodump_lim': 0, -- 'write_iodump_lim': 0 -- } --} -- -- --def get_section_value(section_name, config): -- common_param = {} -- config_sec = config[section_name] -- for config_key in DEFAULT_PARAM[section_name]: -- if config_key in config_sec: -- if not config_sec[config_key].isdecimal(): -- report_alarm_fail(f"Invalid {section_name}.{config_key} config.") -- common_param[config_key] = int(config_sec[config_key]) -- else: -- logging.warning(f"Unset {section_name}.{config_key} in config file, use {DEFAULT_PARAM[section_name][config_key]} as default") -- common_param[config_key] = DEFAULT_PARAM[section_name][config_key] -- return common_param -- -- --def get_log_level(filename): -- if not os.path.exists(filename): -- return logging.INFO -- -- try: -- config = configparser.ConfigParser() -- config.read(filename) -- if not config.has_option(CONF_LOG, CONF_LOG_LEVEL): -- return logging.INFO -- log_level = config.get(CONF_LOG, CONF_LOG_LEVEL) -- -- if log_level.lower() in LogLevel: -- return LogLevel.get(log_level.lower()) -- return logging.INFO -- except configparser.Error: -- return logging.INFO -- - - def get_nested_value(data, keys): - """get data from nested dict""" --- -2.27.0 diff --git a/set-logrotate.patch b/set-logrotate.patch deleted file mode 100644 index 47c507a..0000000 --- a/set-logrotate.patch +++ /dev/null @@ -1,92 +0,0 @@ -From d74076f4b772822de4f5bee1c8a778dd6b1771d2 Mon Sep 17 00:00:00 2001 -From: shixuantong -Date: Wed, 11 Dec 2024 15:25:33 +0800 -Subject: [PATCH] set logrotate - ---- - config/logrotate | 9 --------- - config/logrotate-sysSentry.conf | 35 +++++++++++++++++++++++++++++++++ - src/sh/logrotate-sysSentry.cron | 13 ++++++++++++ - 3 files changed, 48 insertions(+), 9 deletions(-) - delete mode 100644 config/logrotate - create mode 100644 config/logrotate-sysSentry.conf - create mode 100644 src/sh/logrotate-sysSentry.cron - -diff --git a/config/logrotate b/config/logrotate -deleted file mode 100644 -index 3dc77f5..0000000 ---- a/config/logrotate -+++ /dev/null -@@ -1,9 +0,0 @@ --/var/log/sysSentry/*.log { -- compress -- missingok -- notifempty -- copytruncate -- rotate 2 -- size +4096k -- hourly --} -diff --git a/config/logrotate-sysSentry.conf b/config/logrotate-sysSentry.conf -new file mode 100644 -index 0000000..cf5f994 ---- /dev/null -+++ b/config/logrotate-sysSentry.conf -@@ -0,0 +1,35 @@ -+# keep 4 hours worth of backlogs -+rotate 4 -+ -+# create new (empty) log files after rotating old ones -+create -+ -+# compress log files -+compress -+ -+# if a log file does not exist, go no to the next one without an error msg -+missingok -+ -+# do not rotate the log if it is empty -+notifempty -+ -+copytruncate -+ -+# ignore any following matches of a log file. -+# Note that order is significant, it will not overwrite and take the first match. -+# require logrotate >= 3.21.0 -+ignoreduplicates -+ -+/var/log/sysSentry/sysSentry.log { -+ rotate 8 -+ size +4096k -+} -+ -+/var/log/sysSentry/cpu_sentry.log { -+ rotate 2 -+ size +2048k -+} -+ -+/var/log/sysSentry/*.log { -+ size +4096k -+} -diff --git a/src/sh/logrotate-sysSentry.cron b/src/sh/logrotate-sysSentry.cron -new file mode 100644 -index 0000000..64d02f9 ---- /dev/null -+++ b/src/sh/logrotate-sysSentry.cron -@@ -0,0 +1,13 @@ -+#!/bin/sh -+ -+TMPF=`mktemp /tmp/logrotate-sysSentry.XXXXXXXXX` -+ -+/usr/sbin/logrotate /etc/logrotate-sysSentry.conf -v --log=$TMPF -s /var/lib/logrotate-syssentry/logrotate.status -+EXITVALUE=$? -+if [ $EXITVALUE != 0 ]; then -+ /bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE], for details, see /var/log/sysSentry/logrotate.log" -+ /bin/logger -t logrotate -f $TMPF -+fi -+rm -rf $TMPF -+rm -rf /var/lib/logrotate-syssentry/logrotate.status -+exit $EXITVALUE --- -2.27.0 - diff --git a/setting-parameters-must-be-integer.patch b/setting-parameters-must-be-integer.patch deleted file mode 100644 index 20e11f7..0000000 --- a/setting-parameters-must-be-integer.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4abad77067557234d938de3914094c80181030c1 Mon Sep 17 00:00:00 2001 -From: jwolf <523083921@qq.com> -Date: Fri, 30 Aug 2024 14:30:46 +0800 -Subject: [PATCH] must be integer - ---- - c/catcli/catlib/cli_param_checker.c | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/c/catcli/catlib/cli_param_checker.c b/src/c/catcli/catlib/cli_param_checker.c -index e400428..5b38402 100644 ---- a/src/c/catcli/catlib/cli_param_checker.c -+++ b/src/c/catcli/catlib/cli_param_checker.c -@@ -17,8 +17,9 @@ void checkset_cpu_usage_percentage(char *getopt_optarg, catcli_request_body *p_r - if (cpu_utility <= 0 || cpu_utility > CPU_USAGE_PERCENTAGE_MAX || strchr(getopt_optarg, '.') != NULL) { - strncpy(errs->patrol_module_err, - "\"cpu_utility \" must be an integer greater in the range (0,100],correct \"-u, --cpu_utility\"\n", MAX_ERR_LEN); -+ } else { -+ p_request_body->cpu_utility = (int)cpu_utility; - } -- p_request_body->cpu_utility = (int)cpu_utility; - } - - void checkset_cpulist(char *getopt_optarg, catcli_request_body *p_request_body, struct option_errs *errs) -@@ -73,8 +74,9 @@ void checkset_patrol_time(char *getopt_optarg, catcli_request_body *p_request_bo - strncpy(errs->patrol_time_err, - "\"patrol_second\" must be a number in the range of (0,INT_MAX] ,correct \"-t, --patrol_second\"\n", - MAX_ERR_LEN); -+ } else { -+ p_request_body->patrol_second = (int)second; - } -- p_request_body->patrol_second = (int)second; - } - - void checkset_patrol_type(char *getopt_optarg, catcli_request_body *p_request_body, struct option_errs *errs) --- -2.27.0 - diff --git a/split-cpu_sentry-and-syssentry.patch b/split-cpu_sentry-and-syssentry.patch deleted file mode 100644 index 7b2dc7e..0000000 --- a/split-cpu_sentry-and-syssentry.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 3f6e4d12618597b5aab6b0633f1bda800526ea54 Mon Sep 17 00:00:00 2001 -From: gaoruoshu -Date: Wed, 14 Aug 2024 21:10:20 +0800 -Subject: [PATCH] split cpu_sentry and syssentry - ---- - src/python/syssentry/cpu_alarm.py | 42 +++++++++++++++++++++++++ - src/python/syssentry/syssentry.py | 52 ++++++------------------------- - 2 files changed, 52 insertions(+), 42 deletions(-) - -diff --git a/src/python/syssentry/cpu_alarm.py b/src/python/syssentry/cpu_alarm.py -index d972c42..0b1642b 100644 ---- a/src/python/syssentry/cpu_alarm.py -+++ b/src/python/syssentry/cpu_alarm.py -@@ -1,6 +1,7 @@ - import re - import math - import logging -+import socket - from enum import Enum - - from .utils import execute_command -@@ -15,6 +16,12 @@ BINARY = 2 - MIN_DATA_LEN = 0 - MAX_DATA_LEN = 999 - -+PARAM_REP_LEN = 3 -+PARAM_TYPE_LEN = 1 -+PARAM_MODULE_LEN = 1 -+PARAM_TRANS_TO_LEN = 2 -+PARAM_DATA_LEN = 3 -+ - - class Type(Enum): - CE = 0x00 -@@ -207,3 +214,38 @@ def check_fixed_param(data, expect): - raise ValueError("expected str param is not valid") - return data - raise NotImplementedError("unexpected param type") -+ -+ -+def cpu_alarm_recv(server_socket: socket.socket): -+ try: -+ client_socket, _ = server_socket.accept() -+ logging.debug("cpu alarm fd listen ok") -+ -+ data = client_socket.recv(PARAM_REP_LEN) -+ check_fixed_param(data, "REP") -+ -+ data = client_socket.recv(PARAM_TYPE_LEN) -+ _type = check_fixed_param(data, Type) -+ -+ data = client_socket.recv(PARAM_MODULE_LEN) -+ module = check_fixed_param(data, Module) -+ -+ data = client_socket.recv(PARAM_TRANS_TO_LEN) -+ trans_to = check_fixed_param(data, TransTo) -+ -+ data = client_socket.recv(PARAM_DATA_LEN) -+ data_len = check_fixed_param(data, (MIN_DATA_LEN, MAX_DATA_LEN)) -+ -+ data = client_socket.recv(data_len) -+ -+ command, event_type, socket_id, core_id = parser_cpu_alarm_info(data) -+ except socket.error: -+ logging.error("socket error") -+ return -+ except (ValueError, OSError, UnicodeError, TypeError, NotImplementedError): -+ logging.error("server recv cpu alarm msg failed!") -+ client_socket.close() -+ return -+ -+ upload_bmc(_type, module, command, event_type, socket_id, core_id) -+ -diff --git a/src/python/syssentry/syssentry.py b/src/python/syssentry/syssentry.py -index 3d5cb8d..f93956e 100644 ---- a/src/python/syssentry/syssentry.py -+++ b/src/python/syssentry/syssentry.py -@@ -36,8 +36,15 @@ from .heartbeat import (heartbeat_timeout_chk, heartbeat_fd_create, - from .result import RESULT_MSG_HEAD_LEN, RESULT_MSG_MAGIC_LEN, RESULT_MAGIC - from .result import RESULT_LEVEL_ERR_MSG_DICT, ResultLevel - from .utils import get_current_time_string --from .cpu_alarm import (upload_bmc, check_fixed_param, parser_cpu_alarm_info, -- Type, Module, TransTo, MIN_DATA_LEN, MAX_DATA_LEN) -+ -+ -+CPU_EXIST = True -+try: -+ from .cpu_alarm import cpu_alarm_recv -+except ImportError: -+ CPU_EXIST = False -+ logging.debug("Cannot find cpu sentry mod") -+ - - INSPECTOR = None - -@@ -76,45 +83,6 @@ PID_FILE_FLOCK = None - RESULT_SOCKET_PATH = "/var/run/sysSentry/result.sock" - - CPU_ALARM_SOCKET_PATH = "/var/run/sysSentry/report.sock" --PARAM_REP_LEN = 3 --PARAM_TYPE_LEN = 1 --PARAM_MODULE_LEN = 1 --PARAM_TRANS_TO_LEN = 2 --PARAM_DATA_LEN = 3 -- -- --def cpu_alarm_recv(server_socket: socket.socket): -- try: -- client_socket, _ = server_socket.accept() -- logging.debug("cpu alarm fd listen ok") -- -- data = client_socket.recv(PARAM_REP_LEN) -- check_fixed_param(data, "REP") -- -- data = client_socket.recv(PARAM_TYPE_LEN) -- _type = check_fixed_param(data, Type) -- -- data = client_socket.recv(PARAM_MODULE_LEN) -- module = check_fixed_param(data, Module) -- -- data = client_socket.recv(PARAM_TRANS_TO_LEN) -- trans_to = check_fixed_param(data, TransTo) -- -- data = client_socket.recv(PARAM_DATA_LEN) -- data_len = check_fixed_param(data, (MIN_DATA_LEN, MAX_DATA_LEN)) -- -- data = client_socket.recv(data_len) -- -- command, event_type, socket_id, core_id = parser_cpu_alarm_info(data) -- except socket.error: -- logging.error("socket error") -- return -- except (ValueError, OSError, UnicodeError, TypeError, NotImplementedError): -- logging.error("server recv cpu alarm msg failed!") -- client_socket.close() -- return -- -- upload_bmc(_type, module, command, event_type, socket_id, core_id) - - - def msg_data_process(msg_data): -@@ -480,7 +448,7 @@ def main_loop(): - server_result_recv(server_result_fd) - elif event_fd == heartbeat_fd.fileno(): - heartbeat_recv(heartbeat_fd) -- elif event_fd == cpu_alarm_fd.fileno(): -+ elif CPU_EXIST and event_fd == cpu_alarm_fd.fileno(): - cpu_alarm_recv(cpu_alarm_fd) - else: - continue --- -2.33.0 - - diff --git a/sysSentry-1.0.2.tar.gz b/sysSentry-1.0.2.tar.gz deleted file mode 100644 index abb6fd18b9697ae71350686a3b0bf9a233d7d184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317440 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

4nqQ;fp4jNpYC$plcm)6vXL&< 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%0Do@jWEUU@Kn^)XXO~Ph)d*XZ5lKLIL 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�L` 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

(hGOdU}eYJkDKYOSO5jUnoEl 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%0D<={F>nPOAP)WxzZVGg@Lyb`_6X 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�JPDOjgI_G%pnFsTz4MRqI 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

5i^UCR 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 z

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 z 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 z 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%0A~O6|2SyI(2E4ZBZ7B_nglRhPJ;i;X<{#Z*y2Ct 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

ZOtmFw&*J1rAED6cTE-XTG6IU#o=Xr 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ǖ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
p~vj*;$Ub#o_+BxIV;) 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%0AL zhTOM6X4Mx6#-<&)l&bF3|EWB{l){SUdZP(AS)O?@J z_2hP=KfVAKZIx`MAjMpbL^ueQ08%cd^FQmjmH|Ko%5fi{J|f^ykdgi$@Rwt;q`Zy0f@7 z#9zF3%U_&y*b4h3bd#|SBMg;&5;tdMb8Q>U8j0Bb_JsA_i7gOya6JZA2qha)xKzwb z_0Swnh-e#5n@BFm6S{Zf0ZG$ER@LD`z}=Tjr*a)qU4aAQ@aD>U7OQPdd59q-Vh8}viAnSpsTUyH`V z@RGEtnx0ZYIUx#b6f{dXlnJQy1_n0&7d8nvfRO?=$OOge$-lcy>*Z!;2eCwCf@?Xb zgvvw!v_MP0=jOh0cgG*cgTa;Pi0f;-k#)g;!eD~LKa7Uq`%U-y{nb}cARTCzL1E0% z^@WLY^ju~Gx(>VcRmO_&G8vAj5YRRokU}yQ)?B4oD_zU$RYA+G=rG$srC9# zb)QU5uPw^YR6Ja}pm3hsxj2ilpjiO9sZMI>j%M|MgwfIoI4De_y3 zJnU-pUZ#w`jyT>smparcNH&8i(_ei$ML)DF)Mc7oqaI#r9NP66;kY|s&22^P59A;@ zV0~?!k zQv;tK{%U2co1HXC6&ch%ROUzRcPFQABf)G#_~(H<#iPTX%dV-gicH2YcWHg@a1+6m2-+c&t3)D6>Zr8#Pug+ByEi@>eD| zpWIc-hWx6higA=FmJ)!p>(bPy&)dnAWwC&3m=Hh2GKy8uVh63Qdc^^ZjCH{~8-p2; zr7YgLU_5_2GR*o#0*SB~)n%A#=dHuRT$iM1hKAghf=p-lFard7KBWkNh2%s4f-z2n zFFM94wG-8Pt9(8Ojn4wx&aH5yB>`%GvYq1#G(l1YezonW%}oxk9x?{o1L+TjZmRHg z_�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%0DWKTKqNW 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

8MFE^ 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�XREN-&DtrOK{4$t6LM8ReDl20_ZVL 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%0D|`&R7X)5`uj!EOT>G*{DD1)vrbYz^R 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 IF90}M0IHw}Qvd(} literal 0 HcmV?d00001 diff --git a/sysSentry.spec b/sysSentry.spec index 8a17131..ceae486 100644 --- a/sysSentry.spec +++ b/sysSentry.spec @@ -3,101 +3,24 @@ Summary: System Inspection Framework Name: sysSentry -Version: 1.0.2 -Release: 67 +Version: 1.0.3 +Release: 1 License: Mulan PSL v2 Group: System Environment/Daemons Source0: https://gitee.com/openeuler/sysSentry/releases/download/v%{version}/%{name}-%{version}.tar.gz -BuildRoot: %{_builddir}/%{name}-root - -Patch1: fix-version-in-setup.py.patch -Patch2: Fix-the-problem-that-function-cpu_report_result-is-c.patch -Patch3: fix-error-handling.patch -Patch4: fix-result-when-process-output-is-None.patch -Patch5: cpu_utility-and-cpu_patrol-must-be-an-integer.patch -Patch6: setting-parameters-must-be-integer.patch -Patch7: param-must-be-integer.patch -Patch8: add-deleted-code-to-plugin-rasdaemon.patch -Patch9: Remove-ANSI-escape-sequences.patch -Patch10: split-cpu_sentry-and-syssentry.patch -Patch11: fix-configparser.InterpolationSyntaxError.patch -Patch12: fix-syssentry-fails-to-be-started-when-cpu_sentry-is.patch -Patch13: add-collect-module-to-sysSentry.patch -Patch14: feature-add-avg_block_io-plugin.patch -Patch15: fix-some-about-collect-module-and-avg-block-io.patch -Patch16: add-ai-threshold-slow-io-detection-plugin.patch -Patch17: optimize-the-handing-of-cat-cli-error-msg-in-cpu_sentry.patch -Patch18: over-threshold-should-be-warn-level-log-in-cat-cli.patch -Patch19: fix-bug-step-2-about-collect-module-and-avg-block-io.patch -Patch20: add-log-level-and-change-log-format.patch -Patch21: fix-ai_block_io-some-issues.patch -Patch22: add-pyxalarm-and-pySentryNotify-add-multi-users-supp.patch -Patch23: add-sentryctl-get_alarm-module_name-s-time_range-d.patch -Patch24: fix-python-3.7-not-support-list-bool-type.patch -Patch25: avg_block_io-send-alarm-to-xalarmd.patch -Patch26: bugfix-typo.patch -Patch27: fix-config-relative-some-issues.patch -Patch28: update-log-when-it-is-not-lock-collect.patch -Patch29: change-alarm-length.patch -Patch30: add-detail-time.patch -Patch31: xalarm-add-alarm-msg-length-to-8192.patch -Patch32: ai_block_io-adapt-alarm-module.patch -Patch33: add-log-for-improving-maintainability.patch -Patch34: add-get_disk_type-and-fix-some-bugs.patch -Patch35: diff-disk-type-use-diff-config.patch -Patch36: add-parameter-time_range-alarm_id-and-alarm_clear_ti.patch -Patch37: fix-xalarm_Report-function-not-refuse-alarm-msg-exce.patch -Patch38: fix-xalarm_upgrade-not-return-val-and-fail-when-thre.patch -Patch39: add-log-for-xalarm-when-sending-msg-and-clean-invali.patch -Patch40: add-xalarm-cleanup-invalid-server-socket-peroidly.patch -Patch41: ai_block_io-support-stage-and-iotype.patch -Patch42: fix-io_dump-for-collect-module.patch -Patch43: add-root-cause-analysis.patch -Patch44: update-collect-log.patch -Patch45: modify-abnormal-stack-when-the-disk-field-is-not-con.patch -Patch46: ai_block_io-fix-some-bugs.patch -Patch47: refactor-config.py-and-bugfix-uncorrect-slow-io-repo.patch -Patch48: get_io_data-failed-wont-stop-avg_block_io-and-del-di.patch -Patch49: fix-ai_block_io-root-cause-bug.patch -Patch50: listen-thread-of-collect-module-exits-occasionally.patch -Patch51: precise-alarm-query-time.patch -Patch52: fix-word-error.patch -Patch53: optimize-log-printing.patch -Patch54: enrich-alert-info-about-kernel-stack.patch -Patch55: ai_block_io-lack-section-exit.patch -Patch56: fix-xalarm-non-uniform-log-formatting.patch -Patch57: update-collect-plugin-period-max.patch -Patch58: fix-frequency-param-check-bug.patch -Patch59: ai_block_io-support-iodump.patch -Patch60: fix-get_alarm-error.patch -Patch61: fix-alarm_info-newline-break-error.patch -Patch62: add-hbm-online-repair.patch -Patch63: fix-hbm-online-repair-notice-and-efi-create.patch -Patch64: get_alarm-d-abnomal-display.patch -Patch65: modify-logrotate-rule.patch -Patch66: fix-excessive-CPU-usage.patch -Patch67: fix-uint8-bug-and-change-isolation-default-value.patch -Patch68: fix-write-file-return-code-bug.patch -Patch69: change-avg_block_io-config.patch -Patch70: ai_block_io-support-absolute-threshold-lower-limit.patch -Patch71: ai_block_io-fix-some-config-parameters-parse-bug.patch -Patch72: update-nvme-config.patch -Patch73: make-debug-msg-clear.patch -Patch74: add-boundary-check-for-settings.patch -Patch75: change-status-of-period-task-and-sort-mod-file.patch -Patch76: uniform-avg_block_io-log-and-ai_block_io-log.patch -Patch77: set-logrotate.patch -Patch78: hbm_online_repair-add-unload-driver.patch -Patch79: fix-test_ai_block_io-fail.patch BuildRequires: cmake gcc-c++ BuildRequires: python3 python3-setuptools BuildRequires: json-c-devel BuildRequires: chrpath -# for test +BuildRequires: elfutils-devel clang libbpf-devel bpftool BuildRequires: python3-numpy python3-pytest Requires: pyxalarm = %{version} +Requires: libbpf + +%define PYTHON_VERSION %{python3_version} +%define PKGVER syssentry-%{version}-py%{PYTHON_VERSION}.egg-info %description sysSentry provides framework tools for system inspection. @@ -119,15 +42,6 @@ Provides: libxalarm-devel = %{version} %description -n libxalarm-devel This package provides developer tools for the libxalarm. -%package -n cpu_sentry -Summary: CPU fault inspection program -Requires: procps-ng -Recommends: sysSentry = %{version}-%{release} -Recommends: ipmitool - -%description -n cpu_sentry -This package provides CPU fault detection - %package -n avg_block_io Summary: Supports slow I/O detection Requires: sysSentry = %{version}-%{release} @@ -182,92 +96,10 @@ This package provides hbm_online_repair for the sysSentry. %autosetup -n %{name}-%{version} -p1 %build -# xalarm -sh build/build.sh -b %{buildroot}%{_libdir} - -# sysSentry -pushd src/python -python3 setup.py build -popd - -pushd src/c/catcli/catlib -cmake -B ./build/ -S . -D CMAKE_INSTALL_PREFIX=/usr/local -D CMAKE_BUILD_TYPE=Release -pushd build -make -popd -popd - -# hbm_online_repair -pushd src/c/hbm_online_repair -make -popd +%make_build %install -# sysSentry -mkdir -p %{buildroot}%{_bindir} -mkdir -p %{buildroot}%{_unitdir} -mkdir -p %{buildroot}%{_var}/log/sysSentry -install src/python/syssentry/sentryctl %{buildroot}%{_bindir} -install -d -m 700 %{buildroot}/etc/sysSentry/ -install -d -m 700 %{buildroot}/etc/sysSentry/tasks/ -install -d -m 700 %{buildroot}/etc/sysSentry/plugins/ -install -m 600 config/inspect.conf %{buildroot}%{_sysconfdir}/sysSentry -install -m 600 service/sysSentry.service %{buildroot}%{_unitdir} - -# rasdaemon -install config/tasks/rasdaemon.mod %{buildroot}/etc/sysSentry/tasks/ - -# xalarm -sh build/build.sh -i %{buildroot}%{_libdir} -install -m 600 config/xalarm.conf %{buildroot}%{_sysconfdir}/sysSentry -install -d %{buildroot}%{_libdir} -install -d %{buildroot}%{_includedir}/xalarm -install -m 600 service/xalarmd.service %{buildroot}%{_unitdir} -install -m 644 src/libso/xalarm/register_xalarm.h %{buildroot}%{_includedir}/xalarm/register_xalarm.h - -# sentryCollector -install -m 600 config/collector.conf %{buildroot}%{_sysconfdir}/sysSentry -install -m 600 service/sentryCollector.service %{buildroot}%{_unitdir} - -# cpu sentry -install config/tasks/cpu_sentry.mod %{buildroot}/etc/sysSentry/tasks/ -install config/plugins/cpu_sentry.ini %{buildroot}/etc/sysSentry/plugins/cpu_sentry.ini -install src/c/catcli/catlib/build/cat-cli %{buildroot}%{_bindir}/cat-cli -install src/c/catcli/catlib/build/plugin/cpu_patrol/libcpu_patrol.so %{buildroot}%{_libdir} - -chrpath -d %{buildroot}%{_bindir}/cat-cli -chrpath -d %{buildroot}%{_libdir}/libcpu_patrol.so - -# avg_block_io -install config/tasks/avg_block_io.mod %{buildroot}/etc/sysSentry/tasks/ -install config/plugins/avg_block_io.ini %{buildroot}/etc/sysSentry/plugins/avg_block_io.ini - -# ai_block_io -install config/tasks/ai_block_io.mod %{buildroot}/etc/sysSentry/tasks/ -install config/plugins/ai_block_io.ini %{buildroot}/etc/sysSentry/plugins/ai_block_io.ini - -# hbm_online_repair -mkdir -p %{buildroot}/etc/sysconfig/ -install config/tasks/hbm_online_repair.mod %{buildroot}/etc/sysSentry/tasks/ -install src/c/hbm_online_repair/hbm_online_repair %{buildroot}%{_bindir} -install src/c/hbm_online_repair/hbm_online_repair.env %{buildroot}/etc/sysconfig/hbm_online_repair.env - -# logrotate -mkdir -p %{buildroot}%{_localstatedir}/lib/logrotate-syssentry -mkdir -p %{buildroot}%{_sysconfdir}/cron.hourly -install -m 0600 config/logrotate-sysSentry.conf %{buildroot}%{_sysconfdir}/logrotate-sysSentry.conf -install -m 0500 src/sh/logrotate-sysSentry.cron %{buildroot}%{_sysconfdir}/cron.hourly/logrotate-sysSentry - -pushd src/python -python3 setup.py install -O1 --root=$RPM_BUILD_ROOT --record=SENTRY_FILES -cat SENTRY_FILES | grep -v register_xalarm.* | grep -v sentry_notify.* > SENTRY_FILES.tmp -mv SENTRY_FILES.tmp SENTRY_FILES -popd - -%check -PYTHONPATH=%{buildroot}%{python3_sitelib} %{__python3} -m pytest selftest/test/ - -%pre +%make_install %post /sbin/ldconfig @@ -287,28 +119,36 @@ rm -rf /var/run/sysSentry | : %postun /sbin/ldconfig -%clean -rm -rf %{buildroot} - -%files -f src/python/SENTRY_FILES +%files %defattr(0550,root,root) -%dir %attr(0550,root,root) %{python3_sitelib}/xalarm +%attr(0550,root,root) %{python3_sitelib}/xalarm %attr(0550,root,root) %{python3_sitelib}/syssentry +%attr(0550,root,root) %{python3_sitelib}/%{PKGVER} %attr(0550,root,root) %{python3_sitelib}/sentryCollector -%attr(0550,root,root) %{python3_sitelib}/sentryPlugins/avg_block_io -%attr(0550,root,root) %{python3_sitelib}/sentryPlugins/ai_block_io # sysSentry %attr(0500,root,root) %{_bindir}/sentryctl %attr(0550,root,root) %{_bindir}/syssentry +%attr(0550,root,root) %{_bindir}/ebpf_collector %attr(0750,root,root) %config(noreplace) %{_var}/log/sysSentry -%attr(0750,root,root) %config(noreplace) %{_sysconfdir}/sysSentry %attr(0750,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/tasks %attr(0750,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/plugins %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/inspect.conf -%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/tasks/rasdaemon.mod %attr(0600,root,root) %{_unitdir}/sysSentry.service +%exclude %{python3_sitelib}/sentryCollector/collect_plugin.py +%exclude %{python3_sitelib}/xalarm/register_xalarm.py +%exclude %{python3_sitelib}/xalarm/sentry_notify.py + +%exclude %{python3_sitelib}/syssentry/__pycache__ +%exclude %{python3_sitelib}/sentryCollector/__pycache__ +%exclude %{python3_sitelib}/xalarm/__pycache__ + +%exclude %{_sysconfdir}/sysSentry/tasks/ai_block_io.mod +%exclude %{_sysconfdir}/sysSentry/plugins/ai_block_io.ini +%exclude %{_sysconfdir}/sysSentry/tasks/avg_block_io.mod +%exclude %{_sysconfdir}/sysSentry/plugins/avg_block_io.ini + # xalarm %attr(0550,root,root) %{_bindir}/xalarmd %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/xalarm.conf @@ -316,39 +156,14 @@ rm -rf %{buildroot} # logrotate %dir %{_localstatedir}/lib/logrotate-syssentry -%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/logrotate-sysSentry.conf +%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/logrotate-sysSentry.conf %attr(0500,root,root) %{_sysconfdir}/cron.hourly/logrotate-sysSentry -# cpu inspection module -%exclude %{_sysconfdir}/sysSentry/tasks/cpu_sentry.mod -%exclude %{_sysconfdir}/sysSentry/plugins/cpu_sentry.ini -%exclude %{_bindir}/cpu_sentry -%exclude %{_bindir}/cat-cli -%exclude %{python3_sitelib}/syssentry/cpu_* -%exclude %{python3_sitelib}/syssentry/*/cpu_* - -# avg block io -%exclude %{_sysconfdir}/sysSentry/tasks/avg_block_io.mod -%exclude %{_sysconfdir}/sysSentry/plugins/avg_block_io.ini -%exclude %{_bindir}/avg_block_io -%exclude %{python3_sitelib}/sentryPlugins/* - -# ai_block_io -%exclude %{_sysconfdir}/sysSentry/tasks/ai_block_io.mod -%exclude %{_sysconfdir}/sysSentry/plugins/ai_block_io.ini -%exclude %{_bindir}/ai_block_io -%exclude %{python3_sitelib}/sentryPlugins/* - # sentryCollector %attr(0550,root,root) %{_bindir}/sentryCollector %attr(0600,root,root) %{_sysconfdir}/sysSentry/collector.conf %attr(0600,root,root) %{_unitdir}/sentryCollector.service -# pysentry_collect -%exclude %{python3_sitelib}/sentryCollector/collect_plugin.py -%exclude %{python3_sitelib}/sentryCollector/__pycache__/collect_plugin* - -# hbm repair module %exclude %{_sysconfdir}/sysSentry/tasks/hbm_online_repair.mod %exclude %{python3_sitelib}/syssentry/bmc_* %exclude %{python3_sitelib}/syssentry/*/bmc_* @@ -357,41 +172,30 @@ rm -rf %{buildroot} %attr(0550,root,root) %{_libdir}/libxalarm.so %files -n libxalarm-devel -%dir %{_includedir}/xalarm -%attr(0550,root,root) %{_includedir}/xalarm %attr(0550,root,root) %{_includedir}/xalarm/register_xalarm.h %files -n pyxalarm %attr(0550,root,root) %{python3_sitelib}/xalarm/register_xalarm.py -%attr(0550,root,root) %{python3_sitelib}/xalarm/__pycache__/register_xalarm* %files -n pysentry_notify %attr(0550,root,root) %{python3_sitelib}/xalarm/sentry_notify.py -%attr(0550,root,root) %{python3_sitelib}/xalarm/__pycache__/sentry_notify* - -%files -n cpu_sentry -%attr(0500,root,root) %{_bindir}/cat-cli -%attr(0500,root,root) %{_bindir}/cpu_sentry -%attr(0550,root,root) %{_libdir}/libcpu_patrol.so -%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/tasks/cpu_sentry.mod -%attr(0600,root,root) %{_sysconfdir}/sysSentry/plugins/cpu_sentry.ini -%attr(0550,root,root) %{python3_sitelib}/syssentry/cpu_* %files -n avg_block_io %attr(0500,root,root) %{_bindir}/avg_block_io %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/tasks/avg_block_io.mod %attr(0600,root,root) %{_sysconfdir}/sysSentry/plugins/avg_block_io.ini %attr(0550,root,root) %{python3_sitelib}/sentryPlugins/avg_block_io +%exclude %{python3_sitelib}/sentryPlugins/avg_block_io/__pycache__ %files -n ai_block_io %attr(0500,root,root) %{_bindir}/ai_block_io %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/sysSentry/tasks/ai_block_io.mod %attr(0600,root,root) %{_sysconfdir}/sysSentry/plugins/ai_block_io.ini %attr(0550,root,root) %{python3_sitelib}/sentryPlugins/ai_block_io +%exclude %{python3_sitelib}/sentryPlugins/ai_block_io/__pycache__ %files -n pysentry_collect %attr(0550,root,root) %{python3_sitelib}/sentryCollector/collect_plugin.py -%attr(0550,root,root) %{python3_sitelib}/sentryCollector/__pycache__/collect_plugin* %files -n hbm_online_repair %attr(0550,root,root) %{_bindir}/hbm_online_repair @@ -400,409 +204,8 @@ rm -rf %{buildroot} %attr(0550,root,root) %{python3_sitelib}/syssentry/bmc_alarm.py %changelog -* Sat Dec 28 2024 shixuantong - 1.0.2-67 +* Mon Jan 20 2025 zhuofeng - 1.0.3-1 - Type:bugfix - CVE:NA - SUG:NA -- DESC:fix test_ai_block_io fail - -* Wed Dec 18 2024 luckky - 1.0.2-66 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC: add boundary check for settings - -* Wed Dec 18 2024 shixuantong - 1.0.2-65 -- Type:enhancement -- CVE:NA -- SUG:NA -- DESC:set logrotate - -* Wed Dec 18 2024 jinsaihang - 1.0.2-64 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:uniform plugins log - -* Fri Dec 13 2024 zhuofeng - 1.0.2-63 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC: change status of period task and sort mod file - -* Wed Nov 6 2024 luckky - 1.0.2-62 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC: add boundary check for settings - -* Tue Nov 5 2024 luckky - 1.0.2-61 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:make debug msg clear - -* Tue Nov 5 2024 zhangnan - 1.0.2-60 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:update nvme config - -* Tue Nov 5 2024 gaoruoshu - 1.0.2-59 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:change avg_block_io config - -* Mon Nov 4 2024 luckky - 1.0.2-58 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix write file return code bug - -* Fri Nov 1 2024 luckky - 1.0.2-57 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix uint8 bug and change page isolation threshold default value - -* Fri Nov 1 2024 jinsaihang - 1.0.2-56 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:excessive CPU usage - -* Thu Oct 31 2024 zhangnan - 1.0.2-55 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:modify logrotate rule - -* Wed Oct 30 2024 jinsaihang - 1.0.2-54 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:get_alarm -d abnormal display - -* Wed Oct 30 2024 luckky - 1.0.2-53 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix hbm online repair notice and efi create - -* Sat Oct 26 2024 luckky - 1.0.2-52 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:add hbm_online_repair - -* Sat Oct 26 2024 jinsaihang - 1.0.2-51 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:fix newline break error - -* Sat Oct 26 2024 zhangnan - 1.0.2-50 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:remove extra dependency - -* Wed Oct 23 2024 jinsaihang - 1.0.2-49 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:fix get_alarm error - -* Tue Oct 22 2024 heyouzhi - 1.0.2-48 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:ai_block_io support iodump - -* Tue Oct 22 2024 heyouzhi - 1.0.2-47 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:fix frequency param check bug - -* Mon Oct 21 2024 zhuofeng - 1.0.2-46 -- Type:bugfix -- CVE:NA -- SUG:NA -- DES:update collect plugin period max - -* Mon Oct 21 2024 caixiaomeng - 1.0.2-45 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:ai_block_io lack section exit - -* Mon Oct 21 2024 heyouzhi - 1.0.2-44 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:ai_block_io lack section exit - -* Wed Oct 16 2024 heyouzhi - 1.0.2-43 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:enrich alert info about kernel stack - -* Wed Oct 16 2024 jinsaihang - 1.0.2-42 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:optimize log printing - -* Wed Oct 16 2024 zhuofeng - 1.0.2-41 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:listen thread of collect module exits occasionally - -* Wed Oct 16 2024 heyouzhi - 1.0.2-40 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix ai_block_io root cause bug - -* Tue Oct 15 2024 gaoruoshu - 1.0.2-39 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:refactor config.py and bugfix uncorrect slow io report - -* Mon Oct 14 2024 heyouzhi - 1.0.2-38 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:ai_block_io fix some bugs - -* Sat Oct 12 2024 zhuofeng - 1.0.2-37 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add pysentry_collect package and update collect log - modify abnormal stack when the disk field is not configured - -* Sat Oct 12 2024 heyouzhi - 1.0.2-36 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:add root cause analysis - -* Sat Oct 12 2024 zhuofeng - 1.0.2-35 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix io_dump for collect module - -* Fri Oct 11 2024 heyouzhi - 1.0.2-34 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:ai_block_io support stage and iotype - -* Fri Oct 11 2024 caixiaomeng - 1.0.2-33 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix xalarm upgrade not return val, not refuse to send msg when length exceeds 8192,cleanup invalid socket peroidlly - -* Fri Oct 11 2024 jinsaihang - 1.0.2-32 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add parameter validation - -* Fri Oct 11 2024 gaoruoshu - 1.0.2-31 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:avg_block_io adapt different type of disk, use different config - -* Thu Oct 10 2024 zhuofeng - 1.0.2-30 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add get_disk_type and fix some bugs - add log for improving maintainability - -* Thu Oct 10 2024 heyouzhi - 1.0.2-29 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:ai_block_io adapt alarm module - -* Thu Oct 10 2024 caixiaomeng - 1.0.2-28 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:xalarm add alarm msg length to 8192 - -* Thu Oct 10 2024 jinsaihang - 1.0.2-27 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add dependency for sysSentry and avg_block_io - -* Thu Oct 10 2024 jinsaihang - 1.0.2-26 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix get_alarm length and timestamp - -* Wed Oct 9 2024 zhuofeng - 1.0.2-25 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:update log when it is not lock collect - -* Wed Oct 9 2024 heyouzhi - 1.0.2-24 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix ai_block_io config relative some issues - -* Wed Oct 9 2024 zhuofeng - 1.0.2-23 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:avg_block_io send alarm to xalarmd - -* Wed Oct 9 2024 caixiaomeng - 1.0.2-22 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix python 3.7 not support list bool type - -* Tue Oct 8 2024 jinsaihang - 1.0.2-21 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add alarm event query function - -* Tue Oct 8 2024 caixiaomeng - 1.0.2-20 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add pyxalarm and pySentryNotify, add multi users support for xalarmd - -* Mon Sep 30 2024 heyouzhi - 1.0.2-19 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix ai_block_io some issues - -* Fri Sep 27 2024 zhuofeng - 1.0.2-18 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add log level and change log format - -* Wed Sep 25 2024 zhuofeng - 1.0.2-17 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix bug step 2 about collect module and avg block io - -* Mon Sep 23 2024 shixuantong - 1.0.2-16 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:optimize the handing of cat-cli error msg in cpu_sentry - over threshold should be warn level log in cat-cli - -* Mon Sep 23 2024 heyouzhi - 1.0.2-15 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:add ai threshold slow io detection plugin - -* Fri Sep 20 2024 zhuofeng - 1.0.2-14 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:fix some about collect module and avg block io - -* Sat Sep 14 2024 zhuofeng - 1.0.2-13 -- Type:requirement -- CVE:NA -- SUG:NA -- DESC:add collect module and avg_block_io plugin to sysSentry - -* Sat Sep 14 2024 zhuofeng - 1.0.2-12 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix syssentry fails to be started when cpu_sentry is not installed - -* Wed Sep 11 2024 shixuantong - 1.0.2-11 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix configparser.InterpolationSyntaxError - -* Mon Sep 09 2024 caixiaomeng - 1.0.2-10 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:split cpu_sentry and syssentry - -* Mon Sep 02 2024 shixuantong - 1.0.2-9 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:Remove ANSI escape sequences - -* Sat Aug 31 2024 shixuantong - 1.0.2-8 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add ipmitool to Recommends for cpu_sentry - -* Sat Aug 31 2024 zhuofeng - 1.0.2-7 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:add deleted code to plugin rasdaemon - -* Fri Aug 30 2024 shixuantong - 1.0.2-6 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:setting parameters must be integer - -* Wed Aug 28 2024 shixuantong - 1.0.2-5 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:cpu_utility and cpu_patrol must be an integer - -* Fri Jul 26 2024 shixuantong - 1.0.2-4 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:fix result when process output is None - -* Thu Jul 25 2024 shixuantong - 1.0.2-3 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:Fix the problem that function cpu_report_result() is called more than once - fix error handling - -* Tue Jun 18 2024 shixuantong - 1.0.2-2 -- Type:bugfix -- CVE:NA -- SUG:NA -- DESC:delete rpath setting - -* Tue Jun 11 2024 shixuantong - 1.0.2-1 -- Type:enhancement -- CVE:NA -- SUG:NA -- DESC:Package init - +- DESC:1.0.3 init diff --git a/uniform-avg_block_io-log-and-ai_block_io-log.patch b/uniform-avg_block_io-log-and-ai_block_io-log.patch deleted file mode 100644 index d9e91f0..0000000 --- a/uniform-avg_block_io-log-and-ai_block_io-log.patch +++ /dev/null @@ -1,63 +0,0 @@ -From c8f21d1621e96e2c8a239f8028cc9331aa0f8997 Mon Sep 17 00:00:00 2001 -From: jinsaihang -Date: Tue, 17 Dec 2024 11:36:11 +0800 -Subject: [PATCH] uniform avg_block_io log and ai_block_io log - -Signed-off-by: jinsaihang ---- - src/python/sentryPlugins/ai_block_io/ai_block_io.py | 5 +++++ - src/python/sentryPlugins/ai_block_io/detector.py | 8 +++----- - src/python/sentryPlugins/avg_block_io/stage_window.py | 2 +- - 3 files changed, 9 insertions(+), 6 deletions(-) - -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 14f740d..8075f5f 100644 ---- a/src/python/sentryPlugins/ai_block_io/ai_block_io.py -+++ b/src/python/sentryPlugins/ai_block_io/ai_block_io.py -@@ -208,6 +208,11 @@ class SlowIODetection: - tmp_alarm_content = alarm_content.copy() - del tmp_alarm_content["details"] - logging.warning("[SLOW IO] " + str(tmp_alarm_content)) -+ logging.warning(f'[SLOW IO] disk: {str(tmp_alarm_content.get("driver_name"))}, ' -+ f'stage: {str(tmp_alarm_content.get("driver_name"))}, ' -+ f'iotype: {str(tmp_alarm_content.get("io_type"))}, ' -+ f'type: {str(tmp_alarm_content.get("alarm_type"))}, ' -+ f'reason: {str(tmp_alarm_content.get("reason"))}') - logging.warning(f"latency: " + str(alarm_content.get("details").get("latency"))) - logging.warning(f"iodump: " + str(alarm_content.get("details").get("iodump"))) - -diff --git a/src/python/sentryPlugins/ai_block_io/detector.py b/src/python/sentryPlugins/ai_block_io/detector.py -index 496e032..27fb7f7 100644 ---- a/src/python/sentryPlugins/ai_block_io/detector.py -+++ b/src/python/sentryPlugins/ai_block_io/detector.py -@@ -58,11 +58,9 @@ class Detector: - logging.info(f'[abnormal_period]: disk: {self._metric_name.disk_name}, ' - f'stage: {self._metric_name.stage_name}, ' - f'iotype: {self._metric_name.io_access_type_name}, ' -- f'metric: {self._metric_name.metric_name}, ' -- f'current value: {metric_value}, ' -- f'ai threshold: {detection_result[2]}, ' -- f'absolute threshold upper limit: {detection_result[3]}, ' -- f'lower limit: {detection_result[4]}') -+ f'type: {self._metric_name.metric_name}, ' -+ f'ai_threshold: {round(detection_result[2], 3)}, ' -+ f'curr_val: {metric_value}') - else: - logging.debug(f'Detection result: {str(detection_result)}') - logging.debug(f'exit Detector: {self}') -diff --git a/src/python/sentryPlugins/avg_block_io/stage_window.py b/src/python/sentryPlugins/avg_block_io/stage_window.py -index 5113782..587bd49 100644 ---- a/src/python/sentryPlugins/avg_block_io/stage_window.py -+++ b/src/python/sentryPlugins/avg_block_io/stage_window.py -@@ -28,7 +28,7 @@ class AbnormalWindowBase: - self.abnormal_window.append(False) - - def is_abnormal_window(self): -- return sum(self.abnormal_window) > self.window_threshold -+ return sum(self.abnormal_window) >= self.window_threshold - - def window_data_to_string(self): - return ",".join(str(x) for x in self.window_data) --- -2.27.0 - diff --git a/update-collect-log.patch b/update-collect-log.patch deleted file mode 100644 index 2624eb4..0000000 --- a/update-collect-log.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 73f5028fcab08613833c9f2b432f660c70ac264e Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Sat, 12 Oct 2024 16:06:32 +0800 -Subject: [PATCH] update collect log - ---- - src/python/sentryCollector/collect_io.py | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index 2b10cde..f699c3c 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -156,7 +156,7 @@ class CollectIo(): - for line in file: - count += line.count('.op=' + Io_Category[category].upper()) - if count > 0: -- logging.info(f"io_dump info : {disk_name}, {stage}, {category}, {count}") -+ logging.info(f"io_dump info : {disk_name}, {stage}, {Io_Category[category]}, {count}") - except FileNotFoundError: - logging.error("The file %s does not exist.", io_dump_file) - return count --- -2.33.0 - diff --git a/update-collect-plugin-period-max.patch b/update-collect-plugin-period-max.patch deleted file mode 100644 index 42d244d..0000000 --- a/update-collect-plugin-period-max.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 4550d9cbbb7e921db168f748e8b1d5d7cc0f8b15 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Mon, 21 Oct 2024 17:30:39 +0800 -Subject: [PATCH] update collect plugin period max - ---- - src/python/sentryCollector/collect_plugin.py | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryCollector/collect_plugin.py b/src/python/sentryCollector/collect_plugin.py -index 53dddec..9495d8b 100644 ---- a/src/python/sentryCollector/collect_plugin.py -+++ b/src/python/sentryCollector/collect_plugin.py -@@ -45,6 +45,9 @@ LIMIT_IOTYPE_LIST_LEN = 4 - LIMIT_PERIOD_MIN_LEN = 1 - LIMIT_PERIOD_MAX_LEN = 300 - -+# max_save -+LIMIT_MAX_SAVE_LEN = 300 -+ - # interface protocol - class ClientProtocol(): - IS_IOCOLLECT_VALID = 0 -@@ -189,7 +192,7 @@ def inter_is_iocollect_valid(period, disk_list=None, stage=None): - 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: -+ if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN * LIMIT_MAX_SAVE_LEN: - result['ret'] = ResultMessage.RESULT_INVALID_LENGTH - return result - -@@ -246,7 +249,7 @@ def inter_get_io_data(period, disk_list, stage, iotype): - 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: -+ if period < LIMIT_PERIOD_MIN_LEN or period > LIMIT_PERIOD_MAX_LEN * LIMIT_MAX_SAVE_LEN: - result['ret'] = ResultMessage.RESULT_INVALID_LENGTH - return result - --- -2.33.0 - diff --git a/update-log-when-it-is-not-lock-collect.patch b/update-log-when-it-is-not-lock-collect.patch deleted file mode 100644 index 634a2b9..0000000 --- a/update-log-when-it-is-not-lock-collect.patch +++ /dev/null @@ -1,35 +0,0 @@ -From ac73565fdb0e4bc544e5308ea0251dd6be410ed9 Mon Sep 17 00:00:00 2001 -From: zhuofeng -Date: Wed, 9 Oct 2024 16:37:24 +0800 -Subject: [PATCH] update log when it is not lock collect - ---- - src/python/sentryCollector/collect_io.py | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/python/sentryCollector/collect_io.py b/src/python/sentryCollector/collect_io.py -index e45947a..2e75187 100644 ---- a/src/python/sentryCollector/collect_io.py -+++ b/src/python/sentryCollector/collect_io.py -@@ -179,13 +179,17 @@ class CollectIo(): - blk_io_hierarchy_path = os.path.join(disk_path, 'blk_io_hierarchy') - - if not os.path.exists(blk_io_hierarchy_path): -- logging.error("no blk_io_hierarchy directory found in %s, skipping.", disk_name) -+ logging.warning("no blk_io_hierarchy directory found in %s, skipping.", disk_name) - continue - - for file_name in os.listdir(blk_io_hierarchy_path): - file_path = os.path.join(blk_io_hierarchy_path, file_name) - if file_name == 'stats': - all_disk.append(disk_name) -+ -+ if len(all_disk) == 0: -+ logging.debug("no blk_io_hierarchy disk, it is not lock-free collection") -+ return False - - if self.loop_all: - self.disk_list = all_disk --- -2.33.0 - diff --git a/update-nvme-config.patch b/update-nvme-config.patch deleted file mode 100644 index b97a42c..0000000 --- a/update-nvme-config.patch +++ /dev/null @@ -1,51 +0,0 @@ -From f50b4e1b7f5fa38b1930349b1a9a905eb5307ab7 Mon Sep 17 00:00:00 2001 -From: znzjugod -Date: Tue, 5 Nov 2024 11:47:56 +0800 -Subject: [PATCH] update nvme config - ---- - config/plugins/ai_block_io.ini | 8 ++++---- - src/python/sentryPlugins/ai_block_io/config_parser.py | 8 ++++---- - 2 files changed, 8 insertions(+), 8 deletions(-) - -diff --git a/config/plugins/ai_block_io.ini b/config/plugins/ai_block_io.ini -index d0b1e74..69f44ba 100644 ---- a/config/plugins/ai_block_io.ini -+++ b/config/plugins/ai_block_io.ini -@@ -23,10 +23,10 @@ read_tot_lim=50000 - write_tot_lim=50000 - - [latency_nvme_ssd] --read_avg_lim=300 --write_avg_lim=300 --read_tot_lim=500 --write_tot_lim=500 -+read_avg_lim=10000 -+write_avg_lim=10000 -+read_tot_lim=50000 -+write_tot_lim=50000 - - [latency_sata_hdd] - read_avg_lim=15000 -diff --git a/src/python/sentryPlugins/ai_block_io/config_parser.py b/src/python/sentryPlugins/ai_block_io/config_parser.py -index 3049db2..1bbb609 100644 ---- a/src/python/sentryPlugins/ai_block_io/config_parser.py -+++ b/src/python/sentryPlugins/ai_block_io/config_parser.py -@@ -74,10 +74,10 @@ class ConfigParser: - "write_tot_lim": 50000 - }, - "latency_nvme_ssd": { -- "read_avg_lim": 300, -- "write_avg_lim": 300, -- "read_tot_lim": 500, -- "write_tot_lim": 500 -+ "read_avg_lim": 10000, -+ "write_avg_lim": 10000, -+ "read_tot_lim": 50000, -+ "write_tot_lim": 50000 - }, - "latency_sata_hdd": { - "read_avg_lim": 15000, --- -2.45.2 - diff --git a/xalarm-add-alarm-msg-length-to-8192.patch b/xalarm-add-alarm-msg-length-to-8192.patch deleted file mode 100644 index 998fb4b..0000000 --- a/xalarm-add-alarm-msg-length-to-8192.patch +++ /dev/null @@ -1,112 +0,0 @@ -From c95be14eee48e5afb255700c9d67c1d8ef2532dc Mon Sep 17 00:00:00 2001 -From: PshySimon -Date: Thu, 10 Oct 2024 16:15:52 +0800 -Subject: [PATCH] xalarm add alarm msg length to 8192 - ---- - src/libso/xalarm/register_xalarm.c | 2 +- - src/libso/xalarm/register_xalarm.h | 2 +- - src/python/xalarm/register_xalarm.py | 2 +- - src/python/xalarm/sentry_notify.py | 2 +- - src/python/xalarm/xalarm_api.py | 8 ++++++-- - src/python/xalarm/xalarm_server.py | 2 +- - 6 files changed, 11 insertions(+), 7 deletions(-) - -diff --git a/src/libso/xalarm/register_xalarm.c b/src/libso/xalarm/register_xalarm.c -index 21a419f..5aff2bc 100644 ---- a/src/libso/xalarm/register_xalarm.c -+++ b/src/libso/xalarm/register_xalarm.c -@@ -35,7 +35,7 @@ - #define ALARM_SOCKET_PERMISSION 0700 - #define TIME_UNIT_MILLISECONDS 1000 - --#define MAX_PARAS_LEN 1023 -+#define MAX_PARAS_LEN 8191 - #define MIN_ALARM_ID 1001 - #define MAX_ALARM_ID (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) - -diff --git a/src/libso/xalarm/register_xalarm.h b/src/libso/xalarm/register_xalarm.h -index fef9482..dcf4f03 100644 ---- a/src/libso/xalarm/register_xalarm.h -+++ b/src/libso/xalarm/register_xalarm.h -@@ -11,7 +11,7 @@ - #include - #include - --#define ALARM_INFO_MAX_PARAS_LEN 1024 -+#define ALARM_INFO_MAX_PARAS_LEN 8192 - #define MAX_STRERROR_SIZE 1024 - #define MAX_ALARM_TYEPS 1024 - #define MIN_ALARM_ID 1001 -diff --git a/src/python/xalarm/register_xalarm.py b/src/python/xalarm/register_xalarm.py -index 6756b1b..edd9994 100644 ---- a/src/python/xalarm/register_xalarm.py -+++ b/src/python/xalarm/register_xalarm.py -@@ -11,7 +11,7 @@ from struct import error as StructParseError - from .xalarm_api import Xalarm, alarm_bin2stu - - --ALARM_REPORT_LEN = 1048 -+ALARM_REPORT_LEN = 8216 - MAX_NUM_OF_ALARM_ID=128 - MIN_ALARM_ID = 1001 - MAX_ALARM_ID = (MIN_ALARM_ID + MAX_NUM_OF_ALARM_ID - 1) -diff --git a/src/python/xalarm/sentry_notify.py b/src/python/xalarm/sentry_notify.py -index a19e5b3..c763a24 100644 ---- a/src/python/xalarm/sentry_notify.py -+++ b/src/python/xalarm/sentry_notify.py -@@ -17,7 +17,7 @@ CRITICAL_ALM = 3 - ALARM_TYPE_OCCUR = 1 - ALARM_TYPE_RECOVER = 2 - --MAX_PUC_PARAS_LEN = 1024 -+MAX_PUC_PARAS_LEN = 8192 - - DIR_XALARM = "/var/run/xalarm" - PATH_REPORT_ALARM = "/var/run/xalarm/report" -diff --git a/src/python/xalarm/xalarm_api.py b/src/python/xalarm/xalarm_api.py -index 99eabf5..863bd02 100644 ---- a/src/python/xalarm/xalarm_api.py -+++ b/src/python/xalarm/xalarm_api.py -@@ -23,7 +23,7 @@ ALARM_LEVELS = (1, 2, 3, 4, 5) - ALARM_SOCK_PATH = "/var/run/xalarm/report" - MIN_ALARM_ID = 1001 - MAX_ALARM_ID = 1128 --MAX_MSG_LEN = 1024 -+MAX_MSG_LEN = 8192 - - - @dataclasses.dataclass -@@ -120,6 +120,10 @@ def alarm_bin2stu(bin_data): - - - def alarm_stu2bin(alarm_info: Xalarm): -+ alarm_msg = alarm_info.msg1 -+ padding_length = MAX_MSG_LEN - len(alarm_msg) -+ if padding_length > 0: -+ alarm_msg = alarm_msg + ('\x00' * padding_length) - return struct.pack( - f'@HBBll{MAX_MSG_LEN}s', - alarm_info.alarm_id, -@@ -127,4 +131,4 @@ def alarm_stu2bin(alarm_info: Xalarm): - alarm_info.alarm_type, - alarm_info.timetamp.tv_sec, - alarm_info.timetamp.tv_usec, -- alarm_info.msg1.encode('utf-8')) -+ alarm_msg.encode('utf-8')) -diff --git a/src/python/xalarm/xalarm_server.py b/src/python/xalarm/xalarm_server.py -index fcaf393..2882609 100644 ---- a/src/python/xalarm/xalarm_server.py -+++ b/src/python/xalarm/xalarm_server.py -@@ -28,7 +28,7 @@ from .xalarm_transfer import check_filter, transmit_alarm, wait_for_connection - ALARM_DIR = "/var/run/xalarm" - USER_RECV_SOCK = "/var/run/xalarm/alarm" - SOCK_FILE = "/var/run/xalarm/report" --ALARM_REPORT_LEN = 1048 -+ALARM_REPORT_LEN = 8216 - ALARM_DIR_PERMISSION = 0o750 - ALARM_LISTEN_QUEUE_LEN = 5 - --- -2.27.0 -