This is an automated email from the ASF dual-hosted git repository.

wenjun pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new d306f1d04b Refactor record audit log logic (#15881)
d306f1d04b is described below

commit d306f1d04b3b4259093d139a28b2ad4d55d1dcf3
Author: 旺阳 <[email protected]>
AuthorDate: Fri Apr 19 15:20:31 2024 +0800

    Refactor record audit log logic (#15881)
---
 .../api/audit/OperatorLogAspect.java               | 74 ++++++++++++++++++----
 .../dolphinscheduler/api/audit/OperatorUtils.java  | 25 ++------
 .../api/audit/operator/AuditOperator.java          | 16 ++---
 .../api/audit/operator/BaseAuditOperator.java      | 41 +++++-------
 .../service/impl/TaskDefinitionServiceImpl.java    |  6 +-
 .../common/constants/Constants.java                |  4 ++
 .../common/enums/AuditModelType.java               |  2 +-
 7 files changed, 99 insertions(+), 69 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
index da8a7bd3e6..aaf35d5b66 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java
@@ -17,18 +17,26 @@
 
 package org.apache.dolphinscheduler.api.audit;
 
+import org.apache.dolphinscheduler.api.audit.enums.AuditType;
 import org.apache.dolphinscheduler.api.audit.operator.AuditOperator;
-import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.dao.entity.AuditLog;
+import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.service.bean.SpringApplicationContext;
 
 import java.lang.reflect.Method;
+import java.util.List;
 import java.util.Map;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
 import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.stereotype.Component;
@@ -40,34 +48,74 @@ import io.swagger.v3.oas.annotations.Operation;
 @Component
 public class OperatorLogAspect {
 
+    private static final ThreadLocal<AuditContext> auditThreadLocal = new 
ThreadLocal<>();
+
     @Pointcut("@annotation(org.apache.dolphinscheduler.api.audit.OperatorLog)")
     public void logPointCut() {
     }
 
-    @Around("logPointCut()")
-    public Object around(ProceedingJoinPoint point) throws Throwable {
+    @Before("logPointCut()")
+    public void before(JoinPoint point) {
         MethodSignature signature = (MethodSignature) point.getSignature();
         Method method = signature.getMethod();
-
         OperatorLog operatorLog = method.getAnnotation(OperatorLog.class);
-
         Operation operation = method.getAnnotation(Operation.class);
+
         if (operation == null) {
             log.warn("Operation is null of method: {}", method.getName());
-            return point.proceed();
+            return;
         }
-        long beginTime = System.currentTimeMillis();
 
         Map<String, Object> paramsMap = OperatorUtils.getParamsMap(point, 
signature);
-        Result<?> result = (Result<?>) point.proceed();
+        User user = OperatorUtils.getUser(paramsMap);
+        if (user == null) {
+            log.error("user is null");
+            return;
+        }
+
+        AuditType auditType = operatorLog.auditType();
+
         try {
             AuditOperator operator = 
SpringApplicationContext.getBean(operatorLog.auditType().getOperatorClass());
-            long latency = System.currentTimeMillis() - beginTime;
-            operator.recordAudit(paramsMap, result, latency, operation, 
operatorLog);
+            List<AuditLog> auditLogList = 
OperatorUtils.buildAuditLogList(operation.description(), auditType, user);
+            operator.setRequestParam(auditType, auditLogList, paramsMap);
+            AuditContext auditContext =
+                    new AuditContext(auditLogList, paramsMap, operatorLog, 
System.currentTimeMillis(), operator);
+            auditThreadLocal.set(auditContext);
         } catch (Throwable throwable) {
             log.error("Record audit log error", throwable);
         }
+    }
+
+    @AfterReturning(value = "logPointCut()", returning = "returnValue")
+    public void afterReturning(Object returnValue) {
+        try {
+            AuditContext auditContext = auditThreadLocal.get();
+            if (auditContext == null) {
+                return;
+            }
+            auditContext.getOperator().recordAudit(auditContext, returnValue);
+        } catch (Throwable throwable) {
+            log.error("Record audit log error", throwable);
+        } finally {
+            auditThreadLocal.remove();
+        }
+    }
+
+    @AfterThrowing("logPointCut()")
+    public void afterThrowing() {
+        auditThreadLocal.remove();
+    }
+
+    @Getter
+    @Setter
+    @AllArgsConstructor
+    public static class AuditContext {
 
-        return result;
+        List<AuditLog> auditLogList;
+        Map<String, Object> paramsMap;
+        OperatorLog operatorLog;
+        long beginTime;
+        AuditOperator operator;
     }
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorUtils.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorUtils.java
index 10ccf8d648..8dc628b576 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorUtils.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorUtils.java
@@ -20,6 +20,7 @@ package org.apache.dolphinscheduler.api.audit;
 import org.apache.dolphinscheduler.api.audit.enums.AuditType;
 import org.apache.dolphinscheduler.api.enums.ExecuteType;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.AuditModelType;
 import org.apache.dolphinscheduler.common.enums.AuditOperationType;
 import org.apache.dolphinscheduler.common.enums.ReleaseState;
@@ -36,24 +37,12 @@ import java.util.Map;
 
 import lombok.extern.slf4j.Slf4j;
 
-import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.reflect.MethodSignature;
 
 @Slf4j
 public class OperatorUtils {
 
-    protected void changeObjectForVersionRelated(AuditOperationType 
auditOperationType, Map<String, Object> paramsMap,
-                                                 List<AuditLog> auditLogList) {
-        switch (auditOperationType) {
-            case SWITCH_VERSION:
-            case DELETE_VERSION:
-                
auditLogList.get(0).setModelName(paramsMap.get("version").toString());
-                break;
-            default:
-                break;
-        }
-    }
-
     public static boolean resultFail(Result<?> result) {
         return result != null && result.isFailed();
     }
@@ -66,7 +55,7 @@ public class OperatorUtils {
         auditLog.setOperationType(auditType.getAuditOperationType().getName());
         auditLog.setDescription(apiDescription);
         auditLog.setCreateTime(new Date());
-
+        auditLogList.add(auditLog);
         return auditLogList;
     }
 
@@ -80,7 +69,7 @@ public class OperatorUtils {
         return null;
     }
 
-    public static Map<String, Object> getParamsMap(ProceedingJoinPoint point, 
MethodSignature signature) {
+    public static Map<String, Object> getParamsMap(JoinPoint point, 
MethodSignature signature) {
         Object[] args = point.getArgs();
         String[] strings = signature.getParameterNames();
 
@@ -95,7 +84,7 @@ public class OperatorUtils {
     public static AuditOperationType modifyReleaseOperationType(AuditType 
auditType, Map<String, Object> paramsMap) {
         switch (auditType.getAuditOperationType()) {
             case RELEASE:
-                ReleaseState releaseState = (ReleaseState) 
paramsMap.get("releaseState");
+                ReleaseState releaseState = (ReleaseState) 
paramsMap.get(Constants.RELEASE_STATE);
                 if (releaseState == null) {
                     break;
                 }
@@ -109,7 +98,7 @@ public class OperatorUtils {
                 }
                 break;
             case EXECUTE:
-                ExecuteType executeType = (ExecuteType) 
paramsMap.get("executeType");
+                ExecuteType executeType = (ExecuteType) 
paramsMap.get(Constants.EXECUTE_TYPE);
                 if (executeType == null) {
                     break;
                 }
@@ -184,7 +173,7 @@ public class OperatorUtils {
     }
 
     public static boolean isUdfResource(Map<String, Object> paramsMap) {
-        ResourceType resourceType = (ResourceType) paramsMap.get("type");
+        ResourceType resourceType = (ResourceType) 
paramsMap.get(Constants.STRING_PLUGIN_PARAM_TYPE);
         return resourceType != null && resourceType.equals(ResourceType.UDF);
     }
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/AuditOperator.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/AuditOperator.java
index 7d76d5c4bd..c3a9a845f5 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/AuditOperator.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/AuditOperator.java
@@ -17,18 +17,16 @@
 
 package org.apache.dolphinscheduler.api.audit.operator;
 
-import org.apache.dolphinscheduler.api.audit.OperatorLog;
-import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.audit.OperatorLogAspect;
+import org.apache.dolphinscheduler.api.audit.enums.AuditType;
+import org.apache.dolphinscheduler.dao.entity.AuditLog;
 
+import java.util.List;
 import java.util.Map;
 
-import io.swagger.v3.oas.annotations.Operation;
-
 public interface AuditOperator {
 
-    void recordAudit(Map<String, Object> paramsMap,
-                     Result<?> result,
-                     long latency,
-                     Operation operation,
-                     OperatorLog operatorLog) throws Throwable;
+    void recordAudit(OperatorLogAspect.AuditContext auditContext, Object 
returnValue);
+
+    void setRequestParam(AuditType auditType, List<AuditLog> auditLogList, 
Map<String, Object> paramsMap);
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/BaseAuditOperator.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/BaseAuditOperator.java
index 270a5e4df4..0ab607da65 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/BaseAuditOperator.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/BaseAuditOperator.java
@@ -18,12 +18,12 @@
 package org.apache.dolphinscheduler.api.audit.operator;
 
 import org.apache.dolphinscheduler.api.audit.OperatorLog;
+import org.apache.dolphinscheduler.api.audit.OperatorLogAspect;
 import org.apache.dolphinscheduler.api.audit.OperatorUtils;
 import org.apache.dolphinscheduler.api.audit.enums.AuditType;
 import org.apache.dolphinscheduler.api.service.AuditService;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.dao.entity.AuditLog;
-import org.apache.dolphinscheduler.dao.entity.User;
 
 import org.apache.commons.lang3.math.NumberUtils;
 
@@ -36,7 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import com.google.common.base.Strings;
-import io.swagger.v3.oas.annotations.Operation;
 
 @Service
 @Slf4j
@@ -46,40 +45,34 @@ public abstract class BaseAuditOperator implements 
AuditOperator {
     private AuditService auditService;
 
     @Override
-    public void recordAudit(Map<String, Object> paramsMap,
-                            Result<?> result,
-                            long latency,
-                            Operation operation,
-                            OperatorLog operatorLog) {
-
-        AuditType auditType = operatorLog.auditType();
-
-        User user = OperatorUtils.getUser(paramsMap);
-
-        if (user == null) {
-            log.error("user is null");
-            return;
+    public void recordAudit(OperatorLogAspect.AuditContext auditContext, 
Object returnValue) {
+        Result<?> result = new Result<>();
+
+        if (returnValue instanceof Result) {
+            result = (Result<?>) returnValue;
+            if (OperatorUtils.resultFail(result)) {
+                log.error("request fail, code {}", result.getCode());
+                return;
+            }
         }
 
-        List<AuditLog> auditLogList = 
OperatorUtils.buildAuditLogList(operation.description(), auditType, user);
-        setRequestParam(auditType, auditLogList, paramsMap);
+        long latency = System.currentTimeMillis() - 
auditContext.getBeginTime();
+        List<AuditLog> auditLogList = auditContext.getAuditLogList();
 
-        if (OperatorUtils.resultFail(result)) {
-            log.error("request fail, code {}", result.getCode());
-            return;
-        }
+        Map<String, Object> paramsMap = auditContext.getParamsMap();
+        OperatorLog operatorLog = auditContext.getOperatorLog();
+        AuditType auditType = operatorLog.auditType();
 
         setObjectIdentityFromReturnObject(auditType, result, auditLogList);
-
         modifyAuditOperationType(auditType, paramsMap, auditLogList);
         modifyAuditObjectType(auditType, paramsMap, auditLogList);
 
         auditLogList.forEach(auditLog -> auditLog.setLatency(latency));
         auditLogList.forEach(auditLog -> auditService.addAudit(auditLog));
-
     }
 
-    protected void setRequestParam(AuditType auditType, List<AuditLog> 
auditLogList, Map<String, Object> paramsMap) {
+    @Override
+    public void setRequestParam(AuditType auditType, List<AuditLog> 
auditLogList, Map<String, Object> paramsMap) {
         String[] paramNameArr = auditType.getRequestParamName();
 
         if (paramNameArr.length == 0) {
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
index 8b01df1319..71e4d04d6f 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java
@@ -105,8 +105,6 @@ import com.google.common.collect.Lists;
 @Slf4j
 public class TaskDefinitionServiceImpl extends BaseServiceImpl implements 
TaskDefinitionService {
 
-    private static final String RELEASESTATE = "releaseState";
-
     @Autowired
     private ProjectMapper projectMapper;
 
@@ -1297,7 +1295,7 @@ public class TaskDefinitionServiceImpl extends 
BaseServiceImpl implements TaskDe
             return result;
         }
         if (null == releaseState) {
-            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
RELEASESTATE);
+            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.RELEASE_STATE);
             return result;
         }
         TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(code);
@@ -1337,7 +1335,7 @@ public class TaskDefinitionServiceImpl extends 
BaseServiceImpl implements TaskDe
                 break;
             default:
                 log.warn("Parameter releaseState is invalid.");
-                putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
RELEASESTATE);
+                putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.RELEASE_STATE);
                 return result;
         }
         int update = taskDefinitionMapper.updateById(taskDefinition);
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
index 19e1a1fabb..b5bbf740e9 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
@@ -747,4 +747,8 @@ public final class Constants {
      * K8S sensitive param
      */
     public static final String K8S_CONFIG_REGEX = "(?<=((?i)configYaml(\" : 
\"))).*?(?=(\",\\n))";
+
+    public static final String RELEASE_STATE = "releaseState";
+    public static final String EXECUTE_TYPE = "executeType";
+
 }
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/AuditModelType.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/AuditModelType.java
index 449f046f4a..5f046882c1 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/AuditModelType.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/AuditModelType.java
@@ -29,7 +29,7 @@ import lombok.Getter;
 @Getter
 public enum AuditModelType {
 
-    PROJECT("Project", null), // 1
+    PROJECT("Project", null),
     PROCESS("Process", PROJECT),
     PROCESS_INSTANCE("ProcessInstance", PROCESS),
     TASK("Task", PROCESS),

Reply via email to