summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshizhendong <[email protected]>2023-07-11 18:14:22 +0800
committershizhendong <[email protected]>2023-07-11 18:14:22 +0800
commit7ff7c1d2c49f9d379a28bbade4ce08557743294e (patch)
tree4ff6860035f66887b88fbe18b7d7a8e464626371
parentad04d58d8a11dd4090e0f146b444a2148bcccd92 (diff)
fix: NEZ-2936 修复告警规则有效时间内未生效问题
1. 创建 Judge 线程前判断是否在生效周期内 2. 修改 rule 时,根据生效周期修改 state
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java54
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java8
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java62
3 files changed, 97 insertions, 27 deletions
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java b/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java
index 0d1063fe..46c0e158 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/backend/AlertRuleManagerJob.java
@@ -16,9 +16,11 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
-import java.util.Calendar;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TimeZone;
/**
* 所有 nz-web 实例都执行此定时任务
@@ -171,6 +173,7 @@ public class AlertRuleManagerJob extends QuartzJobBean {
JobKey jobKey = this.getAlertRuleJudgeJobKey(newHash, rule.getId());
// 开启job
boolean exists = scheduler.checkExists(jobKey);
+ log.info("create alert rule judge, ruleId: {},exists: {}", rule.getId(), exists);
if (!exists) {
JobDataMap dataMap = new JobDataMap();
dataMap.put(AlertContext.JOB_DATA_KEY_ALERT_RULE_ENTITY, rule);
@@ -178,16 +181,26 @@ public class AlertRuleManagerJob extends QuartzJobBean {
.storeDurably().setJobData(dataMap).build();
// 设置执行周期
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.repeatSecondlyForever(rule.getInr());
- SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
- .forJob(jobDetail)
- .withIdentity(jobKey.getName(), jobKey.getGroup())
- .withSchedule(scheduleBuilder)
- .startAt(Tool.DateUtil.date(System.currentTimeMillis() + Tool.RandomUtil.randomInt(10, 60)*1000)) //加入随机时间,分散alert rule 执行时间
- .build();
- // 创建任务
- scheduler.scheduleJob(jobDetail, simpleTrigger);
+ SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
+ .forJob(jobDetail)
+ .withIdentity(jobKey.getName(), jobKey.getGroup())
+ .withSchedule(scheduleBuilder)
+ .startAt(Tool.DateUtil.date(System.currentTimeMillis() + Tool.RandomUtil.randomInt(10, 60) * 1000)) //加入随机时间,分散alert rule 执行时间
+ .build();
+ // 定时任务是否开启
+ if (Tool.ObjectUtil.equal(1, rule.getSchedEnable())) {
+ // 任务是否在执行周期内
+ boolean isTaskInSched = ruleService.isTaskInSched(rule);
+ if (isTaskInSched) {
+ scheduler.scheduleJob(jobDetail, simpleTrigger);
+ }
+ log.info("create alert rule judge finshed, ruleId: {}, isTaskInSched: {}", rule.getId(), isTaskInSched);
+ } else {
+ // 创建任务
+ scheduler.scheduleJob(jobDetail, simpleTrigger);
+ log.info("create alert rule judge finshed, ruleId: {}", rule.getId());
+ }
}
- log.info("create alert rule judge, ruleId: {},exists: {}", rule.getId(), exists);
}
}
}
@@ -309,7 +322,8 @@ public class AlertRuleManagerJob extends QuartzJobBean {
JobDetail jobDetail = JobBuilder.newJob(AlertRuleScheduleJob.class).withIdentity(onJobKey).storeDurably()
.build();
String jobCronExpression = this.genCron(rule.getSchedStime(), rule.getSchedDays());
- CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression);
+ String timezone = configService.getValue("timezone");
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression).inTimeZone(TimeZone.getTimeZone(timezone));
CronTrigger cronTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withSchedule(cronScheduleBuilder)
.build();
// 创建任务
@@ -322,7 +336,8 @@ public class AlertRuleManagerJob extends QuartzJobBean {
JobDetail jobDetail = JobBuilder.newJob(AlertRuleScheduleJob.class).withIdentity(offJobKey).storeDurably()
.build();
String jobCronExpression = this.genCron(rule.getSchedEtime(), rule.getSchedDays());
- CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression);
+ String timezone = configService.getValue("timezone");
+ CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(jobCronExpression).inTimeZone(TimeZone.getTimeZone(timezone));
CronTrigger cronTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withSchedule(cronScheduleBuilder)
.build();
// 创建任务
@@ -331,7 +346,6 @@ public class AlertRuleManagerJob extends QuartzJobBean {
}
/**
- *
* @param time 时间,00:00
* @param days 星期,多个逗号分隔
* @return
@@ -339,18 +353,8 @@ public class AlertRuleManagerJob extends QuartzJobBean {
public String genCron(String time, String days) {
if (Tool.StrUtil.isAllNotBlank(time, days)) {
String[] split = time.split(":");
- // 将定时时间 根据系统设置 转换为 utc 对应时间
- String value = configService.getValue("timezone");
- TimeZone timezone = TimeZone.getTimeZone(value);
- Calendar cal = Calendar.getInstance();
- int hourOfDay = Tool.NumberUtil.parseInt(split[0]);
- int minute = Tool.NumberUtil.parseInt(split[1]);
- cal.set(1997, 7, 1, hourOfDay, minute);
- cal.add(Calendar.MILLISECOND, 0 - timezone.getRawOffset());
- hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
- minute = cal.get(Calendar.MINUTE);
// 0 1 2 0 0 1,2,4
- return String.format("0 %s %s ? * %s *", minute, hourOfDay, days);
+ return String.format("0 %s %s ? * %s *", split[1], split[0], days);
}
return null;
}
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java b/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java
index 0b8dfe3d..adfa29b9 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java
@@ -37,5 +37,13 @@ public interface AlertRuleService extends IService<AlertRuleEntity> {
AlertRuleEntity queryAlertRule(Integer id);
+ /**
+ * 任务是否在执行周期内
+ *
+ * @param alertRule
+ * @return
+ */
+ boolean isTaskInSched(AlertRuleEntity alertRule);
+
}
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java
index 5fc047b9..eb91b93d 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java
@@ -11,6 +11,7 @@ import cn.hutool.json.JSONUtil;
import cn.hutool.log.Log;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nis.common.exception.NZException;
@@ -45,6 +46,8 @@ import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -74,7 +77,7 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
@Autowired
private BasicImportAndExportServices basicImportAndExportServices;
-
+
@Override
public PageUtils queryPage(Map<String, Object> params) {
String receiverStr = (String) params.get("receiver");
@@ -217,6 +220,9 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
}
this.updateById(alertRule);
+
+ // 任务是否在执行周期内
+ this.isTaskInSched(alertRule);
}
return alertRule.getId();
}
@@ -500,6 +506,9 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
rule.setId(oldRule.getId());
this.updateById(rule);
+
+ // 任务是否在执行周期内
+ this.isTaskInSched(rule);
} else {
params.put("save", true);
// insert
@@ -763,7 +772,7 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
public AlertRuleEntity queryAlertRule(Integer id) {
AlertRuleEntity alertRule = alertRuleDao.selectById(id);
ValidateUtils.is(alertRule).notNull(RCode.ALERTRULE_NOT_EXIST);
-
+
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getRuleId, id));
alertRule.setAlertNum(alertMessageList.size());
List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
@@ -796,4 +805,53 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
alertRule.setStarred(CollUtil.isEmpty(tUserStatList) ? 0 : 1);
return alertRule;
}
+
+ @Override
+ public boolean isTaskInSched(AlertRuleEntity rule) {
+ // 创建任务前,判断 rule 是否在执行周期内
+ boolean isTaskInSched = false;
+ if (Tool.ObjectUtil.equal(1, rule.getSchedEnable())) {
+ List<String> schedDayList = Tool.StrUtil.split(rule.getSchedDays(), ",");
+
+ String timezone = sysConfigService.getValue("timezone");
+ // 当前时间-带时区
+ LocalDateTime now = LocalDateTime.now(ZoneId.of(timezone));
+ String currentWeek = Tool.StrUtil.toString((now.getDayOfWeek().getValue() % 7) + 1);
+ if (schedDayList.contains(currentWeek)) {
+ String schedStime = rule.getSchedStime();
+ LocalDateTime startTime = LocalDateTime.now(ZoneId.of(timezone));
+ startTime = startTime.withHour(Integer.valueOf(schedStime.split(":")[0]));
+ startTime = startTime.withMinute(Integer.valueOf(schedStime.split(":")[1]));
+ startTime = startTime.withSecond(0);
+
+ String schedEtime = rule.getSchedEtime();
+ LocalDateTime endTime = LocalDateTime.now(ZoneId.of(timezone));
+ endTime = endTime.withHour(Integer.valueOf(schedEtime.split(":")[0]));
+ endTime = endTime.withMinute(Integer.valueOf(schedEtime.split(":")[1]));
+ endTime = endTime.withSecond(59);
+
+ // 任务是否在执行周期内
+ isTaskInSched = now.isAfter(startTime) && now.isBefore(endTime);
+ }
+
+ // 在执行周期内,将 rule.state 设置为 0
+ if (Tool.BooleanUtil.isTrue(isTaskInSched)) {
+ this.update(new UpdateWrapper<AlertRuleEntity>().lambda()
+ .set(AlertRuleEntity::getState, 1)
+ .eq(AlertRuleEntity::getId, rule.getId()));
+ }
+
+ // 不在执行周期内,将 rule.state 设置为 0
+ if (Tool.BooleanUtil.isFalse(isTaskInSched)) {
+ this.update(new UpdateWrapper<AlertRuleEntity>().lambda()
+ .set(AlertRuleEntity::getState, 0)
+ .eq(AlertRuleEntity::getId, rule.getId()));
+ }
+ } else {
+ isTaskInSched = false;
+ }
+ log.info("[isTaskInSched] [rule: {}] [schedEnable: {}] [inSched: {}]", rule.getId(), rule.getSchedEnable(), isTaskInSched);
+ return isTaskInSched;
+ }
+
}