diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java index e01ff4cd..05faebf1 100644 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java +++ b/infra/common/src/test/java/cn/hippo4j/common/toolkit/JSONUtilTest.java @@ -24,6 +24,8 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.junit.Assert; import org.junit.Test; +import org.json.JSONException; +import org.skyscreamer.jsonassert.JSONAssert; import java.util.Arrays; import java.util.Collections; @@ -42,7 +44,11 @@ public class JSONUtilTest { @Test public void assertToJSONString() { Assert.assertNull(JSONUtil.toJSONString(null)); - Assert.assertEquals(EXPECTED_FOO_JSON, JSONUtil.toJSONString(EXPECTED_FOO)); + try { + JSONAssert.assertEquals(EXPECTED_FOO_JSON, JSONUtil.toJSONString(EXPECTED_FOO), false); + } catch (JSONException jse) { + throw new RuntimeException(jse); + } } @Test diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java index adf128ed..1004e9d3 100644 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java +++ b/infra/common/src/test/java/cn/hippo4j/common/toolkit/Md5UtilTest.java @@ -19,12 +19,16 @@ package cn.hippo4j.common.toolkit; import cn.hippo4j.common.model.ThreadPoolParameterInfo; import org.junit.Test; +import org.mockito.MockedStatic; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.mockStatic; + public class Md5UtilTest { @Test @@ -50,12 +54,15 @@ public class Md5UtilTest { @Test public void assetGetTpContentMd5() { - String md5Result = "ef5ea7cb47377fb9fb85a7125e76715d"; - ThreadPoolParameterInfo threadPoolParameterInfo = ThreadPoolParameterInfo.builder().tenantId("prescription") - .itemId("dynamic-threadpool-example").tpId("message-consume").content("描述信息").corePoolSize(1) - .maximumPoolSize(2).queueType(1).capacity(4).keepAliveTime(513L).executeTimeOut(null).rejectedType(4) - .isAlarm(1).capacityAlarm(80).livenessAlarm(80).allowCoreThreadTimeOut(1).build(); - Assert.isTrue(md5Result.equals(Md5Util.getTpContentMd5(threadPoolParameterInfo))); + final ThreadPoolParameterInfo threadPoolParameterInfo = new ThreadPoolParameterInfo(); + final String mockContent = "mockContent"; + final String mockContentMd5 = "34cf17bc632ece6e4c81a4ce8aa97d5e"; + try (final MockedStatic mockedContentUtil = mockStatic(ContentUtil.class)) { + mockedContentUtil.when(() -> ContentUtil.getPoolContent(threadPoolParameterInfo)).thenReturn(mockContent); + final String result = Md5Util.getTpContentMd5(threadPoolParameterInfo); + Assert.isTrue(result.equals(mockContentMd5)); + mockedContentUtil.verify(() -> ContentUtil.getPoolContent(threadPoolParameterInfo), times(1)); + } } @Test diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java index 73e5c282..06b55f44 100644 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java +++ b/infra/common/src/test/java/cn/hippo4j/common/toolkit/http/HttpUtilsTest.java @@ -37,7 +37,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; public class HttpUtilsTest { @@ -169,7 +169,7 @@ public class HttpUtilsTest { @Test public void buildUrl() { - Map map = new HashMap<>(); + Map map = new LinkedHashMap<>(); map.put(password, passwordValue); map.put(username, usernameValue); String s = HttpUtil.buildUrl(url + PORT, map); diff --git a/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java b/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java index 5750f587..7909caf9 100644 --- a/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java +++ b/infra/common/src/test/java/cn/hippo4j/common/toolkit/logtracing/LogMessageTest.java @@ -73,7 +73,8 @@ public class LogMessageTest { public void testKvShouldPutAllKeyAndValuePairs() { logMessage.kv("key1", "value1"); logMessage.kv("key2", "value2"); - assertEquals("key1=value1||key2=value2", logMessage.toString()); + String output = logMessage.toString(); + assertTrue(output.equals("key1=value1||key2=value2") || output.equals("key2=value2||key1=value1")); } @Test diff --git a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java b/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java index ab743fd2..4f7316da 100644 --- a/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java +++ b/kernel/dynamic/api/src/main/java/cn/hippo4j/threadpool/dynamic/api/BootstrapPropertiesInterface.java @@ -101,4 +101,11 @@ public interface BootstrapPropertiesInterface { return null; } + /** + * Get Polaris. + */ + default Map getPolaris() { + return null; + } + } diff --git a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java index ea1dc322..1bc87dc0 100644 --- a/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java +++ b/kernel/dynamic/mode/config/src/main/java/cn/hippo4j/threadpool/dynamic/mode/config/properties/BootstrapConfigProperties.java @@ -76,6 +76,11 @@ public class BootstrapConfigProperties implements BootstrapPropertiesInterface { */ private Map etcd; + /** + * polaris config + */ + private Map polaris; + /** * Web config * diff --git a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java index dbabc582..440c56db 100644 --- a/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java +++ b/kernel/message/core/src/main/java/cn/hippo4j/threadpool/message/core/platform/WeChatSendMessageHandler.java @@ -66,7 +66,7 @@ public class WeChatSendMessageHandler extends AbstractRobotSendMessageHandler { weChatReq.setMarkdown(markdown); String responseBody = HttpUtil.post(serverUrl, weChatReq); WeChatRobotResponse response = JSONUtil.parseObject(responseBody, WeChatRobotResponse.class); - Assert.isTrue(response != null, "Response is null."); + Assert.notNull(response, "Response is null."); if (response.getErrcode() != 0) { log.error("WeChat failed to send message, reason : {}", response.errmsg); } diff --git a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java index 3f2a3f8b..b06b4ebf 100644 --- a/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java +++ b/starters/threadpool/config/src/main/java/cn/hippo4j/config/springboot/starter/refresher/PolarisRefresherHandler.java @@ -71,4 +71,5 @@ public class PolarisRefresherHandler extends AbstractConfigThreadPoolDynamicRefr return Objects.equals(POLARIS_FILE_TYPE, "yaml") ? configFileService.getConfigYamlFile(namespace, fileGroup, fileName) : configFileService.getConfigPropertiesFile(namespace, fileGroup, fileName); } + } diff --git a/threadpool/core/src/main/java/cn/hippo4j/core/enable/BeforeCheckConfiguration.java b/threadpool/core/src/main/java/cn/hippo4j/core/enable/BeforeCheckConfiguration.java index 5265faf6..20c2df30 100644 --- a/threadpool/core/src/main/java/cn/hippo4j/core/enable/BeforeCheckConfiguration.java +++ b/threadpool/core/src/main/java/cn/hippo4j/core/enable/BeforeCheckConfiguration.java @@ -23,6 +23,7 @@ import cn.hippo4j.core.config.ConfigEmptyException; import cn.hippo4j.threadpool.dynamic.api.BootstrapPropertiesInterface; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; @@ -144,6 +145,39 @@ public class BeforeCheckConfiguration { } } + Map polaris = properties.getPolaris(); + if (MapUtil.isNotEmpty(polaris)) { + String namespace = polaris.get("namespace").toString(); + if (StringUtil.isBlank(namespace)) { + throw new ConfigEmptyException( + "Web server maybe fail to start. The dynamic thread pool polaris namespace is empty.", + "Please check whether the [spring.dynamic.thread-pool.polaris.namespace] configuration is empty or an empty string."); + } + if (!(polaris.get("file") instanceof Map)) { + throw new ConfigEmptyException( + "Web server maybe fail to start. Lack of the dynamic thread pool polaris file configuration.", + "Please check whether the [spring.dynamic.thread-pool.polaris.file.*] configuration is complete."); + } + Map polarisFile = (Map) polaris.get("file"); + String fileGroup = polarisFile.get("group"); + if (StringUtil.isBlank(fileGroup)) { + throw new ConfigEmptyException( + "Web server maybe fail to start. The dynamic thread pool polaris file group is empty.", + "Please check whether the [spring.dynamic.thread-pool.polaris.file.group] configuration is empty or an empty string."); + } + String fileName = polarisFile.get("name"); + if (StringUtil.isBlank(fileName)) { + throw new ConfigEmptyException( + "Web server maybe fail to start. The dynamic thread pool polaris file name is empty.", + "Please check whether the [spring.dynamic.thread-pool.polaris.file.name] configuration is empty or an empty string."); + } + String fileType = polarisFile.get("type"); + if (StringUtil.isBlank(fileType)) { + throw new ConfigEmptyException( + "Web server maybe fail to start. The dynamic thread pool polaris file type is empty.", + "Please check whether the [spring.dynamic.thread-pool.polaris.file.type] configuration is empty or an empty string."); + } + } break; } default: diff --git a/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorActiveRespDTO.java b/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorActiveRespDTO.java index 83c4b6b2..53e9e8f3 100644 --- a/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorActiveRespDTO.java +++ b/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorActiveRespDTO.java @@ -18,6 +18,7 @@ package cn.hippo4j.config.model.biz.monitor; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -27,6 +28,7 @@ import java.util.List; * Monitor active resp dto. */ @Data +@Builder @NoArgsConstructor @AllArgsConstructor public class MonitorActiveRespDTO { @@ -51,11 +53,21 @@ public class MonitorActiveRespDTO { */ private List queueSizeList; + /** + * Range completed task count list + */ + private List rangeCompletedTaskCountList; + /** * Completed task count list */ private List completedTaskCountList; + /** + * Range reject count list + */ + private List rangeRejectCountList; + /** * Reject count list */ @@ -66,11 +78,6 @@ public class MonitorActiveRespDTO { */ private List queueRemainingCapacityList; - /** - * Current load list - */ - private List currentLoadList; - /** * Queue capacity list */ diff --git a/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorQueryReqDTO.java b/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorQueryReqDTO.java index f5e4e119..93c9e09d 100644 --- a/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorQueryReqDTO.java +++ b/threadpool/server/config/src/main/java/cn/hippo4j/config/model/biz/monitor/MonitorQueryReqDTO.java @@ -44,4 +44,14 @@ public class MonitorQueryReqDTO { * Instance id */ private String instanceId; + + /** + * Start time + */ + private Long startTime; + + /** + * End time + */ + private Long endTime; } diff --git a/threadpool/server/config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java b/threadpool/server/config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java index 385ccbd3..f0894f45 100644 --- a/threadpool/server/config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java +++ b/threadpool/server/config/src/main/java/cn/hippo4j/config/service/biz/impl/HisRunDataServiceImpl.java @@ -17,13 +17,14 @@ package cn.hippo4j.config.service.biz.impl; +import cn.hippo4j.common.model.Result; import cn.hippo4j.common.monitor.Message; import cn.hippo4j.common.monitor.MessageWrapper; import cn.hippo4j.common.monitor.RuntimeMessage; +import cn.hippo4j.common.toolkit.BeanUtil; import cn.hippo4j.common.toolkit.DateUtil; import cn.hippo4j.common.toolkit.GroupKey; import cn.hippo4j.common.toolkit.MessageConvert; -import cn.hippo4j.common.model.Result; import cn.hippo4j.config.config.ServerBootstrapProperties; import cn.hippo4j.config.mapper.HisRunDataMapper; import cn.hippo4j.config.model.HisRunDataInfo; @@ -33,7 +34,6 @@ import cn.hippo4j.config.model.biz.monitor.MonitorRespDTO; import cn.hippo4j.config.monitor.QueryMonitorExecuteChoose; import cn.hippo4j.config.service.ConfigCacheService; import cn.hippo4j.config.service.biz.HisRunDataService; -import cn.hippo4j.common.toolkit.BeanUtil; import cn.hippo4j.server.common.base.Results; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; @@ -45,7 +45,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; import static cn.hippo4j.common.constant.MagicNumberConstants.INDEX_0; import static cn.hippo4j.common.constant.MagicNumberConstants.INDEX_1; @@ -84,15 +83,20 @@ public class HisRunDataServiceImpl extends ServiceImpl hisRunDataInfos = this.lambdaQuery() .eq(HisRunDataInfo::getTenantId, reqDTO.getTenantId()) .eq(HisRunDataInfo::getItemId, reqDTO.getItemId()) .eq(HisRunDataInfo::getTpId, reqDTO.getTpId()) .eq(HisRunDataInfo::getInstanceId, reqDTO.getInstanceId()) - .between(HisRunDataInfo::getTimestamp, startTime, DateUtil.getTime(currentDate)) + .between(HisRunDataInfo::getTimestamp, startTime, endTime) .orderByAsc(HisRunDataInfo::getTimestamp) .list(); List times = new ArrayList<>(); @@ -100,34 +104,48 @@ public class HisRunDataServiceImpl extends ServiceImpl activeSizeList = new ArrayList<>(); List queueCapacityList = new ArrayList<>(); List queueSizeList = new ArrayList<>(); + List rangeCompletedTaskCountList = new ArrayList<>(); List completedTaskCountList = new ArrayList<>(); + List rangeRejectCountList = new ArrayList<>(); List rejectCountList = new ArrayList<>(); List queueRemainingCapacityList = new ArrayList<>(); - List currentLoadList = new ArrayList<>(); - long countTemp = 0L; - AtomicBoolean firstFlag = new AtomicBoolean(Boolean.TRUE); + long completedTaskCountTemp = 0L; + long rejectCountTemp = 0L; + boolean firstFlag = true; for (HisRunDataInfo each : hisRunDataInfos) { String time = DateUtil.format(new Date(each.getTimestamp()), NORM_TIME_PATTERN); times.add(time); poolSizeList.add(each.getPoolSize()); activeSizeList.add(each.getActiveSize()); queueSizeList.add(each.getQueueSize()); - rejectCountList.add(each.getRejectCount()); queueRemainingCapacityList.add(each.getQueueRemainingCapacity()); - currentLoadList.add(each.getCurrentLoad()); queueCapacityList.add(each.getQueueCapacity()); - if (firstFlag.get()) { + if (firstFlag) { + firstFlag = false; completedTaskCountList.add(0L); - firstFlag.set(Boolean.FALSE); - countTemp = each.getCompletedTaskCount(); + completedTaskCountTemp = each.getCompletedTaskCount(); + rejectCountTemp = each.getRejectCount(); continue; } - long completedTaskCount = each.getCompletedTaskCount(); - long countTask = completedTaskCount - countTemp; - completedTaskCountList.add(countTask); - countTemp = each.getCompletedTaskCount(); + rangeCompletedTaskCountList.add(each.getCompletedTaskCount() - completedTaskCountTemp); + completedTaskCountList.add(each.getCompletedTaskCount()); + rangeRejectCountList.add(each.getRejectCount() - rejectCountTemp); + rejectCountList.add(each.getRejectCount()); + completedTaskCountTemp = each.getCompletedTaskCount(); + rejectCountTemp = each.getRejectCount(); } - return new MonitorActiveRespDTO(times, poolSizeList, activeSizeList, queueSizeList, completedTaskCountList, rejectCountList, queueRemainingCapacityList, currentLoadList, queueCapacityList); + return MonitorActiveRespDTO.builder() + .times(times) + .poolSizeList(poolSizeList) + .activeSizeList(activeSizeList) + .queueSizeList(queueSizeList) + .queueCapacityList(queueCapacityList) + .rangeRejectCountList(rangeRejectCountList) + .rejectCountList(rejectCountList) + .completedTaskCountList(completedTaskCountList) + .rangeCompletedTaskCountList(rangeCompletedTaskCountList) + .queueRemainingCapacityList(queueRemainingCapacityList) + .build(); } @Override