# root-cause-analysis **Repository Path**: rvsmart-porting/root-cause-analysis ## Basic Information - **Project Name**: root-cause-analysis - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-11-07 - **Last Updated**: 2025-07-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux发行版软件包迁移构建问题根因分析助手 ## 一 介绍 ​ 为了提高RISC-V 软件包迁移过程的效率,本系统基于LLM模型技术实现了针对RISC-V软件包构建过程的智能日志解析和错误根因分析功能。系统通过浏览器插件的形式进行交互,让用户能够在[EulerMaker平台](https://eulermaker.compass-ci.openeuler.openatom.cn/)或者在[OpenBuildService平台](https://build.tarsier-infra.isrc.ac.cn/)上方便快捷地完成相关操作,极大程度地简化开发者的操作步骤,提高开发效率。 ## 二 软件架构 ​ 本系统的整体技术架构如下图所示,其中主要包括与外界交互的Interface层、执行具体任务的根因分析Agent层、为Agent提供可用工具的Tool Kits层以及存储相关知识库的Database层。其中,最主要的agent层又分为三个模块,分别负责对错误日志进行解析、错误根因分析以及智能修复方案推荐。 ![image-20241108172408762](./doc/imgs/structure.png) ## 三 安装教程 ### Step 1 插件安装 >本插件依赖于 [Tampermonkey](https://www.tampermonkey.net/) 扩展,需要现在的浏览器中安装Tampermonkey扩展插件: #### Chrome 浏览器 1. 打开 [Chrome 网上应用店 Tampermonkey 扩展页面](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo)。 2. 点击“添加至 Chrome”,并确认安装。 #### Firefox 浏览器 1. 打开 [Mozilla 插件站点上的 Tampermonkey 页面](https://addons.mozilla.org/firefox/addon/tampermonkey/)。 2. 点击“添加到 Firefox”,并确认安装。 #### Safari 浏览器 1. 打开 [Tampermonkey 官网的 Safari 版本下载页面](https://www.tampermonkey.net/)。 2. 点击“Download”以下载 Safari 兼容的版本。 #### Microsoft Edge 浏览器 1. 打开 [Microsoft Edge 插件站点的 Tampermonkey 页面](https://microsoftedge.microsoft.com/addons/detail/%E7%AF%A1%E6%94%B9%E7%8C%B4/iikmkjmpaadaobahmlepeloendndfphd)。 2. 点击“获取”,并按照提示安装。 ### step 2 脚本导入 >在安装完插件后,点击 Tampermonkey 扩展图标,进入脚本管理页面,点击右上角的“新建脚本”,粘贴如下脚本代码,并保存。 ```js // ==UserScript== // @name Build Log Analysis // @namespace https://github.com/LightningRS // @version 2024-05-23 // @description Build Log Analysis // @author LightningRS // @match https://eulermaker.compass-ci.openeuler.openatom.cn/* // @match https://build.tarsier-infra.isrc.ac.cn/package/live_build_log/* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAMAAAAPkIrYAAAAjVBMVEUAAAAAd/8Ad/8Ad/8Abv8Ad/8Ad/8Ad/8AeP8Ad/8Aef8Ad/8AeP8AeP8Ad/8Adv8Aev8Ad/8Ad/8Ad/8Ad/8Aef8Ad/8Ad/8Adf8Ad/8Ad/8AeP8AeP8Ad/8Adv8AeP8AeP8Ad/8Adf8AeP8Ad/8Ad/8Ad/8Adv8Ad/8Ad/8AeP8Ad/8Adv8AeP8Ad//W4J9IAAAALnRSTlMA+/P3BObg7oBeCBCikW8xDNRN6sIbxxcTzL2zJtiZdmY/IDjQqzyIU0gqt0OxfSFq+QAAAsRJREFUWMPVWGtDgkAQDHlzWig+0BQfaWUP/v/PqzDYa3A5FvzSflNw8OZmdoe7+8+1CBa3ggr9fLB1boH0MM9/6vjUGykKrPxSVhb3g5p4OZUb9uF8mP+t1bor1G6QY9lB1InzZYXgbWmpm72c8xcr10iPArtCOy26cU5iWK+qb/x7AdLsVP5MF2mYVN8uH1oiOffE+eNMu6BGtO5RLOTcfYVrz2OB2ODZzf/5YODcBU4auQwaDH941/bKabHH42cB56zfyxqmcBF59c5/L+1XE+xDtICdhPM0I6L1/ljW9A2wVuylMEGisYd4gDWv+wOtg511X5LiAtaSfFtjmSPa2doNWGdm9zmxr4udTwDrWNwbcV2VY9MveAGsy9qd62p7fzoxnTUxYZGCaGH7DXVWjQm32GLAutyKaqNRVnZWcgVh2dewrN8Pr+BwkgeKXV1zradjTbGrls/QOiuIrYZlExasRdBZgcQpOJzpumF7rOpPgdhJK59geBQKYZFhhJ3VZ7HkndXXrT3Z/VRDcoh1/Sm8OhCMZPBFgntgC0YyjnHUfVY9xnppmf/SDLCgSxblTRoDnvquWP+N3XUkq+KG+W/fBW8LR3JKWGA9Xjibjx5YKJw8S6/ObCMWCgfFhjs0BSxeODApYJqYsPAnJLZI22ifJiVg1T3k0lIwG2IeMWPxYlMjyElGLMh1JDYtLx6py7TCwmmUQEYXY93F9O7BmEslLBYNHuCb9gGTMoOFkRfzH06xdcloDYsSG4qNdIvhi8HSh6hC32DEhazyYRii8BcgEaoMncH3QnwXjo2OxZoNG5/G5x1jLzxzLx02mqleXGIzc25YAYkNBCI8EQjZxBb6wpMKTKtMHObL+C6ML3qCArHhIYOwZjrNhyFM4V5nTBQre559yTnnxXaj07QwkXJuFlvn00cUG5mzdznb8bnNfV8FjRIV0fmr1gAAAABJRU5ErkJggg== // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @grant GM_addStyle // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js // @require https://cdn.bootcdn.net/ajax/libs/jquery-toast-plugin/1.3.2/jquery.toast.min.js // @require https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.min.js // @resource TOAST_CSS https://cdn.bootcdn.net/ajax/libs/jquery-toast-plugin/1.3.2/jquery.toast.min.css // @resource WEUI_CSS https://cdn.bootcdn.net/ajax/libs/weui/2.6.12/style/weui.min.css // ==/UserScript== /** * 主要功能 * 1. 工程列表页面点击工程后,在新页面打开 * 2. 构建结果页面中点击结果状态后,如果没有日志文件则不再跳转,否则在新页面打开 */ /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; const toastCss = GM_getResourceText("TOAST_CSS"); GM_addStyle(toastCss); // const uiCss = GM_getResourceText("WEUI_CSS"); // GM_addStyle(uiCss); GM_addStyle(` .custom-modal-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 999; } .custom-modal { display: none; position: fixed; z-index: 1000; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 85%; height: 85%; background-color: white; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0,0,0,0.5); } .custom-modal iframe { width: 100%; height: 100%; border: none; } .custom-modal-close { position: absolute; top: 10px; right: 10px; cursor: pointer; font-size: 20px; font-weight: bold; color: #aaa; } .custom-modal-close:hover { color: #000; } `); $.urlParam = function(name){ var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); if (results == null) { return null; } return decodeURI(results[1]) || 0; }; const init = function() { const modalHtml = `
×
`; const $modal = $(modalHtml); $modal.find('#customModalClose').on('click', closeModal); $('body').append($modal); }; const openModal = function() { $('#customModalOverlay').fadeIn(); $('#customModal').fadeIn(); } const closeModal = function() { $('#customModal').fadeOut(); $('#customModalOverlay').fadeOut(); } const postLogContent = function(logFileUrl, content) { const iframeWindow = $('#analyzeIframe').get(0).contentWindow; console.log("当前iframe", iframeWindow) iframeWindow.postMessage(JSON.stringify({ url: logFileUrl, content: content, }), "*"); openModal(); }; const getAndPostLogContent = function(logFileUrl) { $.toast({ heading: '提示', text: '正在获取日志', position: 'top-right', stack: false, hideAfter: false, icon: 'info', }); $.ajax({ url: logFileUrl, method: 'get', type: 'text', success: function(resData) { console.info("日志获取成功"); $.toast({ heading: '提示', text: '日志获取成功', position: 'top-right', stack: false, icon: 'success', }); postLogContent(logFileUrl, resData); }, error: function(reqObj, err, errThrown) { console.error("日志获取失败", err, errThrown); $.toast({ heading: '错误', text: '获取日志失败', position: 'top-right', stack: false, icon: 'error', }); } }); }; const OBS_Analyze = function() { const queryUrl = $('.btn-secondary').get(0).href; console.info("日志链接", queryUrl); getAndPostLogContent(queryUrl); }; const OBS_Init = function() { if (window.location.href.indexOf('tarsier-infra') < 0) { return; } console.log("注册OBS"); const dlButtons = $('.btn-secondary'); dlButtons.each(function(i, elem) { const parent = elem.parentNode; const analyzeBtnHTML = ' Analyze Log'; const $analyzeBtn = $(analyzeBtnHTML); $analyzeBtn.on('click', function() { OBS_Analyze(); }); $(parent).append($analyzeBtn); }); }; const EBS_Analyze = function() { const jobId = $.urlParam('jobId'); const queryData = {"index":"jobs","query":{"size":1,"_source":["os_arch","job_stage","result_root","job_health","job_state"],"query":{"match":{"id":jobId}}}}; $.ajax({ url: "https://eulermaker.compass-ci.openeuler.openatom.cn/api/data-api/search", method: 'post', dataType: 'json', data: JSON.stringify(queryData), success: function(resData) { if (resData.hits.hits.length > 0) { const searchHit = resData.hits.hits[0]; const source = searchHit._source; if (source) { const resultRoot = source.result_root; const queryUrl = "https://eulermaker.compass-ci.openeuler.openatom.cn/api" + resultRoot + "/dmesg?t=" + Date.now(); console.info("日志链接", queryUrl); getAndPostLogContent(queryUrl); return; } } $.toast({ heading: '错误', text: '调用获取日志接口异常', position: 'top-right', stack: false, icon: 'error', }); }, error: function(reqObj, err, errThrown) { console.error("data-api/search 接口出错", err, errThrown); $.toast({ heading: '错误', text: '调用search接口异常', position: 'top-right', stack: false, icon: 'error', }); } }); // postLogContent(null, $('.log-v-list').text()); } let EBS_Initialized = false; const EBS_Init = function() { if (window.location.href.indexOf('eulermaker') < 0) { return; } console.log("注册EBS"); const timer = window.setInterval(function() { if (window.location.href.indexOf("package/build-record") === -1) { console.log("动态路由跳转,解除 EBS_Initialized"); EBS_Initialized = false; } if (EBS_Initialized) return; // 循环检测是否有 构建失败 const $buildInfoValue = $('.build-info-item-last .build-info-value'); if (['构建失败', '内存溢出'].indexOf($buildInfoValue.html()) === -1) return; if ($buildInfoValue.html() !== '构建失败') return; console.log("捕获构建失败"); // 检测日志是否有效 const $logDownloadBtn = $('.build-info button'); const isDisabled = $logDownloadBtn.prop('disabled'); if (isDisabled) { console.error("日志下载按钮被禁用,无法获取日志"); $.toast({ heading: '错误', text: '无法获取日志', position: 'top-right', stack: false, icon: 'error', }); EBS_Initialized = true; // return; } // 检测日志内容是否有效 const logBody = $('.log-v-list').text(); if (logBody.indexOf("Request failed") >= 0) { console.error("日志文件异常", logBody); $.toast({ heading: '错误', text: '无法获取日志:请求异常', position: 'top-right', stack: false, icon: 'error', }); EBS_Initialized = true; return; } // 注册按钮 const analyzeBtnHTML = ''; const $analyzeBtn = $(analyzeBtnHTML); $analyzeBtn.on('click', function() { EBS_Analyze(); }); $('.build-info').append($analyzeBtn); EBS_Initialized = true; }, 500); }; window.addEventListener('load', function() { init(); OBS_Init(); EBS_Init(); }, false); })(); ``` ## 四 使用说明 #### Step 1 打开日志页面 > 在安装并导入上述脚本后,打开您在[EulerMaker平台](https://eulermaker.compass-ci.openeuler.openatom.cn/)或者在[OpenBuildService平台](https://build.tarsier-infra.isrc.ac.cn/) 的构建任务日志页面,会在页面中显示一个按钮,点击按钮,即可分析构建日志,具体如下所示: * EulerMaker平台 ![这是一张示例图片](./doc/imgs/EulerMakerLog.png) * OpenBuildService平台 ![这是一张示例图片](./doc/imgs/OBSLog.png) ***\* 以下以OpenBuildService平台为例,其他平台类似*** #### Step 2 登录账号 > 点击按钮后,会弹出一个日志分析页面,如下图所示:(用户在初次使用时需要优先登录账号,才可以使用分析功能) > > 测试账号密码如下(该账号后续可能会禁用,重要数据建议本地备份): > > 账号:devtest > > 密码:Lsdv8i_2024! ![这是一张示例图片](./doc/imgs/LogLogin.png) #### Step 3 导入或上传日志 > 用户登录账号后,即可开始使用分析功能,脚本会自动将当前的日志访问路径传递至分析工具中,当然,用户也可以手动输入日志路径。 > 同时,用户也可以上传本地构建日志文件,脚本会自动将上传的文件分析,或者手动输入构建日志。 * 通过日志链接构建 ![这是一张示例图片](./doc/imgs/Url.png) * 通过本地文件构建 ![这是一张示例图片](./doc/imgs/File.png) * 手动输入构建日志 ![这是一张示例图片](./doc/imgs/LogCtx.png) #### Step 4 上传Spec文件 (可选) > 在上传完功日志后,用户可以选择上传构建的Spec文件,来帮助工具更好的分析构建日志,这选项是可选的,用户也可以不选择上传。 * 上传Spec文件 ![这是一张示例图片](./doc/imgs/Spec.png) #### Step 5 输入相关提示信息 (可选) > 用户可以选择添加或者删除啊相关提示信息,来帮助工具更好的分析构建日志,这选项是可选的,用户也可以不选择输入。 > > 这部分提示信息主要用于让用户给出关键性的修复建议,尽量简介明了地指出错误的可能原因、修复方案的经验,例如: > > 1. 请尽量从Spec文件中的依赖版本信息去考虑; > > 2. 该错误可能是在测试阶段出现的,重点从该方面进行考虑。 * 输入提示词 ![这是一张示例图片](./doc/imgs/Promote.png) #### Step 6 进行结果分析 > 在点击`进行结果分析`按钮前,用户需要输入当前的任务名称,在当前页面中,工具自动从构建日志URL中提取出当前任务的名称,用户也可以手动输入。 > 点击提交按钮,即可开始分析,分析完成后,脚本会自动将分析结果返回,并显示在页面中。 ![img.png](doc/imgs/Button.png) #### Step 7 结果查看 > 在分析完成后,脚本会自动将分析结果返回,并显示在页面中,用户可以查看分析结果, > 左侧为任务列表会显示与当前任务相关的前20个任务信息,用户可以点击按钮查看任务或者删除任务。 * 左侧任务列表 ![img.png](doc/imgs/TaskList.png) * 右侧任务列表 (用户点击当前任务详情后,会将该任务的构建信息与目前的构建结果返回给用户,用户可以查看构建日志与对应的任务结果) * 用户输入信息 ![img_2.png](doc/imgs/Result.png) * 当前任务对应日志文件 ![CurrentLog.png](doc/imgs/CurrentLog.png) * 当前任务结果 ![Result2.png](doc/imgs/Result2.png) ## 五 工作机制简介 > https://git.rvpt.top:8443/rvpt/rv_chain