# 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层又分为三个模块,分别负责对错误日志进行解析、错误根因分析以及智能修复方案推荐。

## 三 安装教程
### 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平台

* OpenBuildService平台

***\* 以下以OpenBuildService平台为例,其他平台类似***
#### Step 2 登录账号
> 点击按钮后,会弹出一个日志分析页面,如下图所示:(用户在初次使用时需要优先登录账号,才可以使用分析功能)
>
> 测试账号密码如下(该账号后续可能会禁用,重要数据建议本地备份):
>
> 账号:devtest
>
> 密码:Lsdv8i_2024!

#### Step 3 导入或上传日志
> 用户登录账号后,即可开始使用分析功能,脚本会自动将当前的日志访问路径传递至分析工具中,当然,用户也可以手动输入日志路径。
> 同时,用户也可以上传本地构建日志文件,脚本会自动将上传的文件分析,或者手动输入构建日志。
* 通过日志链接构建

* 通过本地文件构建

* 手动输入构建日志

#### Step 4 上传Spec文件 (可选)
> 在上传完功日志后,用户可以选择上传构建的Spec文件,来帮助工具更好的分析构建日志,这选项是可选的,用户也可以不选择上传。
* 上传Spec文件

#### Step 5 输入相关提示信息 (可选)
> 用户可以选择添加或者删除啊相关提示信息,来帮助工具更好的分析构建日志,这选项是可选的,用户也可以不选择输入。
>
> 这部分提示信息主要用于让用户给出关键性的修复建议,尽量简介明了地指出错误的可能原因、修复方案的经验,例如:
>
> 1. 请尽量从Spec文件中的依赖版本信息去考虑;
>
> 2. 该错误可能是在测试阶段出现的,重点从该方面进行考虑。
* 输入提示词

#### Step 6 进行结果分析
> 在点击`进行结果分析`按钮前,用户需要输入当前的任务名称,在当前页面中,工具自动从构建日志URL中提取出当前任务的名称,用户也可以手动输入。
> 点击提交按钮,即可开始分析,分析完成后,脚本会自动将分析结果返回,并显示在页面中。

#### Step 7 结果查看
> 在分析完成后,脚本会自动将分析结果返回,并显示在页面中,用户可以查看分析结果,
> 左侧为任务列表会显示与当前任务相关的前20个任务信息,用户可以点击按钮查看任务或者删除任务。
* 左侧任务列表

* 右侧任务列表
(用户点击当前任务详情后,会将该任务的构建信息与目前的构建结果返回给用户,用户可以查看构建日志与对应的任务结果)
* 用户输入信息

* 当前任务对应日志文件

* 当前任务结果

## 五 工作机制简介
> https://git.rvpt.top:8443/rvpt/rv_chain