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]

Reply via email to