From 7fe5a83db4a55d12fe67593458943619765c058f Mon Sep 17 00:00:00 2001 From: Shuyi Cheng Date: Tue, 30 Jan 2024 10:14:58 +0800 Subject: [PATCH] feat(diagnosis): add virtnet hang diagnosing script Signed-off-by: Shuyi Cheng --- .../service_scripts/virtnet_hang_post.py | 60 +++++++++++++++++++ .../service_scripts/virtnet_hang_pre.py | 24 ++++++++ 2 files changed, 84 insertions(+) create mode 100644 sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_post.py create mode 100644 sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_pre.py diff --git a/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_post.py b/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_post.py new file mode 100644 index 00000000..6fdc77a5 --- /dev/null +++ b/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_post.py @@ -0,0 +1,60 @@ +""" +Time 2024/01/29 17:32 +Author: chengshuyi +Email chengshuyi@linux.alibaba.com +File virtnet_hang_post.py +Description: +""" +import os +import re +import zipfile +from typing import List +import json + +from .base import DiagnosisJobResult, DiagnosisPostProcessor, PostProcessResult + + +def data2json(data): + try: + # 尝试将数据转换为JSON + js = json.loads(data) + return True, js + except (TypeError, OverflowError) as e: + # 如果转换失败,表明数据不满足JSON格式要求 + return False, {} + +class PostProcessor(DiagnosisPostProcessor): + def parse_diagnosis_result(self, results: List[DiagnosisJobResult]) -> PostProcessResult: + + ok, vjson = data2json(results[0].stdout) + + postprocess_result = PostProcessResult( + code=0, + err_msg="", + result={}, + ) + + if not ok: + postprocess_result.code = 1 + postprocess_result.err_msg = "暂时不支持当前内核版本" + return postprocess_result + + + summary_status = "normal" + summary_cause = "" + summary_suggestion = "" + + for iface in vjson["result"]: + if len(iface["errors"]) != 0: + summary_cause += "网卡" + iface["iface"] + "队列hang住了;" + + if len(summary_cause) != 0: + summary_status = "error" + + vjson["summary"] = { + "status" : summary_status, + "cause": summary_cause, + "suggestion": summary_suggestion, + } + postprocess_result.result = vjson + return postprocess_result \ No newline at end of file diff --git a/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_pre.py b/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_pre.py new file mode 100644 index 00000000..049142fa --- /dev/null +++ b/sysom_server/sysom_diagnosis/service_scripts/virtnet_hang_pre.py @@ -0,0 +1,24 @@ +""" +Time 2024/01/29 17:32 +Author: chengshuyi +Email chengshuyi@linux.alibaba.com +File virtnet_hang_pre.py +Description: +""" +from .base import DiagnosisJob, DiagnosisPreProcessor, DiagnosisTask + + +class PreProcessor(DiagnosisPreProcessor): + """virtio_net hang diagnosis + """ + + def get_diagnosis_cmds(self, params: dict) -> DiagnosisTask: + instance = params.get("instance", "") + command = "mkdir -p /var/log/sysak && sysak -g rtrace --virtio --period 1s -c 2 -i any --json > /var/log/sysak/rtrace_virtio_net.json && cat /var/log/sysak/rtrace_virtio_net.json" + print (command) + return DiagnosisTask( + jobs=[ + DiagnosisJob(instance=instance, cmd=command) + ], + in_order=False, + ) -- Gitee