diff --git a/docker-compose.yaml b/docker-compose.yaml index f3311ac2..ca509a87 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,6 +1,6 @@ version: '3.3' -# latest = 2.5.3 +# latest = 2.5.4 # 支持以下源 # lijiahangmax/* diff --git a/docker/docker-build.sh b/docker/docker-build.sh index f08e6efc..470bc549 100644 --- a/docker/docker-build.sh +++ b/docker/docker-build.sh @@ -7,7 +7,7 @@ set -e source ./project-build.sh "$@" # 版本号 -version=2.5.3 +version=2.5.4 # 是否推送镜像 push_image=false # 是否构建 latest diff --git a/docker/project-build.sh b/docker/project-build.sh index ef744e40..c61564ca 100644 --- a/docker/project-build.sh +++ b/docker/project-build.sh @@ -4,7 +4,7 @@ set -e # DockerContext: orion-visor # 版本号 -version=2.5.3 +version=2.5.4 # 是否构建 service export build_service=false # 是否构建 ui diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AppConst.java b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AppConst.java index 0ecc1929..fd3caa18 100644 --- a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AppConst.java +++ b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/AppConst.java @@ -36,7 +36,7 @@ public interface AppConst extends OrionConst { /** * 同 ${orion.version} 迭代时候需要手动更改 */ - String VERSION = "2.5.3"; + String VERSION = "2.5.4"; /** * 同 ${spring.application.name} diff --git a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/ConfigKeys.java b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/ConfigKeys.java index b34b659d..4a62ae10 100644 --- a/orion-visor-common/src/main/java/org/dromara/visor/common/constant/ConfigKeys.java +++ b/orion-visor-common/src/main/java/org/dromara/visor/common/constant/ConfigKeys.java @@ -34,116 +34,116 @@ public interface ConfigKeys { /** * SFTP 文件预览大小 */ - String SFTP_PREVIEW_SIZE = "sftp_previewSize"; + String SFTP_PREVIEW_SIZE = "sftp.preview-size"; /** * SFTP 重复文件备份 */ - String SFTP_UPLOAD_PRESENT_BACKUP = "sftp_uploadPresentBackup"; + String SFTP_UPLOAD_PRESENT_BACKUP = "sftp.upload-present-backup"; /** * SFTP 备份文件名称 */ - String SFTP_UPLOAD_BACKUP_FILE_NAME = "sftp_uploadBackupFileName"; + String SFTP_UPLOAD_BACKUP_FILE_NAME = "sftp.upload-backup-file-name"; /** * 加密公钥 */ - String ENCRYPT_PUBLIC_KEY = "encrypt_publicKey"; + String ENCRYPT_PUBLIC_KEY = "encrypt.public-key"; /** * 加密私钥 */ - String ENCRYPT_PRIVATE_KEY = "encrypt_privateKey"; + String ENCRYPT_PRIVATE_KEY = "encrypt.private-key"; /** * 日志前端显示行数 */ - String LOG_WEB_SCROLL_LINES = "log_webScrollLines"; + String LOG_WEB_SCROLL_LINES = "log.web-scroll-lines"; /** * 日志加载偏移行 */ - String LOG_TRACKER_LOAD_LINES = "log_trackerLoadLines"; + String LOG_TRACKER_LOAD_LINES = "log.tracker-load-lines"; /** * 日志加载间隔毫秒 */ - String LOG_TRACKER_LOAD_INTERVAL = "log_trackerLoadInterval"; + String LOG_TRACKER_LOAD_INTERVAL = "log.tracker-load-interval"; /** * 是否生成详细的执行日志 */ - String LOG_EXEC_DETAIL_LOG = "log_execDetailLog"; + String LOG_EXEC_DETAIL_ENABLED = "log.exec-detail.enabled"; /** - * 凭证有效期分 + * 凭证有效期 分 */ - String LOGIN_LOGIN_SESSION_TIME = "login_loginSessionTime"; + String LOGIN_LOGIN_SESSION_TIME = "login.login-session-time"; /** * 允许多端登录 */ - String LOGIN_ALLOW_MULTI_DEVICE = "login_allowMultiDevice"; + String LOGIN_ALLOW_MULTI_DEVICE = "login.allow-multi-device"; /** * 允许凭证续签 */ - String LOGIN_ALLOW_REFRESH = "login_allowRefresh"; + String LOGIN_ALLOW_REFRESH = "login.allow-refresh"; /** * 凭证续签最大次数 */ - String LOGIN_MAX_REFRESH_COUNT = "login_maxRefreshCount"; + String LOGIN_MAX_REFRESH_COUNT = "login.max-refresh-count"; /** * 凭证续签间隔分 */ - String LOGIN_REFRESH_INTERVAL = "login_refreshInterval"; + String LOGIN_REFRESH_INTERVAL = "login.refresh-interval"; /** * 登录失败锁定 */ - String LOGIN_LOGIN_FAILED_LOCK = "login_loginFailedLock"; + String LOGIN_LOGIN_FAILED_LOCK = "login.login-failed-lock"; /** - * 登录失败锁定阈值分 + * 登录失败锁定阈值 */ - String LOGIN_LOGIN_FAILED_LOCK_THRESHOLD = "login_loginFailedLockThreshold"; + String LOGIN_LOGIN_FAILED_LOCK_THRESHOLD = "login.login-failed-lock-threshold"; /** - * 登录失败锁定时间分 + * 登录失败锁定时间 分 */ - String LOGIN_LOGIN_FAILED_LOCK_TIME = "login_loginFailedLockTime"; + String LOGIN_LOGIN_FAILED_LOCK_TIME = "login.login-failed-lock-time"; /** * 登录失败发信 */ - String LOGIN_LOGIN_FAILED_SEND = "login_loginFailedSend"; + String LOGIN_LOGIN_FAILED_SEND = "login.login-failed-send"; /** * 登录失败发信阈值 */ - String LOGIN_LOGIN_FAILED_SEND_THRESHOLD = "login_loginFailedSendThreshold"; + String LOGIN_LOGIN_FAILED_SEND_THRESHOLD = "login.login-failed-send-threshold"; /** * 是否开启自动清理命令记录 */ - String AUTO_CLEAR_EXEC_LOG_ENABLED = "autoClear_execLogEnabled"; + String AUTO_CLEAR_EXEC_LOG_ENABLED = "auto-clear.exec-log.enabled"; /** * 自动清理命令记录保留天数 */ - String AUTO_CLEAR_EXEC_LOG_KEEP_DAYS = "autoClear_execLogKeepDays"; + String AUTO_CLEAR_EXEC_LOG_KEEP_DAYS = "auto-clear.exec-log.keep-days"; /** * 是否开启自动清理终端连接记录 */ - String AUTO_CLEAR_TERMINAL_LOG_ENABLED = "autoClear_terminalLogEnabled"; + String AUTO_CLEAR_TERMINAL_LOG_ENABLED = "auto-clear.terminal-log.enabled"; /** * 自动清理终端连接记录保留天数 */ - String AUTO_CLEAR_TERMINAL_LOG_KEEP_DAYS = "autoClear_terminalLogKeepDays"; + String AUTO_CLEAR_TERMINAL_LOG_KEEP_DAYS = "auto-clear.terminal-log.keep-days"; } diff --git a/orion-visor-dependencies/pom.xml b/orion-visor-dependencies/pom.xml index bbd0dd7f..5561109a 100644 --- a/orion-visor-dependencies/pom.xml +++ b/orion-visor-dependencies/pom.xml @@ -14,11 +14,11 @@ https://github.com/dromara/orion-visor - 2.5.3 + 2.5.4 2.7.17 2.7.15 1.5.0 - 2.0.4 + 2.0.5 1.9.7 1.18.26 1.6.15 diff --git a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm index b07818bd..030711d4 100644 --- a/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm +++ b/orion-visor-framework/orion-visor-spring-boot-starter-mybatis/src/main/resources/templates/orion-vue-views-components-table.vue.vm @@ -91,6 +91,7 @@ #foreach($field in ${table.fields}) diff --git a/orion-visor-launch/src/main/resources/application-dev.yaml b/orion-visor-launch/src/main/resources/application-dev.yaml index bfad7464..95b5e913 100644 --- a/orion-visor-launch/src/main/resources/application-dev.yaml +++ b/orion-visor-launch/src/main/resources/application-dev.yaml @@ -14,7 +14,7 @@ spring: port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:Data@123456} database: ${REDIS_DATABASE:1} - data-version: ${REDIS_DATA_VERSION:1} + data-version: ${REDIS_DATA_VERSION:2} mock: false redisson: threads: 2 diff --git a/orion-visor-launch/src/main/resources/application-prod.yaml b/orion-visor-launch/src/main/resources/application-prod.yaml index ffd195e1..a93fbdec 100644 --- a/orion-visor-launch/src/main/resources/application-prod.yaml +++ b/orion-visor-launch/src/main/resources/application-prod.yaml @@ -25,7 +25,7 @@ spring: port: ${REDIS_PORT:6379} password: ${REDIS_PASSWORD:Data@123456} database: ${REDIS_DATABASE:0} - data-version: ${REDIS_DATA_VERSION:1} + data-version: ${REDIS_DATA_VERSION:2} redisson: threads: 4 netty-threads: 4 diff --git a/orion-visor-launch/src/test/java/org/dromara/visor/launch/ReplaceVersion.java b/orion-visor-launch/src/test/java/org/dromara/visor/launch/ReplaceVersion.java index ad97dbbe..65a87ad6 100644 --- a/orion-visor-launch/src/test/java/org/dromara/visor/launch/ReplaceVersion.java +++ b/orion-visor-launch/src/test/java/org/dromara/visor/launch/ReplaceVersion.java @@ -39,9 +39,9 @@ import java.util.function.Function; */ public class ReplaceVersion { - private static final String TARGET_VERSION = "2.5.2"; + private static final String TARGET_VERSION = "2.5.3"; - private static final String REPLACE_VERSION = "2.5.3"; + private static final String REPLACE_VERSION = "2.5.4"; private static final String PATH = new File("").getAbsolutePath(); diff --git a/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/config/AppLogConfig.java b/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/config/AppLogConfig.java index 922d77f1..e02cbc09 100644 --- a/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/config/AppLogConfig.java +++ b/orion-visor-modules/orion-visor-module-common/src/main/java/org/dromara/visor/module/common/config/AppLogConfig.java @@ -50,12 +50,12 @@ public class AppLogConfig { /** * 是否生成详细的执行日志 */ - private final ConfigRef execDetailLog; + private final ConfigRef execDetailEnabled; public AppLogConfig(ConfigStore configStore) { this.trackerLoadLines = configStore.int32(ConfigKeys.LOG_TRACKER_LOAD_LINES); this.trackerLoadInterval = configStore.int32(ConfigKeys.LOG_TRACKER_LOAD_INTERVAL); - this.execDetailLog = configStore.bool(ConfigKeys.LOG_EXEC_DETAIL_LOG); + this.execDetailEnabled = configStore.bool(ConfigKeys.LOG_EXEC_DETAIL_ENABLED); } public Integer getTrackerLoadLines() { @@ -66,8 +66,8 @@ public class AppLogConfig { return trackerLoadInterval.value; } - public Boolean getExecDetailLog() { - return execDetailLog.value; + public Boolean getExecDetailEnabled() { + return execDetailEnabled.value; } } diff --git a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/handler/exec/command/handler/ExecTaskHandler.java b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/handler/exec/command/handler/ExecTaskHandler.java index ecb90eb7..076eaf4a 100644 --- a/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/handler/exec/command/handler/ExecTaskHandler.java +++ b/orion-visor-modules/orion-visor-module-exec/orion-visor-module-exec-service/src/main/java/org/dromara/visor/module/exec/handler/exec/command/handler/ExecTaskHandler.java @@ -193,7 +193,7 @@ public class ExecTaskHandler implements IExecTaskHandler { * @return handler */ private IExecCommandHandler createCommandHandler(Long execHostId) { - if (Booleans.isTrue(appLogConfig.getExecDetailLog())) { + if (Booleans.isTrue(appLogConfig.getExecDetailEnabled())) { // 详细日志 return new ExecCommandDetailHandler(execHostId, execLog, builtParams, timeoutChecker); } else { diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/dao/DataGroupDAO.java b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/dao/DataGroupDAO.java index f265e2db..05e43dd8 100644 --- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/dao/DataGroupDAO.java +++ b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/dao/DataGroupDAO.java @@ -45,20 +45,27 @@ public interface DataGroupDAO extends IMapper { * * @param parentId parentId * @param type type + * @param userId userId * @return max(sort) */ - Integer selectMaxSort(@Param("parentId") Long parentId, @Param("type") String type); + Integer selectMaxSort(@Param("parentId") Long parentId, + @Param("type") String type, + @Param("userId") Long userId); /** * 修改排序 * * @param parentId parentId + * @param type type + * @param userId userId * @param condition 条件 * @param referSort 对比值 * @param addition 自增步长 * @return effect */ Integer updateSort(@Param("parentId") Long parentId, + @Param("type") String type, + @Param("userId") Long userId, @Param("condition") String condition, @Param("referSort") Integer referSort, @Param("addition") Integer addition); diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/define/cache/UserCacheKeyDefine.java b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/define/cache/UserCacheKeyDefine.java index ff179ef0..8a66388f 100644 --- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/define/cache/UserCacheKeyDefine.java +++ b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/define/cache/UserCacheKeyDefine.java @@ -59,6 +59,7 @@ public interface UserCacheKeyDefine { CacheKeyDefine LOGIN_FAILED_COUNT = new CacheKeyBuilder() .key("user:login-failed:{}") .desc("用户登录失败次数 ${username}") + .noPrefix() .type(Integer.class) .struct(RedisCacheStruct.STRING) .build(); diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/service/impl/DataGroupServiceImpl.java b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/service/impl/DataGroupServiceImpl.java index 6af63e03..5f776efe 100644 --- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/service/impl/DataGroupServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/java/org/dromara/visor/module/infra/service/impl/DataGroupServiceImpl.java @@ -82,7 +82,7 @@ public class DataGroupServiceImpl implements DataGroupService { // 查询数据是否冲突 this.checkDataGroupPresent(record); // 查询最大排序 - Integer sort = dataGroupDAO.selectMaxSort(request.getParentId(), request.getType()); + Integer sort = dataGroupDAO.selectMaxSort(request.getParentId(), request.getType(), request.getUserId()); record.setSort(sort + Const.DEFAULT_SORT); // 插入 int effect = dataGroupDAO.insert(record); @@ -130,14 +130,19 @@ public class DataGroupServiceImpl implements DataGroupService { Assert.notNull(targetRecord, ErrorMessage.GROUP_ABSENT); // 更新 String type = moveRecord.getType(); + Long userId = moveRecord.getUserId(); Long targetParentId = targetRecord.getParentId(); int effect = 0; // 修改排序 if (MovePosition.TOP.equals(position)) { // 移动到元素上 将大于等于 targetRecord 的排序都加 10 - dataGroupDAO.updateSort(targetParentId, ">=", - targetRecord.getSort(), Const.DEFAULT_SORT); - // 修改 parentId sort + dataGroupDAO.updateSort(targetParentId, + type, + userId, + ">=", + targetRecord.getSort(), + Const.DEFAULT_SORT); + // 修改关联以及排序 DataGroupDO update = DataGroupDO.builder() .id(id) .parentId(targetParentId) @@ -146,8 +151,8 @@ public class DataGroupServiceImpl implements DataGroupService { effect = dataGroupDAO.updateById(update); } else if (MovePosition.IN.equals(position)) { // 移动到元素中 获取最大排序 - Integer newSort = dataGroupDAO.selectMaxSort(targetId, type) + Const.DEFAULT_SORT; - // 修改 parentId sort + Integer newSort = dataGroupDAO.selectMaxSort(targetId, type, userId) + Const.DEFAULT_SORT; + // 修改关联以及排序 DataGroupDO update = DataGroupDO.builder() .id(id) .parentId(targetId) @@ -156,9 +161,13 @@ public class DataGroupServiceImpl implements DataGroupService { effect = dataGroupDAO.updateById(update); } else if (MovePosition.BOTTOM.equals(position)) { // 移动到元素下 将大于 targetRecord 的排序都加 10 - dataGroupDAO.updateSort(targetParentId, ">", - targetRecord.getSort(), Const.DEFAULT_SORT); - // 修改 parentId sort + dataGroupDAO.updateSort(targetParentId, + type, + userId, + ">", + targetRecord.getSort(), + Const.DEFAULT_SORT); + // 修改关联以及排序 DataGroupDO update = DataGroupDO.builder() .id(id) .parentId(targetParentId) @@ -167,7 +176,7 @@ public class DataGroupServiceImpl implements DataGroupService { effect = dataGroupDAO.updateById(update); } // 删除缓存 - this.deleteCache(type, moveRecord.getUserId()); + this.deleteCache(type, userId); // 添加日志参数 OperatorLogs.add(OperatorLogs.SOURCE, moveRecord.getName()); OperatorLogs.add(OperatorLogs.TARGET, targetRecord.getName()); diff --git a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/resources/mapper/DataGroupMapper.xml b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/resources/mapper/DataGroupMapper.xml index 4a2b5289..c39baafc 100644 --- a/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/resources/mapper/DataGroupMapper.xml +++ b/orion-visor-modules/orion-visor-module-infra/orion-visor-module-infra-service/src/main/resources/mapper/DataGroupMapper.xml @@ -22,19 +22,27 @@ id, parent_id, type, user_id, name, sort, create_time, update_time, creator, updater, deleted - - UPDATE data_group - SET sort = sort + #{addition} - WHERE parent_id = #{parentId} - AND sort ${condition} #{referSort} - - + + UPDATE data_group + SET sort = sort + #{addition} + WHERE deleted = 0 + AND type = #{type} + AND parent_id = #{parentId} + AND sort ${condition} #{referSort} + + AND user_id = #{userId} + + + diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/MonitorContext.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorAgentContext.java similarity index 63% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/MonitorContext.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorAgentContext.java index a6f17058..deb401f6 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/MonitorContext.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorAgentContext.java @@ -20,7 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.context; import cn.orionsec.kit.lang.define.cache.TimedCache; import cn.orionsec.kit.lang.define.cache.TimedCacheBuilder; @@ -29,15 +29,11 @@ import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.dromara.visor.common.constant.Const; import org.dromara.visor.module.monitor.convert.MonitorHostConvert; -import org.dromara.visor.module.monitor.convert.MonitorMetricsConvert; import org.dromara.visor.module.monitor.dao.MonitorHostDAO; -import org.dromara.visor.module.monitor.dao.MonitorMetricsDAO; import org.dromara.visor.module.monitor.entity.domain.MonitorHostDO; -import org.dromara.visor.module.monitor.entity.domain.MonitorMetricsDO; import org.dromara.visor.module.monitor.entity.dto.AgentMetricsDataDTO; import org.dromara.visor.module.monitor.entity.dto.MonitorHostConfigDTO; import org.dromara.visor.module.monitor.entity.dto.MonitorHostContextDTO; -import org.dromara.visor.module.monitor.entity.dto.MonitorMetricsContextDTO; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -47,7 +43,7 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** - * 监控上下文 + * 监控探针上下文 * * @author Jiahang Li * @version 1.0.0 @@ -55,23 +51,13 @@ import java.util.concurrent.ConcurrentHashMap; */ @Slf4j @Component -public class MonitorContext { +public class MonitorAgentContext { /** * 监控主机缓存 */ private static final ConcurrentHashMap MONITOR_HOST_CACHE = new ConcurrentHashMap<>(); - /** - * 监控指标缓存 - */ - private static final ConcurrentHashMap MONITOR_METRICS_CACHE = new ConcurrentHashMap<>(); - - /** - * 监控指标引用缓存 - */ - private static final ConcurrentHashMap MONITOR_METRICS_KEY_REL = new ConcurrentHashMap<>(); - /** * 最后心跳时间缓存 3min */ @@ -88,9 +74,6 @@ public class MonitorContext { .checkInterval(Const.MS_S_60) .build(); - @Resource - private MonitorMetricsDAO monitorMetricsDAO; - @Resource private MonitorHostDAO monitorHostDAO; @@ -103,10 +86,6 @@ public class MonitorContext { log.info("MonitorContext-init hosts start."); this.loadMonitorHost(); log.info("MonitorContext-init hosts end."); - // 初始化监控指标 - log.info("MonitorContext-init metrics start."); - this.loadMonitorMetrics(); - log.info("MonitorContext-init metrics end."); } @PreDestroy @@ -128,17 +107,6 @@ public class MonitorContext { } } - /** - * 加载监控指标 - */ - public void loadMonitorMetrics() { - MONITOR_METRICS_CACHE.clear(); - // 查询全部指标 - List metrics = monitorMetricsDAO.selectList(null); - metrics.forEach(s -> MONITOR_METRICS_CACHE.put(s.getId(), MonitorMetricsConvert.MAPPER.toContext(s))); - metrics.forEach(s -> MONITOR_METRICS_KEY_REL.put(this.getMonitorMetricsKey(s.getMeasurement(), s.getValue()), s.getId())); - } - // ----------------------- 监控主机 ---------------------- /** @@ -194,7 +162,7 @@ public class MonitorContext { * @param metrics 指标 */ public void setAgentMetrics(String agentKey, AgentMetricsDataDTO metrics) { - // 设置指标数据 + // 设置指标数据 LATEST_METRICS_CACHE.put(agentKey, metrics); // 更新心跳时间 AGENT_LAST_ACTIVE_TIME.put(agentKey, System.currentTimeMillis()); @@ -237,72 +205,4 @@ public class MonitorContext { return AGENT_LAST_ACTIVE_TIME.get(agentKey) != null; } - // ----------------------- 监控指标 ---------------------- - - /** - * 重新加载监控指标 - * - * @param id id - */ - public void reloadMonitorMetrics(Long id) { - // 删除指标缓存 - MONITOR_METRICS_CACHE.remove(id); - // 删除指标引用 - MONITOR_METRICS_KEY_REL.entrySet().removeIf(entry -> entry.getValue().equals(id)); - // 重新加载指标 - MonitorMetricsDO metrics = monitorMetricsDAO.selectById(id); - if (metrics == null) { - return; - } - MONITOR_METRICS_CACHE.put(metrics.getId(), MonitorMetricsConvert.MAPPER.toContext(metrics)); - MONITOR_METRICS_KEY_REL.put(this.getMonitorMetricsKey(metrics.getMeasurement(), metrics.getValue()), metrics.getId()); - } - - /** - * 获取监控指标 - * - * @param id id - * @return cache - */ - public MonitorMetricsContextDTO getMonitorMetrics(Long id) { - return MONITOR_METRICS_CACHE.get(id); - } - - /** - * 获取监控指标 - * - * @param measurement measurement - * @param field field - * @return cache - */ - public MonitorMetricsContextDTO getMonitorMetrics(String measurement, String field) { - Long id = MONITOR_METRICS_KEY_REL.get(this.getMonitorMetricsKey(measurement, field)); - if (id == null) { - return null; - } - return MONITOR_METRICS_CACHE.get(id); - } - - /** - * 获取监控指标 id - * - * @param measurement measurement - * @param field field - * @return id - */ - public Long getMonitorMetricsId(String measurement, String field) { - return MONITOR_METRICS_KEY_REL.get(this.getMonitorMetricsKey(measurement, field)); - } - - /** - * 获取监控指标 key - * - * @param measurement measurement - * @param field field - * @return key - */ - private String getMonitorMetricsKey(String measurement, String field) { - return measurement + "_" + field; - } - } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorMetricsContext.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorMetricsContext.java new file mode 100644 index 00000000..a13b82f9 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/context/MonitorMetricsContext.java @@ -0,0 +1,152 @@ +/* + * 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.context; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.visor.module.monitor.convert.MonitorMetricsConvert; +import org.dromara.visor.module.monitor.dao.MonitorMetricsDAO; +import org.dromara.visor.module.monitor.entity.domain.MonitorMetricsDO; +import org.dromara.visor.module.monitor.entity.dto.MonitorMetricsContextDTO; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 监控指标上下文 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/10/12 19:39 + */ +@Slf4j +@Component +public class MonitorMetricsContext { + + /** + * 监控指标缓存 + */ + private static final ConcurrentHashMap MONITOR_METRICS_CACHE = new ConcurrentHashMap<>(); + + /** + * 监控指标引用缓存 + */ + private static final ConcurrentHashMap MONITOR_METRICS_KEY_REL = new ConcurrentHashMap<>(); + + @Resource + private MonitorMetricsDAO monitorMetricsDAO; + + /** + * 初始化监控上下文 + */ + @PostConstruct + public void initMonitorContext() { + // 初始化监控指标 + log.info("MetricsContext-init start."); + this.loadMonitorMetrics(); + log.info("MetricsContext-init end."); + } + + /** + * 加载监控指标 + */ + public void loadMonitorMetrics() { + MONITOR_METRICS_CACHE.clear(); + // 查询全部指标 + List metrics = monitorMetricsDAO.selectList(null); + metrics.forEach(s -> MONITOR_METRICS_CACHE.put(s.getId(), MonitorMetricsConvert.MAPPER.toContext(s))); + metrics.forEach(s -> MONITOR_METRICS_KEY_REL.put(this.getMonitorMetricsKey(s.getMeasurement(), s.getValue()), s.getId())); + } + + + // ----------------------- 监控指标 ---------------------- + + /** + * 重新加载监控指标 + * + * @param id id + */ + public void reloadMonitorMetrics(Long id) { + // 删除指标缓存 + MONITOR_METRICS_CACHE.remove(id); + // 删除指标引用 + MONITOR_METRICS_KEY_REL.entrySet().removeIf(entry -> entry.getValue().equals(id)); + // 重新加载指标 + MonitorMetricsDO metrics = monitorMetricsDAO.selectById(id); + if (metrics == null) { + return; + } + MONITOR_METRICS_CACHE.put(metrics.getId(), MonitorMetricsConvert.MAPPER.toContext(metrics)); + MONITOR_METRICS_KEY_REL.put(this.getMonitorMetricsKey(metrics.getMeasurement(), metrics.getValue()), metrics.getId()); + } + + /** + * 获取监控指标 + * + * @param id id + * @return cache + */ + public MonitorMetricsContextDTO getMonitorMetrics(Long id) { + return MONITOR_METRICS_CACHE.get(id); + } + + /** + * 获取监控指标 + * + * @param measurement measurement + * @param field field + * @return cache + */ + public MonitorMetricsContextDTO getMonitorMetrics(String measurement, String field) { + Long id = MONITOR_METRICS_KEY_REL.get(this.getMonitorMetricsKey(measurement, field)); + if (id == null) { + return null; + } + return MONITOR_METRICS_CACHE.get(id); + } + + /** + * 获取监控指标 id + * + * @param measurement measurement + * @param field field + * @return id + */ + public Long getMonitorMetricsId(String measurement, String field) { + return MONITOR_METRICS_KEY_REL.get(this.getMonitorMetricsKey(measurement, field)); + } + + /** + * 获取监控指标 key + * + * @param measurement measurement + * @param field field + * @return key + */ + private String getMonitorMetricsKey(String measurement, String field) { + return measurement + "_" + field; + } + +} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyController.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyController.java index 5cc0a8fe..551f44ed 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyController.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/controller/AlarmPolicyController.java @@ -104,9 +104,10 @@ public class AlarmPolicyController { @IgnoreLog(IgnoreLogMode.RET) @GetMapping("/list") @Operation(summary = "查询全部监控告警策略") + @Parameter(name = "type", description = "type", required = true) @PreAuthorize("@ss.hasPermission('monitor:alarm-policy:query')") - public List getAlarmPolicyList() { - return alarmPolicyService.getAlarmPolicyListByCache(); + public List getAlarmPolicyList(@RequestParam("type") String type) { + return alarmPolicyService.getAlarmPolicyListByCache(type); } @IgnoreLog(IgnoreLogMode.RET) 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 bc976a8c..b29ab2b1 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 @@ -35,8 +35,8 @@ import org.dromara.visor.framework.log.core.annotation.IgnoreLog; import org.dromara.visor.framework.log.core.enums.IgnoreLogMode; import org.dromara.visor.framework.web.core.annotation.DemoDisableApi; import org.dromara.visor.framework.web.core.annotation.RestWrapper; +import org.dromara.visor.module.monitor.context.MonitorAgentContext; import org.dromara.visor.module.monitor.define.operator.MonitorHostOperatorType; -import org.dromara.visor.module.monitor.engine.MonitorContext; import org.dromara.visor.module.monitor.entity.dto.AgentMetricsDataDTO; import org.dromara.visor.module.monitor.entity.request.host.*; import org.dromara.visor.module.monitor.entity.vo.MonitorHostMetricsDataVO; @@ -68,7 +68,7 @@ public class MonitorHostController { private MonitorHostService monitorHostService; @Resource - private MonitorContext monitorContext; + private MonitorAgentContext monitorAgentContext; @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/query") @@ -84,7 +84,7 @@ public class MonitorHostController { @Parameter(name = "agentKey", description = "agentKey", required = true) @PreAuthorize("@ss.hasPermission('monitor:monitor-host:query')") public AgentMetricsDataDTO getMonitorHostOverride(@RequestParam("agentKey") String agentKey) { - return monitorContext.getAgentMetrics(agentKey); + return monitorAgentContext.getAgentMetrics(agentKey); } @IgnoreLog(IgnoreLogMode.RET) 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 37fbc756..58e6fcfb 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 @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.monitor.convert; +import org.dromara.visor.common.mapstruct.JsonConversion; 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; @@ -40,7 +41,7 @@ import java.util.List; * @version 1.0.0 * @since 2025-9-17 21:31 */ -@Mapper +@Mapper(uses = JsonConversion.class) public interface AlarmEventConvert { AlarmEventConvert MAPPER = Mappers.getMapper(AlarmEventConvert.class); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmPolicyRuleConvert.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmPolicyRuleConvert.java index 3f4837b2..20ef52ac 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmPolicyRuleConvert.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/AlarmPolicyRuleConvert.java @@ -22,11 +22,11 @@ */ package org.dromara.visor.module.monitor.convert; -import org.dromara.visor.module.monitor.engine.AlarmEngineRule; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyRuleDO; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyRuleCreateRequest; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyRuleUpdateRequest; import org.dromara.visor.module.monitor.entity.vo.AlarmPolicyRuleVO; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEngineRule; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/MonitorHostConvert.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/MonitorHostConvert.java index af2f19cd..836b1f22 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/MonitorHostConvert.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/convert/MonitorHostConvert.java @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.monitor.convert; +import org.dromara.visor.common.mapstruct.StringConversion; import org.dromara.visor.module.asset.entity.dto.host.HostDTO; import org.dromara.visor.module.asset.entity.dto.host.HostQueryDTO; import org.dromara.visor.module.monitor.entity.domain.MonitorHostDO; @@ -40,7 +41,7 @@ import org.mapstruct.factory.Mappers; * @version 1.0.0 * @since 2025-8-14 16:27 */ -@Mapper +@Mapper(uses = StringConversion.class) public interface MonitorHostConvert { MonitorHostConvert MAPPER = Mappers.getMapper(MonitorHostConvert.class); diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmPolicyRuleDAO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmPolicyRuleDAO.java index 60b87ce5..70ed66e9 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmPolicyRuleDAO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/dao/AlarmPolicyRuleDAO.java @@ -59,4 +59,13 @@ public interface AlarmPolicyRuleDAO extends IMapper { return this.selectList(Conditions.eq(AlarmPolicyRuleDO::getPolicyId, policyId)); } + /** + * 通过 policyId 删除 + * + * @param policyId policyId + */ + default void deleteByPolicyId(Long policyId) { + this.delete(Conditions.eq(AlarmPolicyRuleDO::getPolicyId, policyId)); + } + } 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 ca4fac0f..c7815750 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 @@ -39,8 +39,8 @@ import java.util.concurrent.TimeUnit; public interface AlarmPolicyCacheKeyDefine { CacheKeyDefine ALARM_POLICY = new CacheKeyBuilder() - .key("alarm:policy:list") - .desc("告警策略") + .key("alarm:policy:list:{}") + .desc("告警策略 ${type}") .type(AlarmPolicyCacheDTO.class) .struct(RedisCacheStruct.HASH) .timeout(8, TimeUnit.HOURS) @@ -49,6 +49,7 @@ public interface AlarmPolicyCacheKeyDefine { CacheKeyDefine ALARM_RULE_SILENCE = new CacheKeyBuilder() .key("alarm:silence:{}:{}") .desc("告警规则沉默标志 ${agentKey} ${ruleId}") + .noPrefix() .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/entity/domain/AlarmEventDO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmEventDO.java index a9c0fab4..8edfa726 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmEventDO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmEventDO.java @@ -57,17 +57,17 @@ public class AlarmEventDO extends BaseDO { @TableField("agent_key") private String agentKey; - @Schema(description = "主机id") - @TableField("host_id") - private Long hostId; + @Schema(description = "事件来源") + @TableField("source_type") + private String sourceType; - @Schema(description = "主机名称") - @TableField("host_name") - private String hostName; + @Schema(description = "事件来源id") + @TableField("source_id") + private Long sourceId; - @Schema(description = "主机地址") - @TableField("host_address") - private String hostAddress; + @Schema(description = "事件来源id") + @TableField("source_info") + private String sourceInfo; @Schema(description = "策略id") @TableField("policy_id") diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmPolicyDO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmPolicyDO.java index d4a5b2b5..21ece051 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmPolicyDO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/domain/AlarmPolicyDO.java @@ -50,6 +50,10 @@ public class AlarmPolicyDO extends BaseDO { private static final long serialVersionUID = 1L; + @Schema(description = "策略类型") + @TableField("type") + private String type; + @Schema(description = "策略名称") @TableField("name") private String name; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/dto/AlarmEventTriggerDTO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/dto/AlarmEventTriggerDTO.java index 92bf69af..ba6ad7c6 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/dto/AlarmEventTriggerDTO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/dto/AlarmEventTriggerDTO.java @@ -56,14 +56,14 @@ public class AlarmEventTriggerDTO extends BaseDO { @Schema(description = "agentKey") private String agentKey; - @Schema(description = "主机id") - private Long hostId; + @Schema(description = "事件来源") + private String sourceType; - @Schema(description = "主机名称") - private String hostName; + @Schema(description = "事件来源id") + private Long sourceId; - @Schema(description = "主机地址") - private String hostAddress; + @Schema(description = "事件来源id") + private String sourceInfo; @Schema(description = "策略id") private Long policyId; 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/alarm/AlarmEventQueryRequest.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmEventQueryRequest.java index 5ea96e89..30881934 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmEventQueryRequest.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmEventQueryRequest.java @@ -48,13 +48,16 @@ public class AlarmEventQueryRequest extends BaseQueryRequest { @Schema(description = "id") private Long id; - @Schema(description = "主机名称") - private Long hostId; - @Size(max = 32) @Schema(description = "agentKey") private String agentKey; + @Schema(description = "事件来源") + private String sourceType; + + @Schema(description = "事件来源id") + private Long sourceId; + @Schema(description = "策略id") private Long policyId; 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/alarm/AlarmPolicyCreateRequest.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyCreateRequest.java index d37ccfd2..7dd28135 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyCreateRequest.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyCreateRequest.java @@ -47,6 +47,10 @@ public class AlarmPolicyCreateRequest implements Serializable { private static final long serialVersionUID = 1L; + @NotBlank + @Schema(description = "策略类型") + private String type; + @NotBlank @Size(max = 64) @Schema(description = "策略名称") 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/alarm/AlarmPolicyQueryRequest.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyQueryRequest.java index 067c552d..133e8132 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyQueryRequest.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/request/alarm/AlarmPolicyQueryRequest.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import org.dromara.visor.common.entity.BaseQueryRequest; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; /** @@ -46,6 +47,10 @@ public class AlarmPolicyQueryRequest extends BaseQueryRequest { @Schema(description = "id") private Long id; + @NotBlank + @Schema(description = "策略类型") + private String type; + @Size(max = 64) @Schema(description = "策略名称") private String name; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmEventVO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmEventVO.java index a5316e5b..f6d88146 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmEventVO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmEventVO.java @@ -22,6 +22,7 @@ */ package org.dromara.visor.module.monitor.entity.vo; +import com.alibaba.fastjson.JSONObject; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; @@ -51,14 +52,14 @@ public class AlarmEventVO implements Serializable { @Schema(description = "id") private Long id; - @Schema(description = "主机名称") - private Long hostId; + @Schema(description = "事件来源") + private String sourceType; - @Schema(description = "主机名称") - private String hostName; + @Schema(description = "事件来源id") + private Long sourceId; - @Schema(description = "主机地址") - private String hostAddress; + @Schema(description = "事件来源id") + private JSONObject sourceInfo; @Schema(description = "agentKey") private String agentKey; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmPolicyVO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmPolicyVO.java index 5a0f3d17..9f3e655c 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmPolicyVO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/AlarmPolicyVO.java @@ -51,6 +51,9 @@ public class AlarmPolicyVO implements Serializable { @Schema(description = "id") private Long id; + @Schema(description = "策略类型") + private String type; + @Schema(description = "策略名称") private String name; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/MonitorHostVO.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/MonitorHostVO.java index cd4d4925..efcc1126 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/MonitorHostVO.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/entity/vo/MonitorHostVO.java @@ -76,6 +76,9 @@ public class MonitorHostVO implements Serializable { @Schema(description = "主机地址") private String address; + @Schema(description = "主机类型") + private List types; + @Schema(description = "主机状态") private String status; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/AlarmEventSourceTypeEnum.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/AlarmEventSourceTypeEnum.java new file mode 100644 index 00000000..16c2ccea --- /dev/null +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/enums/AlarmEventSourceTypeEnum.java @@ -0,0 +1,63 @@ +/* + * 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.AllArgsConstructor; +import lombok.Getter; + +/** + * 告警事件来源 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/10/13 22:03 + */ +@Getter +@AllArgsConstructor +public enum AlarmEventSourceTypeEnum { + + /** + * 主机告警 + */ + HOST, + + /** + * 拨测告警 + */ + UPTIME, + + ; + + public static AlarmEventSourceTypeEnum of(String value) { + if (value == null) { + return null; + } + for (AlarmEventSourceTypeEnum item : values()) { + if (item.name().equals(value)) { + return item; + } + } + return null; + } + +} \ No newline at end of file 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/handler/alarm/AlarmEngineContext.java similarity index 97% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineContext.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/AlarmEngineContext.java index 5ad880f2..39a92301 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/handler/alarm/AlarmEngineContext.java @@ -20,7 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.handler.alarm; import cn.orionsec.kit.lang.utils.Strings; import cn.orionsec.kit.lang.utils.collect.Lists; @@ -37,6 +37,8 @@ import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyDO; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyNotifyDO; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyRuleDO; import org.dromara.visor.module.monitor.enums.AlarmSwitchEnum; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEnginePolicy; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEngineRule; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngine.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/BaseAlarmEngine.java similarity index 59% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngine.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/BaseAlarmEngine.java index 3cdddd69..0ee47adc 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngine.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/BaseAlarmEngine.java @@ -20,7 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.handler.alarm; import cn.orionsec.kit.lang.define.cache.TimedCache; import cn.orionsec.kit.lang.define.cache.TimedCacheBuilder; @@ -32,23 +32,23 @@ import cn.orionsec.kit.lang.utils.collect.Lists; import cn.orionsec.kit.lang.utils.collect.Maps; import cn.orionsec.kit.lang.utils.io.Streams; import cn.orionsec.kit.lang.utils.time.Dates; -import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.dromara.visor.common.constant.Const; import org.dromara.visor.common.entity.PushUser; import org.dromara.visor.common.enums.BooleanBit; import org.dromara.visor.framework.biz.push.core.utils.PushUtils; import org.dromara.visor.framework.redis.core.utils.RedisStrings; -import org.dromara.visor.module.asset.api.HostAgentApi; -import org.dromara.visor.module.asset.entity.dto.host.HostBaseDTO; import org.dromara.visor.module.infra.api.SystemUserApi; -import org.dromara.visor.module.monitor.convert.AlarmEventConvert; +import org.dromara.visor.module.monitor.context.MonitorAgentContext; +import org.dromara.visor.module.monitor.context.MonitorMetricsContext; import org.dromara.visor.module.monitor.define.cache.AlarmPolicyCacheKeyDefine; -import org.dromara.visor.module.monitor.entity.domain.AlarmEventDO; import org.dromara.visor.module.monitor.entity.dto.*; -import org.dromara.visor.module.monitor.enums.*; +import org.dromara.visor.module.monitor.enums.AlarmLevelEnum; +import org.dromara.visor.module.monitor.enums.AlarmTriggerConditionEnum; +import org.dromara.visor.module.monitor.enums.MetricsUnitEnum; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEnginePolicy; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEngineRule; import org.dromara.visor.module.monitor.service.AlarmEventService; -import org.springframework.stereotype.Component; import javax.annotation.PreDestroy; import javax.annotation.Resource; @@ -57,62 +57,50 @@ import java.util.*; import java.util.concurrent.TimeUnit; /** - * 告警引擎 + * 告警引擎基类 * * @author Jiahang Li * @version 1.0.0 - * @since 2025/8/21 17:26 + * @since 2025/10/13 10:12 */ @Slf4j -@Component -public class AlarmEngine { +public abstract class BaseAlarmEngine implements IAlarmEngine { /** * 告警触发状态缓存 10min */ - private static final TimedCache TRIGGER_STATE_CACHE = TimedCacheBuilder.create() + protected static final TimedCache TRIGGER_STATE_CACHE = TimedCacheBuilder.create() .expireAfter(10 * Const.MS_S_60) .checkInterval(Const.MS_S_60) .build(); @Resource - private AlarmEngineContext alarmEngineContext; + protected AlarmEngineContext alarmEngineContext; @Resource - private MonitorContext monitorContext; + protected MonitorAgentContext monitorAgentContext; @Resource - private AlarmEventService alarmEventService; + protected MonitorMetricsContext monitorMetricsContext; @Resource - private HostAgentApi hostAgentApi; + protected AlarmEventService alarmEventService; @Resource - private SystemUserApi systemUserApi; + protected SystemUserApi systemUserApi; @PreDestroy public void destroyTimedCache() { Streams.close(TRIGGER_STATE_CACHE); } - /** - * 检查并且告警 - * - * @param agentKey agentKey - * @param prevMetrics prevMetrics - * @param newMetrics newMetrics - */ + @Override public void checkAndAlarm(String agentKey, AgentMetricsDataDTO prevMetrics, AgentMetricsDataDTO newMetrics) { - // 获取主机信息 - MonitorHostContextDTO monitorHost = monitorContext.getMonitorHost(agentKey); - if (monitorHost == null) { - return; - } - // 检查策略是否开启 - Long policyId = monitorHost.getPolicyId(); - if (policyId == null || AlarmSwitchEnum.isOff(monitorHost.getAlarmSwitch())) { + // 获取告警策略 + Long policyId = this.getAlarmPolicyId(agentKey); + if (policyId == null) { return; } // 获取对应的策略 @@ -132,7 +120,7 @@ public class AlarmEngine { // 检查指标 AlarmEventTriggerDTO event = this.checkAndAlarm(agentKey, prevMetrics, newMetrics, agentMetrics, metricsField, - policy, monitorHost); + policy); if (event != null) { alarmEvents.add(event); } @@ -147,6 +135,14 @@ public class AlarmEngine { } } + /** + * 获取告警策略 id + * + * @param agentKey agentKey + * @return policyId + */ + protected abstract Long getAlarmPolicyId(String agentKey); + /** * 检查并且告警 * @@ -156,25 +152,22 @@ public class AlarmEngine { * @param agentMetrics agentMetrics * @param metricsField metricsField * @param policy policy - * @param monitorHost monitorHost * @return event */ - private AlarmEventTriggerDTO checkAndAlarm(String agentKey, - AgentMetricsDataDTO prevMetrics, - AgentMetricsDataDTO newMetrics, - AgentMetricsDTO agentMetrics, - String metricsField, - AlarmEnginePolicy policy, - MonitorHostContextDTO monitorHost) { - Long timestamp = newMetrics.getTimestamp(); + protected AlarmEventTriggerDTO checkAndAlarm(String agentKey, + AgentMetricsDataDTO prevMetrics, + AgentMetricsDataDTO newMetrics, + AgentMetricsDTO agentMetrics, + String metricsField, + AlarmEnginePolicy policy) { + Long alarmTimestamp = newMetrics.getTimestamp(); // 指标id - Long metricsId = monitorContext.getMonitorMetricsId(agentMetrics.getType(), metricsField); + Long metricsId = monitorMetricsContext.getMonitorMetricsId(agentMetrics.getType(), metricsField); if (metricsId == null) { return null; } // 指标值 - BigDecimal metricsValue; - metricsValue = agentMetrics.getValues().getBigDecimal(metricsField); + BigDecimal metricsValue = agentMetrics.getValues().getBigDecimal(metricsField); if (metricsValue == null) { return null; } @@ -200,14 +193,30 @@ public class AlarmEngine { return null; } // 检查是否在静默期 - boolean inSilence = this.checkAndSetInSilencePeriod(agentKey, timestamp, matchedRule); + boolean inSilence = this.checkAndSetInSilencePeriod(agentKey, alarmTimestamp, matchedRule); if (inSilence) { return null; } // 创建告警事件 - return this.createAlarmEvent(agentKey, monitorHost, timestamp, agentMetrics, metricsValue, matchedRule); + return this.createAlarmEvent(agentKey, alarmTimestamp, agentMetrics, metricsValue, matchedRule); } + /** + * 创建告警事件 + * + * @param agentKey agentKey + * @param alarmTimestamp alarmTimestamp + * @param agentMetrics agentMetrics + * @param metricsValue metricsValue + * @param rule rule + * @return event + */ + protected abstract AlarmEventTriggerDTO createAlarmEvent(String agentKey, + Long alarmTimestamp, + AgentMetricsDTO agentMetrics, + BigDecimal metricsValue, + AlarmEngineRule rule); + /** * 获取到第一个匹配到达阈值的规则 包含 tag * @@ -216,9 +225,9 @@ public class AlarmEngine { * @param metricsValue metricsValue * @return rule */ - private AlarmEngineRule matchTaggedAgentMetricsRule(List rules, - Map metricsTags, - BigDecimal metricsValue) { + protected AlarmEngineRule matchTaggedAgentMetricsRule(List rules, + Map metricsTags, + BigDecimal metricsValue) { AlarmEngineRule matchedRule = null; // context 根据 level 排序了 for (AlarmEngineRule rule : rules) { @@ -265,7 +274,7 @@ public class AlarmEngine { * @param metricsValue metricsValue * @return rule */ - private AlarmEngineRule matchAgentMetricsRule(List rules, BigDecimal metricsValue) { + protected AlarmEngineRule matchAgentMetricsRule(List rules, BigDecimal metricsValue) { AlarmEngineRule matchedRule = null; // context 根据 level 排序了 for (AlarmEngineRule rule : rules) { @@ -289,13 +298,13 @@ public class AlarmEngine { * @param rule rule * @param metricValue metricValue */ - private boolean checkAlarmCondition(AlarmEngineRule rule, BigDecimal metricValue) { + protected boolean checkAlarmCondition(AlarmEngineRule rule, BigDecimal metricValue) { // 获取指标值 if (metricValue == null) { return false; } // 获取指标单位 - MonitorMetricsContextDTO metrics = monitorContext.getMonitorMetrics(rule.getMetricsId()); + MonitorMetricsContextDTO metrics = monitorMetricsContext.getMonitorMetrics(rule.getMetricsId()); MetricsUnitEnum unit = Optional.ofNullable(metrics) .map(MonitorMetricsContextDTO::getUnit) .map(MetricsUnitEnum::of) @@ -310,13 +319,8 @@ public class AlarmEngine { } // 将阈值转换为原始值 threshold = unit.getThresholdOriginalValue(threshold); - // 触发条件 - AlarmTriggerConditionEnum condition = AlarmTriggerConditionEnum.of(rule.getTriggerCondition()); - if (condition == null) { - return false; - } // 判断是否达到触发条件 - return this.evaluateCondition(condition, metricValue, threshold); + return this.evaluateCondition(rule.getTriggerCondition(), metricValue, threshold); } /** @@ -327,10 +331,12 @@ public class AlarmEngine { * @param threshold threshold * @return eval */ - private boolean evaluateCondition(AlarmTriggerConditionEnum condition, - BigDecimal metricValue, - BigDecimal threshold) { - switch (condition) { + protected boolean evaluateCondition(String condition, + BigDecimal metricValue, + BigDecimal threshold) { + // 触发条件 + AlarmTriggerConditionEnum triggerCondition = AlarmTriggerConditionEnum.of(condition); + switch (triggerCondition) { case GT: return metricValue.compareTo(threshold) > 0; case GE: @@ -356,10 +362,10 @@ public class AlarmEngine { * @param rule rule * @return result */ - private boolean checkConsecutiveCount(String agentKey, - AgentMetricsDataDTO prevMetrics, - AgentMetricsDataDTO newMetrics, - AlarmEngineRule rule) { + protected boolean checkConsecutiveCount(String agentKey, + AgentMetricsDataDTO prevMetrics, + AgentMetricsDataDTO newMetrics, + AlarmEngineRule rule) { // 获取规则连续触发次数 Integer ruleConsecutiveCount = Objects1.def(rule.getConsecutiveCount(), 1); // 获取指标连续触发次数 @@ -393,8 +399,8 @@ public class AlarmEngine { * @param prevMetrics prevMetrics * @return isConsecutiveTrigger */ - private boolean isConsecutiveTrigger(AlarmTriggerStateDTO triggerState, - AgentMetricsDataDTO prevMetrics) { + protected boolean isConsecutiveTrigger(AlarmTriggerStateDTO triggerState, + AgentMetricsDataDTO prevMetrics) { if (prevMetrics == null || triggerState == null) { return false; } @@ -404,14 +410,14 @@ public class AlarmEngine { /** * 检查并且设置静默期 * - * @param agentKey agentKey - * @param timestamp timestamp - * @param rule rule + * @param agentKey agentKey + * @param alarmTimestamp alarmTimestamp + * @param rule rule * @return inSilence */ - private boolean checkAndSetInSilencePeriod(String agentKey, - Long timestamp, - AlarmEngineRule rule) { + protected boolean checkAndSetInSilencePeriod(String agentKey, + Long alarmTimestamp, + AlarmEngineRule rule) { Integer silencePeriod = Objects1.def(rule.getSilencePeriod(), 0); // 无静默期则触发 if (silencePeriod <= 0) { @@ -427,75 +433,11 @@ public class AlarmEngine { .noPrefix() .timeout(silencePeriod, TimeUnit.MINUTES) .build(); - RedisStrings.set(key, timestamp); + RedisStrings.set(key, alarmTimestamp); } return inSilence; } - /** - * 创建告警事件 - * - * @param agentKey agentKey - * @param monitorHost monitorHost - * @param timestamp timestamp - * @param agentMetrics agentMetrics - * @param metricsValue metricsValue - * @param rule rule - * @return event - */ - private AlarmEventTriggerDTO createAlarmEvent(String agentKey, - MonitorHostContextDTO monitorHost, - Long timestamp, - AgentMetricsDTO agentMetrics, - BigDecimal metricsValue, - AlarmEngineRule rule) { - // 查询主机信息 - HostBaseDTO host = hostAgentApi.getHostCacheByAgentKey(agentKey); - if (host == null) { - host = new HostBaseDTO(); - } - // 获取指标 - MonitorMetricsContextDTO metrics = monitorContext.getMonitorMetrics(rule.getMetricsId()); - // 指标单位 - MetricsUnitEnum unit = MetricsUnitEnum.of(metrics.getUnit()); - // 获取连续触发次数 - Integer consecutiveCount = Optional.ofNullable(TRIGGER_STATE_CACHE.get(this.getTriggerStateCacheKey(agentKey, rule))) - .map(AlarmTriggerStateDTO::getConsecutiveCount) - .orElse(1); - // 构建告警信息 - String alarmInfo = this.buildAlarmInfo(metrics, rule, unit, metricsValue, consecutiveCount); - // 创建告警事件记录 - Map tags = agentMetrics.getTags(); - AlarmEventDO alarmEvent = AlarmEventDO.builder() - .agentKey(agentKey) - .hostId(host.getId()) - .hostName(host.getName()) - .hostAddress(host.getAddress()) - .policyId(rule.getPolicyId()) - .policyRuleId(rule.getId()) - .metricsId(rule.getMetricsId()) - .metricsMeasurement(metrics.getMeasurement()) - .alarmTags(tags == null ? Const.EMPTY_OBJECT : JSON.toJSONString(tags)) - .alarmValue(metricsValue) - .alarmThreshold(unit.getThresholdOriginalValue(rule.getThreshold())) - .alarmInfo(alarmInfo) - .alarmLevel(rule.getLevel()) - .triggerCondition(rule.getTriggerCondition()) - .consecutiveCount(consecutiveCount) - .falseAlarm(BooleanBit.FALSE.getValue()) - .handleStatus(AlarmHandleStatusEnum.NEW.name()) - .handleUserId(monitorHost.getOwnerUserId()) - .handleUsername(monitorHost.getOwnerUsername()) - .createTime(new Date(timestamp)) - .updateTime(new Date(timestamp)) - .build(); - - // 保存告警事件 - alarmEventService.createAlarmEvent(alarmEvent); - // 填充其他参数 - return AlarmEventConvert.MAPPER.toTrigger(alarmEvent); - } - /** * 构建告警信息 * @@ -506,11 +448,11 @@ public class AlarmEngine { * @param consecutiveCount consecutiveCount * @return alarmInfo */ - private String buildAlarmInfo(MonitorMetricsContextDTO metrics, - AlarmEngineRule rule, - MetricsUnitEnum unit, - BigDecimal metricsValue, - Integer consecutiveCount) { + protected String buildAlarmInfo(MonitorMetricsContextDTO metrics, + AlarmEngineRule rule, + MetricsUnitEnum unit, + BigDecimal metricsValue, + Integer consecutiveCount) { return metrics.getName() + Const.SPACE + AlarmTriggerConditionEnum.of(rule.getTriggerCondition()).getCondition() + Const.SPACE + unit.format(rule.getThreshold(), new MetricsUnitEnum.FormatOptions(2, metrics.getSuffix())) @@ -525,7 +467,7 @@ public class AlarmEngine { * @param rule rule * @return cacheKey */ - private String getTriggerStateCacheKey(String agentKey, AlarmEngineRule rule) { + protected String getTriggerStateCacheKey(String agentKey, AlarmEngineRule rule) { return agentKey + ":" + rule.getId(); } @@ -535,7 +477,7 @@ public class AlarmEngine { * @param policy policy * @param alarmEvents alarmEvents */ - private void notifyAlarmPolicyChannels(AlarmEnginePolicy policy, List alarmEvents) { + protected void notifyAlarmPolicyChannels(AlarmEnginePolicy policy, List alarmEvents) { List notifyIdList = policy.getNotifyIdList(); if (Lists.isEmpty(notifyIdList)) { return; @@ -549,38 +491,41 @@ public class AlarmEngine { // 构建参数 List> paramsList = new ArrayList<>(); for (AlarmEventTriggerDTO event : alarmEvents) { - MonitorMetricsContextDTO metrics = monitorContext.getMonitorMetrics(event.getMetricsId()); - MetricsUnitEnum unit = MetricsUnitEnum.of(metrics.getUnit()); - AlarmLevelEnum level = AlarmLevelEnum.of(event.getAlarmLevel()); - AlarmTriggerConditionEnum triggerCondition = AlarmTriggerConditionEnum.of(event.getTriggerCondition()); + try { + MonitorMetricsContextDTO metrics = monitorMetricsContext.getMonitorMetrics(event.getMetricsId()); + MetricsUnitEnum unit = MetricsUnitEnum.of(metrics.getUnit()); + AlarmLevelEnum level = AlarmLevelEnum.of(event.getAlarmLevel()); + AlarmTriggerConditionEnum triggerCondition = AlarmTriggerConditionEnum.of(event.getTriggerCondition()); - // 告警事件参数 - Map params = new HashMap<>(); - params.put("id", event.getId()); - params.put("relKey", event.getId()); - params.put("policyId", policy.getId()); - params.put("policyName", policy.getName()); - params.put("ruleId", event.getPolicyRuleId()); - params.put("hostId", event.getHostId()); - params.put("hostName", event.getHostName()); - params.put("hostAddress", event.getHostAddress()); - params.put("metrics", metrics.getMeasurement() + "." + metrics.getValue()); - params.put("metricsId", metrics.getId()); - params.put("metricsName", metrics.getName()); - params.put("metricsField", metrics.getValue()); - params.put("metricsMeasurement", metrics.getMeasurement()); - params.put("tags", event.getAlarmTags()); - params.put("level", level.name()); - params.put("levelLabel", level.getLabel()); - params.put("levelSeverity", level.getSeverity()); - params.put("levelColor", level.getColor()); - params.put("consecutiveCount", event.getConsecutiveCount()); - params.put("triggerCondition", triggerCondition.getCondition()); - params.put("alarmInfo", event.getAlarmInfo()); - params.put("alarmValue", unit.format(event.getAlarmValue(), new MetricsUnitEnum.FormatOptions(2, metrics.getSuffix()))); - params.put("alarmThreshold", unit.format(event.getAlarmThreshold(), new MetricsUnitEnum.FormatOptions(4, metrics.getSuffix()))); - params.put("alarmTime", Dates.format(event.getCreateTime())); - paramsList.add(params); + // 告警事件参数 + Map params = new HashMap<>(); + params.put("id", event.getId()); + params.put("relKey", event.getId()); + params.put("policyId", policy.getId()); + params.put("policyName", policy.getName()); + params.put("ruleId", event.getPolicyRuleId()); + params.put("metrics", metrics.getMeasurement() + "." + metrics.getValue()); + params.put("metricsId", metrics.getId()); + params.put("metricsName", metrics.getName()); + params.put("metricsField", metrics.getValue()); + params.put("metricsMeasurement", metrics.getMeasurement()); + params.put("tags", event.getAlarmTags()); + params.put("level", level.name()); + params.put("levelLabel", level.getLabel()); + params.put("levelSeverity", level.getSeverity()); + params.put("levelColor", level.getColor()); + params.put("consecutiveCount", event.getConsecutiveCount()); + params.put("triggerCondition", triggerCondition.getCondition()); + params.put("alarmInfo", event.getAlarmInfo()); + params.put("alarmValue", unit.format(event.getAlarmValue(), new MetricsUnitEnum.FormatOptions(2, metrics.getSuffix()))); + params.put("alarmThreshold", unit.format(event.getAlarmThreshold(), new MetricsUnitEnum.FormatOptions(4, metrics.getSuffix()))); + params.put("alarmTime", Dates.format(event.getCreateTime())); + // 设置额外告警推送参数 + this.setExtraAlarmPushParams(params, event); + paramsList.add(params); + } catch (Exception e) { + log.info("AlarmEngine-setAlarmParams error", e); + } } // 推送消息 for (Map params : paramsList) { @@ -590,4 +535,12 @@ public class AlarmEngine { } } -} \ No newline at end of file + /** + * 设置告警推送参数 + * + * @param params params + * @param event event + */ + protected abstract void setExtraAlarmPushParams(Map params, AlarmEventTriggerDTO event); + +} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/IAlarmEngine.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/IAlarmEngine.java new file mode 100644 index 00000000..53aee054 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/IAlarmEngine.java @@ -0,0 +1,47 @@ +/* + * 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.handler.alarm; + +import org.dromara.visor.module.monitor.entity.dto.AgentMetricsDataDTO; + +/** + * 告警引擎 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/10/13 10:22 + */ +public interface IAlarmEngine { + + /** + * 检查并且告警 + * + * @param agentKey agentKey + * @param prevMetrics prevMetrics + * @param newMetrics newMetrics + */ + void checkAndAlarm(String agentKey, + AgentMetricsDataDTO prevMetrics, + AgentMetricsDataDTO newMetrics); + +} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/MetricsAlarmEngine.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/MetricsAlarmEngine.java new file mode 100644 index 00000000..10cbb429 --- /dev/null +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/MetricsAlarmEngine.java @@ -0,0 +1,145 @@ +/* + * 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.handler.alarm; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.dromara.visor.common.constant.Const; +import org.dromara.visor.common.enums.BooleanBit; +import org.dromara.visor.module.asset.api.HostAgentApi; +import org.dromara.visor.module.asset.entity.dto.host.HostBaseDTO; +import org.dromara.visor.module.monitor.convert.AlarmEventConvert; +import org.dromara.visor.module.monitor.entity.domain.AlarmEventDO; +import org.dromara.visor.module.monitor.entity.dto.*; +import org.dromara.visor.module.monitor.enums.AlarmEventSourceTypeEnum; +import org.dromara.visor.module.monitor.enums.AlarmHandleStatusEnum; +import org.dromara.visor.module.monitor.enums.AlarmSwitchEnum; +import org.dromara.visor.module.monitor.enums.MetricsUnitEnum; +import org.dromara.visor.module.monitor.handler.alarm.model.AlarmEngineRule; +import org.dromara.visor.module.monitor.handler.alarm.model.HostAlarmSourceInfo; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; +import java.util.Optional; + +/** + * 告警引擎 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2025/8/21 17:26 + */ +@Slf4j +@Component("metricsAlarmEngine") +public class MetricsAlarmEngine extends BaseAlarmEngine { + + @Resource + protected HostAgentApi hostAgentApi; + + @Override + protected Long getAlarmPolicyId(String agentKey) { + // 获取主机信息 + MonitorHostContextDTO monitorHost = monitorAgentContext.getMonitorHost(agentKey); + if (monitorHost == null) { + return null; + } + // 检查策略是否开启 + Long policyId = monitorHost.getPolicyId(); + if (policyId == null || AlarmSwitchEnum.isOff(monitorHost.getAlarmSwitch())) { + return null; + } + return policyId; + } + + @Override + protected AlarmEventTriggerDTO createAlarmEvent(String agentKey, + Long alarmTimestamp, + AgentMetricsDTO agentMetrics, + BigDecimal metricsValue, + AlarmEngineRule rule) { + MonitorHostContextDTO monitorHost = monitorAgentContext.getMonitorHost(agentKey); + // 查询主机信息 + HostBaseDTO host = hostAgentApi.getHostCacheByAgentKey(agentKey); + if (host == null) { + host = new HostBaseDTO(); + } + // 获取指标 + MonitorMetricsContextDTO metrics = monitorMetricsContext.getMonitorMetrics(rule.getMetricsId()); + // 指标单位 + MetricsUnitEnum unit = MetricsUnitEnum.of(metrics.getUnit()); + // 获取连续触发次数 + Integer consecutiveCount = Optional.ofNullable(TRIGGER_STATE_CACHE.get(this.getTriggerStateCacheKey(agentKey, rule))) + .map(AlarmTriggerStateDTO::getConsecutiveCount) + .orElse(1); + // 构建告警信息 + String alarmInfo = this.buildAlarmInfo(metrics, rule, unit, metricsValue, consecutiveCount); + // 创建告警事件记录 + Map tags = agentMetrics.getTags(); + AlarmEventDO alarmEvent = AlarmEventDO.builder() + .agentKey(agentKey) + .sourceType(AlarmEventSourceTypeEnum.HOST.name()) + .sourceId(host.getId()) + .sourceInfo(HostAlarmSourceInfo.builder() + .name(host.getName()) + .code(host.getCode()) + .address(host.getAddress()) + .build() + .toJsonString()) + .policyId(rule.getPolicyId()) + .policyRuleId(rule.getId()) + .metricsId(rule.getMetricsId()) + .metricsMeasurement(metrics.getMeasurement()) + .alarmTags(tags == null ? Const.EMPTY_OBJECT : JSON.toJSONString(tags)) + .alarmValue(metricsValue) + .alarmThreshold(unit.getThresholdOriginalValue(rule.getThreshold())) + .alarmInfo(alarmInfo) + .alarmLevel(rule.getLevel()) + .triggerCondition(rule.getTriggerCondition()) + .consecutiveCount(consecutiveCount) + .falseAlarm(BooleanBit.FALSE.getValue()) + .handleStatus(AlarmHandleStatusEnum.NEW.name()) + .handleUserId(monitorHost.getOwnerUserId()) + .handleUsername(monitorHost.getOwnerUsername()) + .createTime(new Date(alarmTimestamp)) + .updateTime(new Date(alarmTimestamp)) + .build(); + + // 保存告警事件 + alarmEventService.createAlarmEvent(alarmEvent); + // 填充其他参数 + return AlarmEventConvert.MAPPER.toTrigger(alarmEvent); + } + + @Override + protected void setExtraAlarmPushParams(Map params, AlarmEventTriggerDTO event) { + HostAlarmSourceInfo sourceInfo = JSON.parseObject(event.getSourceInfo(), HostAlarmSourceInfo.class); + params.put("hostId", event.getSourceId()); + params.put("hostName", sourceInfo.getName()); + params.put("hostCode", sourceInfo.getCode()); + params.put("hostAddress", sourceInfo.getAddress()); + } + +} \ No newline at end of file diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEnginePolicy.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEnginePolicy.java similarity index 92% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEnginePolicy.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEnginePolicy.java index 9057de3e..d8e5796c 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEnginePolicy.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEnginePolicy.java @@ -20,7 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.handler.alarm.model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; @@ -48,6 +48,9 @@ public class AlarmEnginePolicy { @Schema(description = "策略id") private Long id; + @Schema(description = "策略类型") + private String type; + @Schema(description = "策略名称") private String name; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineRule.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEngineRule.java similarity index 97% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineRule.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEngineRule.java index b641fee1..f7ac7bc7 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmEngineRule.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/AlarmEngineRule.java @@ -20,7 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.handler.alarm.model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmTriggerState.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/HostAlarmSourceInfo.java similarity index 64% rename from orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmTriggerState.java rename to orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/HostAlarmSourceInfo.java index d42f3651..20017f66 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/engine/AlarmTriggerState.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/handler/alarm/model/HostAlarmSourceInfo.java @@ -20,40 +20,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.dromara.visor.module.monitor.engine; +package org.dromara.visor.module.monitor.handler.alarm.model; +import cn.orionsec.kit.lang.able.IJsonObject; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** - * 告警触发状态 - 轻量级缓存对象 - * 用于减少内存占用,只保存必要的触发状态信息 + * 主机告警源信息 * * @author Jiahang Li * @version 1.0.0 - * @since 2024/6/3 18:00 + * @since 2025/10/13 22:09 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor -public class AlarmTriggerState { +@Schema(name = "HostAlarmSourceInfo", description = "主机告警源信息") +public class HostAlarmSourceInfo implements IJsonObject { - /** - * 时间戳 - */ - private Long timestamp; + @Schema(description = "主机名称") + private String name; - /** - * 是否触发告警 - */ - private Boolean triggered; + @Schema(description = "主机编码") + private String code; - /** - * 规则键 - */ - private String ruleKey; + @Schema(description = "主机地址") + private String address; -} \ No newline at end of file +} diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/listener/AgentOfflineEventListener.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/listener/AgentOfflineEventListener.java index ad9e9ffb..cfe47ca6 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/listener/AgentOfflineEventListener.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/listener/AgentOfflineEventListener.java @@ -23,7 +23,7 @@ package org.dromara.visor.module.monitor.listener; import org.dromara.visor.module.asset.entity.event.AgentOfflineEvent; -import org.dromara.visor.module.monitor.engine.MonitorContext; +import org.dromara.visor.module.monitor.context.MonitorAgentContext; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; @@ -41,13 +41,13 @@ import java.util.List; public class AgentOfflineEventListener implements ApplicationListener { @Resource - private MonitorContext monitorContext; + private MonitorAgentContext monitorAgentContext; @SuppressWarnings("unchecked") @Override public void onApplicationEvent(AgentOfflineEvent event) { List agentKeys = (List) event.getSource(); - agentKeys.forEach(monitorContext::setAgentOffline); + agentKeys.forEach(monitorAgentContext::setAgentOffline); } } diff --git a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyService.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyService.java index da7cecee..d79b8ef9 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyService.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/AlarmPolicyService.java @@ -77,9 +77,10 @@ public interface AlarmPolicyService { /** * 通过缓存查询监控告警策略 * + * @param type type * @return rows */ - List getAlarmPolicyListByCache(); + List getAlarmPolicyListByCache(String type); /** * 分页查询监控告警策略 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 0838c56d..c7361b7a 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 @@ -223,7 +223,8 @@ public class AlarmEventServiceImpl implements AlarmEventService { public LambdaQueryWrapper buildQueryWrapper(AlarmEventQueryRequest request) { return alarmEventDAO.wrapper() .eq(AlarmEventDO::getId, request.getId()) - .eq(AlarmEventDO::getHostId, request.getHostId()) + .eq(AlarmEventDO::getSourceType, request.getSourceType()) + .eq(AlarmEventDO::getSourceId, request.getSourceId()) .eq(AlarmEventDO::getAgentKey, request.getAgentKey()) .eq(AlarmEventDO::getPolicyId, request.getPolicyId()) .eq(AlarmEventDO::getMetricsId, request.getMetricsId()) 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 94786850..e5f64cb8 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 @@ -35,7 +35,6 @@ import org.dromara.visor.module.monitor.convert.AlarmPolicyRuleConvert; import org.dromara.visor.module.monitor.dao.AlarmPolicyDAO; import org.dromara.visor.module.monitor.dao.AlarmPolicyRuleDAO; import org.dromara.visor.module.monitor.dao.MonitorMetricsDAO; -import org.dromara.visor.module.monitor.engine.AlarmEngineContext; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyDO; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyRuleDO; import org.dromara.visor.module.monitor.entity.domain.MonitorMetricsDO; @@ -44,6 +43,7 @@ import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyRuleUpda import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyRuleUpdateSwitchRequest; import org.dromara.visor.module.monitor.entity.vo.AlarmPolicyRuleVO; import org.dromara.visor.module.monitor.enums.AlarmSwitchEnum; +import org.dromara.visor.module.monitor.handler.alarm.AlarmEngineContext; import org.dromara.visor.module.monitor.service.AlarmPolicyRuleService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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 ca415b4b..e072d773 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 @@ -27,6 +27,7 @@ import cn.orionsec.kit.lang.utils.Booleans; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.dromara.visor.common.constant.Const; import org.dromara.visor.common.constant.ErrorMessage; import org.dromara.visor.common.utils.Assert; import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs; @@ -38,7 +39,6 @@ import org.dromara.visor.module.monitor.dao.AlarmPolicyNotifyDAO; import org.dromara.visor.module.monitor.dao.AlarmPolicyRuleDAO; import org.dromara.visor.module.monitor.dao.MonitorHostDAO; import org.dromara.visor.module.monitor.define.cache.AlarmPolicyCacheKeyDefine; -import org.dromara.visor.module.monitor.engine.AlarmEngineContext; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyDO; import org.dromara.visor.module.monitor.entity.dto.AlarmPolicyAlarmCountDTO; import org.dromara.visor.module.monitor.entity.dto.AlarmPolicyCacheDTO; @@ -49,6 +49,7 @@ import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyCreateRe import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyQueryRequest; import org.dromara.visor.module.monitor.entity.request.alarm.AlarmPolicyUpdateRequest; import org.dromara.visor.module.monitor.entity.vo.AlarmPolicyVO; +import org.dromara.visor.module.monitor.handler.alarm.AlarmEngineContext; import org.dromara.visor.module.monitor.service.AlarmEventService; import org.dromara.visor.module.monitor.service.AlarmPolicyNotifyService; import org.dromara.visor.module.monitor.service.AlarmPolicyRuleService; @@ -110,8 +111,11 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { Long id = record.getId(); // 设置告警通知 alarmPolicyNotifyService.setAlarmPolicyNotify(id, request.getNotifyIdList()); - // 删除缓存 + // 重新加载上下文 alarmEngineContext.reloadPolicy(id); + // 删除缓存 + RedisMaps.delete(AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(record.getType()), + AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(Const.ALL)); // 设置日志参数 OperatorLogs.add(OperatorLogs.ID, id); log.info("AlarmPolicyService-createAlarmPolicy id: {}, effect: {}", id, effect); @@ -130,6 +134,11 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { Long newId = this.createAlarmPolicy(request); // 复制策略规则 alarmPolicyRuleService.copyAlarmPolicyRule(id, newId); + // 重新加载上下文 + alarmEngineContext.reloadPolicy(id); + // 删除缓存 + RedisMaps.delete(AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(record.getType()), + AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(Const.ALL)); return newId; } @@ -143,6 +152,7 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { Assert.notNull(record, ErrorMessage.DATA_ABSENT); // 转换 AlarmPolicyDO updateRecord = AlarmPolicyConvert.MAPPER.to(request); + updateRecord.setType(record.getType()); // 查询数据是否冲突 this.checkAlarmPolicyPresent(updateRecord); // 更新 @@ -152,8 +162,11 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { alarmPolicyNotifyService.setAlarmPolicyNotify(id, request.getNotifyIdList()); } log.info("AlarmPolicyService-updateAlarmPolicyById effect: {}", effect); - // 删除缓存 + // 重新加载上下文 alarmEngineContext.reloadPolicy(id); + // 删除缓存 + RedisMaps.delete(AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(record.getType()), + AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(Const.ALL)); return effect; } @@ -171,16 +184,21 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { } @Override - public List getAlarmPolicyListByCache() { + public List getAlarmPolicyListByCache(String type) { + String cacheKey = AlarmPolicyCacheKeyDefine.ALARM_POLICY.format(type); // 查询缓存 - List list = RedisMaps.valuesJson(AlarmPolicyCacheKeyDefine.ALARM_POLICY); + List list = RedisMaps.valuesJson(cacheKey, AlarmPolicyCacheKeyDefine.ALARM_POLICY); if (list.isEmpty()) { // 查询数据库 - list = alarmPolicyDAO.of().list(AlarmPolicyConvert.MAPPER::toCache); + list = alarmPolicyDAO.of() + .createWrapper() + .eq(!Const.ALL.equals(type), AlarmPolicyDO::getType, type) + .then() + .list(AlarmPolicyConvert.MAPPER::toCache); // 设置屏障 防止穿透 CacheBarriers.checkBarrier(list, AlarmPolicyCacheDTO::new); // 设置缓存 - RedisMaps.putAllJson(AlarmPolicyCacheKeyDefine.ALARM_POLICY, s -> s.getId().toString(), list); + RedisMaps.putAllJson(cacheKey, AlarmPolicyCacheKeyDefine.ALARM_POLICY, s -> s.getId().toString(), list); } // 删除屏障 CacheBarriers.removeBarrier(list); @@ -248,7 +266,7 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { // 删除策略通知 alarmPolicyNotifyDAO.deleteByPolicyId(id); // 删除策略规则 - alarmPolicyRuleService.deleteByPolicyId(id); + alarmPolicyRuleDAO.deleteByPolicyId(id); // 删除缓存 alarmEngineContext.reloadPolicy(id); log.info("AlarmPolicyService-deleteAlarmPolicyById effect: {}", effect); @@ -259,6 +277,7 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { public LambdaQueryWrapper buildQueryWrapper(AlarmPolicyQueryRequest request) { return alarmPolicyDAO.wrapper() .eq(AlarmPolicyDO::getId, request.getId()) + .eq(AlarmPolicyDO::getType, request.getType()) .like(AlarmPolicyDO::getName, request.getName()) .like(AlarmPolicyDO::getDescription, request.getDescription()); } @@ -274,6 +293,7 @@ public class AlarmPolicyServiceImpl implements AlarmPolicyService { // 更新时忽略当前记录 .ne(AlarmPolicyDO::getId, domain.getId()) // 用其他字段做重复校验 + .eq(AlarmPolicyDO::getType, domain.getType()) .eq(AlarmPolicyDO::getName, domain.getName()); // 检查是否存在 boolean present = alarmPolicyDAO.of(wrapper).present(); 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 a3777cac..f42d7551 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 @@ -23,6 +23,7 @@ package org.dromara.visor.module.monitor.service.impl; import cn.orionsec.kit.lang.able.Executable; +import cn.orionsec.kit.lang.annotation.Keep; import cn.orionsec.kit.lang.utils.Strings; import cn.orionsec.kit.lang.utils.collect.Lists; import cn.orionsec.kit.lang.utils.collect.Maps; @@ -38,14 +39,14 @@ import org.dromara.visor.framework.influxdb.core.utils.InfluxdbUtils; 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.context.MonitorAgentContext; import org.dromara.visor.module.monitor.dao.MonitorHostDAO; -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; import org.dromara.visor.module.monitor.entity.dto.AgentMetricsDataDTO; import org.dromara.visor.module.monitor.entity.dto.HostMetaDTO; import org.dromara.visor.module.monitor.entity.dto.MonitorHostConfigDTO; import org.dromara.visor.module.monitor.enums.AlarmSwitchEnum; +import org.dromara.visor.module.monitor.handler.alarm.IAlarmEngine; import org.dromara.visor.module.monitor.service.MonitorAgentEndpointService; import org.dromara.visor.module.monitor.utils.MetricsUtils; import org.springframework.scheduling.annotation.Async; @@ -79,18 +80,19 @@ public class MonitorAgentEndpointServiceImpl implements MonitorAgentEndpointServ private SystemUserApi systemUserApi; @Resource - private MonitorContext monitorContext; + private MonitorAgentContext monitorAgentContext; + @Keep @Resource - private AlarmEngine alarmEngine; + private IAlarmEngine metricsAlarmEngine; @Override @Async("metricsExecutor") public void addMetrics(String agentKey, AgentMetricsDataDTO newMetrics) { log.info("MonitorAgentEndpointService.addMetrics start agentKey: {}", agentKey); // 设置数据缓存 - AgentMetricsDataDTO prevMetrics = monitorContext.getAgentMetrics(agentKey); - monitorContext.setAgentMetrics(agentKey, newMetrics); + AgentMetricsDataDTO prevMetrics = monitorAgentContext.getAgentMetrics(agentKey); + monitorAgentContext.setAgentMetrics(agentKey, newMetrics); // 数据点 List points = newMetrics.getMetrics() .stream() @@ -102,7 +104,7 @@ public class MonitorAgentEndpointServiceImpl implements MonitorAgentEndpointServ // 写入数据点 InfluxdbUtils.writePoints(points); // 告警 - alarmEngine.checkAndAlarm(agentKey, prevMetrics, newMetrics); + metricsAlarmEngine.checkAndAlarm(agentKey, prevMetrics, newMetrics); } @Override @@ -149,7 +151,7 @@ public class MonitorAgentEndpointServiceImpl implements MonitorAgentEndpointServ } // 重新加载监控主机上下文 if (newConfig != null) { - monitorContext.reloadMonitorHost(agentKey); + monitorAgentContext.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 5d343e43..bb70dc40 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 @@ -48,10 +48,10 @@ import org.dromara.visor.module.asset.entity.dto.host.HostQueryDTO; import org.dromara.visor.module.asset.enums.AgentOnlineStatusEnum; import org.dromara.visor.module.infra.api.SystemUserApi; import org.dromara.visor.module.monitor.constant.MetricsConst; +import org.dromara.visor.module.monitor.context.MonitorAgentContext; 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.engine.MonitorContext; import org.dromara.visor.module.monitor.entity.domain.AlarmPolicyDO; import org.dromara.visor.module.monitor.entity.domain.MonitorHostDO; import org.dromara.visor.module.monitor.entity.dto.*; @@ -102,7 +102,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { private MonitorMetricsService monitorMetricsService; @Resource - private MonitorContext monitorContext; + private MonitorAgentContext monitorAgentContext; @Override public DataGrid getMonitorHostPage(MonitorHostQueryRequest request) { @@ -308,7 +308,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { monitorHostDAO.setPolicyIdWithNullById(id); } // 重新加载监控主机上下文 - monitorContext.reloadMonitorHost(host.getAgentKey()); + monitorAgentContext.reloadMonitorHost(host.getAgentKey()); log.info("MonitorHostService-updateMonitorHostById effect: {}", effect); return effect; } @@ -334,7 +334,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { log.info("MonitorHostService-updateMonitorHostAlarmSwitch effect: {}", effect); // 更新缓存 for (HostDTO host : hostList) { - monitorContext.reloadMonitorHost(host.getAgentKey()); + monitorAgentContext.reloadMonitorHost(host.getAgentKey()); } return effect; } @@ -350,7 +350,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { // 删除 int effect = monitorHostDAO.deleteByHostIdList(hostIdList); // 删除缓存 - hosts.forEach(s -> monitorContext.removeMonitorHost(s.getAgentKey())); + hosts.forEach(s -> monitorAgentContext.removeMonitorHost(s.getAgentKey())); log.info("MonitorHostService.deleteByHostIdList finish effect: {}", effect); return effect; } @@ -394,7 +394,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { List fields = request.getFields(); // 获取配置信息 List configList = agentKeys.stream() - .map(monitorContext::getMonitorHost) + .map(monitorAgentContext::getMonitorHost) .map(MonitorHostContextDTO::getConfig) .filter(Objects::nonNull) .collect(Collectors.toList()); @@ -446,7 +446,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { * @return data */ public MonitorHostMetricsDataVO getHostMetricsData(String agentKey, MonitorHostConfigDTO config) { - AgentMetricsDataDTO metrics = monitorContext.getAgentMetrics(agentKey); + AgentMetricsDataDTO metrics = monitorAgentContext.getAgentMetrics(agentKey); // 无数据 if (metrics == null) { return MonitorHostMetricsDataVO.noData(agentKey); @@ -454,7 +454,7 @@ public class MonitorHostServiceImpl implements MonitorHostService { // 从缓存中获取配置 if (config == null) { config = Optional.of(agentKey) - .map(monitorContext::getMonitorHost) + .map(monitorAgentContext::getMonitorHost) .map(MonitorHostContextDTO::getConfig) .orElse(null); } 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/MonitorMetricsServiceImpl.java b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorMetricsServiceImpl.java index 49a931c6..6b22757c 100644 --- a/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorMetricsServiceImpl.java +++ b/orion-visor-modules/orion-visor-module-monitor/orion-visor-module-monitor-service/src/main/java/org/dromara/visor/module/monitor/service/impl/MonitorMetricsServiceImpl.java @@ -31,10 +31,10 @@ import org.dromara.visor.common.utils.Assert; import org.dromara.visor.framework.biz.operator.log.core.utils.OperatorLogs; import org.dromara.visor.framework.redis.core.utils.RedisMaps; import org.dromara.visor.framework.redis.core.utils.barrier.CacheBarriers; +import org.dromara.visor.module.monitor.context.MonitorMetricsContext; import org.dromara.visor.module.monitor.convert.MonitorMetricsConvert; import org.dromara.visor.module.monitor.dao.MonitorMetricsDAO; import org.dromara.visor.module.monitor.define.cache.MonitorMetricsCacheKeyDefine; -import org.dromara.visor.module.monitor.engine.MonitorContext; import org.dromara.visor.module.monitor.entity.domain.MonitorMetricsDO; import org.dromara.visor.module.monitor.entity.dto.MonitorMetricsCacheDTO; import org.dromara.visor.module.monitor.entity.dto.MonitorMetricsContextDTO; @@ -70,7 +70,7 @@ public class MonitorMetricsServiceImpl implements MonitorMetricsService { private AlarmPolicyRuleService alarmPolicyRuleService; @Resource - private MonitorContext monitorContext; + private MonitorMetricsContext monitorMetricsContext; @Override @Transactional(rollbackFor = Exception.class) @@ -88,7 +88,7 @@ public class MonitorMetricsServiceImpl implements MonitorMetricsService { // 设置日志参数 OperatorLogs.add(OperatorLogs.ID, id); // 重新加载本地缓存 - monitorContext.reloadMonitorMetrics(id); + monitorMetricsContext.reloadMonitorMetrics(id); log.info("MonitorMetricsService-createMonitorMetrics id: {}, effect: {}", id, effect); return id; } @@ -112,7 +112,7 @@ public class MonitorMetricsServiceImpl implements MonitorMetricsService { // 删除缓存 RedisMaps.delete(MonitorMetricsCacheKeyDefine.MONITOR_METRICS); // 重新加载本地缓存 - monitorContext.reloadMonitorMetrics(id); + monitorMetricsContext.reloadMonitorMetrics(id); return effect; } @@ -151,7 +151,7 @@ public class MonitorMetricsServiceImpl implements MonitorMetricsService { @Override public String getMetricName(String measurement, String value) { - MonitorMetricsContextDTO metrics = monitorContext.getMonitorMetrics(measurement, value); + MonitorMetricsContextDTO metrics = monitorMetricsContext.getMonitorMetrics(measurement, value); if (metrics == null) { return value; } @@ -172,7 +172,7 @@ public class MonitorMetricsServiceImpl implements MonitorMetricsService { // 删除缓存 RedisMaps.delete(MonitorMetricsCacheKeyDefine.MONITOR_METRICS, id); // 重新加载本地缓存 - monitorContext.reloadMonitorMetrics(id); + monitorMetricsContext.reloadMonitorMetrics(id); // 设置日志参数 OperatorLogs.add(OperatorLogs.NAME, record.getName()); log.info("MonitorMetricsService-deleteMonitorMetricsById id: {}, effect: {}", id, effect); 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 27d2f526..b88e1525 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 @@ -5,9 +5,9 @@ - - - + + + @@ -41,7 +41,7 @@ - id, host_id, host_name, host_address, agent_key, policy_id, policy_rule_id, metrics_id, metrics_measurement, alarm_tags, alarm_value, alarm_threshold, alarm_info, alarm_level, trigger_condition, consecutive_count, false_alarm, handle_status, handle_time, handle_remark, handle_user_id, handle_username, create_time, update_time, creator, updater, deleted + id, event_source, source_id, source_info, agent_key, policy_id, policy_rule_id, metrics_id, metrics_measurement, alarm_tags, alarm_value, alarm_threshold, alarm_info, alarm_level, trigger_condition, consecutive_count, false_alarm, handle_status, handle_time, handle_remark, handle_user_id, handle_username, create_time, update_time, creator, updater, deleted