This is an automated email from the ASF dual-hosted git repository.
zhangxiaowei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozhera.git
The following commit(s) were added to refs/heads/master by this push:
new afa6a7cf refactor: add log query tool (#617)
afa6a7cf is described below
commit afa6a7cf1016e064f961eab4307b4b3d7dfb61a7
Author: EricDing <[email protected]>
AuthorDate: Wed Nov 26 15:52:59 2025 +0800
refactor: add log query tool (#617)
* refactor: refactor ozhera intelligence
* feat: add coder tool and git mcp
* fix: update codefix agent and tool
* fix: add git suffix
* refactor: add log query tool
* fix: add endTime and update desc
---
.../domain/rootanalysis/CodeFixInfo.java | 5 ++
.../bootstrap/IntelligenceBootStrap.java | 2 +-
.../intelligence/filter/TokenValidationFilter.java | 53 ----------------------
.../src/main/resources/application.properties | 11 +++++
.../resources/config/opensource-outer.properties | 8 ++++
.../ozhera-intelligence-service/pom.xml | 11 +++++
.../intelligence/agents/config/AgentConfig.java | 29 +++++++-----
...CodeFixTool.java => RootExceptionSpanTool.java} | 21 +++++----
8 files changed, 66 insertions(+), 74 deletions(-)
diff --git
a/ozhera-intelligence/ozhera-intelligence-domain/src/main/java/org/apache/ozhera/intelligence/domain/rootanalysis/CodeFixInfo.java
b/ozhera-intelligence/ozhera-intelligence-domain/src/main/java/org/apache/ozhera/intelligence/domain/rootanalysis/CodeFixInfo.java
index 5ba95e3e..64a6d21f 100644
---
a/ozhera-intelligence/ozhera-intelligence-domain/src/main/java/org/apache/ozhera/intelligence/domain/rootanalysis/CodeFixInfo.java
+++
b/ozhera-intelligence/ozhera-intelligence-domain/src/main/java/org/apache/ozhera/intelligence/domain/rootanalysis/CodeFixInfo.java
@@ -45,4 +45,9 @@ public class CodeFixInfo {
* Exception stack trace extracted from span logs
*/
private String stacktrace;
+
+ /**
+ * End time of the span in milliseconds (calculated from startTime +
duration)
+ */
+ private Long endTime;
}
diff --git
a/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/bootstrap/IntelligenceBootStrap.java
b/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/bootstrap/IntelligenceBootStrap.java
index a9e4dfcd..26c35da8 100644
---
a/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/bootstrap/IntelligenceBootStrap.java
+++
b/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/bootstrap/IntelligenceBootStrap.java
@@ -24,7 +24,7 @@ import
org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration
-@ComponentScan(basePackages = {"org.apache.ozhera.intelligence",
"run.mone.mcp.git"})
+@ComponentScan(basePackages = {"org.apache.ozhera.intelligence",
"run.mone.mcp.git", "run.mone.mcp.hera.analysis.tool",
"run.mone.mcp.hera.analysis.service"})
@Slf4j
public class IntelligenceBootStrap {
public static void main(String... args) {
diff --git
a/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/filter/TokenValidationFilter.java
b/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/filter/TokenValidationFilter.java
deleted file mode 100644
index f0eb8c08..00000000
---
a/ozhera-intelligence/ozhera-intelligence-server/src/main/java/org/apache/ozhera/intelligence/filter/TokenValidationFilter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.ozhera.intelligence.filter;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Component
-public class TokenValidationFilter extends OncePerRequestFilter {
-
- private static final Logger logger =
LoggerFactory.getLogger(TokenValidationFilter.class);
-
- @Value("${analyze.token}")
- private String validToken;
-
- @Override
- protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
- throws ServletException, IOException {
- String token = request.getHeader("x-token");
-
- if (token != null && token.equals(validToken)) {
- filterChain.doFilter(request, response);
- } else {
- logger.warn("Token incorrect, illegal request!");
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- }
- }
-}
diff --git
a/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/application.properties
b/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/application.properties
index 97043ec8..dd2e2af3 100644
---
a/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/application.properties
+++
b/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/application.properties
@@ -56,3 +56,14 @@ prometheus.api.url=${prometheus.api.url}
git.default.username=${git.default.username}
git.default.token=${git.default.token}
git.email.suffix=${git.email.suffix}
+
+hera.analysis.api.url=${hera.analysis.api.url}
+hera.analysis.api.auth=${hera.analysis.api.auth}
+hera.analysis.api.username=${hera.analysis.api.username}
+hera.analysis.api.flowId=${hera.analysis.api.flowId}
+
+metrics.api.url=${metrics.api.url}
+
+dubbo.qps.api.url=${dubbo.qps.api.url}
+
+log.query.api.url=${log.query.api.url}
diff --git
a/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/config/opensource-outer.properties
b/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/config/opensource-outer.properties
index bc80007c..f637cb22 100644
---
a/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/config/opensource-outer.properties
+++
b/ozhera-intelligence/ozhera-intelligence-server/src/main/resources/config/opensource-outer.properties
@@ -54,3 +54,11 @@ prometheus.api.url=
git.default.username=xxx
git.default.token=xxx
[email protected]
+
+hera.analysis.api.url=https://xxxx
+hera.analysis.api.auth=xxxx
+hera.analysis.api.username=xxx
+hera.analysis.api.flowId=
+metrics.api.url=http://xxx
+dubbo.qps.api.url=http://xxxx
+log.query.api.url=http://xxxx
diff --git a/ozhera-intelligence/ozhera-intelligence-service/pom.xml
b/ozhera-intelligence/ozhera-intelligence-service/pom.xml
index 35469a45..026b98e0 100644
--- a/ozhera-intelligence/ozhera-intelligence-service/pom.xml
+++ b/ozhera-intelligence/ozhera-intelligence-service/pom.xml
@@ -47,6 +47,17 @@
</exclusion>
</exclusions>
</dependency>
+ <dependency>
+ <groupId>run.mone</groupId>
+ <artifactId>mcp-hera-analysis</artifactId>
+ <version>1.6.1-jdk21-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <artifactId>spring-webmvc</artifactId>
+ <groupId>org.springframework</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
<dependency>
<groupId>run.mone</groupId>
<artifactId>mcp-git</artifactId>
diff --git
a/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/config/AgentConfig.java
b/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/config/AgentConfig.java
index eedac345..7fd0f136 100644
---
a/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/config/AgentConfig.java
+++
b/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/config/AgentConfig.java
@@ -19,7 +19,7 @@
package org.apache.ozhera.intelligence.agents.config;
import com.google.common.collect.Lists;
-import org.apache.ozhera.intelligence.agents.tool.CodeFixTool;
+import org.apache.ozhera.intelligence.agents.tool.RootExceptionSpanTool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
@@ -30,6 +30,7 @@ import run.mone.hive.roles.tool.*;
import run.mone.mcp.git.tool.GitCloneTool;
import run.mone.mcp.git.tool.GitCommitTool;
import run.mone.mcp.git.tool.GitPushTool;
+import run.mone.mcp.hera.analysis.tool.LogQueryTool;
import run.mone.mcp.miline.tools.GetPipelineDetailTool;
import run.mone.mcp.miline.tools.RunPipelineTool;
@@ -41,7 +42,7 @@ public class AgentConfig {
private String agentName;
@Autowired
- private CodeFixTool codeFixTool;
+ private RootExceptionSpanTool codeFixTool;
@Autowired
private GitCloneTool gitCloneTool;
@@ -49,18 +50,20 @@ public class AgentConfig {
private GitCommitTool gitCommitTool;
@Autowired
private GitPushTool gitPushTool;
+ @Autowired
+ private LogQueryTool logQueryTool;
private boolean isRemoteFile = false;
@Bean
public RoleMeta roleMeta() {
ChatFunction chat = new ChatFunction(agentName, 20);
-
chat.setDesc("和%s聊天,问问%s关于OzHera可观测性的服务监控和链路追踪相关的数据。支持各种形式如:'%s'、'请%s告诉我监控数据'、'让%s帮我看看服务状态'、'%s你知道服务有什么问题'等。支持上下文连续对话。");
+
chat.setDesc("和%s聊天,让%s基于某一个traceId执行漏洞修复。支持各种形式如:'%s'、'请%s帮我修复问题'、'让%s根据cd573409c0e75849c73ddd1ca655dfcc修复漏洞'、'%s
cd573409c0e75849c73ddd1ca655dfcc'等。支持上下文连续对话。");
return RoleMeta.builder()
- .name("OzHera可观测系统专家")
- .profile("你是OzHera可观测系统专家,精通分布式系统的监控和链路追踪,能够帮助用户诊断和解决复杂的系统问题")
-
.goal("你的目标是根据用户输入返回OzHera中专业的监控数据和链路追踪数据,帮助用户快速定位和解决系统中的异常和性能问题")
+ .name("OzHera漏洞修复专家")
+ .profile("你是OzHera漏洞修复专家,精通漏洞修复,能够根据traceId修复trace上的各种问题")
+ .goal("你的目标是根据用户输入的traceId,查询trace和log的相关信息,根据现有代码进行修复,最后进行发布")
.constraints("不要探讨一些负面的东西,如果用户问你,你可以直接拒绝掉")
//允许自动从知识库获取内容(意图识别的小模型)
//
.webQuery(WebQuery.builder().autoWebQuery(true).modelType("bert").version("finetune-bert-20250605-73a29258").releaseServiceName("bert-is-network").build())
@@ -82,17 +85,19 @@ public class AgentConfig {
new GetPipelineDetailTool(),
gitCloneTool,
gitCommitTool,
- gitPushTool
+ gitPushTool,
+ logQueryTool
))
//mcp工具
.mcpTools(Lists.newArrayList(chat))
.workflow("""
- 你是代码级自动异常修复系统,严格按照以下步骤执行:
+ 你是代码级自动异常修复系统,当前系统环境是Linux,严格按照以下步骤执行:
1、根据traceId获取链路上根因节点的项目信息与异常信息
- 2、根据根因节点的projectId和envId获取流水线详情
-
3、根据流水线详情中的gitUrl、gitBranch、gitCommitId调用git_clone工具进行git clone
- 4、根据trace链路上的异常信息,结合项目代码进行异常修复
- 5、修复完成后,将本地代码使用git_commit工具进行git
commit,commit信息是自动代码修复, 使用git_push进行git push
+ 2、查询对应project和流水线(env)endTime前后半小时的该traceId的全部日志
+ 2、根据根因节点的projectId和envId(就是pipelineId)获取流水线详情
+
3、根据流水线详情中的gitUrl、gitBranch、gitCommitId调用git_clone工具进行git clone\s
+ 4、根据trace链路上的异常信息或者是日志中的信息,结合项目代码进行异常修复\s
+ 5、修复完成后,将本地代码使用git_commit工具进行git
commit,commit信息是自动代码修复, 使用git_push进行git push\s
6、根据projectId和envId调用RunPipelineTool进行发布
""")
.build();
diff --git
a/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/CodeFixTool.java
b/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/RootExceptionSpanTool.java
similarity index 93%
rename from
ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/CodeFixTool.java
rename to
ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/RootExceptionSpanTool.java
index 5f42f7d7..2a8a23d8 100644
---
a/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/CodeFixTool.java
+++
b/ozhera-intelligence/ozhera-intelligence-service/src/main/java/org/apache/ozhera/intelligence/agents/tool/RootExceptionSpanTool.java
@@ -46,7 +46,7 @@ import java.util.List;
*/
@Slf4j
@Component
-public class CodeFixTool implements ITool {
+public class RootExceptionSpanTool implements ITool {
@Value("${server.type}")
private String env;
@@ -54,7 +54,7 @@ public class CodeFixTool implements ITool {
/**
* Tool name
*/
- public static final String name = "code_fix";
+ public static final String name = "root_exception_span";
/**
* Trace service for querying spans
@@ -124,10 +124,10 @@ public class CodeFixTool implements ITool {
taskProgress = "";
}
return """
- <code_fix>
+ <root_exception_span>
<traceId>32位追踪ID</traceId>
%s
- </code_fix>
+ </root_exception_span>
""".formatted(taskProgress);
}
@@ -135,9 +135,9 @@ public class CodeFixTool implements ITool {
public String example() {
return """
示例: 分析异常trace并提取修复信息
- <code_fix>
+ <root_exception_span>
<traceId>a1b2c3d4e5f6789012345678abcdef01</traceId>
- </code_fix>
+ </root_exception_span>
""";
}
@@ -148,7 +148,7 @@ public class CodeFixTool implements ITool {
try {
// Validate required parameter
if (!inputJson.has("traceId") ||
StringUtils.isBlank(inputJson.get("traceId").getAsString())) {
- log.error("code_fix operation missing required parameter
traceId");
+ log.error("root_exception_span operation missing required
parameter traceId");
result.addProperty("error", "缺少必填参数 'traceId'");
return result;
}
@@ -229,6 +229,7 @@ public class CodeFixTool implements ITool {
result.addProperty("spanId", rootCauseSpanId);
result.addProperty("projectId", codeFixInfo.getProjectId());
result.addProperty("envId", codeFixInfo.getEnvId());
+ result.addProperty("endTime", codeFixInfo.getEndTime());
result.addProperty("stacktrace", codeFixInfo.getStacktrace());
log.info("Successfully analyzed code fix info for traceId: {}",
traceId);
@@ -236,7 +237,7 @@ public class CodeFixTool implements ITool {
return result;
} catch (Exception e) {
- log.error("Error executing code_fix operation", e);
+ log.error("Error executing root_exception_span operation", e);
result.addProperty("error", "代码修复分析失败:" + e.getMessage());
result.addProperty("success", false);
return result;
@@ -290,10 +291,14 @@ public class CodeFixTool implements ITool {
}
}
+ // Calculate endTime from startTime + duration (convert from
microseconds to milliseconds)
+ Long endTime = (span.getStartTime() + span.getDuration()) / 1000;
+
return CodeFixInfo.builder()
.projectId(projectId)
.envId(envId)
.stacktrace(stacktrace)
+ .endTime(endTime)
.build();
} catch (Exception e) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]