Skip to content

Commit 7ff3935

Browse files
authored
The eigenvalues are recalculated through configuration (#125)
* feat: The eigenvalues are recalculated through configuration
1 parent 2df1a6e commit 7ff3935

File tree

8 files changed

+164
-9
lines changed

8 files changed

+164
-9
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.arextest.config.model.vo;
2+
3+
import lombok.Data;
4+
5+
import javax.validation.constraints.NotEmpty;
6+
import javax.validation.constraints.NotNull;
7+
8+
/**
9+
* created by xinyuan_wang on 2023/12/4
10+
*/
11+
@Data
12+
public class QueryConfigOfCategoryRequest {
13+
14+
@NotNull
15+
private String appId;
16+
17+
private String operationName;
18+
19+
private String categoryName;
20+
21+
@NotEmpty
22+
private Boolean entryPoint;
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.arextest.config.model.vo;
2+
3+
import java.util.List;
4+
import java.util.Set;
5+
import lombok.Data;
6+
7+
/**
8+
* created by xinyuan_wang on 2023/12/4
9+
*/
10+
@Data
11+
public class QueryConfigOfCategoryResponse {
12+
private QueryConfigOfCategory body;
13+
14+
@Data
15+
public static class QueryConfigOfCategory {
16+
private String operationName;
17+
18+
private Set<List<String>> exclusionList;
19+
20+
private Set<String> ignoreNodeSet;
21+
}
22+
}

arex-storage-web-api/src/main/java/com/arextest/storage/mock/EigenProcessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ public class EigenProcessor {
1919

2020
public static Map<Integer, Long> calculateEigen(String body, String categoryName,
2121
Collection<List<String>> exclusions,
22-
Collection<String> nodeNames) {
22+
Collection<String> ignoreNodes) {
2323
EigenOptions options = EigenOptions.options();
2424
options.putCategoryType(categoryName);
2525
if (CollectionUtils.isNotEmpty(exclusions)) {
2626
options.putExclusions(exclusions);
2727
}
28-
if (CollectionUtils.isNotEmpty(nodeNames)) {
29-
options.putIgnoreNodes(nodeNames);
28+
if (CollectionUtils.isNotEmpty(ignoreNodes)) {
29+
options.putIgnoreNodes(ignoreNodes);
3030
}
3131
EigenResult eigenResult = eigenSDK.calculateEigen(body, options);
3232
if (eigenResult == null) {

arex-storage-web-api/src/main/java/com/arextest/storage/mock/MockResultProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ <T extends Mocker> boolean removeRecordResult(MockCategoryType category, String
3434
* @param item
3535
* @return
3636
*/
37-
void calculateEigen(@NotNull Mocker item);
37+
void calculateEigen(@NotNull Mocker item, boolean queryConfig);
3838
}

arex-storage-web-api/src/main/java/com/arextest/storage/mock/impl/DefaultMockResultProviderImpl.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.arextest.common.cache.CacheProvider;
44
import com.arextest.common.utils.CompressionUtils;
5+
import com.arextest.config.model.vo.QueryConfigOfCategoryResponse.QueryConfigOfCategory;
56
import com.arextest.model.constants.MockAttributeNames;
67
import com.arextest.model.mock.AREXMocker;
78
import com.arextest.model.mock.MockCategoryType;
@@ -16,10 +17,12 @@
1617
import com.arextest.storage.mock.internal.matchkey.impl.DatabaseMatchKeyBuilderImpl;
1718
import com.arextest.storage.model.MockResultType;
1819
import com.arextest.storage.serialization.ZstdJacksonSerializer;
20+
import com.arextest.storage.service.QueryConfigService;
1921
import com.google.common.collect.Lists;
2022
import com.google.common.collect.Maps;
2123
import java.util.ArrayList;
2224
import java.util.Arrays;
25+
import java.util.Collection;
2326
import java.util.Collections;
2427
import java.util.Comparator;
2528
import java.util.Iterator;
@@ -70,6 +73,8 @@ final class DefaultMockResultProviderImpl implements MockResultProvider {
7073
private MatchStrategyMetricService matchStrategyMetricService;
7174
@Resource
7275
private DatabaseMatchKeyBuilderImpl databaseMatchKeyBuilder;
76+
@Resource
77+
private QueryConfigService queryConfigService;
7378

7479
/**
7580
* 1. Store recorded data and matching keys in redis 2. The mock type associated with dubbo, which
@@ -134,7 +139,7 @@ private <T extends Mocker> int sequencePutRecordData(MockCategoryType category,
134139
byte[] recordIdBytes, int size, byte[] recordKey, T value, int sequence,
135140
Map<byte[], Integer> mockSequenceKeyMaps) {
136141
if (useEigenMatch && MapUtils.isEmpty(value.getEigenMap())) {
137-
calculateEigen(value);
142+
calculateEigen(value, true);
138143
}
139144
List<byte[]> mockKeyList = matchKeyFactory.build(value);
140145
final byte[] zstdValue = serializer.serialize(value);
@@ -243,7 +248,7 @@ public <T extends Mocker> boolean removeRecordResult(MockCategoryType category,
243248
}
244249

245250
@Override
246-
public void calculateEigen(Mocker item) {
251+
public void calculateEigen(Mocker item, boolean queryConfig) {
247252
try {
248253
if (item.getCategoryType().isEntryPoint()) {
249254
return;
@@ -254,8 +259,20 @@ public void calculateEigen(Mocker item) {
254259
return;
255260
}
256261

262+
// get exclusion and ignore node from arex-api.use this to reduction noise
263+
Collection<List<String>> exclusions = null;
264+
Collection<String> ignoreNodes = null;
265+
if (queryConfig) {
266+
QueryConfigOfCategory queryConfigOfCategory = queryConfigService.queryConfigOfCategory(
267+
item);
268+
if (queryConfigOfCategory != null) {
269+
exclusions = queryConfigOfCategory.getExclusionList();
270+
ignoreNodes = queryConfigOfCategory.getIgnoreNodeSet();
271+
}
272+
}
273+
257274
Map<Integer, Long> calculateEigen = EigenProcessor.calculateEigen(eigenBody,
258-
item.getCategoryType().getName(), null, null);
275+
item.getCategoryType().getName(), exclusions, ignoreNodes);
259276
if (MapUtils.isEmpty(calculateEigen)) {
260277
LOGGER.warn("calculate eigen is null");
261278
return;
@@ -357,7 +374,7 @@ public byte[] getRecordResult(@NotNull Mocker mockItem, MockResultContext contex
357374
try {
358375
long start = System.currentTimeMillis();
359376
if (useEigenMatch) {
360-
calculateEigen(mockItem);
377+
calculateEigen(mockItem, false);
361378
}
362379
List<byte[]> mockKeyList = matchKeyFactory.build(mockItem);
363380
long end = System.currentTimeMillis();

arex-storage-web-api/src/main/java/com/arextest/storage/service/AgentWorkingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public <T extends Mocker> boolean saveRecord(@NotNull T item) {
7979
return true;
8080
}
8181

82-
mockResultProvider.calculateEigen(item);
82+
mockResultProvider.calculateEigen(item, true);
8383
RepositoryProvider<T> repositoryWriter = repositoryProviderFactory.defaultProvider();
8484
return repositoryWriter != null && repositoryWriter.save(item);
8585
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.arextest.storage.service;
2+
3+
import com.arextest.common.cache.CacheProvider;
4+
import com.arextest.config.model.vo.QueryConfigOfCategoryResponse.QueryConfigOfCategory;
5+
import com.arextest.config.model.vo.QueryConfigOfCategoryRequest;
6+
import com.arextest.config.model.vo.QueryConfigOfCategoryResponse;
7+
import com.arextest.model.mock.Mocker;
8+
import com.arextest.storage.cache.CacheKeyUtils;
9+
import com.arextest.storage.client.HttpWepServiceApiClient;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.beans.factory.annotation.Value;
12+
import org.springframework.stereotype.Service;
13+
14+
import javax.annotation.Resource;
15+
16+
import static com.arextest.diff.utils.JacksonHelperUtil.objectMapper;
17+
18+
/**
19+
* query config service
20+
* created by xinyuan_wang on 2023/11/5
21+
*/
22+
@Service
23+
@Slf4j
24+
public class QueryConfigService {
25+
private static final String CONFIG_PREFIX = "config_";
26+
@Value("${arex.query.config.url}")
27+
private String queryConfigOfCategoryUrl;
28+
@Value("${arex.query.config.cache.expired.seconds:600}")
29+
private long cacheExpiredSeconds;
30+
@Resource
31+
private HttpWepServiceApiClient httpWepServiceApiClient;
32+
@Resource
33+
private CacheProvider redisCacheProvider;
34+
35+
public QueryConfigOfCategory queryConfigOfCategory(Mocker mocker) {
36+
if (mocker.getCategoryType().isSkipComparison()) {
37+
return null;
38+
}
39+
String categoryName = mocker.getCategoryType().getName();
40+
String appId = mocker.getAppId();
41+
String operationName = mocker.getOperationName();
42+
43+
QueryConfigOfCategory configCache = getConfigCache(appId, categoryName,
44+
operationName);
45+
if (configCache != null) {
46+
return configCache;
47+
}
48+
49+
QueryConfigOfCategoryRequest queryConfigOfCategoryRequest = new QueryConfigOfCategoryRequest();
50+
queryConfigOfCategoryRequest.setCategoryName(categoryName);
51+
queryConfigOfCategoryRequest.setAppId(appId);
52+
queryConfigOfCategoryRequest.setEntryPoint(mocker.getCategoryType().isEntryPoint());
53+
queryConfigOfCategoryRequest.setOperationName(operationName);
54+
QueryConfigOfCategoryResponse queryConfigOfCategoryResponse =
55+
httpWepServiceApiClient.jsonPost(queryConfigOfCategoryUrl, queryConfigOfCategoryRequest, QueryConfigOfCategoryResponse.class);
56+
if (queryConfigOfCategoryResponse != null && queryConfigOfCategoryResponse.getBody() != null) {
57+
putConfigCache(appId, categoryName, operationName, queryConfigOfCategoryResponse.getBody());
58+
return queryConfigOfCategoryResponse.getBody();
59+
}
60+
return null;
61+
}
62+
63+
public boolean putConfigCache(String appId, String categoryName, String operationName,
64+
QueryConfigOfCategory response) {
65+
try {
66+
byte[] key = CacheKeyUtils.toUtf8Bytes(CONFIG_PREFIX + appId + categoryName + operationName);
67+
byte[] values = CacheKeyUtils.toUtf8Bytes(objectMapper.writeValueAsString(response));
68+
redisCacheProvider.put(key, cacheExpiredSeconds, values);
69+
return true;
70+
} catch (Exception e) {
71+
LOGGER.error("putConfigCache failed!", e);
72+
return false;
73+
}
74+
}
75+
76+
public QueryConfigOfCategory getConfigCache(String appId, String categoryName, String operationName) {
77+
try {
78+
byte[] key = CacheKeyUtils.toUtf8Bytes(CONFIG_PREFIX + appId + categoryName + operationName);
79+
byte[] values = redisCacheProvider.get(key);
80+
if (values == null) {
81+
return null;
82+
}
83+
return objectMapper.readValue(new String(values), QueryConfigOfCategory.class);
84+
} catch (Exception e) {
85+
LOGGER.error("getConfigCache failed!", e);
86+
return null;
87+
}
88+
}
89+
90+
}

arex-storage-web-api/src/main/resources/application.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ arex:
1212
app:
1313
auth:
1414
switch: true
15+
query:
16+
config:
17+
url: ${arex.api.service.api:http://arex-api-service:8080}/api/config/comparison/summary/queryConfigOfCategory
1518
config:
1619
# default for application settings
1720
application:

0 commit comments

Comments
 (0)