Skip to content

Commit 9fecc73

Browse files
wufuncxcaspar
authored andcommitted
feature: add business data match
Signed-off-by: wufan <[email protected]>
1 parent defec86 commit 9fecc73

File tree

40 files changed

+729
-56
lines changed

40 files changed

+729
-56
lines changed

assembly.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@
5353
<include>**/**</include>
5454
</includes>
5555
</fileSet>
56+
<fileSet>
57+
<directory>chaosblade-exec-spi/target/classes</directory>
58+
<outputDirectory></outputDirectory>
59+
<includes>
60+
<include>**/**</include>
61+
</includes>
62+
</fileSet>
5663

5764
<!-- plugins -->
5865
<fileSet>

chaosblade-exec-common/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929

3030

3131
<dependencies>
32+
<dependency>
33+
<groupId>com.alibaba.chaosblade</groupId>
34+
<artifactId>chaosblade-exec-spi</artifactId>
35+
<version>${project.version}</version>
36+
</dependency>
3237
<dependency>
3338
<groupId>org.projectlombok</groupId>
3439
<artifactId>lombok</artifactId>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.alibaba.chaosblade.exec.common.aop.matcher.busi;
2+
3+
import com.alibaba.chaosblade.exec.common.aop.CustomMatcher;
4+
import com.alibaba.chaosblade.exec.common.util.BusinessParamUtil;
5+
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
/**
10+
11+
*/
12+
public class BusinessParamMatcher implements CustomMatcher {
13+
private static final BusinessParamMatcher INSTANCE = new BusinessParamMatcher();
14+
15+
private BusinessParamMatcher() {
16+
}
17+
18+
public static BusinessParamMatcher getInstance() {
19+
return INSTANCE;
20+
}
21+
22+
@Override
23+
public boolean match(String commandValue, Object originValue) {
24+
Map<String, String> businessData = (Map<String, String>) originValue;
25+
List<BusinessParamUtil.BusinessParam> businessParams = BusinessParamUtil.parseFromJsonStr(commandValue);
26+
for (BusinessParamUtil.BusinessParam businessParam : businessParams) {
27+
if (!businessData.containsKey(businessParam.getKey())) {
28+
return false;
29+
}
30+
if (!businessData.get(businessParam.getKey()).equals(businessParam.getValue())) {
31+
return false;
32+
}
33+
}
34+
return true;
35+
}
36+
37+
@Override
38+
public boolean regexMatch(String commandValue, Object originValue) {
39+
return false;
40+
}
41+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.alibaba.chaosblade.exec.common.center;
2+
3+
4+
import java.util.*;
5+
6+
public class DefaultSPIServiceManager implements SPIServiceManager {
7+
private static Map<String, List<Object>> spiMap;
8+
9+
static {
10+
spiMap = new HashMap<String, List<Object>>();
11+
}
12+
13+
@Override
14+
public void load() {
15+
16+
}
17+
@Override
18+
public List<Object> getServices(String className, ClassLoader classLoader) {
19+
if (spiMap.containsKey(className)) {
20+
return spiMap.get(className);
21+
}
22+
synchronized (this) {
23+
if (spiMap.containsKey(className)) {
24+
return spiMap.get(className);
25+
}
26+
List<Object> services = loadService(className, classLoader);
27+
spiMap.put(className, services);
28+
return services;
29+
}
30+
}
31+
32+
public List<Object> loadService(String className, ClassLoader classLoader) {
33+
Class clazz;
34+
try {
35+
clazz = classLoader.loadClass(className);
36+
} catch (ClassNotFoundException e) {
37+
return Collections.EMPTY_LIST;
38+
}
39+
ServiceLoader serviceLoader = ServiceLoader.load(clazz, classLoader);
40+
List<Object> objects = new ArrayList<Object>();
41+
for (Object object : serviceLoader) {
42+
objects.add(object);
43+
}
44+
return objects;
45+
}
46+
47+
@Override
48+
public void unload() {
49+
spiMap.clear();
50+
}
51+
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/center/ManagerFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public class ManagerFactory {
3434
*/
3535
private static ListenerManager listenerManager = new DefaultListenerManager();
3636

37+
private static SPIServiceManager spiServiceManager = new DefaultSPIServiceManager();
38+
3739
public static StatusManager getStatusManager() {
3840
return statusManager;
3941
}
@@ -46,10 +48,15 @@ public static ListenerManager getListenerManager() {
4648
return listenerManager;
4749
}
4850

51+
public static SPIServiceManager spiServiceManager() {
52+
return spiServiceManager;
53+
}
54+
4955
public static void load() {
5056
modelSpecManager.load();
5157
listenerManager.load();
5258
statusManager.load();
59+
spiServiceManager.load();
5360
}
5461

5562
/**
@@ -59,5 +66,6 @@ public static void unload() {
5966
statusManager.unload();
6067
modelSpecManager.unload();
6168
listenerManager.unload();
69+
spiServiceManager.unload();
6270
}
6371
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.alibaba.chaosblade.exec.common.center;
2+
3+
import java.util.List;
4+
5+
public interface SPIServiceManager extends ManagerService{
6+
List<Object> getServices(String className, ClassLoader classLoader);
7+
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/constant/ModelConstant.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
public interface ModelConstant {
2323
String JVM_TARGET = "jvm";
2424

25+
String HTTP_TARGET = "http";
26+
27+
String HTTP_URL_MATCHER_NAME = "uri";
28+
2529
/**
2630
* The name of effect percent matcher
2731
*/
@@ -36,4 +40,9 @@ public interface ModelConstant {
3640
* The flag of regex pattern
3741
*/
3842
String REGEX_PATTERN_FLAG = "regex-pattern";
43+
44+
/**
45+
* the flag of buisness params
46+
*/
47+
String BUSINESS_PARAMS = "b-params";
3948
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/context/GlobalContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ public Object get(String key) {
5454
public Object remove(String key) {
5555
return contextMap.remove(key);
5656
}
57+
58+
public boolean containsKey(String key){
59+
return contextMap.containsKey(key);
60+
}
5761
}
Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,45 @@
11
package com.alibaba.chaosblade.exec.common.context;
22

3+
import java.util.Map;
4+
35
/**
46
57
*/
68
public class ThreadLocalContext {
79

810
private static ThreadLocalContext DEFAULT = new ThreadLocalContext();
9-
private InheritableThreadLocal<Object> local = new InheritableThreadLocal<Object>();
11+
private InheritableThreadLocal<Content> local = new InheritableThreadLocal<Content>();
1012

1113
public static ThreadLocalContext getInstance() {
1214
return DEFAULT;
1315
}
1416

15-
public void set(Object value) {
17+
public void set(Content value) {
1618
local.set(value);
1719
}
1820

19-
public Object get() {
21+
public Content get() {
2022
return local.get();
2123
}
24+
25+
public static class Content{
26+
private StackTraceElement[] stackTraceElements;
27+
private Map<String, Map<String, String>> businessData;
28+
29+
public StackTraceElement[] getStackTraceElements() {
30+
return stackTraceElements;
31+
}
32+
33+
public void setStackTraceElements(StackTraceElement[] stackTraceElements) {
34+
this.stackTraceElements = stackTraceElements;
35+
}
36+
37+
public Map<String, Map<String, String>> getBusinessData() {
38+
return businessData;
39+
}
40+
41+
public void settValue(Map<String, Map<String, String>> businessData) {
42+
this.businessData = businessData;
43+
}
44+
}
2245
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/injection/Injector.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.alibaba.chaosblade.exec.common.model.action.returnv.UnsupportedReturnTypeException;
2929
import com.alibaba.chaosblade.exec.common.model.matcher.MatcherModel;
3030
import com.alibaba.chaosblade.exec.common.util.JsonUtil;
31+
import com.alibaba.chaosblade.exec.common.util.ModelUtil;
3132
import com.alibaba.chaosblade.exec.common.util.StringUtil;
3233
import org.slf4j.Logger;
3334
import org.slf4j.LoggerFactory;
@@ -163,9 +164,13 @@ private static boolean compare(Model model, EnhancerModel enhancerModel) {
163164
continue;
164165
}
165166
}
166-
167167
return false;
168168
}
169+
// business param match
170+
if (keyName.equals(ModelConstant.BUSINESS_PARAMS)) {
171+
Map<String, Map<String, String>> expMap = (Map<String, Map<String, String>>) value;
172+
value = expMap.get(ModelUtil.getIdentifier(model));
173+
}
169174
// custom match
170175
if (keyName.endsWith(ModelConstant.REGEX_PATTERN_FLAG) ? customMatcher.regexMatch(String.valueOf(entry.getValue()), value) : customMatcher.match(String.valueOf(entry.getValue()), value)) {
171176
continue;

0 commit comments

Comments
 (0)