Skip to content

Commit d306f1d

Browse files
authored
Refactor record audit log logic (#15881)
1 parent 32f9288 commit d306f1d

7 files changed

Lines changed: 99 additions & 69 deletions

File tree

‎dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorLogAspect.java‎

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,26 @@
1717

1818
package org.apache.dolphinscheduler.api.audit;
1919

20+
import org.apache.dolphinscheduler.api.audit.enums.AuditType;
2021
import org.apache.dolphinscheduler.api.audit.operator.AuditOperator;
21-
import org.apache.dolphinscheduler.api.utils.Result;
22+
import org.apache.dolphinscheduler.dao.entity.AuditLog;
23+
import org.apache.dolphinscheduler.dao.entity.User;
2224
import org.apache.dolphinscheduler.service.bean.SpringApplicationContext;
2325

2426
import java.lang.reflect.Method;
27+
import java.util.List;
2528
import java.util.Map;
2629

30+
import lombok.AllArgsConstructor;
31+
import lombok.Getter;
32+
import lombok.Setter;
2733
import lombok.extern.slf4j.Slf4j;
2834

29-
import org.aspectj.lang.ProceedingJoinPoint;
30-
import org.aspectj.lang.annotation.Around;
35+
import org.aspectj.lang.JoinPoint;
36+
import org.aspectj.lang.annotation.AfterReturning;
37+
import org.aspectj.lang.annotation.AfterThrowing;
3138
import org.aspectj.lang.annotation.Aspect;
39+
import org.aspectj.lang.annotation.Before;
3240
import org.aspectj.lang.annotation.Pointcut;
3341
import org.aspectj.lang.reflect.MethodSignature;
3442
import org.springframework.stereotype.Component;
@@ -40,34 +48,74 @@
4048
@Component
4149
public class OperatorLogAspect {
4250

51+
private static final ThreadLocal<AuditContext> auditThreadLocal = new ThreadLocal<>();
52+
4353
@Pointcut("@annotation(org.apache.dolphinscheduler.api.audit.OperatorLog)")
4454
public void logPointCut() {
4555
}
4656

47-
@Around("logPointCut()")
48-
public Object around(ProceedingJoinPoint point) throws Throwable {
57+
@Before("logPointCut()")
58+
public void before(JoinPoint point) {
4959
MethodSignature signature = (MethodSignature) point.getSignature();
5060
Method method = signature.getMethod();
51-
5261
OperatorLog operatorLog = method.getAnnotation(OperatorLog.class);
53-
5462
Operation operation = method.getAnnotation(Operation.class);
63+
5564
if (operation == null) {
5665
log.warn("Operation is null of method: {}", method.getName());
57-
return point.proceed();
66+
return;
5867
}
59-
long beginTime = System.currentTimeMillis();
6068

6169
Map<String, Object> paramsMap = OperatorUtils.getParamsMap(point, signature);
62-
Result<?> result = (Result<?>) point.proceed();
70+
User user = OperatorUtils.getUser(paramsMap);
71+
if (user == null) {
72+
log.error("user is null");
73+
return;
74+
}
75+
76+
AuditType auditType = operatorLog.auditType();
77+
6378
try {
6479
AuditOperator operator = SpringApplicationContext.getBean(operatorLog.auditType().getOperatorClass());
65-
long latency = System.currentTimeMillis() - beginTime;
66-
operator.recordAudit(paramsMap, result, latency, operation, operatorLog);
80+
List<AuditLog> auditLogList = OperatorUtils.buildAuditLogList(operation.description(), auditType, user);
81+
operator.setRequestParam(auditType, auditLogList, paramsMap);
82+
AuditContext auditContext =
83+
new AuditContext(auditLogList, paramsMap, operatorLog, System.currentTimeMillis(), operator);
84+
auditThreadLocal.set(auditContext);
6785
} catch (Throwable throwable) {
6886
log.error("Record audit log error", throwable);
6987
}
88+
}
89+
90+
@AfterReturning(value = "logPointCut()", returning = "returnValue")
91+
public void afterReturning(Object returnValue) {
92+
try {
93+
AuditContext auditContext = auditThreadLocal.get();
94+
if (auditContext == null) {
95+
return;
96+
}
97+
auditContext.getOperator().recordAudit(auditContext, returnValue);
98+
} catch (Throwable throwable) {
99+
log.error("Record audit log error", throwable);
100+
} finally {
101+
auditThreadLocal.remove();
102+
}
103+
}
104+
105+
@AfterThrowing("logPointCut()")
106+
public void afterThrowing() {
107+
auditThreadLocal.remove();
108+
}
109+
110+
@Getter
111+
@Setter
112+
@AllArgsConstructor
113+
public static class AuditContext {
70114

71-
return result;
115+
List<AuditLog> auditLogList;
116+
Map<String, Object> paramsMap;
117+
OperatorLog operatorLog;
118+
long beginTime;
119+
AuditOperator operator;
72120
}
73121
}

‎dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/OperatorUtils.java‎

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.dolphinscheduler.api.audit.enums.AuditType;
2121
import org.apache.dolphinscheduler.api.enums.ExecuteType;
2222
import org.apache.dolphinscheduler.api.utils.Result;
23+
import org.apache.dolphinscheduler.common.constants.Constants;
2324
import org.apache.dolphinscheduler.common.enums.AuditModelType;
2425
import org.apache.dolphinscheduler.common.enums.AuditOperationType;
2526
import org.apache.dolphinscheduler.common.enums.ReleaseState;
@@ -36,24 +37,12 @@
3637

3738
import lombok.extern.slf4j.Slf4j;
3839

39-
import org.aspectj.lang.ProceedingJoinPoint;
40+
import org.aspectj.lang.JoinPoint;
4041
import org.aspectj.lang.reflect.MethodSignature;
4142

4243
@Slf4j
4344
public class OperatorUtils {
4445

45-
protected void changeObjectForVersionRelated(AuditOperationType auditOperationType, Map<String, Object> paramsMap,
46-
List<AuditLog> auditLogList) {
47-
switch (auditOperationType) {
48-
case SWITCH_VERSION:
49-
case DELETE_VERSION:
50-
auditLogList.get(0).setModelName(paramsMap.get("version").toString());
51-
break;
52-
default:
53-
break;
54-
}
55-
}
56-
5746
public static boolean resultFail(Result<?> result) {
5847
return result != null && result.isFailed();
5948
}
@@ -66,7 +55,7 @@ public static List<AuditLog> buildAuditLogList(String apiDescription, AuditType
6655
auditLog.setOperationType(auditType.getAuditOperationType().getName());
6756
auditLog.setDescription(apiDescription);
6857
auditLog.setCreateTime(new Date());
69-
58+
auditLogList.add(auditLog);
7059
return auditLogList;
7160
}
7261

@@ -80,7 +69,7 @@ public static User getUser(Map<String, Object> paramsMap) {
8069
return null;
8170
}
8271

83-
public static Map<String, Object> getParamsMap(ProceedingJoinPoint point, MethodSignature signature) {
72+
public static Map<String, Object> getParamsMap(JoinPoint point, MethodSignature signature) {
8473
Object[] args = point.getArgs();
8574
String[] strings = signature.getParameterNames();
8675

@@ -95,7 +84,7 @@ public static Map<String, Object> getParamsMap(ProceedingJoinPoint point, Method
9584
public static AuditOperationType modifyReleaseOperationType(AuditType auditType, Map<String, Object> paramsMap) {
9685
switch (auditType.getAuditOperationType()) {
9786
case RELEASE:
98-
ReleaseState releaseState = (ReleaseState) paramsMap.get("releaseState");
87+
ReleaseState releaseState = (ReleaseState) paramsMap.get(Constants.RELEASE_STATE);
9988
if (releaseState == null) {
10089
break;
10190
}
@@ -109,7 +98,7 @@ public static AuditOperationType modifyReleaseOperationType(AuditType auditType,
10998
}
11099
break;
111100
case EXECUTE:
112-
ExecuteType executeType = (ExecuteType) paramsMap.get("executeType");
101+
ExecuteType executeType = (ExecuteType) paramsMap.get(Constants.EXECUTE_TYPE);
113102
if (executeType == null) {
114103
break;
115104
}
@@ -184,7 +173,7 @@ public static Map<String, Object> getObjectIfFromReturnObject(Object obj, String
184173
}
185174

186175
public static boolean isUdfResource(Map<String, Object> paramsMap) {
187-
ResourceType resourceType = (ResourceType) paramsMap.get("type");
176+
ResourceType resourceType = (ResourceType) paramsMap.get(Constants.STRING_PLUGIN_PARAM_TYPE);
188177
return resourceType != null && resourceType.equals(ResourceType.UDF);
189178
}
190179

‎dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/AuditOperator.java‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,16 @@
1717

1818
package org.apache.dolphinscheduler.api.audit.operator;
1919

20-
import org.apache.dolphinscheduler.api.audit.OperatorLog;
21-
import org.apache.dolphinscheduler.api.utils.Result;
20+
import org.apache.dolphinscheduler.api.audit.OperatorLogAspect;
21+
import org.apache.dolphinscheduler.api.audit.enums.AuditType;
22+
import org.apache.dolphinscheduler.dao.entity.AuditLog;
2223

24+
import java.util.List;
2325
import java.util.Map;
2426

25-
import io.swagger.v3.oas.annotations.Operation;
26-
2727
public interface AuditOperator {
2828

29-
void recordAudit(Map<String, Object> paramsMap,
30-
Result<?> result,
31-
long latency,
32-
Operation operation,
33-
OperatorLog operatorLog) throws Throwable;
29+
void recordAudit(OperatorLogAspect.AuditContext auditContext, Object returnValue);
30+
31+
void setRequestParam(AuditType auditType, List<AuditLog> auditLogList, Map<String, Object> paramsMap);
3432
}

‎dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/audit/operator/BaseAuditOperator.java‎

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
package org.apache.dolphinscheduler.api.audit.operator;
1919

2020
import org.apache.dolphinscheduler.api.audit.OperatorLog;
21+
import org.apache.dolphinscheduler.api.audit.OperatorLogAspect;
2122
import org.apache.dolphinscheduler.api.audit.OperatorUtils;
2223
import org.apache.dolphinscheduler.api.audit.enums.AuditType;
2324
import org.apache.dolphinscheduler.api.service.AuditService;
2425
import org.apache.dolphinscheduler.api.utils.Result;
2526
import org.apache.dolphinscheduler.dao.entity.AuditLog;
26-
import org.apache.dolphinscheduler.dao.entity.User;
2727

2828
import org.apache.commons.lang3.math.NumberUtils;
2929

@@ -36,7 +36,6 @@
3636
import org.springframework.stereotype.Service;
3737

3838
import com.google.common.base.Strings;
39-
import io.swagger.v3.oas.annotations.Operation;
4039

4140
@Service
4241
@Slf4j
@@ -46,40 +45,34 @@ public abstract class BaseAuditOperator implements AuditOperator {
4645
private AuditService auditService;
4746

4847
@Override
49-
public void recordAudit(Map<String, Object> paramsMap,
50-
Result<?> result,
51-
long latency,
52-
Operation operation,
53-
OperatorLog operatorLog) {
54-
55-
AuditType auditType = operatorLog.auditType();
56-
57-
User user = OperatorUtils.getUser(paramsMap);
58-
59-
if (user == null) {
60-
log.error("user is null");
61-
return;
48+
public void recordAudit(OperatorLogAspect.AuditContext auditContext, Object returnValue) {
49+
Result<?> result = new Result<>();
50+
51+
if (returnValue instanceof Result) {
52+
result = (Result<?>) returnValue;
53+
if (OperatorUtils.resultFail(result)) {
54+
log.error("request fail, code {}", result.getCode());
55+
return;
56+
}
6257
}
6358

64-
List<AuditLog> auditLogList = OperatorUtils.buildAuditLogList(operation.description(), auditType, user);
65-
setRequestParam(auditType, auditLogList, paramsMap);
59+
long latency = System.currentTimeMillis() - auditContext.getBeginTime();
60+
List<AuditLog> auditLogList = auditContext.getAuditLogList();
6661

67-
if (OperatorUtils.resultFail(result)) {
68-
log.error("request fail, code {}", result.getCode());
69-
return;
70-
}
62+
Map<String, Object> paramsMap = auditContext.getParamsMap();
63+
OperatorLog operatorLog = auditContext.getOperatorLog();
64+
AuditType auditType = operatorLog.auditType();
7165

7266
setObjectIdentityFromReturnObject(auditType, result, auditLogList);
73-
7467
modifyAuditOperationType(auditType, paramsMap, auditLogList);
7568
modifyAuditObjectType(auditType, paramsMap, auditLogList);
7669

7770
auditLogList.forEach(auditLog -> auditLog.setLatency(latency));
7871
auditLogList.forEach(auditLog -> auditService.addAudit(auditLog));
79-
8072
}
8173

82-
protected void setRequestParam(AuditType auditType, List<AuditLog> auditLogList, Map<String, Object> paramsMap) {
74+
@Override
75+
public void setRequestParam(AuditType auditType, List<AuditLog> auditLogList, Map<String, Object> paramsMap) {
8376
String[] paramNameArr = auditType.getRequestParamName();
8477

8578
if (paramNameArr.length == 0) {

‎dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@
105105
@Slf4j
106106
public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDefinitionService {
107107

108-
private static final String RELEASESTATE = "releaseState";
109-
110108
@Autowired
111109
private ProjectMapper projectMapper;
112110

@@ -1297,7 +1295,7 @@ public Map<String, Object> releaseTaskDefinition(User loginUser, long projectCod
12971295
return result;
12981296
}
12991297
if (null == releaseState) {
1300-
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, RELEASESTATE);
1298+
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, Constants.RELEASE_STATE);
13011299
return result;
13021300
}
13031301
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(code);
@@ -1337,7 +1335,7 @@ public Map<String, Object> releaseTaskDefinition(User loginUser, long projectCod
13371335
break;
13381336
default:
13391337
log.warn("Parameter releaseState is invalid.");
1340-
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, RELEASESTATE);
1338+
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, Constants.RELEASE_STATE);
13411339
return result;
13421340
}
13431341
int update = taskDefinitionMapper.updateById(taskDefinition);

‎dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,4 +747,8 @@ private Constants() {
747747
* K8S sensitive param
748748
*/
749749
public static final String K8S_CONFIG_REGEX = "(?<=((?i)configYaml(\" : \"))).*?(?=(\",\\n))";
750+
751+
public static final String RELEASE_STATE = "releaseState";
752+
public static final String EXECUTE_TYPE = "executeType";
753+
750754
}

‎dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/enums/AuditModelType.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
@Getter
3030
public enum AuditModelType {
3131

32-
PROJECT("Project", null), // 1
32+
PROJECT("Project", null),
3333
PROCESS("Process", PROJECT),
3434
PROCESS_INSTANCE("ProcessInstance", PROCESS),
3535
TASK("Task", PROCESS),

0 commit comments

Comments
 (0)