zhangyi пре 6 месеци
родитељ
комит
d8e44c1742
2 измењених фајлова са 67 додато и 34 уклоњено
  1. 30 0
      Dockerfile
  2. 37 34
      src/main/java/com/seecoder/ai/alarm/controller/LogController.java

+ 30 - 0
Dockerfile

@@ -0,0 +1,30 @@
+# 构建阶段
+FROM maven:3.6.1 AS builder
+
+WORKDIR /app
+
+# 复制 Maven 配置文件
+COPY pom.xml .
+
+# 下载依赖(利用 Docker 缓存层)
+RUN mvn dependency:go-offline -B
+
+# 复制源代码并构建
+COPY src ./src
+RUN mvn clean package -DskipTests -B
+
+# 运行阶段
+FROM eclipse-temurin:21-jre-alpine
+
+WORKDIR /app
+
+# 从构建阶段复制 jar 包
+COPY --from=builder /app/target/*.jar app.jar
+
+# 设置文件所有权
+RUN chown -R appuser:appgroup /app
+
+# 切换到非 root 用户
+USER appuser
+
+

+ 37 - 34
src/main/java/com/seecoder/ai/alarm/controller/LogController.java

@@ -62,9 +62,10 @@ public class LogController {
     }
     }
 
 
     @GetMapping("/mock-process")
     @GetMapping("/mock-process")
+    // ... existing code ...
     public ApiResult<List<LogVO>> getProcessMockLogs() {
     public ApiResult<List<LogVO>> getProcessMockLogs() {
         List<LogVO> mockLogs = new ArrayList<>();
         List<LogVO> mockLogs = new ArrayList<>();
-        String traceId = "" + System.currentTimeMillis(); // 统一的traceId
+        String traceId = "" + System.currentTimeMillis(); // 统一的 traceId
 
 
         // 模拟完整的考试系统调用流程
         // 模拟完整的考试系统调用流程
 
 
@@ -73,20 +74,20 @@ public class LogController {
                 "com.seecoder.exam.portal.controller.LoginController", "用户登录请求",
                 "com.seecoder.exam.portal.controller.LoginController", "用户登录请求",
                 traceId, "0", List.of("userId=10001", "username=student001", "ip=192.168.1.100")));
                 traceId, "0", List.of("userId=10001", "username=student001", "ip=192.168.1.100")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.100", "portal-login", "auth-service-thread-1", "INFO",
-                "com.seecoder.exam.portal.service.AuthService", "验证用户凭证",
-                traceId, "0.0", List.of("username=student001", "password=encrypted")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.100", "portal-login", "auth-service-thread-1", "WARN",
+                "com.seecoder.exam.portal.service.AuthService", "用户密码尝试次数过多",
+                traceId, "0.0", List.of("username=student001", "attempt_count=3", "warning=频繁登录")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.200", "portal-login", "db-pool-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.200", "portal-login", "db-pool-1", "INFO",
                 "com.seecoder.exam.portal.repository.UserRepository", "查询用户信息",
                 "com.seecoder.exam.portal.repository.UserRepository", "查询用户信息",
                 traceId, "0.0.0", List.of("sql=SELECT * FROM users WHERE username=?", "params=[student001]")));
                 traceId, "0.0.0", List.of("sql=SELECT * FROM users WHERE username=?", "params=[student001]")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.250", "portal-login", "redis-client-1", "INFO",
-                "com.seecoder.exam.portal.cache.SessionCache", "生成会话信息",
-                traceId, "0.0.1", List.of("sessionId=SID123456", "expire=7200")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.250", "portal-login", "redis-client-1", "ERROR",
+                "com.seecoder.exam.portal.cache.SessionCache", "Redis 连接超时",
+                traceId, "0.0.1", List.of("error=ConnectionTimeout", "retry_count=2", "fallback=本地会话")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.300", "portal-login", "http-nio-8080-exec-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:30:00.300", "portal-login", "http-nio-8080-exec-1", "INFO",
-                "com.seecoder.exam.portal.controller.LoginController", "登录成功返回token",
+                "com.seecoder.exam.portal.controller.LoginController", "登录成功返回 token",
                 traceId, "0", List.of("token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", "expires_in=7200")));
                 traceId, "0", List.of("token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", "expires_in=7200")));
 
 
         // 2. 考试开始流程
         // 2. 考试开始流程
@@ -94,34 +95,34 @@ public class LogController {
                 "com.seecoder.exam.coder.controller.ExamController", "开始考试请求",
                 "com.seecoder.exam.coder.controller.ExamController", "开始考试请求",
                 traceId, "0.1", List.of("examId=EXAM20251201", "userId=10001")));
                 traceId, "0.1", List.of("examId=EXAM20251201", "userId=10001")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.050", "coder-exam", "exam-service-thread-1", "INFO",
-                "com.seecoder.exam.coder.service.ExamService", "验证考试权限",
-                traceId, "0.1.0", List.of("userId=10001", "examId=EXAM20251201", "status=authorized")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.050", "coder-exam", "exam-service-thread-1", "WARN",
+                "com.seecoder.exam.coder.service.ExamService", "考试即将过期提醒",
+                traceId, "0.1.0", List.of("userId=10001", "examId=EXAM20251201", "warning=考试剩余时间不足 30 分钟")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.100", "coder-exam", "question-service-client", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.100", "coder-exam", "question-service-client", "INFO",
                 "com.seecoder.exam.coder.client.QuestionClient", "获取考试题目列表",
                 "com.seecoder.exam.coder.client.QuestionClient", "获取考试题目列表",
                 traceId, "0.1.0.0", List.of("examId=EXAM20251201", "count=10")));
                 traceId, "0.1.0.0", List.of("examId=EXAM20251201", "count=10")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.200", "coder-exam", "db-pool-2", "INFO",
-                "com.seecoder.exam.coder.repository.QuestionRepository", "查询题目详情",
-                traceId, "0.1.0.0.0", List.of("questionIds=[Q001,Q002,Q003]", "fields=title,content,options")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:35:00.200", "coder-exam", "db-pool-2", "ERROR",
+                "com.seecoder.exam.coder.repository.QuestionRepository", "数据库查询失败后重试成功",
+                traceId, "0.1.0.0.0", List.of("error=DeadLockLoser", "retry_count=1", "questionIds=[Q001,Q002,Q003]", "fields=title,content,options")));
 
 
         // 3. 代码编写和提交流程
         // 3. 代码编写和提交流程
         mockLogs.add(createProcessLogVO("2025-12-01 14:45:00.000", "coder-exam", "http-nio-8080-exec-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:45:00.000", "coder-exam", "http-nio-8080-exec-1", "INFO",
                 "com.seecoder.exam.coder.controller.CodeController", "保存代码草稿",
                 "com.seecoder.exam.coder.controller.CodeController", "保存代码草稿",
                 traceId, "0.2", List.of("examId=EXAM20251201", "questionId=Q001", "language=java")));
                 traceId, "0.2", List.of("examId=EXAM20251201", "questionId=Q001", "language=java")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:45:00.050", "coder-exam", "redis-client-2", "INFO",
-                "com.seecoder.exam.coder.cache.CodeCache", "缓存代码内容",
-                traceId, "0.2.0", List.of("key=code:10001:EXAM20251201:Q001", "expire=3600")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:45:00.050", "coder-exam", "redis-client-2", "WARN",
+                "com.seecoder.exam.coder.cache.CodeCache", "缓存内存使用率过高",
+                traceId, "0.2.0", List.of("key=code:10001:EXAM20251201:Q001", "memory_usage=85%", "warning=建议清理过期缓存")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:00.000", "coder-exam", "http-nio-8080-exec-2", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:00.000", "coder-exam", "http-nio-8080-exec-2", "INFO",
                 "com.seecoder.exam.coder.controller.CodeController", "提交最终代码",
                 "com.seecoder.exam.coder.controller.CodeController", "提交最终代码",
                 traceId, "0.3", List.of("examId=EXAM20251201", "questionId=Q001", "submit=true")));
                 traceId, "0.3", List.of("examId=EXAM20251201", "questionId=Q001", "submit=true")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:50:00.050", "coder-exam", "compile-service-client", "INFO",
-                "com.seecoder.exam.coder.client.CompileClient", "代码编译请求",
-                traceId, "0.3.0", List.of("language=java", "source_length=1234", "timeout=30s")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:50:00.050", "coder-exam", "compile-service-client", "ERROR",
+                "com.seecoder.exam.coder.client.CompileClient", "代码编译服务不可用",
+                traceId, "0.3.0", List.of("error=ServiceUnavailable", "language=java", "fallback=排队等待")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:01.000", "coder-exam", "docker-container-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:01.000", "coder-exam", "docker-container-1", "INFO",
                 "com.seecoder.exam.compile.Compiler", "执行编译过程",
                 "com.seecoder.exam.compile.Compiler", "执行编译过程",
@@ -132,33 +133,35 @@ public class LogController {
                 "com.seecoder.exam.judge.JudgeService", "开始代码评判",
                 "com.seecoder.exam.judge.JudgeService", "开始代码评判",
                 traceId, "0.3.0.1", List.of("submission_id=SUB20251201001", "question_id=Q001")));
                 traceId, "0.3.0.1", List.of("submission_id=SUB20251201001", "question_id=Q001")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:50:02.100", "jenkins-judge", "test-runner-1", "INFO",
-                "com.seecoder.exam.judge.TestCaseRunner", "执行测试用例",
-                traceId, "0.3.0.1.0", List.of("test_cases=5", "timeout=10s")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:50:02.100", "jenkins-judge", "test-runner-1", "WARN",
+                "com.seecoder.exam.judge.TestCaseRunner", "测试用例执行超时警告",
+                traceId, "0.3.0.1.0", List.of("test_cases=5", "timeout=10s", "warning=部分用例执行时间过长")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:03.500", "jenkins-judge", "result-service-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:50:03.500", "jenkins-judge", "result-service-1", "INFO",
                 "com.seecoder.exam.judge.ResultService", "汇总评判结果",
                 "com.seecoder.exam.judge.ResultService", "汇总评判结果",
                 traceId, "0.3.0.1.1", List.of("passed=4", "failed=1", "score=80")));
                 traceId, "0.3.0.1.1", List.of("passed=4", "failed=1", "score=80")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:50:03.600", "jenkins-judge", "db-pool-3", "INFO",
-                "com.seecoder.exam.judge.repository.ResultRepository", "保存评判结果",
-                traceId, "0.3.0.1.2", List.of("sql=INSERT INTO results VALUES (?, ?, ?)", "params=[SUB20251201001, 80, PASSED]")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:50:03.600", "jenkins-judge", "db-pool-3", "ERROR",
+                "com.seecoder.exam.judge.repository.ResultRepository", "保存评判结果时发生主键冲突",
+                traceId, "0.3.0.1.2", List.of("error=DuplicateKeyException", "sql=INSERT INTO results VALUES (?, ?, ?)", "params=[SUB20251201001, 80, PASSED]", "resolution=使用 UPDATE 代替")));
 
 
-        // 5. GitLab代码管理流程
-        mockLogs.add(createProcessLogVO("2025-12-01 14:55:00.000", "gitlab-manager", "gitlab-client-1", "INFO",
-                "com.seecoder.exam.gitlab.GitLabService", "创建代码仓库",
-                traceId, "0.4", List.of("project_name=exam_EXAM20251201_10001", "visibility=private")));
+        // 5. GitLab 代码管理流程
+        mockLogs.add(createProcessLogVO("2025-12-01 14:55:00.000", "gitlab-manager", "gitlab-client-1", "WARN",
+                "com.seecoder.exam.gitlab.GitLabService", "GitLab API 响应缓慢",
+                traceId, "0.4", List.of("project_name=exam_EXAM20251201_10001", "visibility=private", "response_time=3500ms", "warning=API 响应超过阈值")));
 
 
         mockLogs.add(createProcessLogVO("2025-12-01 14:55:00.500", "gitlab-manager", "http-client-1", "INFO",
         mockLogs.add(createProcessLogVO("2025-12-01 14:55:00.500", "gitlab-manager", "http-client-1", "INFO",
-                "com.seecoder.exam.gitlab.GitLabClient", "调用GitLab API",
+                "com.seecoder.exam.gitlab.GitLabClient", "调用 GitLab API",
                 traceId, "0.4.0", List.of("api=/api/v4/projects", "method=POST", "response_code=201")));
                 traceId, "0.4.0", List.of("api=/api/v4/projects", "method=POST", "response_code=201")));
 
 
-        mockLogs.add(createProcessLogVO("2025-12-01 14:55:01.000", "gitlab-manager", "webhook-service-1", "INFO",
-                "com.seecoder.exam.gitlab.WebHookService", "配置仓库Webhook",
-                traceId, "0.4.1", List.of("url=https://exam-system/callback", "events=[push,merge_request]")));
+        mockLogs.add(createProcessLogVO("2025-12-01 14:55:01.000", "gitlab-manager", "webhook-service-1", "ERROR",
+                "com.seecoder.exam.gitlab.WebHookService", "Webhook 配置失败",
+                traceId, "0.4.1", List.of("error=SSLHandshakeException", "url=https://exam-system/callback", "events=[push,merge_request]", "resolution=检查 SSL 证书")));
 
 
         return ApiResult.success(mockLogs);
         return ApiResult.success(mockLogs);
     }
     }
+    // ... existing code ...
+
 
 
     /**
     /**
      * 创建流程调用日志的辅助方法
      * 创建流程调用日志的辅助方法