From 86abf4f6348fa25f215b9cfbffde9d96c216704f Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Mon, 29 Sep 2025 13:35:47 +0800 Subject: [PATCH 01/13] =?UTF-8?q?:hammer:=20=E5=91=8A=E8=AD=A6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yaml | 2 +- .../src/main/resources/application-prod.yaml | 2 +- .../visor/module/monitor/convert/AlarmEventConvert.java | 4 ++-- .../dromara/visor/module/monitor/dao/AlarmEventDAO.java | 8 ++++---- ...larmPolicyAlarmCountPO.java => AlarmEventCountPO.java} | 4 ++-- .../monitor/service/impl/AlarmEventServiceImpl.java | 4 ++-- .../src/main/resources/mapper/AlarmEventMapper.xml | 3 ++- 7 files changed, 14 insertions(+), 13 deletions(-) rename orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/{AlarmPolicyAlarmCountPO.java => AlarmEventCountPO.java} (90%) diff --git a/orion-visor-launch/src/main/resources/application-dev.yaml b/orion-visor-launch/src/main/resources/application-dev.yaml index 312c7a46..a448b939 100644 --- a/orion-visor-launch/src/main/resources/application-dev.yaml +++ b/orion-visor-launch/src/main/resources/application-dev.yaml @@ -1,7 +1,7 @@ spring: datasource: druid: - url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:orion_visor}?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true + url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:orion_visor}?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&rewriteBatchedStatements=true&useServerPrepStmts=false username: ${MYSQL_USER:root} password: ${MYSQL_PASSWORD:Data@123456} initial-size: 0 diff --git a/orion-visor-launch/src/main/resources/application-prod.yaml b/orion-visor-launch/src/main/resources/application-prod.yaml index c6cf2897..e9c8619e 100644 --- a/orion-visor-launch/src/main/resources/application-prod.yaml +++ b/orion-visor-launch/src/main/resources/application-prod.yaml @@ -1,7 +1,7 @@ spring: datasource: druid: - url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:orion_visor}?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true + url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:orion_visor}?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true&rewriteBatchedStatements=true&useServerPrepStmts=false username: ${MYSQL_USER:root} password: ${MYSQL_PASSWORD:Data@123456} # 初始连接数 diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmEventConvert.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmEventConvert.java index 17cf1559..02ff51e9 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmEventConvert.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmEventConvert.java @@ -25,7 +25,7 @@ package org.dromara.visor.module.monitor.convert; import org.dromara.visor.module.monitor.entity.domain.AlarmEventDO; import org.dromara.visor.module.monitor.entity.dto.AlarmEventTriggerDTO; import org.dromara.visor.module.monitor.entity.dto.AlarmPolicyAlarmCountDTO; -import org.dromara.visor.module.monitor.entity.po.AlarmPolicyAlarmCountPO; +import org.dromara.visor.module.monitor.entity.po.AlarmEventCountPO; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmEventQueryRequest; import org.dromara.visor.module.monitor.entity.vo.AlarmEventVO; import org.mapstruct.Mapper; @@ -51,7 +51,7 @@ public interface AlarmEventConvert { AlarmEventTriggerDTO toTrigger(AlarmEventDO domain); - AlarmPolicyAlarmCountDTO toCount(AlarmPolicyAlarmCountPO domain); + AlarmPolicyAlarmCountDTO toCount(AlarmEventCountPO domain); List to(List list); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmEventDAO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmEventDAO.java index ff3544d6..723e56ce 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmEventDAO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmEventDAO.java @@ -26,7 +26,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.dromara.visor.framework.mybatis.core.mapper.IMapper; import org.dromara.visor.module.monitor.entity.domain.AlarmEventDO; -import org.dromara.visor.module.monitor.entity.po.AlarmPolicyRuleCountPO; +import org.dromara.visor.module.monitor.entity.po.AlarmEventCountPO; import java.util.Date; import java.util.List; @@ -49,8 +49,8 @@ public interface AlarmEventDAO extends IMapper { * @param createTimeEnd createTimeEnd * @return count */ - List selectPolicyEventCount(@Param("policyIdList") List policyIdList, - @Param("createTimeStart") Date createTimeStart, - @Param("createTimeEnd") Date createTimeEnd); + List selectPolicyEventCount(@Param("policyIdList") List policyIdList, + @Param("createTimeStart") Date createTimeStart, + @Param("createTimeEnd") Date createTimeEnd); } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmPolicyAlarmCountPO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmEventCountPO.java similarity index 90% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmPolicyAlarmCountPO.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmEventCountPO.java index 65658320..25ba477e 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmPolicyAlarmCountPO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/po/AlarmEventCountPO.java @@ -41,8 +41,8 @@ import java.io.Serializable; @Builder @NoArgsConstructor @AllArgsConstructor -@Schema(name = "AlarmPolicyAlarmCountPO", description = "监控告警事件数量对象") -public class AlarmPolicyAlarmCountPO implements Serializable { +@Schema(name = "AlarmEventCountPO", description = "监控告警事件数量对象") +public class AlarmEventCountPO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmEventServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmEventServiceImpl.java index 9d91224a..612ac92d 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmEventServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmEventServiceImpl.java @@ -43,7 +43,7 @@ import org.dromara.visor.module.monitor.dao.AlarmEventDAO; import org.dromara.visor.module.monitor.define.cache.AlarmEventCacheKeyDefine; import org.dromara.visor.module.monitor.entity.domain.AlarmEventDO; import org.dromara.visor.module.monitor.entity.dto.AlarmPolicyAlarmCountDTO; -import org.dromara.visor.module.monitor.entity.po.AlarmPolicyRuleCountPO; +import org.dromara.visor.module.monitor.entity.po.AlarmEventCountPO; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmEventClearRequest; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmEventHandleRequest; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmEventQueryRequest; @@ -198,7 +198,7 @@ public class AlarmEventServiceImpl implements AlarmEventService { if (!queryIdList.isEmpty()) { Map countMap = alarmEventDAO.selectPolicyEventCount(queryIdList, startDate, endDate) .stream() - .collect(Collectors.toMap(AlarmPolicyRuleCountPO::getPolicyId, AlarmPolicyRuleCountPO::getCount)); + .collect(Collectors.toMap(AlarmEventCountPO::getPolicyId, AlarmEventCountPO::getCount)); // 设置缓存 for (Long policyId : queryIdList) { Integer count = Objects1.def(countMap.get(policyId), 0); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/resources/mapper/AlarmEventMapper.xml b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/resources/mapper/AlarmEventMapper.xml index 2fedaf31..27d2f526 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/resources/mapper/AlarmEventMapper.xml +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/resources/mapper/AlarmEventMapper.xml @@ -34,7 +34,7 @@ - + @@ -48,6 +48,7 @@ SELECT policy_id, COUNT(1) total_count FROM monitor_alarm_event WHERE deleted = 0 + AND false_alarm = 0 AND policy_id IN #{item} From 29e6db75ca86c5ba0916f01e5ee88d4b11543f3b Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Sat, 4 Oct 2025 21:31:03 +0800 Subject: [PATCH 02/13] =?UTF-8?q?:hammer:=20=E7=99=BB=E5=BD=95=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=8F=90=E7=A4=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orion-visor-ui/src/router/guard/user-login-info.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/orion-visor-ui/src/router/guard/user-login-info.ts b/orion-visor-ui/src/router/guard/user-login-info.ts index 9b189a21..9f23deb9 100644 --- a/orion-visor-ui/src/router/guard/user-login-info.ts +++ b/orion-visor-ui/src/router/guard/user-login-info.ts @@ -2,6 +2,7 @@ import type { RouteLocationRaw, Router } from 'vue-router'; import NProgress from 'nprogress'; import { useUserStore } from '@/store'; import { isLogin } from '@/utils/auth'; +import { Message } from '@arco-design/web-vue'; import { LOGIN_ROUTE_NAME, UPDATE_PASSWORD_ROUTE_NAME } from '@/router/constants'; /** @@ -30,6 +31,7 @@ export default function setupUserLoginInfoGuard(router: Router) { next(); } } catch (error) { + Message.error('获取用户信息失败'); // 获取失败退出登录 await userStore.logout(); next({ From d58d46ca8c51903b82211e5a3298a1c722c27019 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Mon, 6 Oct 2025 16:18:20 +0800 Subject: [PATCH 03/13] =?UTF-8?q?:hammer:=20=E4=BF=AE=E6=94=B9=20influx=20?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=AF=AD=E5=8F=A5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../influxdb/core/query/FluxQueryBuilder.java | 30 +++++-------------- .../request/host/MonitorHostChartRequest.java | 18 +++++------ .../service/impl/MonitorHostServiceImpl.java | 1 + .../compoments/metrics-chart.vue | 1 + 4 files changed, 19 insertions(+), 31 deletions(-) diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-influxdb/src/main/java/org/dromara/visor/framework/influxdb/core/query/FluxQueryBuilder.java b/orion-visor-framework/orion-visor-spring-boot-starter-influxdb/src/main/java/org/dromara/visor/framework/influxdb/core/query/FluxQueryBuilder.java index 1e479080..9289e369 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-influxdb/src/main/java/org/dromara/visor/framework/influxdb/core/query/FluxQueryBuilder.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-influxdb/src/main/java/org/dromara/visor/framework/influxdb/core/query/FluxQueryBuilder.java @@ -24,6 +24,7 @@ package org.dromara.visor.framework.influxdb.core.query; import cn.orionsec.kit.lang.utils.collect.Collections; import cn.orionsec.kit.lang.utils.collect.Lists; +import cn.orionsec.kit.lang.utils.collect.Maps; import org.dromara.visor.common.constant.Const; import java.time.Instant; @@ -194,7 +195,7 @@ public class FluxQueryBuilder { if (values.size() == 1) { return this.tag(key, Collections.first(values)); } - // + // 使用 or 拼接 Collection conditions = values.stream() .map(value -> String.format("r[\"%s\"] == \"%s\"", key, value)) .collect(Collectors.toList()); @@ -204,33 +205,18 @@ public class FluxQueryBuilder { } /** - * 过滤多个 tag - * tag 使用 and - * value 使用 or + * 过滤 tag * * @param tags tags * @return this */ public FluxQueryBuilder tags(Map> tags) { - for (Map.Entry> entry : tags.entrySet()) { - String key = entry.getKey(); - Collection values = entry.getValue(); - if (Collections.isEmpty(values)) { - continue; - } - if (values.size() == 1) { - // 单值直接用等号 - String singleValue = values.iterator().next(); - this.appendFilter(String.format("r[\"%s\"] == \"%s\"", key, singleValue)); - } else { - // 多值用 OR - Collection conditions = values.stream() - .map(v -> String.format("r[\"%s\"] == \"%s\"", key, v)) - .collect(Collectors.toList()); - this.appendFilter("(" + String.join(" or ", conditions) + ")"); - } + if (Maps.isEmpty(tags)) { + return this; + } + for (Map.Entry> entry : tags.entrySet()) { + this.tag(entry.getKey(), entry.getValue()); } - this.closeFilter(); return this; } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/host/MonitorHostChartRequest.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/host/MonitorHostChartRequest.java index 770a492d..d5245149 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/host/MonitorHostChartRequest.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/host/MonitorHostChartRequest.java @@ -59,17 +59,17 @@ public class MonitorHostChartRequest extends BaseQueryRequest { @Schema(description = "时间窗口") private String window; + @Schema(description = "时间区间") + private String range; + + @Schema(description = "时间区间") + private Long start; + + @Schema(description = "时间区间") + private Long end; + @NotBlank @Schema(description = "聚合参数") private String aggregate; - @Schema(description = "聚合参数") - private Long start; - - @Schema(description = "聚合参数") - private Long end; - - @Schema(description = "区间") - private String range; - } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java index f7888f3c..84623030 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java @@ -372,6 +372,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { } else { Assert.notNull(request.getStart(), ErrorMessage.PARAM_MISSING); Assert.notNull(request.getEnd(), ErrorMessage.PARAM_MISSING); + query.range(request.getStart(), request.getEnd()); } // 设置名称 Set names = null; diff --git a/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart.vue b/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart.vue index 5ae17b91..6927ccc6 100644 --- a/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart.vue +++ b/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart.vue @@ -70,6 +70,7 @@ animation: false, tooltip: { trigger: 'axis', + appendToBody: true, backgroundColor: 'rgba(255, 255, 255, 0.9)', textStyle: { color: 'rgba(0, 0, 0, 0.8)', From cb20d56a7bf9d76c1b1ee39a5d2a0fc609eea5ea Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Tue, 7 Oct 2025 00:28:34 +0800 Subject: [PATCH 04/13] =?UTF-8?q?:rocket:=20=E4=BF=AE=E5=A4=8D=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E5=BC=95=E6=93=8E=E5=88=9D=E5=A7=8B=E5=8C=96=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../visor/module/monitor/engine/AlarmEngineContext.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineContext.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineContext.java index 1592490d..5ad880f2 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineContext.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineContext.java @@ -125,6 +125,9 @@ public class AlarmEngineContext { * @return rules */ private Map> getPolicyRules(List list) { + if (Lists.isEmpty(list)) { + return new HashMap<>(); + } // 转为 map Map> ruleMap = Lists.stream(list) .map(s -> { @@ -154,6 +157,9 @@ public class AlarmEngineContext { * @return id */ private List getPolicyEngineNotifier(List list) { + if (Lists.isEmpty(list)) { + return new ArrayList<>(); + } return list.stream() .map(AlarmPolicyNotifyDO::getNotifyId) .distinct() From 25082b9ea121bccf1aa98044acecdf6a13912e00 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Tue, 7 Oct 2025 00:28:49 +0800 Subject: [PATCH 05/13] =?UTF-8?q?:hammer:=20=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8C=96.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose-testing.yaml | 6 +- docker-compose.yaml | 8 +- .../constant/AutoConfigureOrderConst.java | 4 +- orion-visor-dependencies/pom.xml | 5 + .../listener/PushMessageEventListener.java | 5 +- .../pom.xml | 27 ++++ .../OrionExecutorAutoConfiguration.java | 70 +++++++++++ .../configuration/config/ExecutorConfig.java | 102 +++++++++++++++ .../config/ExecutorsConfig.java} | 38 ++---- .../core/context/ExecutorContext.java | 119 ++++++++++++++++++ .../executor/core/utils/ExecutorUtils.java | 84 +++++++++++++ ...itional-spring-configuration-metadata.json | 77 ++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../OrionAsyncAutoConfiguration.java | 96 -------------- .../OrionSchedulerAutoConfiguration.java | 9 +- ...itional-spring-configuration-metadata.json | 35 ------ ...ot.autoconfigure.AutoConfiguration.imports | 1 - .../OrionWebAutoConfiguration.java | 2 + orion-visor-framework/pom.xml | 3 +- orion-visor-launch/pom.xml | 6 +- .../src/main/resources/application-dev.yaml | 81 ++++++++++++ .../src/main/resources/application-prod.yaml | 80 +++++++++++- .../src/main/resources/application.yaml | 12 +- .../orion-visor-module-asset-service/pom.xml | 6 +- .../module/asset/define/AssetThreadPools.java | 16 +-- .../orion-visor-module-exec-service/pom.xml | 6 +- .../module/exec/define/ExecThreadPools.java | 60 ++------- .../pom.xml | 6 +- .../pom.xml | 4 + .../terminal/define/TerminalThreadPools.java | 36 ++---- .../compoments/metrics-chart-tab.vue | 2 +- 31 files changed, 720 insertions(+), 287 deletions(-) create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/pom.xml create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/OrionExecutorAutoConfiguration.java create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorConfig.java rename orion-visor-framework/{orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/config/AsyncExecutorConfig.java => orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorsConfig.java} (59%) create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/context/ExecutorContext.java create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/utils/ExecutorUtils.java create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/additional-spring-configuration-metadata.json create mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionAsyncAutoConfiguration.java delete mode 100644 orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/additional-spring-configuration-metadata.json diff --git a/docker-compose-testing.yaml b/docker-compose-testing.yaml index 1d189c97..a6a5c363 100644 --- a/docker-compose-testing.yaml +++ b/docker-compose-testing.yaml @@ -19,6 +19,10 @@ services: DEMO_MODE: false volumes: - /data/orion-visor-space/docker-volumes/service/root-orion:/root/orion + ulimits: + nofile: + soft: 65536 + hard: 65536 healthcheck: test: [ "CMD", "curl", "http://127.0.0.1:9200/orion-visor/api/server/bootstrap/health" ] interval: 15s @@ -87,4 +91,4 @@ services: networks: orion-visor-net: - driver: bridge \ No newline at end of file + driver: bridge diff --git a/docker-compose.yaml b/docker-compose.yaml index 73371019..2bb604da 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,6 @@ version: '3.3' -# latest = 2.5.2 +# latest = 2.5.1 # 支持以下源 # lijiahangmax/* @@ -27,10 +27,6 @@ services: privileged: true ports: - "9200:9200" - ulimits: - nofile: - soft: 65536 - hard: 65536 environment: SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} MYSQL_HOST: ${MYSQL_HOST:-mysql} @@ -178,4 +174,4 @@ services: networks: orion-visor-net: - driver: bridge \ No newline at end of file + driver: bridge diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AutoConfigureOrderConst.java b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AutoConfigureOrderConst.java index c11c7a29..4fdfdc85 100644 --- a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AutoConfigureOrderConst.java +++ b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AutoConfigureOrderConst.java @@ -33,6 +33,8 @@ package org.dromara.visor.common.constant; */ public interface AutoConfigureOrderConst { + int FRAMEWORK_EXECUTOR = Integer.MIN_VALUE + 1000; + int FRAMEWORK_WEB = Integer.MIN_VALUE + 1100; int FRAMEWORK_SECURITY = Integer.MIN_VALUE + 1200; @@ -65,8 +67,6 @@ public interface AutoConfigureOrderConst { int FRAMEWORK_JOB_QUARTZ = Integer.MIN_VALUE + 2610; - int FRAMEWORK_JOB_ASYNC = Integer.MIN_VALUE + 2620; - int FRAMEWORK_BIZ_PUSH = Integer.MIN_VALUE + 2700; int FRAMEWORK_BIZ_OPERATOR_LOG = Integer.MIN_VALUE + 7000; diff --git a/orion-visor-dependencies/pom.xml b/orion-visor-dependencies/pom.xml index 22e38a91..32771f7d 100644 --- a/orion-visor-dependencies/pom.xml +++ b/orion-visor-dependencies/pom.xml @@ -106,6 +106,11 @@ orion-visor-spring-boot-starter-job ${revision} + + org.dromara.visor + orion-visor-spring-boot-starter-executor + ${revision} + org.dromara.visor orion-visor-spring-boot-starter-websocket diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-biz-push/src/main/java/org/dromara/visor/framework/biz/push/core/listener/PushMessageEventListener.java b/orion-visor-framework/orion-visor-spring-boot-starter-biz-push/src/main/java/org/dromara/visor/framework/biz/push/core/listener/PushMessageEventListener.java index 6df72da8..da16acde 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-biz-push/src/main/java/org/dromara/visor/framework/biz/push/core/listener/PushMessageEventListener.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-biz-push/src/main/java/org/dromara/visor/framework/biz/push/core/listener/PushMessageEventListener.java @@ -48,8 +48,7 @@ public class PushMessageEventListener implements ApplicationListener) pushServiceMap.get(message.getChannel()); } -} \ No newline at end of file +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/pom.xml b/orion-visor-framework/orion-visor-spring-boot-starter-executor/pom.xml new file mode 100644 index 00000000..c6761bf4 --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/pom.xml @@ -0,0 +1,27 @@ + + + + org.dromara.visor + orion-visor-framework + ${revision} + + + 4.0.0 + orion-visor-spring-boot-starter-executor + ${project.artifactId} + jar + + 项目线程池配置包 + https://github.com/dromara/orion-visor + + + + + org.dromara.visor + orion-visor-common + + + + diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/OrionExecutorAutoConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/OrionExecutorAutoConfiguration.java new file mode 100644 index 00000000..2df895b9 --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/OrionExecutorAutoConfiguration.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2023 - present Dromara, All rights reserved. + * + * https://visor.dromara.org + * https://visor.dromara.org.cn + * https://visor.orionsec.cn + * + * Members: + * Jiahang Li - ljh1553488six@139.com - author + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.visor.framework.executor.configuration; + +import org.dromara.visor.common.constant.AutoConfigureOrderConst; +import org.dromara.visor.framework.executor.configuration.config.ExecutorsConfig; +import org.dromara.visor.framework.executor.core.context.ExecutorContext; +import org.dromara.visor.framework.executor.core.utils.ExecutorUtils; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; + +/** + * 项目线程池配置 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/9/16 14:34 + */ +@EnableAsync +@AutoConfiguration +@EnableConfigurationProperties({ExecutorsConfig.class}) +@AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_EXECUTOR) +public class OrionExecutorAutoConfiguration { + + /** + * 创建线程池上下文 + * + * @param executorsConfig executorsConfig + * @param beanFactory beanFactory + * @return 线程池上下文 + */ + @Bean + public ExecutorContext executorContext(ExecutorsConfig executorsConfig, + ConfigurableBeanFactory beanFactory) { + // 创建上下文 + ExecutorContext context = new ExecutorContext(executorsConfig, beanFactory); + Map executorMap = context.init(); + // 获取线程池列表 + ExecutorUtils.setExecutors(executorMap); + return context; + } + +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorConfig.java b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorConfig.java new file mode 100644 index 00000000..2d65c14c --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorConfig.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2023 - present Dromara, All rights reserved. + * + * https://visor.dromara.org + * https://visor.dromara.org.cn + * https://visor.orionsec.cn + * + * Members: + * Jiahang Li - ljh1553488six@139.com - author + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.visor.framework.executor.configuration.config; + +import cn.orionsec.kit.lang.define.thread.RejectPolicy; +import cn.orionsec.kit.lang.utils.Systems; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +/** + * 线程池配置 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/9/16 10:51 + */ +@Data +@Builder +@AllArgsConstructor +public class ExecutorConfig { + + /** + * 是否启用 + */ + private boolean enabled; + + /** + * 是否使用 MDC + */ + private boolean mdc; + + /** + * 核心线程数 + */ + private int corePoolSize; + + /** + * 最大线程数 + */ + private int maxPoolSize; + + /** + * 队列容量 + */ + private int queueCapacity; + + /** + * 空闲线程存活时间 + */ + private int keepAliveSeconds; + + /** + * 是否允许核心线程超时 + */ + private boolean allowCoreTimeout; + + /** + * 是否使用同步队列 + */ + private boolean synchronousQueue; + + /** + * 线程名称前缀 + */ + private String threadNamePrefix; + + /** + * 拒绝策略 + */ + private RejectPolicy rejectPolicy; + + public ExecutorConfig() { + this.enabled = true; + this.corePoolSize = Systems.PROCESS_NUM; + this.maxPoolSize = Systems.PROCESS_NUM; + this.queueCapacity = 100; + this.keepAliveSeconds = 300; + this.rejectPolicy = RejectPolicy.CALLER_RUNS; + } + +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/config/AsyncExecutorConfig.java b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorsConfig.java similarity index 59% rename from orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/config/AsyncExecutorConfig.java rename to orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorsConfig.java index 4ea9f91c..db454c48 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/config/AsyncExecutorConfig.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/configuration/config/ExecutorsConfig.java @@ -20,47 +20,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.framework.job.configuration.config; +package org.dromara.visor.framework.executor.configuration.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.Map; + /** - * 线程池配置类 + * 线程池配置 * * @author Jiahang Li * @version 1.0.0 - * @since 2023/7/10 15:49 + * @since 2025/9/16 16:21 */ @Data -@ConfigurationProperties(prefix = "orion.async.executor") -public class AsyncExecutorConfig { +@ConfigurationProperties(prefix = "app") +public class ExecutorsConfig { /** - * 核心线程数量 + * 线程池配置 */ - private int corePoolSize; - - /** - * 最大线程数量 - */ - private int maxPoolSize; - - /** - * 队列容量 - */ - private int queueCapacity; - - /** - * 活跃时间 - */ - private int keepAliveSeconds; - - public AsyncExecutorConfig() { - this.corePoolSize = 8; - this.maxPoolSize = 16; - this.queueCapacity = 200; - this.keepAliveSeconds = 300; - } + private Map executors; } diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/context/ExecutorContext.java b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/context/ExecutorContext.java new file mode 100644 index 00000000..43ee3df3 --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/context/ExecutorContext.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2023 - present Dromara, All rights reserved. + * + * https://visor.dromara.org + * https://visor.dromara.org.cn + * https://visor.orionsec.cn + * + * Members: + * Jiahang Li - ljh1553488six@139.com - author + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.visor.framework.executor.core.context; + +import cn.orionsec.kit.lang.define.thread.RejectPolicy; +import cn.orionsec.kit.lang.utils.Strings; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.dromara.visor.common.thread.ThreadPoolMdcTaskExecutor; +import org.dromara.visor.framework.executor.configuration.config.ExecutorConfig; +import org.dromara.visor.framework.executor.configuration.config.ExecutorsConfig; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.HashMap; +import java.util.Map; + +/** + * 执行器上下文 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/9/16 16:28 + */ +@Slf4j +public class ExecutorContext { + + private final ExecutorsConfig executorsConfig; + + private final ConfigurableBeanFactory beanFactory; + + public ExecutorContext(ExecutorsConfig executorsConfig, ConfigurableBeanFactory beanFactory) { + this.executorsConfig = executorsConfig; + this.beanFactory = beanFactory; + } + + /** + * 初始化 + * + * @return executorMap + */ + public Map init() { + log.info("--------- Executors init start --------- "); + Map executorMap = new HashMap<>(); + executorsConfig.getExecutors().forEach((beanName, config) -> { + String executorName = Strings.leftPad(beanName, 30); + // 是否启用 + if (!config.isEnabled()) { + log.info("Executor [{}] is disabled.", executorName); + return; + } + // 创建线程池 + ThreadPoolTaskExecutor executor = this.createTaskExecutor(config); + // 注册到容器中 + beanFactory.registerSingleton(beanName, executor); + executorMap.put(beanName, executor); + log.info("Executor [{}] init success. {}", executorName, JSON.toJSONString(config)); + }); + log.info("--------- Executors init end --------- "); + return executorMap; + } + + /** + * 创建线程池 + * + * @param config config + */ + private ThreadPoolTaskExecutor createTaskExecutor(ExecutorConfig config) { + // 创建线程池 + ThreadPoolTaskExecutor executor; + if (config.isMdc()) { + executor = new ThreadPoolMdcTaskExecutor(); + } else { + executor = new ThreadPoolTaskExecutor(); + } + // 同步队列 + if (config.isSynchronousQueue()) { + config.setCorePoolSize(0); + config.setMaxPoolSize(Integer.MAX_VALUE); + config.setQueueCapacity(0); + config.setRejectPolicy(RejectPolicy.ABORT); + } + // 设置参数 + executor.setCorePoolSize(config.getCorePoolSize()); + executor.setMaxPoolSize(config.getMaxPoolSize()); + executor.setQueueCapacity(config.getQueueCapacity()); + executor.setThreadNamePrefix(config.getThreadNamePrefix()); + executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); + executor.setAllowCoreThreadTimeOut(config.isAllowCoreTimeout()); + executor.setRejectedExecutionHandler(config.getRejectPolicy().getHandler()); + // 设置等待所有任务执行结束再关闭线程池 + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAwaitTerminationSeconds(60); + // 初始化 + executor.initialize(); + return executor; + } + +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/utils/ExecutorUtils.java b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/utils/ExecutorUtils.java new file mode 100644 index 00000000..5666b3cf --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/java/org/dromara/visor/framework/executor/core/utils/ExecutorUtils.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2023 - present Dromara, All rights reserved. + * + * https://visor.dromara.org + * https://visor.dromara.org.cn + * https://visor.orionsec.cn + * + * Members: + * Jiahang Li - ljh1553488six@139.com - author + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.visor.framework.executor.core.utils; + +import cn.orionsec.kit.lang.able.Executable; +import cn.orionsec.kit.lang.utils.Exceptions; +import cn.orionsec.kit.lang.utils.collect.Maps; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.Map; + +/** + * 线程池工具类 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/9/16 16:34 + */ +public class ExecutorUtils { + + private static Map executorMap; + + private ExecutorUtils() { + } + + /** + * 获取线程池 + * + * @param name name + * @return executor + */ + public static ThreadPoolTaskExecutor getExecutor(String name) { + return executorMap.get(name); + } + + /** + * 执行 + * + * @param name name + * @param runnable runnable + */ + public static void execute(String name, Runnable runnable) { + getExecutor(name).execute(runnable); + } + + /** + * 执行 + * + * @param name name + * @param executable executable + */ + public static void execute(String name, Executable executable) { + getExecutor(name).execute(executable::exec); + } + + public static void setExecutors(Map executorMap) { + if (ExecutorUtils.executorMap != null) { + // unmodified + throw Exceptions.state(); + } + ExecutorUtils.executorMap = Maps.unmodified(executorMap); + } + +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 00000000..25f0906c --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,77 @@ +{ + "groups": [ + { + "name": "orion.executors.*", + "type": "org.dromara.visor.framework.executor.configuration.config.ExecutorConfig", + "sourceType": "org.dromara.visor.framework.executor.configuration.config.ExecutorConfig", + "description": "线程池配置项." + } + ], + "properties": [ + { + "name": "orion.executors", + "type": "java.util.Map", + "description": "线程池配置.", + "defaultValue": "{}" + }, + { + "name": "orion.executors.*.enabled", + "type": "java.lang.Boolean", + "description": "是否启用.", + "defaultValue": false + }, + { + "name": "orion.executors.*.corePoolSize", + "type": "java.lang.Integer", + "description": "核心线程数.", + "defaultValue": "CPU_NUM" + }, + { + "name": "orion.executors.*.maxPoolSize", + "type": "java.lang.Integer", + "description": "最大线程数.", + "defaultValue": "CPU_NUM" + }, + { + "name": "orion.executors.*.queueCapacity", + "type": "java.lang.Integer", + "description": "任务队列容量.", + "defaultValue": 100 + }, + { + "name": "orion.executors.*.keepAliveSeconds", + "type": "java.lang.Integer", + "description": "空闲线程存活时间.", + "defaultValue": 60 + }, + { + "name": "orion.executors.*.allowCoreTimeout", + "type": "java.lang.Boolean", + "description": "是否允许核心线程超时回收.", + "defaultValue": false + }, + { + "name": "orion.executors.*.synchronousQueue", + "type": "java.lang.Boolean", + "description": "是否启用同步队列模式.", + "defaultValue": false + }, + { + "name": "orion.executors.*.mdc", + "type": "java.lang.Boolean", + "description": "是否启用 MDC 上下文传递.", + "defaultValue": false + }, + { + "name": "orion.executors.*.threadNamePrefix", + "type": "java.lang.String", + "description": "线程名称前缀." + }, + { + "name": "orion.executors.*.rejectPolicy", + "type": "cn.orionsec.kit.lang.define.thread.RejectPolicy", + "description": "拒绝策略.", + "defaultValue": "CALLER_RUNS" + } + ] +} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..9ef44eb1 --- /dev/null +++ b/orion-visor-framework/orion-visor-spring-boot-starter-executor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.visor.framework.executor.configuration.OrionExecutorAutoConfiguration diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionAsyncAutoConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionAsyncAutoConfiguration.java deleted file mode 100644 index 7544e5b8..00000000 --- a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionAsyncAutoConfiguration.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2023 - present Dromara, All rights reserved. - * - * https://visor.dromara.org - * https://visor.dromara.org.cn - * https://visor.orionsec.cn - * - * Members: - * Jiahang Li - ljh1553488six@139.com - author - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.dromara.visor.framework.job.configuration; - -import org.dromara.visor.common.constant.AutoConfigureOrderConst; -import org.dromara.visor.common.constant.Const; -import org.dromara.visor.common.thread.ThreadPoolMdcTaskExecutor; -import org.dromara.visor.framework.job.configuration.config.AsyncExecutorConfig; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.core.task.TaskExecutor; -import org.springframework.scheduling.annotation.EnableAsync; - -import java.util.concurrent.ThreadPoolExecutor; - -/** - * async 异步任务 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/6/20 10:34 - */ -@EnableAsync -@AutoConfiguration -@AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_JOB_ASYNC) -@EnableConfigurationProperties(AsyncExecutorConfig.class) -public class OrionAsyncAutoConfiguration { - - /** - * {@code @Async("asyncExecutor")} - * - * @return 支持 MDC 的异步线程池 - */ - @Bean(name = "asyncExecutor") - public TaskExecutor asyncExecutor(AsyncExecutorConfig config) { - ThreadPoolMdcTaskExecutor executor = new ThreadPoolMdcTaskExecutor(); - executor.setCorePoolSize(config.getCorePoolSize()); - executor.setMaxPoolSize(config.getMaxPoolSize()); - executor.setQueueCapacity(config.getQueueCapacity()); - executor.setKeepAliveSeconds(config.getKeepAliveSeconds()); - executor.setAllowCoreThreadTimeOut(true); - executor.setThreadNamePrefix("async-task-"); - // 设置等待所有任务执行结束再关闭线程池 - executor.setWaitForTasksToCompleteOnShutdown(true); - // 以确保应用最后能够被关闭 - executor.setAwaitTerminationSeconds(60); - // 调用者调用拒绝策略 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - executor.initialize(); - return executor; - } - - /** - * {@code @Async("metricsExecutor")} - * - * @return 指标线程池 - */ - @Bean(name = "metricsExecutor") - public TaskExecutor metricsExecutor() { - ThreadPoolMdcTaskExecutor executor = new ThreadPoolMdcTaskExecutor(); - executor.setCorePoolSize(4); - executor.setMaxPoolSize(8); - executor.setQueueCapacity(1000); - executor.setKeepAliveSeconds(Const.MS_S_60); - executor.setAllowCoreThreadTimeOut(true); - executor.setThreadNamePrefix("metrics-task-"); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setAwaitTerminationSeconds(60); - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - executor.initialize(); - return executor; - } - -} diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionSchedulerAutoConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionSchedulerAutoConfiguration.java index c6c78804..81b14a16 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionSchedulerAutoConfiguration.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/java/org/dromara/visor/framework/job/configuration/OrionSchedulerAutoConfiguration.java @@ -25,6 +25,8 @@ package org.dromara.visor.framework.job.configuration; import org.dromara.visor.common.constant.AutoConfigureOrderConst; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureOrder; +import org.springframework.boot.autoconfigure.task.TaskSchedulingProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; @@ -40,17 +42,18 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @EnableScheduling @AutoConfiguration @AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_JOB) +@EnableConfigurationProperties(TaskSchedulingProperties.class) public class OrionSchedulerAutoConfiguration { /** * @return 任务调度器 */ @Bean - public TaskScheduler taskScheduler() { + public TaskScheduler taskScheduler(TaskSchedulingProperties properties) { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); - scheduler.setPoolSize(4); scheduler.setRemoveOnCancelPolicy(true); - scheduler.setThreadNamePrefix("scheduling-task-"); + scheduler.setPoolSize(properties.getPool().getSize()); + scheduler.setThreadNamePrefix(properties.getThreadNamePrefix()); return scheduler; } diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 80da6cb2..00000000 --- a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "groups": [ - { - "name": "orion.async.executor", - "type": "org.dromara.visor.framework.job.configuration.config.AsyncExecutorConfig", - "sourceType": "org.dromara.visor.framework.job.configuration.config.AsyncExecutorConfig" - } - ], - "properties": [ - { - "name": "orion.async.executor.core-pool-size", - "type": "java.lang.Integer", - "description": "核心线程数量.", - "defaultValue": "8" - }, - { - "name": "orion.async.executor.max-pool-size", - "type": "java.lang.Integer", - "description": "最大线程数量.", - "defaultValue": "16" - }, - { - "name": "orion.async.executor.queue-capacity", - "type": "java.lang.Integer", - "description": "队列容量.", - "defaultValue": "200" - }, - { - "name": "orion.async.executor.keep-alive-seconds", - "type": "java.lang.Integer", - "description": "活跃时间.", - "defaultValue": "300" - } - ] -} \ No newline at end of file diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 73005eb9..5b215b2a 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/orion-visor-framework/orion-visor-spring-boot-starter-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,2 @@ org.dromara.visor.framework.job.configuration.OrionSchedulerAutoConfiguration org.dromara.visor.framework.job.configuration.OrionQuartzAutoConfiguration -org.dromara.visor.framework.job.configuration.OrionAsyncAutoConfiguration \ No newline at end of file diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-web/src/main/java/org/dromara/visor/framework/web/configuration/OrionWebAutoConfiguration.java b/orion-visor-framework/orion-visor-spring-boot-starter-web/src/main/java/org/dromara/visor/framework/web/configuration/OrionWebAutoConfiguration.java index 18fb70d8..6e89fe0e 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-web/src/main/java/org/dromara/visor/framework/web/configuration/OrionWebAutoConfiguration.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-web/src/main/java/org/dromara/visor/framework/web/configuration/OrionWebAutoConfiguration.java @@ -42,6 +42,7 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.DependsOn; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; @@ -67,6 +68,7 @@ import java.util.List; * @version 1.0.0 * @since 2023/6/16 16:26 */ +@DependsOn({"executorContext"}) @AutoConfiguration @AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_WEB) @EnableConfigurationProperties(ExposeApiConfig.class) diff --git a/orion-visor-framework/pom.xml b/orion-visor-framework/pom.xml index 5b9f3849..eb543e33 100644 --- a/orion-visor-framework/pom.xml +++ b/orion-visor-framework/pom.xml @@ -24,6 +24,7 @@ orion-visor-spring-boot-starter-cipher orion-visor-spring-boot-starter-config orion-visor-spring-boot-starter-job + orion-visor-spring-boot-starter-executor orion-visor-spring-boot-starter-websocket orion-visor-spring-boot-starter-redis orion-visor-spring-boot-starter-desensitize @@ -37,4 +38,4 @@ orion-visor-spring-boot-starter-biz-operator-log - \ No newline at end of file + diff --git a/orion-visor-launch/pom.xml b/orion-visor-launch/pom.xml index 06d81696..85b012fb 100644 --- a/orion-visor-launch/pom.xml +++ b/orion-visor-launch/pom.xml @@ -102,6 +102,10 @@ org.dromara.visor orion-visor-spring-boot-starter-job + + org.dromara.visor + orion-visor-spring-boot-starter-executor + org.dromara.visor orion-visor-spring-boot-starter-websocket @@ -199,4 +203,4 @@ - \ No newline at end of file + diff --git a/orion-visor-launch/src/main/resources/application-dev.yaml b/orion-visor-launch/src/main/resources/application-dev.yaml index a448b939..bfad7464 100644 --- a/orion-visor-launch/src/main/resources/application-dev.yaml +++ b/orion-visor-launch/src/main/resources/application-dev.yaml @@ -49,3 +49,84 @@ mybatis-plus: configuration: # 日志打印 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +app: + executors: + # 默认异步线程池 + asyncExecutor: + mdc: true + core-pool-size: 2 + max-pool-size: 4 + queue-capacity: 30 + allow-core-timeout: false + thread-name-prefix: async-executor- + # 指标存储异步线程池 + metricsExecutor: + mdc: true + core-pool-size: 2 + max-pool-size: 2 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: metrics-task- + # 推送异步线程池 + pushExecutor: + mdc: true + core-pool-size: 1 + max-pool-size: 1 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: message-push- + # 探针安装线程池 + agentInstallExecutor: + core-pool-size: 2 + max-pool-size: 2 + queue-capacity: 200 + allow-core-timeout: true + thread-name-prefix: agent-install- + # 终端标准输出线程池 + terminalStdoutExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: terminal-stdout- + # 终端操作线程池 + terminalOperatorExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: terminal-operator- + # 终端异步保存线程池 + terminalAsyncSaverExecutor: + core-pool-size: 1 + max-pool-size: 1 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: terminal-watcher- + # 批量执行超时检查线程池 + execTimeoutCheckExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: timeout-check- + # 批量执行任务线程池 + execTaskExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-task- + # 批量执行主机命令线程池 + execHostCommandExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-host- + # 批量执行日志查看线程池 + execLogViewExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-log- + # 批量上传任务线程池 + uploadTaskExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: upload-task- + # 批量上传主机线程池 + uploadHostExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: upload-host- diff --git a/orion-visor-launch/src/main/resources/application-prod.yaml b/orion-visor-launch/src/main/resources/application-prod.yaml index e9c8619e..ffd195e1 100644 --- a/orion-visor-launch/src/main/resources/application-prod.yaml +++ b/orion-visor-launch/src/main/resources/application-prod.yaml @@ -84,9 +84,81 @@ orion: aes: # 加密密钥 secret-key: ${SECRET_KEY:uQeacXV8b3isvKLK} - async: - executor: + +app: + executors: + # 默认异步线程池 + asyncExecutor: + mdc: true core-pool-size: 8 max-pool-size: 16 - queue-capacity: 200 - keep-alive-seconds: 300 + queue-capacity: 100 + allow-core-timeout: false + thread-name-prefix: async-executor- + # 指标存储异步线程池 + metricsExecutor: + mdc: true + core-pool-size: 4 + max-pool-size: 4 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: metrics-task- + # 推送异步线程池 + pushExecutor: + mdc: true + core-pool-size: 4 + max-pool-size: 4 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: message-push- + # 探针安装线程池 + agentInstallExecutor: + allow-core-timeout: true + thread-name-prefix: agent-install- + # 终端标准输出线程池 + terminalStdoutExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: terminal-stdout- + # 终端操作线程池 + terminalOperatorExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: terminal-operator- + # 终端异步保存线程池 + terminalAsyncSaverExecutor: + core-pool-size: 1 + max-pool-size: 1 + queue-capacity: 1000 + allow-core-timeout: true + thread-name-prefix: terminal-watcher- + # 批量执行超时检查线程池 + execTimeoutCheckExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: timeout-check- + # 批量执行任务线程池 + execTaskExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-task- + # 批量执行主机命令线程池 + execHostCommandExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-host- + # 批量执行日志查看线程池 + execLogViewExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: exec-log- + # 批量上传任务线程池 + uploadTaskExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: upload-task- + # 批量上传主机线程池 + uploadHostExecutor: + synchronous-queue: true + allow-core-timeout: true + thread-name-prefix: upload-host- diff --git a/orion-visor-launch/src/main/resources/application.yaml b/orion-visor-launch/src/main/resources/application.yaml index c04432cc..1a151e5b 100644 --- a/orion-visor-launch/src/main/resources/application.yaml +++ b/orion-visor-launch/src/main/resources/application.yaml @@ -22,6 +22,11 @@ spring: async: # 异步请求时间 30min request-timeout: 1800000 + task: + scheduling: + thread-name-prefix: scheduling-task- + pool: + size: 4 datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver @@ -255,13 +260,6 @@ orion: secret-key: I66AndrKWrwXjtBL use-generator-key: true generator-key-length: 128 - async: - # 线程池配置 - executor: - core-pool-size: 2 - max-pool-size: 4 - queue-capacity: 30 - keep-alive-seconds: 180 operator-log: error-message-length: 255 user-agent-length: 128 diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/pom.xml b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/pom.xml index dea24084..657bfb13 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/pom.xml +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/pom.xml @@ -88,6 +88,10 @@ org.dromara.visor orion-visor-spring-boot-starter-job + + org.dromara.visor + orion-visor-spring-boot-starter-executor + org.dromara.visor orion-visor-spring-boot-starter-test @@ -102,4 +106,4 @@ - \ No newline at end of file + diff --git a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/AssetThreadPools.java b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/AssetThreadPools.java index b38fe855..5dd72dc1 100644 --- a/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/AssetThreadPools.java +++ b/orion-visor-modules/orion-visor-module-asset/orion-visor-module-asset-service/src/main/java/org/dromara/visor/module/asset/define/AssetThreadPools.java @@ -22,12 +22,9 @@ */ package org.dromara.visor.module.asset.define; -import cn.orionsec.kit.lang.define.thread.ExecutorBuilder; -import cn.orionsec.kit.lang.utils.Systems; -import org.dromara.visor.common.constant.Const; +import org.dromara.visor.framework.executor.core.utils.ExecutorUtils; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.Executor; /** * 执行线程池 @@ -41,13 +38,6 @@ public interface AssetThreadPools { /** * 批量执行主机命令线程池 */ - ThreadPoolExecutor AGENT_INSTALL = ExecutorBuilder.create() - .namedThreadFactory("agent-install-") - .corePoolSize(Systems.PROCESS_NUM) - .maxPoolSize(Systems.PROCESS_NUM) - .keepAliveTime(Const.MS_S_60) - .workQueue(new LinkedBlockingQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor AGENT_INSTALL = ExecutorUtils.getExecutor("agentInstallExecutor"); } diff --git a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/pom.xml b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/pom.xml index c8ad58ff..616a9f98 100644 --- a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/pom.xml +++ b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/pom.xml @@ -87,10 +87,14 @@ org.dromara.visor orion-visor-spring-boot-starter-job + + org.dromara.visor + orion-visor-spring-boot-starter-executor + org.dromara.visor orion-visor-spring-boot-starter-test - \ No newline at end of file + diff --git a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/define/ExecThreadPools.java b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/define/ExecThreadPools.java index 81e78ae2..5c1b9cdc 100644 --- a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/define/ExecThreadPools.java +++ b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/define/ExecThreadPools.java @@ -22,11 +22,9 @@ */ package org.dromara.visor.module.exec.define; -import cn.orionsec.kit.lang.define.thread.ExecutorBuilder; -import org.dromara.visor.common.constant.Const; +import org.dromara.visor.framework.executor.core.utils.ExecutorUtils; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.Executor; /** * 执行线程池 @@ -40,73 +38,31 @@ public interface ExecThreadPools { /** * 超时检查线程池 */ - ThreadPoolExecutor TIMEOUT_CHECK = ExecutorBuilder.create() - .namedThreadFactory("timeout-check-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor TIMEOUT_CHECK = ExecutorUtils.getExecutor("execTimeoutCheckExecutor"); /** * 批量执行任务线程池 */ - ThreadPoolExecutor EXEC_TASK = ExecutorBuilder.create() - .namedThreadFactory("exec-task-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor EXEC_TASK = ExecutorUtils.getExecutor("execTaskExecutor"); /** * 批量执行主机命令线程池 */ - ThreadPoolExecutor EXEC_HOST = ExecutorBuilder.create() - .namedThreadFactory("exec-host-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor EXEC_HOST = ExecutorUtils.getExecutor("execHostCommandExecutor"); /** * 批量执行日志查看线程池 */ - ThreadPoolExecutor EXEC_LOG = ExecutorBuilder.create() - .namedThreadFactory("exec-log-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor EXEC_LOG = ExecutorUtils.getExecutor("execLogViewExecutor"); /** * 批量上传任务线程池 */ - ThreadPoolExecutor UPLOAD_TASK = ExecutorBuilder.create() - .namedThreadFactory("upload-task-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor UPLOAD_TASK = ExecutorUtils.getExecutor("uploadTaskExecutor"); /** * 批量上传主机线程池 */ - ThreadPoolExecutor UPLOAD_HOST = ExecutorBuilder.create() - .namedThreadFactory("upload-host-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor UPLOAD_HOST = ExecutorUtils.getExecutor("uploadHostExecutor"); } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/pom.xml b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/pom.xml index 6a67c475..65d76d12 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/pom.xml +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/pom.xml @@ -83,6 +83,10 @@ org.dromara.visor orion-visor-spring-boot-starter-job + + org.dromara.visor + orion-visor-spring-boot-starter-executor + org.dromara.visor orion-visor-spring-boot-starter-test @@ -111,4 +115,4 @@ - \ No newline at end of file + diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml index 83ae569b..f7b7ec1a 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/pom.xml @@ -83,6 +83,10 @@ org.dromara.visor orion-visor-spring-boot-starter-job + + org.dromara.visor + orion-visor-spring-boot-starter-executor + org.dromara.visor orion-visor-spring-boot-starter-test diff --git a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java index 637c4f60..c515abc9 100644 --- a/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java +++ b/orion-visor-modules/orion-visor-module-terminal/orion-visor-module-terminal-service/src/main/java/org/dromara/visor/module/terminal/define/TerminalThreadPools.java @@ -22,12 +22,9 @@ */ package org.dromara.visor.module.terminal.define; -import cn.orionsec.kit.lang.define.thread.ExecutorBuilder; -import org.dromara.visor.common.constant.Const; +import org.dromara.visor.framework.executor.core.utils.ExecutorUtils; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.SynchronousQueue; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.Executor; /** * 终端线程池 @@ -39,37 +36,18 @@ import java.util.concurrent.ThreadPoolExecutor; public interface TerminalThreadPools { /** - * terminal 标准输出线程池 + * 终端标准输出线程池 */ - ThreadPoolExecutor TERMINAL_STDOUT = ExecutorBuilder.create() - .namedThreadFactory("terminal-stdout-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor TERMINAL_STDOUT = ExecutorUtils.getExecutor("terminalStdoutExecutor"); /** - * terminal 操作线程池 + * 终端操作线程池 */ - ThreadPoolExecutor TERMINAL_OPERATOR = ExecutorBuilder.create() - .namedThreadFactory("terminal-operator-") - .corePoolSize(1) - .maxPoolSize(Integer.MAX_VALUE) - .keepAliveTime(Const.MS_S_60) - .workQueue(new SynchronousQueue<>()) - .allowCoreThreadTimeout(true) - .build(); + Executor TERMINAL_OPERATOR = ExecutorUtils.getExecutor("terminalOperatorExecutor"); /** * 终端异步保存线程池 */ - ThreadPoolExecutor TERMINAL_ASYNC_SAVER = ExecutorBuilder.create() - .namedThreadFactory("terminal-async-saver-") - .corePoolSize(1) - .maxPoolSize(1) - .workQueue(new LinkedBlockingQueue<>()) - .build(); + Executor TERMINAL_ASYNC_SAVER = ExecutorUtils.getExecutor("terminalAsyncSaverExecutor"); } diff --git a/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart-tab.vue b/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart-tab.vue index cfe480f1..7e755f8c 100644 --- a/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart-tab.vue +++ b/orion-visor-ui/src/views/monitor/monitor-detail/compoments/metrics-chart-tab.vue @@ -40,7 +40,7 @@ md: props.chartCompose ? 2 : 1, lg: props.chartCompose ? 2 : 1, xl: props.chartCompose ? 3 : 1, - xxl: props.chartCompose ? 3 : 1, + xxl: props.chartCompose ? 4 : 1, }; }); From 2103698417486f61525cdf31aa50f6137a015b38 Mon Sep 17 00:00:00 2001 From: lijiahangmax Date: Tue, 7 Oct 2025 14:26:40 +0800 Subject: [PATCH 06/13] =?UTF-8?q?:hammer:=20=E4=BC=98=E5=8C=96=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/redis/core/utils/RedisMaps.java | 27 ++- .../controller/AlarmPolicyRuleController.java | 6 +- .../controller/MonitorHostController.java | 11 ++ .../module/monitor/dao/MonitorHostDAO.java | 14 ++ .../cache/AlarmPolicyCacheKeyDefine.java | 3 +- .../cache/MonitorHostCacheKeyDefine.java | 48 ++++++ .../module/monitor/enums/MeasurementEnum.java | 20 ++- .../monitor/enums/MeasurementFieldEnum.java | 159 ------------------ .../service/AlarmPolicyRuleService.java | 6 +- .../monitor/service/MonitorHostService.java | 9 + .../impl/AlarmPolicyRuleServiceImpl.java | 6 +- .../service/impl/AlarmPolicyServiceImpl.java | 4 +- .../impl/MonitorAgentEndpointServiceImpl.java | 9 +- .../service/impl/MonitorHostServiceImpl.java | 55 +++++- orion-visor-ui/src/api/monitor/alarm-rule.ts | 4 +- .../src/api/monitor/monitor-host.ts | 7 + .../components/alarm-rule-form-drawer.vue | 131 +++++++++++---- 17 files changed, 296 insertions(+), 223 deletions(-) create mode 100644 orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/MonitorHostCacheKeyDefine.java delete mode 100644 orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementFieldEnum.java diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/org/dromara/visor/framework/redis/core/utils/RedisMaps.java b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/org/dromara/visor/framework/redis/core/utils/RedisMaps.java index ba8a8934..d3c9f58d 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/org/dromara/visor/framework/redis/core/utils/RedisMaps.java +++ b/orion-visor-framework/orion-visor-spring-boot-starter-redis/src/main/java/org/dromara/visor/framework/redis/core/utils/RedisMaps.java @@ -312,6 +312,19 @@ public class RedisMaps extends RedisUtils { return getJson(key.getKey(), hashKey, (Class) key.getType()); } + /** + * 获取值 json + * + * @param define define + * @param key key + * @param hashKey hashKey + * @param V + * @return value + */ + public static V getJson(String key, CacheKeyDefine define, Object hashKey) { + return getJson(key, hashKey, (Class) define.getType()); + } + /** * 获取值 json * @@ -355,9 +368,9 @@ public class RedisMaps extends RedisUtils { /** * 获取值 json * - * @param key key - * @param hashKeys hashKeys - * @param V + * @param key key + * @param hashKeys hashKeys + * @param V * @return values */ public static List multiGetJson(CacheKeyDefine key, List hashKeys) { @@ -367,10 +380,10 @@ public class RedisMaps extends RedisUtils { /** * 获取值 json * - * @param key key - * @param hashKeys hashKeys - * @param clazz clazz - * @param V + * @param key key + * @param hashKeys hashKeys + * @param clazz clazz + * @param V * @return values */ public static List multiGetJson(String key, List hashKeys, Class clazz) { diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyRuleController.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyRuleController.java index 8edb642f..d82eaf9e 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyRuleController.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyRuleController.java @@ -93,11 +93,11 @@ public class AlarmPolicyRuleController { @GetMapping("/list") @Operation(summary = "查询全部监控告警规则") @Parameter(name = "policyId", description = "policyId", required = true) - @Parameter(name = "metricsMeasurement", description = "metricsMeasurement") + @Parameter(name = "measurement", description = "measurement") @PreAuthorize("@ss.hasPermission('monitor:alarm-policy:query')") public List getAlarmPolicyRuleList(@RequestParam("policyId") Long policyId, - @RequestParam(value = "metricsMeasurement", required = false) String metricsMeasurement) { - return alarmPolicyRuleService.getAlarmPolicyRuleList(policyId, metricsMeasurement); + @RequestParam(value = "measurement", required = false) String measurement) { + return alarmPolicyRuleService.getAlarmPolicyRuleList(policyId, measurement); } @DemoDisableApi diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/MonitorHostController.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/MonitorHostController.java index 53544890..dbbf3dd4 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/MonitorHostController.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/MonitorHostController.java @@ -106,6 +106,17 @@ public class MonitorHostController { return monitorHostService.getMonitorHostChart(request); } + @IgnoreLog(IgnoreLogMode.RET) + @GetMapping("/host-tags") + @Operation(summary = "查询监控告警标签") + @Parameter(name = "policyId", description = "policyId", required = true) + @Parameter(name = "measurement", description = "measurement") + @PreAuthorize("@ss.hasPermission('monitor:monitor-host:query')") + public List getMonitorHostPolicyRuleTags(@RequestParam("policyId") Long policyId, + @RequestParam(value = "measurement", required = false) String measurement) { + return monitorHostService.getMonitorHostPolicyRuleTags(policyId, measurement); + } + @DemoDisableApi @OperatorLog(MonitorHostOperatorType.UPDATE) @PutMapping("/update") diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/MonitorHostDAO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/MonitorHostDAO.java index be453484..2a44f28d 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/MonitorHostDAO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/MonitorHostDAO.java @@ -95,6 +95,20 @@ public interface MonitorHostDAO extends IMapper { return this.delete(Conditions.in(MonitorHostDO::getHostId, hostIdList)); } + /** + * 通过 policyId 查询 + * + * @param policyId policyId + * @return row + */ + default List selectByPolicyId(Long policyId) { + return this.of() + .createWrapper() + .eq(MonitorHostDO::getPolicyId, policyId) + .then() + .list(); + } + /** * 设置 policyId 为 null * diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/AlarmPolicyCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/AlarmPolicyCacheKeyDefine.java index 20ae552d..ca4fac0f 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/AlarmPolicyCacheKeyDefine.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/AlarmPolicyCacheKeyDefine.java @@ -38,7 +38,7 @@ import java.util.concurrent.TimeUnit; */ public interface AlarmPolicyCacheKeyDefine { - CacheKeyDefine MONITOR_ALARM_POLICY = new CacheKeyBuilder() + CacheKeyDefine ALARM_POLICY = new CacheKeyBuilder() .key("alarm:policy:list") .desc("告警策略") .type(AlarmPolicyCacheDTO.class) @@ -49,6 +49,7 @@ public interface AlarmPolicyCacheKeyDefine { CacheKeyDefine ALARM_RULE_SILENCE = new CacheKeyBuilder() .key("alarm:silence:{}:{}") .desc("告警规则沉默标志 ${agentKey} ${ruleId}") + .type(Long.class) .struct(RedisCacheStruct.STRING) .build(); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/MonitorHostCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/MonitorHostCacheKeyDefine.java new file mode 100644 index 00000000..fba07e68 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/define/cache/MonitorHostCacheKeyDefine.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2023 - present Dromara, All rights reserved. + * + * https://visor.dromara.org + * https://visor.dromara.org.cn + * https://visor.orionsec.cn + * + * Members: + * Jiahang Li - ljh1553488six@139.com - author + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.visor.module.monitor.define.cache; + +import cn.orionsec.kit.lang.define.cache.key.CacheKeyBuilder; +import cn.orionsec.kit.lang.define.cache.key.CacheKeyDefine; +import cn.orionsec.kit.lang.define.cache.key.struct.RedisCacheStruct; + +import java.util.concurrent.TimeUnit; + +/** + * 监控主机缓存 key + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025-9-14 00:12 + */ +public interface MonitorHostCacheKeyDefine { + + CacheKeyDefine MONITOR_HOST_POLICY_HOST_TAGS = new CacheKeyBuilder() + .key("monitor:host:policy:host-tags:{}") + .desc("告警规则沉默标志 ${policyId}") + .type(String.class) + .struct(RedisCacheStruct.HASH) + .timeout(8, TimeUnit.HOURS) + .build(); + +} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementEnum.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementEnum.java index 937c26d1..2e8cc706 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementEnum.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementEnum.java @@ -43,7 +43,7 @@ public enum MeasurementEnum { /** * cpu */ - CPU("cpu", (s) -> { + CPU("cpu", true, (s) -> { s.accept(MetricsConst.CPU_USER_SECONDS_TOTAL, double.class); s.accept(MetricsConst.CPU_SYSTEM_SECONDS_TOTAL, double.class); s.accept(MetricsConst.CPU_TOTAL_SECONDS_TOTAL, double.class); @@ -52,7 +52,7 @@ public enum MeasurementEnum { /** * 内存 */ - MEMORY("memory", s -> { + MEMORY("memory", false, s -> { s.accept(MetricsConst.MEM_USED_BYTES_TOTAL, long.class); s.accept(MetricsConst.MEM_USED_PERCENT, double.class); s.accept(MetricsConst.MEM_SWAP_USED_BYTES_TOTAL, long.class); @@ -62,7 +62,7 @@ public enum MeasurementEnum { /** * 负载 */ - LOAD("load", s -> { + LOAD("load", false, s -> { s.accept(MetricsConst.LOAD1, double.class); s.accept(MetricsConst.LOAD5, double.class); s.accept(MetricsConst.LOAD15, double.class); @@ -74,7 +74,7 @@ public enum MeasurementEnum { /** * 磁盘 */ - DISK("disk", s -> { + DISK("disk", true, s -> { s.accept(MetricsConst.DISK_FS_USED_BYTES_TOTAL, long.class); s.accept(MetricsConst.DISK_FS_USED_PERCENT, double.class); s.accept(MetricsConst.DISK_FS_INODES_USED_PERCENT, double.class); @@ -83,7 +83,7 @@ public enum MeasurementEnum { /** * io */ - IO("io", s -> { + IO("io", false, s -> { s.accept(MetricsConst.DISK_IO_READ_BYTES_TOTAL, long.class); s.accept(MetricsConst.DISK_IO_WRITE_BYTES_TOTAL, long.class); s.accept(MetricsConst.DISK_IO_READS_TOTAL, long.class); @@ -97,7 +97,7 @@ public enum MeasurementEnum { /** * 网络 */ - NETWORK("network", s -> { + NETWORK("network", true, s -> { s.accept(MetricsConst.NET_SENT_BYTES_TOTAL, long.class); s.accept(MetricsConst.NET_RECV_BYTES_TOTAL, long.class); s.accept(MetricsConst.NET_SENT_PACKETS_TOTAL, long.class); @@ -111,7 +111,7 @@ public enum MeasurementEnum { /** * 连接数 */ - CONNECTIONS("connections", s -> { + CONNECTIONS("connections", false, s -> { s.accept(MetricsConst.NET_TCP_CONNECTIONS, int.class); s.accept(MetricsConst.NET_UDP_CONNECTIONS, int.class); s.accept(MetricsConst.NET_INET_CONNECTIONS, int.class); @@ -121,10 +121,14 @@ public enum MeasurementEnum { ; private final String measurement; + + private final boolean hasTags; + private final Map> fields; - MeasurementEnum(String measurement, Consumer>> register) { + MeasurementEnum(String measurement, boolean hasTags, Consumer>> register) { this.measurement = measurement; + this.hasTags = hasTags; this.fields = new HashedMap<>(); register.accept(this.fields::put); } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementFieldEnum.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementFieldEnum.java deleted file mode 100644 index c8936655..00000000 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/MeasurementFieldEnum.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2023 - present Dromara, All rights reserved. - * - * https://visor.dromara.org - * https://visor.dromara.org.cn - * https://visor.orionsec.cn - * - * Members: - * Jiahang Li - ljh1553488six@139.com - author - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.dromara.visor.module.monitor.enums; - -import lombok.Getter; -import org.apache.commons.collections4.map.HashedMap; -import org.dromara.visor.module.monitor.constant.MetricsConst; - -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -/** - * 指标度量类型 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2025/8/14 10:27 - */ -@Getter -public enum MeasurementFieldEnum { - - /** - * cpu - */ - CPU("cpu", (s) -> { - s.accept(MetricsConst.CPU_USER_SECONDS_TOTAL, double.class); - s.accept(MetricsConst.CPU_SYSTEM_SECONDS_TOTAL, double.class); - s.accept(MetricsConst.CPU_TOTAL_SECONDS_TOTAL, double.class); - }), - - /** - * 内存 - */ - MEMORY("memory", s -> { - s.accept(MetricsConst.MEM_USED_BYTES_TOTAL, long.class); - s.accept(MetricsConst.MEM_USED_PERCENT, double.class); - s.accept(MetricsConst.MEM_SWAP_USED_BYTES_TOTAL, long.class); - s.accept(MetricsConst.MEM_SWAP_USED_PERCENT, double.class); - }), - - /** - * 负载 - */ - LOAD("load", s -> { - s.accept(MetricsConst.LOAD1, double.class); - s.accept(MetricsConst.LOAD5, double.class); - s.accept(MetricsConst.LOAD15, double.class); - s.accept(MetricsConst.LOAD1_CORE_RATIO, double.class); - s.accept(MetricsConst.LOAD5_CORE_RATIO, double.class); - s.accept(MetricsConst.LOAD15_CORE_RATIO, double.class); - }), - - /** - * 磁盘 - */ - DISK("disk", s -> { - s.accept(MetricsConst.DISK_FS_USED_BYTES_TOTAL, long.class); - s.accept(MetricsConst.DISK_FS_USED_PERCENT, double.class); - s.accept(MetricsConst.DISK_FS_INODES_USED_PERCENT, double.class); - }), - - /** - * io - */ - IO("io", s -> { - s.accept(MetricsConst.DISK_IO_READ_BYTES_TOTAL, long.class); - s.accept(MetricsConst.DISK_IO_WRITE_BYTES_TOTAL, long.class); - s.accept(MetricsConst.DISK_IO_READS_TOTAL, long.class); - s.accept(MetricsConst.DISK_IO_WRITES_TOTAL, long.class); - s.accept(MetricsConst.DISK_IO_READ_BYTES_PER_SECOND, double.class); - s.accept(MetricsConst.DISK_IO_WRITE_BYTES_PER_SECOND, double.class); - s.accept(MetricsConst.DISK_IO_READS_PER_SECOND, double.class); - s.accept(MetricsConst.DISK_IO_WRITES_PER_SECOND, double.class); - }), - - /** - * 网络 - */ - NETWORK("network", s -> { - s.accept(MetricsConst.NET_SENT_BYTES_TOTAL, long.class); - s.accept(MetricsConst.NET_RECV_BYTES_TOTAL, long.class); - s.accept(MetricsConst.NET_SENT_PACKETS_TOTAL, long.class); - s.accept(MetricsConst.NET_RECV_PACKETS_TOTAL, long.class); - s.accept(MetricsConst.NET_SENT_BYTES_PER_SECOND, double.class); - s.accept(MetricsConst.NET_RECV_BYTES_PER_SECOND, double.class); - s.accept(MetricsConst.NET_SENT_PACKETS_PER_SECOND, double.class); - s.accept(MetricsConst.NET_RECV_PACKETS_PER_SECOND, double.class); - }), - - /** - * 连接数 - */ - CONNECTIONS("connections", s -> { - s.accept(MetricsConst.NET_TCP_CONNECTIONS, int.class); - s.accept(MetricsConst.NET_UDP_CONNECTIONS, int.class); - s.accept(MetricsConst.NET_INET_CONNECTIONS, int.class); - s.accept(MetricsConst.NET_ALL_CONNECTIONS, int.class); - }), - - ; - - private final String measurement; - private final Map> fields; - - MeasurementFieldEnum(String measurement, Consumer>> register) { - this.measurement = measurement; - this.fields = new HashedMap<>(); - register.accept(this.fields::put); - } - - public static MeasurementFieldEnum of(String measurement) { - if (measurement == null) { - return null; - } - for (MeasurementFieldEnum e : values()) { - if (e.measurement.equals(measurement)) { - return e; - } - } - return null; - } - - /** - * 获取度量值类型 - * - * @param measurement measurement - * @param field field - * @return type - */ - public static Class getMetricsValueType(String measurement, String field) { - MeasurementFieldEnum m = of(measurement); - if (m == null) { - return null; - } - return m.getFields().get(field); - } - -} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyRuleService.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyRuleService.java index c9da8d9a..a7de8b5a 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyRuleService.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyRuleService.java @@ -73,11 +73,11 @@ public interface AlarmPolicyRuleService { /** * 查询全部监控告警规则 * - * @param policyId policyId - * @param metricsMeasurement metricsMeasurement + * @param policyId policyId + * @param measurement measurement * @return rows */ - List getAlarmPolicyRuleList(Long policyId, String metricsMeasurement); + List getAlarmPolicyRuleList(Long policyId, String measurement); /** * 通过 metricsId 删除监控告警规则 diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/MonitorHostService.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/MonitorHostService.java index c5fc3e5c..5f806168 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/MonitorHostService.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/MonitorHostService.java @@ -66,6 +66,15 @@ public interface MonitorHostService { */ List getMonitorHostChart(MonitorHostChartRequest request); + /** + * 查询监控告警规则主机标签 + * + * @param policyId policyId + * @param measurement measurement + * @return tags + */ + List getMonitorHostPolicyRuleTags(Long policyId, String measurement); + /** * 更新监控主机 * diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyRuleServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyRuleServiceImpl.java index 7946347f..94786850 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyRuleServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyRuleServiceImpl.java @@ -160,13 +160,13 @@ public class AlarmPolicyRuleServiceImpl implements AlarmPolicyRuleService { } @Override - public List getAlarmPolicyRuleList(Long policyId, String metricsMeasurement) { + public List getAlarmPolicyRuleList(Long policyId, String measurement) { // 查询 return alarmPolicyRuleDAO.of() .createWrapper() .eq(AlarmPolicyRuleDO::getPolicyId, policyId) - .eq(Strings.isNotBlank(metricsMeasurement), AlarmPolicyRuleDO::getMetricsMeasurement, metricsMeasurement) - // 想同的指标在一起 + .eq(Strings.isNotBlank(measurement), AlarmPolicyRuleDO::getMetricsMeasurement, measurement) + // 相同的指标在一起 .orderByAsc(AlarmPolicyRuleDO::getMetricsId) // 通过 p0 > p1 排序 .orderByAsc(AlarmPolicyRuleDO::getLevel) diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyServiceImpl.java index a0b98134..ca415b4b 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/AlarmPolicyServiceImpl.java @@ -173,14 +173,14 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { @Override public List getAlarmPolicyListByCache() { // 查询缓存 - List list = RedisMaps.valuesJson(AlarmPolicyCacheKeyDefine.MONITOR_ALARM_POLICY); + List list = RedisMaps.valuesJson(AlarmPolicyCacheKeyDefine.ALARM_POLICY); if (list.isEmpty()) { // 查询数据库 list = alarmPolicyDAO.of().list(AlarmPolicyConvert.MAPPER::toCache); // 设置屏障 防止穿透 CacheBarriers.checkBarrier(list, AlarmPolicyCacheDTO::new); // 设置缓存 - RedisMaps.putAllJson(AlarmPolicyCacheKeyDefine.MONITOR_ALARM_POLICY, s -> s.getId().toString(), list); + RedisMaps.putAllJson(AlarmPolicyCacheKeyDefine.ALARM_POLICY, s -> s.getId().toString(), list); } // 删除屏障 CacheBarriers.removeBarrier(list); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorAgentEndpointServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorAgentEndpointServiceImpl.java index 0c445078..93b8c75d 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorAgentEndpointServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorAgentEndpointServiceImpl.java @@ -35,10 +35,12 @@ import org.dromara.visor.common.constant.ErrorMessage; import org.dromara.visor.common.utils.Assert; import org.dromara.visor.common.utils.LockerUtils; import org.dromara.visor.framework.influxdb.core.utils.InfluxdbUtils; +import org.dromara.visor.framework.redis.core.utils.RedisMaps; import org.dromara.visor.module.asset.api.HostApi; import org.dromara.visor.module.asset.entity.dto.host.HostDTO; import org.dromara.visor.module.infra.api.SystemUserApi; import org.dromara.visor.module.monitor.dao.MonitorHostDAO; +import org.dromara.visor.module.monitor.define.cache.MonitorHostCacheKeyDefine; import org.dromara.visor.module.monitor.engine.AlarmEngine; import org.dromara.visor.module.monitor.engine.MonitorContext; import org.dromara.visor.module.monitor.entity.domain.MonitorHostDO; @@ -146,8 +148,13 @@ public class MonitorAgentEndpointServiceImpl implements MonitorAgentEndpointServ update.setMonitorConfig(JSON.toJSONString(newConfig)); } monitorHostDAO.updateById(update); + // 删除元数据缓存 + Long policyId = monitorHost.getPolicyId(); + if (policyId != null) { + RedisMaps.delete(MonitorHostCacheKeyDefine.MONITOR_HOST_POLICY_HOST_TAGS.format(policyId)); + } } - // 设置配置缓存 + // 重新加载监控主机上下文 if (newConfig != null) { monitorContext.reloadMonitorHost(agentKey); } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java index 84623030..f3183c35 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorHostServiceImpl.java @@ -40,6 +40,7 @@ import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs; import org.dromara.visor.framework.influxdb.core.query.FluxQueryBuilder; import org.dromara.visor.framework.influxdb.core.utils.InfluxdbUtils; import org.dromara.visor.framework.mybatis.core.query.Conditions; +import org.dromara.visor.framework.redis.core.utils.RedisMaps; import org.dromara.visor.module.asset.api.HostAgentApi; import org.dromara.visor.module.asset.api.HostApi; import org.dromara.visor.module.asset.entity.dto.host.HostAgentLogDTO; @@ -51,6 +52,7 @@ import org.dromara.visor.module.monitor.constant.MetricsConst; import org.dromara.visor.module.monitor.convert.MonitorHostConvert; import org.dromara.visor.module.monitor.dao.AlarmPolicyDAO; import org.dromara.visor.module.monitor.dao.MonitorHostDAO; +import org.dromara.visor.module.monitor.define.cache.MonitorHostCacheKeyDefine; import org.dromara.visor.module.monitor.engine.MonitorContext; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyDO; import org.dromara.visor.module.monitor.entity.domain.MonitorHostDO; @@ -74,6 +76,7 @@ import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 监控主机 服务实现类 @@ -235,6 +238,48 @@ public class MonitorHostServiceImpl implements MonitorHostService { return seriesList; } + @Override + public List getMonitorHostPolicyRuleTags(Long policyId, String measurement) { + MeasurementEnum measurementEnum = MeasurementEnum.of(measurement); + if (measurementEnum == null) { + return Collections.emptyList(); + } + // 查询缓存 + String cacheKey = MonitorHostCacheKeyDefine.MONITOR_HOST_POLICY_HOST_TAGS.format(policyId); + String value = RedisMaps.get(cacheKey, measurement); + if (!Strings.isBlank(value)) { + return JSON.parseArray(value, String.class); + } + // 查询规则下的全部主机 + List metas = monitorHostDAO.selectByPolicyId(policyId) + .stream() + .map(MonitorHostDO::getMonitorMeta) + .filter(Objects::nonNull) + .map(s -> JSON.parseObject(s, MonitorHostMetaDTO.class)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + // 映射数据 + Function> tagsGetter; + if (MeasurementEnum.CPU.equals(measurementEnum)) { + tagsGetter = MonitorHostMetaDTO::getCpus; + } else if (MeasurementEnum.DISK.equals(measurementEnum)) { + tagsGetter = MonitorHostMetaDTO::getDisks; + } else if (MeasurementEnum.NETWORK.equals(measurementEnum)) { + tagsGetter = MonitorHostMetaDTO::getNets; + } else { + return Collections.emptyList(); + } + List tags = metas.stream() + .map(tagsGetter) + .flatMap(Collection::stream) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + // 设置缓存 + RedisMaps.putJson(cacheKey, MonitorHostCacheKeyDefine.MONITOR_HOST_POLICY_HOST_TAGS, measurement, tags); + return tags; + } + @Override @Transactional(rollbackFor = Exception.class) public Integer updateMonitorHostById(MonitorHostUpdateRequest request) { @@ -272,7 +317,15 @@ public class MonitorHostServiceImpl implements MonitorHostService { if (policyId == null) { monitorHostDAO.setPolicyIdWithNullById(id); } - // 更新缓存 + // 删除元数据缓存 + List tagsCacheKeyList = Stream.of(policyId, monitorHost.getPolicyId()) + .filter(Objects::nonNull) + .map(MonitorHostCacheKeyDefine.MONITOR_HOST_POLICY_HOST_TAGS::format) + .collect(Collectors.toList()); + if (!tagsCacheKeyList.isEmpty()) { + RedisMaps.delete(tagsCacheKeyList); + } + // 重新加载监控主机上下文 monitorContext.reloadMonitorHost(host.getAgentKey()); log.info("MonitorHostService-updateMonitorHostById effect: {}", effect); return effect; diff --git a/orion-visor-ui/src/api/monitor/alarm-rule.ts b/orion-visor-ui/src/api/monitor/alarm-rule.ts index 21563a8b..28d38701 100644 --- a/orion-visor-ui/src/api/monitor/alarm-rule.ts +++ b/orion-visor-ui/src/api/monitor/alarm-rule.ts @@ -72,8 +72,8 @@ export function updateAlarmRuleSwitch(request: AlarmRuleUpdateRequest) { /** * 查询全部监控告警规则 */ -export function getAlarmRuleList(policyId: number, metricsMeasurement: string = '') { - return axios.get>('/monitor/alarm-policy-rule/list', { params: { policyId, metricsMeasurement } }); +export function getAlarmRuleList(policyId: number, measurement: string = '') { + return axios.get>('/monitor/alarm-policy-rule/list', { params: { policyId, measurement } }); } /** diff --git a/orion-visor-ui/src/api/monitor/monitor-host.ts b/orion-visor-ui/src/api/monitor/monitor-host.ts index fd025031..3d6b86aa 100644 --- a/orion-visor-ui/src/api/monitor/monitor-host.ts +++ b/orion-visor-ui/src/api/monitor/monitor-host.ts @@ -177,6 +177,13 @@ export function getMonitorHostPage(request: MonitorHostQueryRequest) { return axios.post>('/monitor/monitor-host/query', request); } +/** + * 查询监控告警标签 + */ +export function getMonitorHostPolicyRuleTags(policyId: number, measurement: string = '') { + return axios.get>('/monitor/monitor-host/host-tags', { params: { policyId, measurement } }); +} + /** * 更新监控主机 */ diff --git a/orion-visor-ui/src/views/monitor/alarm-rule/components/alarm-rule-form-drawer.vue b/orion-visor-ui/src/views/monitor/alarm-rule/components/alarm-rule-form-drawer.vue index 54029640..a88e4555 100644 --- a/orion-visor-ui/src/views/monitor/alarm-rule/components/alarm-rule-form-drawer.vue +++ b/orion-visor-ui/src/views/monitor/alarm-rule/components/alarm-rule-form-drawer.vue @@ -6,7 +6,7 @@ :unmount-on-close="true" :ok-button-props="{ disabled: loading }" :cancel-button-props="{ disabled: loading }" - :on-before-ok="handlerOk" + :on-before-ok="handleOk" @cancel="handleClose"> -