summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nz-admin/src/main/java/com/nis/common/utils/Constant.java32
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/controller/AlertRuleController.java14
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/dao/AlertMessageDao.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleEntity.java86
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleImportEnum.java31
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/service/AlertRuleService.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/alert/service/impl/AlertRuleServiceImpl.java336
-rw-r--r--nz-admin/src/main/java/com/nis/modules/asset/service/impl/AssetAssetServiceImpl.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/asset/service/impl/DcServiceImpl.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/endpoint/service/impl/MonitorEndpointServiceImpl.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/module/service/impl/MonitorModuleServiceImpl.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/project/service/impl/MonitorProjectServiceImpl.java2
-rw-r--r--nz-admin/src/main/java/com/nis/modules/stat/controller/StatController.java21
-rw-r--r--nz-admin/src/main/java/com/nis/modules/stat/service/StatService.java11
-rw-r--r--nz-admin/src/main/java/com/nis/modules/stat/service/impl/StatServiceImpl.java55
-rw-r--r--nz-admin/src/main/java/db/migration/V2023_04_10__SupportMultiThresholdAlertRules.java151
-rw-r--r--nz-admin/src/main/resources/db/R__AZ_sys_config.sql4
-rw-r--r--nz-admin/src/main/resources/mapper/alert/AlertMessageDao.xml36
-rw-r--r--nz-admin/src/main/resources/mapper/alert/AlertRuleDao.xml26
-rw-r--r--nz-admin/src/main/resources/mapper/stat/StatDao.xml10
-rw-r--r--nz-common/src/main/java/com/nis/common/utils/RCode.java9
22 files changed, 453 insertions, 385 deletions
diff --git a/nz-admin/src/main/java/com/nis/common/utils/Constant.java b/nz-admin/src/main/java/com/nis/common/utils/Constant.java
index dc49aaf0..9429fe47 100644
--- a/nz-admin/src/main/java/com/nis/common/utils/Constant.java
+++ b/nz-admin/src/main/java/com/nis/common/utils/Constant.java
@@ -638,6 +638,38 @@ public class Constant {
}
}
+ /**
+ * Alert Rule Type
+ */
+ public enum AlertRuleType {
+ METRICS(1),
+ LOGS(2),
+ SNMP_TRAP(3);
+
+ private Integer value;
+
+ AlertRuleType(Integer value) {
+ this.value = value;
+ }
+
+ public Integer getValue() {
+ return value;
+ }
+
+ public void setValue(Integer value) {
+ this.value = value;
+ }
+
+ public static AlertRuleType getRuleType(Integer value) {
+ for (AlertRuleType type : AlertRuleType.values()) {
+ if (type.getValue().equals(value)) {
+ return type;
+ }
+ }
+ return null;
+ }
+ }
+
public enum AgentType {
GLOBAL("global", 1), PER_DATACENTER("per_datacenter", 2), THANOS_QUERY("thanos_query", 3),
THANOS_RULE("thanos_rule", 4), THANOS_SIDECAR("thanos_sidecar", 5), THANOS_STORE("thanos_store", 6),
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/controller/AlertRuleController.java b/nz-admin/src/main/java/com/nis/modules/alert/controller/AlertRuleController.java
index 9078d602..355c389e 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/controller/AlertRuleController.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/controller/AlertRuleController.java
@@ -71,6 +71,12 @@ public class AlertRuleController {
@SysLog(operation = OperationEnum.ADD,type = TypeEnum.ALERTRULE)
@RequiresPermissions({"alert:rule:save"})
public R save(@RequestBody AlertRuleEntity alertRule) {
+ ValidateUtils.is(alertRule.getName()).notNull(RCode.ALERTRULE_NAME_ISNULL).maxLength(64)
+ .and(alertRule.getExpr()).notNull(RCode.ALERTRULE_EXPR_ISNULL).maxLength(512)
+ .and(alertRule.getLast()).notNull(RCode.ALERTRULE_LAST_ISNULL).min(1, RCode.ALERTRULE_LAST_ISNOTPOSITIVE)
+ .and(alertRule.getSummary()).notNull(RCode.ALERTRULE_SUMMARY_ISNULL).maxLength(512)
+ .and(alertRule.getDescription()).maxLength(512)
+ .and(alertRule.getType()).notNull(RCode.ALERTRULE_TYPE_ISNULL);
return R.ok().putData("id", alertRuleService.saveOrUpdateAlertRule(alertRule));
}
@@ -82,7 +88,13 @@ public class AlertRuleController {
@SysLog(operation = OperationEnum.UPDATE,type = TypeEnum.ALERTRULE)
@RequiresPermissions({"alert:rule:update"})
public R update(@RequestBody AlertRuleEntity alertRule){
- ValidateUtils.is(alertRule.getId()).notNull(RCode.ALERTRULE_ID_ISNULL);
+ ValidateUtils.is(alertRule.getId()).notNull(RCode.ALERTRULE_ID_ISNULL)
+ .and(alertRule.getName()).notNull(RCode.ALERTRULE_NAME_ISNULL).maxLength(64)
+ .and(alertRule.getExpr()).notNull(RCode.ALERTRULE_EXPR_ISNULL).maxLength(512)
+ .and(alertRule.getLast()).notNull(RCode.ALERTRULE_LAST_ISNULL).min(1, RCode.ALERTRULE_LAST_ISNOTPOSITIVE)
+ .and(alertRule.getSummary()).notNull(RCode.ALERTRULE_SUMMARY_ISNULL).maxLength(512)
+ .and(alertRule.getDescription()).maxLength(512)
+ .and(alertRule.getType()).notNull(RCode.ALERTRULE_TYPE_ISNULL);
return R.ok().putData("id", alertRuleService.saveOrUpdateAlertRule(alertRule));
}
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/dao/AlertMessageDao.java b/nz-admin/src/main/java/com/nis/modules/alert/dao/AlertMessageDao.java
index 1c72b84e..2480a7ed 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/dao/AlertMessageDao.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/dao/AlertMessageDao.java
@@ -30,8 +30,6 @@ public interface AlertMessageDao extends BaseMapper<AlertMessageEntity> {
void deleteByRuleIds(@Param("ids") List ruleIds);
- // 只返回用于统计的列 severity rule_id project_id module_id asset_id dc_id
- //List<AlertMessageEntity> getAlertsStatColumn();
/**
* 根据告警级别统计符合条件的激活状态告警数量
* @param type 可选值:asset, dc, project, module, endpoint, rule
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleEntity.java b/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleEntity.java
index fcb86487..9fc2783d 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleEntity.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleEntity.java
@@ -1,19 +1,18 @@
package com.nis.modules.alert.entity;
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
+import cn.hutool.core.lang.TypeReference;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.nis.common.utils.Tool;
import com.nis.modules.sys.entity.SysUserEntity;
-
-import cn.hutool.core.lang.TypeReference;
import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
/**
* @author fang
*
@@ -37,17 +36,6 @@ public class AlertRuleEntity implements Serializable {
* 运算表达式
*/
private String expr;
-
- /**
- * 比较符号
- */
-// private String operator;
-
- /**
- * 阈值
- */
-// private Double threshold;
-
/**
* 单位
*/
@@ -57,10 +45,6 @@ public class AlertRuleEntity implements Serializable {
*/
private Integer last;
/**
- * 告警级别
- */
-// private Integer severityId;
- /**
* 告警摘要
*/
private String summary;
@@ -178,21 +162,21 @@ public class AlertRuleEntity implements Serializable {
/**
* 多阈值告警条件
*/
+ @TableField("`condition`")
private String condition;
-// @TableField(exist = false)
-// private AlertSeverityConf severity;
-
@TableField(exist = false)
private List alert;
+ public void setName(String name) {
+ this.name = Tool.StrUtil.trim(name);
+ }
+
/**
* 计算 alert rule hash id
*
- * @param entity
* @return
*/
-
public String getAlertRuleHashId() {
String content = new StringBuilder(AlertRuleEntity.class.getName()).append(id).append(name).append(expr)
.append(unit).append(last).append(summary).append(description).append(autoExpired).append(schedEnable)
@@ -240,6 +224,7 @@ public class AlertRuleEntity implements Serializable {
public List<ConditionItem> getConditionItems() {
//1、string to bean
TypeReference<List<ConditionItem>> tr = new TypeReference<List<ConditionItem>>() {};
+ this.condition = Tool.StrUtil.emptyToDefault(this.condition, "[]");
List<ConditionItem> items = Tool.JSONUtil.toBean(this.condition, tr.getType(), true);
//2、根据 告警优先级 排序
items.sort( (i1,i2) -> {
@@ -258,30 +243,29 @@ public class AlertRuleEntity implements Serializable {
public boolean validate(String val) {
boolean result = false;
switch (operator) {
- case "==":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));
- break;
- case "!=":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));;
- break;
- case ">":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));;
- break;
- case "<":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));;
- break;
- case ">=":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));;
- break;
- case "<=":
- result = (Tool.NumberUtil.parseDouble(value) == Tool.NumberUtil.parseDouble(val));;
- break;
- case "~=":
- result = Pattern.matches(operator, val.toString());
- break;
- default:
-
- break;
+ case "==":
+ result = (Tool.NumberUtil.parseDouble(val) == Tool.NumberUtil.parseDouble(value));
+ break;
+ case "!=":
+ result = (Tool.NumberUtil.parseDouble(val) != Tool.NumberUtil.parseDouble(value));
+ break;
+ case ">":
+ result = (Tool.NumberUtil.parseDouble(val) > Tool.NumberUtil.parseDouble(value));
+ break;
+ case "<":
+ result = (Tool.NumberUtil.parseDouble(val) < Tool.NumberUtil.parseDouble(value));
+ break;
+ case ">=":
+ result = (Tool.NumberUtil.parseDouble(val) >= Tool.NumberUtil.parseDouble(value));
+ break;
+ case "<=":
+ result = (Tool.NumberUtil.parseDouble(val) <= Tool.NumberUtil.parseDouble(value));
+ break;
+ case "~=":
+ result = Pattern.matches(operator, val.toString());
+ break;
+ default:
+ break;
}
return result;
}
diff --git a/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleImportEnum.java b/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleImportEnum.java
index e61da0d4..b76cc98b 100644
--- a/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleImportEnum.java
+++ b/nz-admin/src/main/java/com/nis/modules/alert/entity/AlertRuleImportEnum.java
@@ -11,24 +11,23 @@ public enum AlertRuleImportEnum {
INTERVAL("interval", 2),
TIMEOUT("timeout", 3),
EXPR("expr", 4),
- OPERATOR("operator", 5),
- THRESHOLD("threshold", 6),
+ CONDITION("condition", 5),
+ EXT_LABELS("ext_labels", 6),
UNIT("unit", 7),
LAST("last", 8),
- SEVERITY("severity", 9),
- SUMMARY("summary", 10),
- DESCRIPTION("description", 11),
- RECEIVER("receiver", 12),
- NOTICES_METHOD("notices method", 13),
- STATE("state", 14),
- AUTO_EXPIRED("auto expired", 15),
- SCHED_ENABLE("schedule enable", 16),
- SCHED_DAYS("schedule days config", 17),
- SCHED_STIME("schedule start time", 18),
- SCHED_ETIME("schedule end time", 19),
- NOTIFY_ACTIVE("notify active", 20),
- NOTIFY_EXPIRED("notify expired", 21),
- TROUBLE_SHOOTING("trouble shooting", 22);
+ SUMMARY("summary", 9),
+ DESCRIPTION("description", 10),
+ RECEIVER("receiver", 11),
+ NOTICES_METHOD("notices method", 12),
+ STATE("state", 13),
+ AUTO_EXPIRED("auto expired", 14),
+ SCHED_ENABLE("schedule enable", 15),
+ SCHED_DAYS("schedule days config", 16),
+ SCHED_STIME("schedule start time", 17),
+ SCHED_ETIME("schedule end time", 18),
+ NOTIFY_ACTIVE("notify active", 19),
+ NOTIFY_EXPIRED("notify expired", 20),
+ TROUBLE_SHOOTING("trouble shooting", 21);
private String name;
private int index;
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 d29baa1d..0b8dfe3d 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
@@ -27,7 +27,6 @@ public interface AlertRuleService extends IService<AlertRuleEntity> {
void delete(Integer[] ids);
-
void getTemplateByLanguage(HttpServletResponse response, String format) throws IOException;
Map importAlertRuleData(MultipartFile excelFile, Map<String, Object> params) throws IOException;
@@ -38,6 +37,5 @@ public interface AlertRuleService extends IService<AlertRuleEntity> {
AlertRuleEntity queryAlertRule(Integer id);
-// Map<String, List<Integer>> getSeverityNameAndRuleIdsMap(Integer... ruleIds);
}
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 2be9f104..9b92871c 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
@@ -1,27 +1,13 @@
package com.nis.modules.alert.service.impl;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+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.metadata.IPage;
@@ -29,26 +15,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nis.common.exception.NZException;
import com.nis.common.smartvalidate.ValidateUtils;
import com.nis.common.smartvalidate.utils.RegexUtil;
-import com.nis.common.utils.Constant;
-import com.nis.common.utils.ImportValidateUtil;
-import com.nis.common.utils.PageUtils;
-import com.nis.common.utils.Query;
-import com.nis.common.utils.RCode;
-import com.nis.common.utils.StringUtils;
-import com.nis.common.utils.Tool;
-import com.nis.common.utils.ToolUtil;
-import com.nis.common.utils.YamlUtil;
+import com.nis.common.utils.*;
+import com.nis.common.utils.Constant.AlertRuleType;
import com.nis.modules.alert.dao.AlertRuleDao;
import com.nis.modules.alert.entity.AlertMessageEntity;
import com.nis.modules.alert.entity.AlertNotifyMethod;
import com.nis.modules.alert.entity.AlertRuleEntity;
import com.nis.modules.alert.entity.AlertRuleImportEnum;
-import com.nis.modules.alert.entity.AlertSeverityConf;
import com.nis.modules.alert.service.AlertMessageService;
import com.nis.modules.alert.service.AlertNotifyMethodService;
import com.nis.modules.alert.service.AlertRuleService;
-import com.nis.modules.alert.service.AlertSeverityService;
-import com.nis.modules.stat.service.StatService;
import com.nis.modules.sys.entity.SysUserEntity;
import com.nis.modules.sys.entity.SysUserStarredEntity;
import com.nis.modules.sys.service.BasicImportAndExportServices;
@@ -56,19 +32,26 @@ import com.nis.modules.sys.service.SysConfigService;
import com.nis.modules.sys.service.SysUserService;
import com.nis.modules.sys.service.SysUserStarredService;
import com.nis.modules.sys.shiro.ShiroUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.BooleanUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.log.Log;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@Service("alertRuleService")
public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEntity> implements AlertRuleService {
- private static Log log = Log.get();
+ private static final Log log = Log.get();
@Autowired
private AlertRuleDao alertRuleDao;
@@ -77,29 +60,19 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
private SysUserService sysUserService;
@Autowired
- private YamlUtil yamlUtil;
-
- @Autowired
private AlertNotifyMethodService methodService;
@Autowired
private SysConfigService sysConfigService;
@Autowired
- private AlertSeverityService alertSeverityService;
-
- @Autowired
private AlertMessageService alertMessageService;
@Autowired
- private StatService statService;
-
- @Autowired
private SysUserStarredService sysUserStarredService;
@Autowired
private BasicImportAndExportServices basicImportAndExportServices;
-
@Override
public PageUtils queryPage(Map<String, Object> params) {
@@ -202,7 +175,6 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
@Override
public Integer saveOrUpdateAlertRule(AlertRuleEntity alertRule) {
// 校验参数
- alertRule.setName(StrUtil.trim(alertRule.getName()));
this.validateParam(alertRule);
// 校验名称重复
@@ -210,22 +182,6 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
throw new NZException(RCode.ALERTRULE_NAME_DUPLICATE);
}
-
- // 仅metrics类型需要校验rule表达式 logs和snmp trap暂不支持
-// if (1 == alertRule.getType()) {
-// // 校验expr
-// boolean checkRule = false;
-// try {
-// checkRule = yamlUtil.checkRule(YamlUtil.alertRuleEntityToYamlMap(alertRule));
-// } catch (IOException e) {
-// log.error(String.format("expr校验失败,rule信息是:%s,错误信息是:%s", alertRule.toString(), e));
-// }
-//
-// if (!checkRule) {
-// throw new NZException(RCode.ALERTRULE_EXPR_ERROR);
-// }
-// }
-
// 校验关联用户
String receiver = alertRule.getReceiver();
if (StringUtils.isNotEmpty(receiver)) {
@@ -353,31 +309,26 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
String expr = dataMap.get(AlertRuleImportEnum.EXPR.getIndex());
validateUtil.validateRequired(expr, lineNum, AlertRuleImportEnum.EXPR.getIndex());
- String operator = dataMap.get(AlertRuleImportEnum.OPERATOR.getIndex());
- operator = operator.replaceAll(" ", "");
- String threshold = dataMap.get(AlertRuleImportEnum.THRESHOLD.getIndex());
String unit = dataMap.get(AlertRuleImportEnum.UNIT.getIndex());
String last = dataMap.get(AlertRuleImportEnum.LAST.getIndex());
+ String condition = dataMap.get(AlertRuleImportEnum.CONDITION.getIndex());
if (StrUtil.equals("3", type)) {
validateUtil.validateRegex(expr, "^(\\d{1,9}\\.){0,}[\\d]+$", lineNum, AlertRuleImportEnum.EXPR.getIndex());
} else {
- validateUtil.validateRequired(threshold, lineNum, AlertRuleImportEnum.THRESHOLD.getIndex());
- validateUtil.validateDouble(threshold, lineNum, AlertRuleImportEnum.THRESHOLD.getIndex());
-
List<String> unitEnumList = Tool.ListUtil.toList(Constant.ALERT_RULE_UNIT_MAP.keySet());
validateUtil.validateRequired(unit, lineNum, AlertRuleImportEnum.UNIT.getIndex());
validateUtil.validateEnumValArr(unit, unitEnumList, lineNum, AlertRuleImportEnum.UNIT.getIndex());
- validateUtil.validateRequired(operator, lineNum, AlertRuleImportEnum.OPERATOR.getIndex());
- validateUtil.validateEnumValArr(operator, Constant.RULE_OPERATORS, lineNum, AlertRuleImportEnum.OPERATOR.getIndex());
-
validateUtil.validateRequired(last, lineNum, AlertRuleImportEnum.LAST.getIndex());
validateUtil.validateDouble(last, lineNum, AlertRuleImportEnum.LAST.getIndex());
}
- String severity = dataMap.get(AlertRuleImportEnum.SEVERITY.getIndex());
- validateUtil.validateRequired(severity, lineNum, AlertRuleImportEnum.SEVERITY.getIndex());
- validateUtil.validateRelObjExits("alert_severity_conf", "name", severity, false, lineNum, AlertRuleImportEnum.SEVERITY.getIndex());
+ // condition 必填 & jsonArr 格式
+ validateUtil.validateRequired(condition, lineNum, AlertRuleImportEnum.CONDITION.getIndex());
+ validateUtil.validateJsonArray(condition, lineNum, AlertRuleImportEnum.CONDITION.getIndex());
+
+ String extLabels = dataMap.get(AlertRuleImportEnum.EXT_LABELS.getIndex());
+ validateUtil.validateJsonArray(extLabels, lineNum, AlertRuleImportEnum.EXT_LABELS.getIndex());
String summary = dataMap.get(AlertRuleImportEnum.SUMMARY.getIndex());
validateUtil.validateRequired(summary, lineNum, AlertRuleImportEnum.SUMMARY.getIndex());
@@ -448,44 +399,6 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
validateUtil.recordImportAttrErr(lineNum, RCode.IMPORT_NOT_WITHIN_REASON.setParam(AlertRuleImportEnum.SCHED_ETIME.getIndex()));
}
- AlertSeverityConf alertSeverityConf = alertSeverityService.getOne(new LambdaQueryWrapper<AlertSeverityConf>().eq(AlertSeverityConf::getName, severity));
-
- String description = dataMap.get(AlertRuleImportEnum.DESCRIPTION.getIndex());
- String trbShotStr = dataMap.get(AlertRuleImportEnum.TROUBLE_SHOOTING.getIndex());
- AlertRuleEntity ruleEntity = new AlertRuleEntity();
- ruleEntity.setName(name);
- ruleEntity.setExpr(expr);
- ruleEntity.setUnit(Constant.ALERT_RULE_UNIT_MAP.get(StrUtil.emptyToDefault(unit, "none")));
- ruleEntity.setLast(StrUtil.isNotEmpty(last) ? Double.valueOf(last).intValue() : null);
- ruleEntity.setSummary(summary);
- ruleEntity.setDescription(description);
- ruleEntity.setReceiver(receiver);
- ruleEntity.setMethod(method);
- ruleEntity.setState(Integer.valueOf(state));
- ruleEntity.setAutoExpired(Integer.valueOf(autoExpired));
- ruleEntity.setSchedEnable(Integer.valueOf(schedEnable));
- ruleEntity.setSchedDays(schedDays);
- ruleEntity.setSchedStime(schedStime);
- ruleEntity.setSchedEtime(schedEtime);
- ruleEntity.setNotifyActive(Integer.valueOf(notifyActive));
- ruleEntity.setNotifyExpired(Integer.valueOf(notifyExpired));
- ruleEntity.setTrbShot(trbShotStr);
- ruleEntity.setType(Integer.valueOf(type));
- ruleEntity.setInr(intervalIntVal);
- ruleEntity.setTimeout(timeoutIntVal);
- // 仅metrics类型需要校验rule表达式 logs和snmp trap暂不支持
-// if (StrUtil.equals("1", type)) {
-// try {
-// boolean checkRule = yamlUtil.checkRule(YamlUtil.alertRuleEntityToYamlMap(ruleEntity));
-// if (!checkRule) {
-// validateUtil.recordImportAttrErr(lineNum, RCode.IMPORT_FORMAT_ERROR.setParam(AlertRuleImportEnum.EXPR.getIndex()));
-// }
-// } catch (Exception e) {
-// log.error(e, "expr validate error,rule info: {}", JSONObject.toJSONString(ruleEntity));
-// validateUtil.recordImportAttrErr(lineNum, RCode.IMPORT_FORMAT_ERROR.setParam(AlertRuleImportEnum.EXPR.getIndex()));
-// }
-// }
-
List<Map<String, String>> errMsgForThisLine = validateUtil.getImportErrMsgForThisLine(lineNum);
if (BooleanUtil.and(Tool.StrUtil.equals("0", ignoreError), Tool.CollUtil.isNotEmpty(errMsgForThisLine))) {
// 结束本次导入,自导入行开始 到结尾数据行,提示错误信息
@@ -496,8 +409,34 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
break;
}
+ String description = dataMap.get(AlertRuleImportEnum.DESCRIPTION.getIndex());
+ String trbShotStr = dataMap.get(AlertRuleImportEnum.TROUBLE_SHOOTING.getIndex());
if (Tool.CollUtil.isEmpty(errMsgForThisLine)) {
try {
+ AlertRuleEntity ruleEntity = new AlertRuleEntity();
+ ruleEntity.setName(name);
+ ruleEntity.setExpr(expr);
+ ruleEntity.setUnit(Constant.ALERT_RULE_UNIT_MAP.get(StrUtil.emptyToDefault(unit, "none")));
+ ruleEntity.setLast(StrUtil.isNotEmpty(last) ? Double.valueOf(last).intValue() : null);
+ ruleEntity.setCondition(condition);
+ ruleEntity.setExtLabels(extLabels);
+ ruleEntity.setSummary(summary);
+ ruleEntity.setDescription(description);
+ ruleEntity.setReceiver(receiver);
+ ruleEntity.setMethod(method);
+ ruleEntity.setState(Integer.valueOf(state));
+ ruleEntity.setAutoExpired(Integer.valueOf(autoExpired));
+ ruleEntity.setSchedEnable(Integer.valueOf(schedEnable));
+ ruleEntity.setSchedDays(schedDays);
+ ruleEntity.setSchedStime(schedStime);
+ ruleEntity.setSchedEtime(schedEtime);
+ ruleEntity.setNotifyActive(Integer.valueOf(notifyActive));
+ ruleEntity.setNotifyExpired(Integer.valueOf(notifyExpired));
+ ruleEntity.setTrbShot(trbShotStr);
+ ruleEntity.setType(Integer.valueOf(type));
+ ruleEntity.setInr(intervalIntVal);
+ ruleEntity.setTimeout(timeoutIntVal);
+
this.saveOrUpdateRowData(ruleEntity, params);
// save or update
Object saveFlag = params.get("save");
@@ -607,7 +546,6 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
Map<Long, String> userIdAndNameMap = sysUserList.stream().collect(Collectors.toMap(SysUserEntity::getId, SysUserEntity::getName));
List<AlertNotifyMethod> methodList = methodService.list();
Map<Integer, String> methodIdAndNameMap = methodList.stream().collect(Collectors.toMap(AlertNotifyMethod::getId, AlertNotifyMethod::getName));
- String receiveIds, receiveNames;
for (AlertRuleEntity rule : list) {
// 内置告警不导出
if (rule.getBuildIn() != null && rule.getBuildIn().equals(1)) continue;
@@ -617,13 +555,15 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
tempList.add(ObjectUtil.defaultIfNull(rule.getInr(), "").toString());
tempList.add(ObjectUtil.defaultIfNull(rule.getTimeout(), "").toString());
tempList.add(rule.getExpr());
+ tempList.add(rule.getCondition());
+ tempList.add(StrUtil.nullToDefault(rule.getExtLabels(), ""));
tempList.add(getUnitDescrByVal(rule.getUnit()));
tempList.add(ObjectUtil.defaultIfNull(rule.getLast(),"").toString());
tempList.add(rule.getSummary());
tempList.add(rule.getDescription());
- receiveIds = rule.getReceiver();
+ String receiveIds = rule.getReceiver();
if (StringUtils.isNotEmpty(receiveIds)) {
- receiveNames = "";
+ String receiveNames = "";
for (String id : Arrays.asList(receiveIds.split(","))) {
receiveNames += userIdAndNameMap.get(Long.valueOf(id)) + ",";
}
@@ -674,38 +614,36 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
}
private void validateParam(AlertRuleEntity alertRule) {
- Integer unit = alertRule.getUnit();
- ValidateUtils.is(alertRule.getName()).notNull(RCode.ALERTRULE_NAME_ISNULL).maxLength(64)
- .and(alertRule.getExpr()).notNull(RCode.ALERTRULE_EXPR_ISNULL).maxLength(512)
- .and(alertRule.getLast()).notNull(RCode.ALERTRULE_LAST_ISNULL).min(1, RCode.ALERTRULE_LAST_ISNOTPOSITIVE)
- .and(alertRule.getSummary()).notNull(RCode.ALERTRULE_SUMMARY_ISNULL).maxLength(512)
- .and(alertRule.getDescription()).maxLength(512)
- .and(alertRule.getType()).notNull(RCode.ALERTRULE_TYPE_ISNULL);
-
- List<Integer> typeList = Arrays.asList(new Integer[]{1, 2, 3});
- if (!typeList.contains(alertRule.getType())) {
+ Integer type = alertRule.getType();
+ List<Integer> typeEnumList = Arrays.asList(AlertRuleType.values()).stream().map(AlertRuleType::getValue).collect(Collectors.toList());
+ if (!typeEnumList.contains(type)) {
throw new NZException(RCode.ALERTRULE_TYPE_INCORRECT);
}
- // snmp trap type
- if (3 == alertRule.getType()) {
- String oid = alertRule.getExpr();
- if (!RegexUtil.test("^(\\d{1,9}\\.){0,}[\\d]+$", oid)) {
- throw new NZException(RCode.ALERTRULE_OIDFORMAT_ERROR);
+ switch (AlertRuleType.getRuleType(type)) {
+ case METRICS:
+ case LOGS: {
+ Integer unit = alertRule.getUnit();
+ ValidateUtils.is(unit).notNull(RCode.ALERTRULE_UNIT_ISNULL);
+ List<Integer> unitList = new ArrayList(Constant.ALERT_RULE_UNIT_MAP.values());
+ if (unit < Collections.min(unitList) || unit > Collections.max(unitList)) {
+ throw new NZException(RCode.ALERTRULE_UNIT_INVALIDE);
+ }
+ break;
}
- } else {
- // 除 snmp trap 类型外,threshold unit 必填
- ValidateUtils.is(unit).notNull(RCode.ALERTRULE_UNIT_ISNULL);
-
- List<Integer> unitList = new ArrayList(Constant.ALERT_RULE_UNIT_MAP.values());
- if (unit < Collections.min(unitList) || unit > Collections.max(unitList)) {
- throw new NZException(RCode.ALERTRULE_UNIT_INVALIDE);
+ case SNMP_TRAP: {
+ String oid = alertRule.getExpr();
+ if (!RegexUtil.test("^(\\d{1,9}\\.){0,}[\\d]+$", oid)) {
+ throw new NZException(RCode.ALERTRULE_OIDFORMAT_ERROR);
+ }
+ break;
}
+ default:
+ break;
}
// 校验 method 是否存在
String method = alertRule.getMethod();
-
if (StringUtils.isNotEmpty(method)) {
List<AlertNotifyMethod> methodList = methodService.list();
List<Integer> methodIdList = methodList.stream().map(AlertNotifyMethod::getId).collect(Collectors.toList());
@@ -785,71 +723,75 @@ public class AlertRuleServiceImpl extends ServiceImpl<AlertRuleDao, AlertRuleEnt
}
}
}
+
+ // condition
+ String condition = alertRule.getCondition();
+ boolean isConditionJsonArray = JSONUtil.isTypeJSONArray(condition);
+ if (BooleanUtil.negate(isConditionJsonArray)) {
+ throw new NZException(RCode.ALERTRULE_CONDITION_FORMAT);
+ }
+ List<AlertRuleEntity.ConditionItem> conditionItems = alertRule.getConditionItems();
+ ValidateUtils.is(conditionItems).notNull(RCode.ALERTRULE_CONDITION_ISNULL);
+
+ for (AlertRuleEntity.ConditionItem item : conditionItems) {
+ ValidateUtils.is(item.getId()).notNull(RCode.ALERTSEVERITY_ID_ISNULL)
+ .and(item.getWeight()).notNull(RCode.ALERTRULE_CONDITION_ID_ISNULL)
+ .and(item.getOperator()).notNull(RCode.ALERTRULE_CONDITION_OPERATOR_ISNULL)
+ .and(item.getValue()).notNull(RCode.ALERTRULE_CONDITION_VALUE_ISNULL);
+ if (ObjectUtil.equal(type, AlertRuleType.SNMP_TRAP.getValue())) {
+ ValidateUtils.is(item.getOperator()).equalsIgnoreCase("~=", RCode.ALERTRULE_SNMPTRAP_OPERATOR_ERROR);
+ } else {
+ List<String> operatorEnumList = Arrays.asList(new String[]{"==", "!=", ">", "<", ">=", "<="});
+ if (!operatorEnumList.contains(item.getOperator())) {
+ throw new NZException(RCode.ALERTRULE_OPERATOR_INVALIDE);
+ }
+ }
+ }
+
+ // extLabels
+ String extLabels = alertRule.getExtLabels();
+ if (StrUtil.isNotEmpty(extLabels)) {
+ boolean isExtLabelsJsonArray = JSONUtil.isTypeJSONArray(condition);
+ if (BooleanUtil.negate(isExtLabelsJsonArray)) {
+ throw new NZException(RCode.ALERTRULE_EXTLABELS_FORMAT);
+ }
+ }
}
@Override
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);
alertRule.setAlert(alert);
- if(ObjectUtil.isNotEmpty(alertRule)) {
- // 获取所有用户
- List<SysUserEntity> userList = sysUserService.list();
- Map<Long, String> userIdAndName = userList.stream().collect(Collectors.toMap(SysUserEntity::getId, SysUserEntity::getName));
-
- String receiver = alertRule.getReceiver();
- if (StringUtils.isNotEmpty(receiver)) {
- List<SysUserEntity> list = new ArrayList<>();
- Arrays.asList(receiver.split(",")).stream().forEach(userId -> {
- SysUserEntity userEntity = new SysUserEntity();
- userEntity.setId(Long.valueOf(userId));
- userEntity.setName(userIdAndName.get(Long.valueOf(userId)));
- list.add(userEntity);
- });
- alertRule.setReceivers(list);
- }
-
- // 当前用户收藏状态 1:收藏 0:未收藏
- int ruleStarredCount = sysUserStarredService.count(
- new LambdaQueryWrapper<SysUserStarredEntity>()
- .eq(SysUserStarredEntity::getType, "alertRule")
- .eq(SysUserStarredEntity::getTid, alertRule.getId())
- .eq(SysUserStarredEntity::getUid, ShiroUtils.getUserId().intValue()));
-
- alertRule.setStarred(ruleStarredCount == 0 ? 0 : 1);
+ // 获取所有用户
+ List<SysUserEntity> userList = sysUserService.list();
+ Map<Long, String> userIdAndName = userList.stream().collect(Collectors.toMap(SysUserEntity::getId, SysUserEntity::getName));
+
+ String receiver = alertRule.getReceiver();
+ if (StringUtils.isNotEmpty(receiver)) {
+ List<SysUserEntity> list = new ArrayList<>();
+ Arrays.asList(receiver.split(",")).stream().forEach(userId -> {
+ SysUserEntity userEntity = new SysUserEntity();
+ userEntity.setId(Long.valueOf(userId));
+ userEntity.setName(userIdAndName.get(Long.valueOf(userId)));
+ list.add(userEntity);
+ });
+ alertRule.setReceivers(list);
}
+ // 当前用户收藏状态 1:收藏 0:未收藏
+ int ruleStarredCount = sysUserStarredService.count(
+ new LambdaQueryWrapper<SysUserStarredEntity>()
+ .eq(SysUserStarredEntity::getType, "alertRule")
+ .eq(SysUserStarredEntity::getTid, alertRule.getId())
+ .eq(SysUserStarredEntity::getUid, ShiroUtils.getUserId().intValue()));
+
+ alertRule.setStarred(ruleStarredCount == 0 ? 0 : 1);
return alertRule;
}
-
- /**
- * 通过 ruleIds 返回 告警级别 对应 ruleId map
- * k: severityName
- * v: ruleIds
- *
- * @param ids
- * @return
- */
-// @Override
-// public Map<String, List<Integer>> getSeverityNameAndRuleIdsMap(Integer... ids) {
-// List<AlertSeverityConf> severityConfList = alertSeverityService.list();
-// Map<Integer, String> severityIdAndNameMap = severityConfList.stream().collect(Collectors.toMap(AlertSeverityConf::getId, AlertSeverityConf::getName));
-//
-// List<AlertRuleEntity> ruleList = this.list(new LambdaQueryWrapper<AlertRuleEntity>().in(AlertRuleEntity::getId, Arrays.asList(ids)));
-// Map<Integer, List<AlertRuleEntity>> severityIdAndRules = ruleList.stream().collect(Collectors.groupingBy(AlertRuleEntity::getSeverityId));
-//
-// Map<String, List<Integer>> severityNameAndRuleIdsMap = new HashMap<>(8);
-// for (Map.Entry<Integer, String> entry : severityIdAndNameMap.entrySet()) {
-// Integer severityId = entry.getKey();
-// String severityName = entry.getValue();
-// List<AlertRuleEntity> rules = Tool.ObjectUtil.isNull(severityIdAndRules.get(severityId)) ? new ArrayList<>() : severityIdAndRules.get(severityId);
-// List<Integer> ruleIds = rules.stream().map(AlertRuleEntity::getId).collect(Collectors.toList());
-// severityNameAndRuleIdsMap.put(severityName, ruleIds);
-// }
-// return severityNameAndRuleIdsMap;
-// }
}
diff --git a/nz-admin/src/main/java/com/nis/modules/asset/service/impl/AssetAssetServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/asset/service/impl/AssetAssetServiceImpl.java
index f6a9d185..7a5584b2 100644
--- a/nz-admin/src/main/java/com/nis/modules/asset/service/impl/AssetAssetServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/asset/service/impl/AssetAssetServiceImpl.java
@@ -293,7 +293,7 @@ public class AssetAssetServiceImpl extends ServiceImpl<AssetAssetDao, AssetAsset
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getAssetId, asset.getId()));
asset.setAlertNum(alertMessageList.size());
- List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
+ List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("asset",id);
asset.setAlert(alert);
// 不返回 密码 / 密钥信息
diff --git a/nz-admin/src/main/java/com/nis/modules/asset/service/impl/DcServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/asset/service/impl/DcServiceImpl.java
index 7d214fbf..4fc87507 100644
--- a/nz-admin/src/main/java/com/nis/modules/asset/service/impl/DcServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/asset/service/impl/DcServiceImpl.java
@@ -131,7 +131,7 @@ public class DcServiceImpl extends ServiceImpl<DcDao, Dc> implements DcService {
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getDcId, dc.getId()));
dc.setAlertNum(alertMessageList.size());
- List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
+ List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("datacenter",id);
dc.setAlert(alert);
Integer assetNum = assetService.count(new LambdaQueryWrapper<AssetAsset>().eq(AssetAsset::getDcId, dc.getId()));
diff --git a/nz-admin/src/main/java/com/nis/modules/endpoint/service/impl/MonitorEndpointServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/endpoint/service/impl/MonitorEndpointServiceImpl.java
index b3193292..d1133178 100644
--- a/nz-admin/src/main/java/com/nis/modules/endpoint/service/impl/MonitorEndpointServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/endpoint/service/impl/MonitorEndpointServiceImpl.java
@@ -159,7 +159,7 @@ public class MonitorEndpointServiceImpl extends ServiceImpl<MonitorEndpointDao,
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getEndpointId, endpoint.getId()));
endpoint.setAlertNum(alertMessageList.size());
- List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
+ List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("endpoint",id);
endpoint.setAlert(alert);
endpoint.setConfigs(this.getEndpointConfigs(endpoint));
diff --git a/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java b/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java
index 24637c2a..8e3168c4 100644
--- a/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java
+++ b/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java
@@ -60,7 +60,7 @@ public class NezhaMetrics implements MeterBinder {
for (int i = 0; i < nzAlertMumsMetrics.size(); i++) {
MetricsDto dto = nzAlertMumsMetrics.get(i);
Gauge.builder("nz_alert_nums", dto, value -> dto.getTotal())
- .tags("id", dto.getId() + "", "name", dto.getName(), "severity", dto.getSeverity())
+ .tags("id", dto.getId() + "", "name", dto.getName(), "severity", Tool.StrUtil.nullToEmpty(dto.getSeverity()))
.description("Alert statistics info")
.register(meterRegistry);
}
diff --git a/nz-admin/src/main/java/com/nis/modules/module/service/impl/MonitorModuleServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/module/service/impl/MonitorModuleServiceImpl.java
index 1a8695d8..186b8f70 100644
--- a/nz-admin/src/main/java/com/nis/modules/module/service/impl/MonitorModuleServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/module/service/impl/MonitorModuleServiceImpl.java
@@ -130,7 +130,7 @@ public class MonitorModuleServiceImpl extends ServiceImpl<MonitorModuleDao, Moni
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getModuleId, module.getId()));
module.setAlertNum(alertMessageList.size());
- List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
+ List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("module",id);
module.setAlert(alert);
Integer dashboardId = module.getDashboardId();
diff --git a/nz-admin/src/main/java/com/nis/modules/project/service/impl/MonitorProjectServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/project/service/impl/MonitorProjectServiceImpl.java
index 0e02c7a9..76deab23 100644
--- a/nz-admin/src/main/java/com/nis/modules/project/service/impl/MonitorProjectServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/project/service/impl/MonitorProjectServiceImpl.java
@@ -75,7 +75,7 @@ public class MonitorProjectServiceImpl extends ServiceImpl<MonitorProjectDao, Mo
List<AlertMessageEntity> alertMessageList = alertMessageService.list(new LambdaQueryWrapper<AlertMessageEntity>().eq(AlertMessageEntity::getProjectId, project.getId()));
project.setAlertNum(alertMessageList.size());
- List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("rule",id);
+ List<Map<String, Object>> alert = alertMessageService.getAlertsStatBySeverity("project",id);
project.setAlert(alert);
// 当前用户收藏状态 1:收藏 0:未收藏
diff --git a/nz-admin/src/main/java/com/nis/modules/stat/controller/StatController.java b/nz-admin/src/main/java/com/nis/modules/stat/controller/StatController.java
index 772921d9..3464493c 100644
--- a/nz-admin/src/main/java/com/nis/modules/stat/controller/StatController.java
+++ b/nz-admin/src/main/java/com/nis/modules/stat/controller/StatController.java
@@ -1,24 +1,19 @@
package com.nis.modules.stat.controller;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
+import com.nis.common.smartvalidate.ValidateUtils;
+import com.nis.common.utils.*;
+import com.nis.modules.stat.entity.StatAnalysis;
+import com.nis.modules.stat.service.StatService;
+import com.nis.modules.sys.controller.AbstractController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
-import com.nis.common.smartvalidate.ValidateUtils;
-import com.nis.common.utils.Constant;
-import com.nis.common.utils.PageUtils;
-import com.nis.common.utils.R;
-import com.nis.common.utils.RCode;
-import com.nis.common.utils.Tool;
-import com.nis.modules.stat.entity.StatAnalysis;
-import com.nis.modules.stat.service.StatService;
-import com.nis.modules.sys.controller.AbstractController;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
@RestController
@RequestMapping("/stat")
diff --git a/nz-admin/src/main/java/com/nis/modules/stat/service/StatService.java b/nz-admin/src/main/java/com/nis/modules/stat/service/StatService.java
index 0fce1e20..c2ce615c 100644
--- a/nz-admin/src/main/java/com/nis/modules/stat/service/StatService.java
+++ b/nz-admin/src/main/java/com/nis/modules/stat/service/StatService.java
@@ -38,8 +38,15 @@ public interface StatService{
List<StatAnalysis> queryEndpointType(Map<String,Object> params);
List<StatAnalysis> queryEndpointState(Map<String,Object> params);
-
- List<StatAnalysis> queryAlertRuleTotal(Map<String,Object> params);
+
+ /**
+ * 告警规则总数统计接口
+ * 统计各个告警级别下告警规则总数
+ *
+ * @param params
+ * @return
+ */
+ List<StatAnalysis> queryAlertRuleTotal(Map<String, Object> params);
StatAnalysis queryAlertMessageTotal(Map<String,Object> params);
diff --git a/nz-admin/src/main/java/com/nis/modules/stat/service/impl/StatServiceImpl.java b/nz-admin/src/main/java/com/nis/modules/stat/service/impl/StatServiceImpl.java
index ba3af9b5..0000571e 100644
--- a/nz-admin/src/main/java/com/nis/modules/stat/service/impl/StatServiceImpl.java
+++ b/nz-admin/src/main/java/com/nis/modules/stat/service/impl/StatServiceImpl.java
@@ -1,39 +1,20 @@
package com.nis.modules.stat.service.impl;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.ObjectUtils;
-
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Pair;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
+import cn.hutool.log.Log;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nis.common.exception.NZException;
-import com.nis.common.utils.Constant;
-import com.nis.common.utils.PageUtils;
-import com.nis.common.utils.Query;
-import com.nis.common.utils.RCode;
-import com.nis.common.utils.StringUtils;
-import com.nis.common.utils.Tool;
-import com.nis.common.utils.ToolUtil;
+import com.nis.common.utils.*;
import com.nis.modules.alert.dao.AlertMessageDao;
import com.nis.modules.alert.entity.AlertSeverityConf;
-import com.nis.modules.alert.service.AlertMessageService;
-import com.nis.modules.alert.service.AlertRuleService;
import com.nis.modules.alert.service.AlertSeverityService;
import com.nis.modules.asset.entity.AssetAsset;
import com.nis.modules.asset.entity.AssetPing;
@@ -43,7 +24,6 @@ import com.nis.modules.asset.service.AssetPingService;
import com.nis.modules.asset.service.DcService;
import com.nis.modules.endpoint.entity.MonitorEndpoint;
import com.nis.modules.endpoint.service.MonitorEndpointService;
-import com.nis.modules.endpoint.service.MonitorEndpointStateService;
import com.nis.modules.module.entity.MonitorModule;
import com.nis.modules.module.service.MonitorModuleService;
import com.nis.modules.project.entity.MonitorProject;
@@ -57,13 +37,13 @@ import com.nis.modules.sys.service.SysConfigService;
import com.nis.modules.sys.service.SysUserService;
import com.nis.modules.sys.service.TimezoneService;
import com.nis.modules.sys.shiro.ShiroUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.lang.Pair;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.core.util.URLUtil;
-import cn.hutool.log.Log;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@Service
public class StatServiceImpl implements StatService {
@@ -95,12 +75,6 @@ public class StatServiceImpl implements StatService {
private MonitorEndpointService monitorEndpointService;
@Autowired
- private MonitorEndpointStateService monitorEndpointStateService;
-
- @Autowired
- private AlertMessageService alertMessageService;
-
- @Autowired
private SysConfigService sysConfigService;
@Autowired
@@ -110,9 +84,6 @@ public class StatServiceImpl implements StatService {
private AlertMessageDao alertMessageDao;
@Autowired
- private AlertRuleService alertRuleService;
-
- @Autowired
private TimezoneService timezoneService;
private Integer topNSize = 10;
diff --git a/nz-admin/src/main/java/db/migration/V2023_04_10__SupportMultiThresholdAlertRules.java b/nz-admin/src/main/java/db/migration/V2023_04_10__SupportMultiThresholdAlertRules.java
new file mode 100644
index 00000000..cde88354
--- /dev/null
+++ b/nz-admin/src/main/java/db/migration/V2023_04_10__SupportMultiThresholdAlertRules.java
@@ -0,0 +1,151 @@
+package db.migration;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.DbUtil;
+import cn.hutool.db.Entity;
+import cn.hutool.db.SqlConnRunner;
+import cn.hutool.db.sql.SqlExecutor;
+import cn.hutool.log.Log;
+import com.nis.common.utils.Constant.AlertRuleType;
+import com.nis.common.utils.Tool;
+import com.nis.modules.alert.entity.AlertRuleEntity;
+import org.apache.commons.lang3.time.StopWatch;
+import org.flywaydb.core.api.MigrationVersion;
+import org.flywaydb.core.api.migration.BaseJavaMigration;
+import org.flywaydb.core.api.migration.Context;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.util.List;
+
+/**
+ * V2023_04_10__SupportMultiThresholdAlertRules.java
+ * 支持多阈值告警规则
+ * <p>
+ * 1. alert_rule drop operator & threshold & severity_id columns
+ * 2. alert_rule add condition & ext_labels columns
+ * <p>
+ * 历史数据格式升级
+ *
+ * @author shizhendong
+ * @date 2023-04-10
+ */
+public class V2023_04_10__SupportMultiThresholdAlertRules extends BaseJavaMigration {
+
+ private static final Log log = Log.get();
+
+ private static String MIGRATION_SQL =
+ "ALTER TABLE alert_rule \n" +
+ "DROP COLUMN IF EXISTS operator,\n" +
+ "DROP COLUMN IF EXISTS threshold,\n" +
+ "DROP COLUMN IF EXISTS severity_id,\n" +
+ "ADD COLUMN IF NOT EXISTS `condition` varchar(4096) NOT NULL DEFAULT '' COMMENT '判断条件\\r\\noperator可选值:\\r\\n== (equal)\\r\\n!= (not-equal)\\r\\n> (greater-than)\\r\\n< (less-than)\\r\\n>= (greater-or-equal)\\r\\n<= (less-or-equal)\\r\\n~= (regex)\\r\\n示例:\\r\\n[{\"id\":1,\"weight\":1,\"operator\":\">\",\"value\":\"80\"},{\"id\":1,\"weight\":2,\"operator\":\">\",\"value\":\"70\"}]',\n" +
+ "ADD COLUMN IF NOT EXISTS `ext_labels` varchar(4096) NOT NULL DEFAULT '' COMMENT '扩展标签\\r\\n示例:\\r\\n[{\"name\":\"test\",\"value\":\"ddd\"},{\"name\":\"tas\",\"value\":\"ccc\"}]';";
+
+ @Override
+ public void migrate(Context context) throws Exception {
+ log.info("[migrate] [begin]");
+ StopWatch sw = new StopWatch();
+ sw.start();
+
+ Connection connection = context.getConnection();
+ SqlConnRunner sqlConnRunner = DbUtil.newSqlConnRunner(connection);
+
+ // query history data
+ log.info("[migrate] [query history alert rule list]");
+ List<Entity> ruleHistoryDataList = sqlConnRunner.findAll(connection, Entity.create("alert_rule"));
+ log.info("[migrate] [rule history data] [size: {}]", ruleHistoryDataList.size());
+
+ // alert table
+ log.info("[migrate] [ALTER TABLE alert_rule] [begin]");
+ PreparedStatement prepareStatement = null;
+ try {
+ prepareStatement = connection.prepareStatement(MIGRATION_SQL);
+ SqlExecutor.execute(prepareStatement);
+ } finally {
+ // close
+ Tool.IoUtil.close(prepareStatement);
+ }
+ log.info("[migrate] [ALTER TABLE alert_rule] [finshed]");
+
+ // history data format conversion
+ log.info("[migrate] [rule history data format conversion] [begin]");
+ for (Entity entity : ruleHistoryDataList) {
+ // type
+ Integer type = entity.getInt("type");
+ type = Tool.ObjectUtil.defaultIfNull(type, AlertRuleType.METRICS.getValue());
+ AlertRuleType alertRuleType = AlertRuleType.getRuleType(type);
+
+ // severity_id
+ Integer severityId = entity.get("severity_id", 1);
+
+ AlertRuleEntity.ConditionItem conditionItem = new AlertRuleEntity.ConditionItem();
+ conditionItem.setId(severityId);
+ conditionItem.setWeight(1);
+ switch (alertRuleType) {
+ case METRICS:
+ case LOGS: {
+ String operator = entity.getStr("operator");
+ operator = StrUtil.emptyToDefault(operator, ">");
+
+ BigDecimal threshold = entity.getBigDecimal("threshold");
+ threshold = Tool.ObjectUtil.defaultIfNull(threshold, new BigDecimal(0.0));
+
+ conditionItem.setOperator(operator);
+ conditionItem.setValue(threshold.toPlainString());
+ break;
+ }
+ case SNMP_TRAP: {
+ conditionItem.setOperator("~=");
+ conditionItem.setValue(".*");
+ break;
+ }
+ default:
+ break;
+ }
+ // update
+ sqlConnRunner.update(
+ connection,
+ Entity.create()
+ .set("condition", Tool.JSONUtil.toJsonStr(Tool.ListUtil.of(conditionItem)))
+ .set("ext_labels", Tool.StrUtil.EMPTY),
+ Entity.create("alert_rule").set("id", entity.get("id")));
+ }
+ log.info("[migrate] [rule history data format conversion] [finshed]");
+
+ sw.stop();
+ log.info("[migrate] [finshed] [Run time: {}]", sw.toString());
+ }
+
+ @Override
+ public MigrationVersion getVersion() {
+ return MigrationVersion.fromVersion("2023.04.10");
+ }
+
+ @Override
+ public String getDescription() {
+ return "Support multi threshold alert rules";
+ }
+
+ @Override
+ public Integer getChecksum() {
+ return null;
+ }
+
+ @Override
+ public boolean isUndo() {
+ return super.isUndo();
+ }
+
+ @Override
+ public boolean isBaselineMigration() {
+ return super.isBaselineMigration();
+ }
+
+ @Override
+ public boolean canExecuteInTransaction() {
+ return super.canExecuteInTransaction();
+ }
+
+}
diff --git a/nz-admin/src/main/resources/db/R__AZ_sys_config.sql b/nz-admin/src/main/resources/db/R__AZ_sys_config.sql
index d01a9948..a7fa6f92 100644
--- a/nz-admin/src/main/resources/db/R__AZ_sys_config.sql
+++ b/nz-admin/src/main/resources/db/R__AZ_sys_config.sql
@@ -48,7 +48,7 @@ REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`)
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (NULL, 'system_version', '23.01', 1, 'NZ系统版本');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (NULL, 'prometheus_default_retention_time_when_s3', '1', 1, 'metrics 对象存储时普罗米修斯默认保留时间 单位: d');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'interface_name', 'eth0,en0,bond0,ens2f0,enp0s31f6', 1, NULL);
-REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'stat_query_json', '[\r\n {\r\n \"name\": \"asset\",\r\n \"datasql\": \"SELECT t.name as asset,t.*,atc.vm,atc.vmh,atc.NAME AS type,assc.NAME AS state,ab.NAME AS brand,am.NAME AS model,dc.NAME AS datacenter,cabinet.NAME AS cabinet,(CASE ap.`status` WHEN 1 THEN \'Up\' ELSE \'Down\' END) AS ping,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count,(CASE WHEN mc.c IS NULL THEN 0 ELSE mc.c END) AS endpoint_count FROM asset_asset t LEFT JOIN asset_type_conf atc ON t.type_id=atc.id LEFT JOIN asset_state_conf assc ON t.state_id=assc.id LEFT JOIN asset_brand ab ON t.brand_id=ab.id LEFT JOIN asset_model am ON t.model_id=am.id LEFT JOIN dc ON t.dc_id=dc.id LEFT JOIN cabinet ON t.cabinet_id=cabinet.id LEFT JOIN asset_ping ap ON t.id=ap.asset_id LEFT JOIN (SELECT asset_id,count(1) AS c FROM alert_message_active ama WHERE ama.asset_id IS NOT NULL GROUP BY asset_id) amc ON amc.asset_id=t.id LEFT JOIN (SELECT asset_id,count(1) AS c FROM monitor_endpoint me GROUP BY asset_id) mc ON mc.asset_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"ping\",\r\n \"expr\": \"ping\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset_type\",\r\n \"expr\": \"type\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset_state\",\r\n \"expr\": \"state\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"brand\",\r\n \"expr\": \"brand\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"model\",\r\n \"expr\": \"model\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"cabinet\",\r\n \"expr\": \"cabinet\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset type\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_type_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"atc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"atc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"atc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"atc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset state\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_state_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"assc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"assc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"assc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"assc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset brand\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_brand_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"ab.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"ab.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"ab.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"ab.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset model\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_model_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"am.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"am.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"am.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"am.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"id\",\r\n \"type\": 1,\r\n \"rule\": [\r\n {\r\n \"regex\": \"\\\\d+\",\r\n \"tip\": \"filter_asset_id_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \">\",\r\n \"expr\": \"t.id > {{value}}\"\r\n },\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.id = {{value}}\"\r\n },\r\n {\r\n \"name\": \"<\",\r\n \"expr\": \"t.id < {{value}}\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.id != {{value}}\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"datasql\": \"SELECT t.id,t.name as datacenter,(CASE WHEN cc.c IS NULL THEN 0 ELSE cc.c END) AS cabinet_count,(CASE WHEN ac.c IS NULL THEN 0 ELSE ac.c END) AS asset_count,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM dc t LEFT JOIN (SELECT dc_id,count(1) AS c FROM cabinet GROUP BY dc_id) cc ON cc.dc_id=t.id LEFT JOIN (SELECT dc_id,count(1) AS c FROM asset_asset GROUP BY dc_id) ac ON ac.dc_id=t.id LEFT JOIN (SELECT dc_id,count(1) AS c FROM alert_message_active ama WHERE ama.dc_id IS NOT NULL GROUP BY dc_id) amc ON amc.dc_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"cabinet_sum\",\r\n \"expr\": \"sum(cabinet_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"project\",\r\n \"datasql\": \"SELECT t.id,t.name as project,(CASE WHEN mm.c IS NULL THEN 0 ELSE mm.c END) AS module_count,(CASE WHEN aec.c IS NULL THEN 0 ELSE aec.c END) AS endpoint_count,(CASE WHEN aec.ac IS NULL THEN 0 ELSE aec.ac END) AS asset_count,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM monitor_project t LEFT JOIN (SELECT project_id,count(1) AS c FROM monitor_module GROUP BY project_id) mm ON mm.project_id=t.id LEFT JOIN (SELECT project_id,count(1) AS c FROM alert_message_active ama WHERE ama.project_id IS NOT NULL GROUP BY project_id) amc ON amc.project_id=t.id LEFT JOIN (SELECT project_id,count(1) AS c,count(DISTINCT e.asset_id) AS ac FROM monitor_endpoint e LEFT JOIN monitor_module m ON m.id=e.module_id GROUP BY m.project_id) aec ON aec.project_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"module_sum\",\r\n \"expr\": \"sum(module_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"datasql\": \"SELECT t.id,t.NAME AS module,mp.NAME AS project,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count,(CASE WHEN mc.c IS NULL THEN 0 ELSE mc.c END) AS endpoint_count,(CASE WHEN mc.ac IS NULL THEN 0 ELSE mc.ac END) AS asset_count FROM monitor_module t LEFT JOIN monitor_project mp ON t.project_id=mp.id LEFT JOIN (SELECT module_id,count(1) AS c FROM alert_message_active ama WHERE ama.module_id IS NOT NULL GROUP BY module_id) amc ON amc.module_id=t.id LEFT JOIN (SELECT module_id,count(1) AS c,count(DISTINCT asset_id) AS ac FROM monitor_endpoint me GROUP BY module_id) mc ON mc.module_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"datasql\": \"SELECT \\tt.NAME AS endpoint, \\tt.*, \\tmm.NAME AS module, \\tmp.NAME AS project, \\tdc.NAME AS datacenter, \\taa.NAME AS asset, \\tatc.vm, \\tatc.vmh, \\tatc.NAME AS type, \\tassc.NAME AS state, \\tab.NAME AS brand, \\tam.NAME AS model, \\tcabinet.NAME AS cabinet, \\t( CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END ) AS alert_message_count FROM \\tmonitor_endpoint t \\tLEFT JOIN monitor_module mm ON t.module_id = mm.id \\tLEFT JOIN monitor_project mp ON mm.project_id = mp.id \\tLEFT JOIN asset_asset aa ON t.asset_id = aa.id \\tLEFT JOIN asset_type_conf atc ON aa.type_id = atc.id \\tLEFT JOIN asset_state_conf assc ON aa.state_id = assc.id \\tLEFT JOIN asset_brand ab ON aa.brand_id = ab.id \\tLEFT JOIN asset_model am ON aa.model_id = am.id \\tLEFT JOIN dc ON aa.dc_id = dc.id \\tLEFT JOIN cabinet ON aa.cabinet_id = cabinet.id \\tLEFT JOIN asset_ping ap ON aa.id = ap.asset_id \\tLEFT JOIN ( SELECT endpoint_id, count( 1 ) AS c FROM alert_message_active ama WHERE ama.endpoint_id IS NOT NULL GROUP BY endpoint_id ) amc ON amc.endpoint_id = t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"expr\": \"endpoint\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mm.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mm.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mm.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mm.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_endpoint_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"aa.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"aa.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"aa.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"aa.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert rule\",\r\n \"datasql\": \"SELECT t.id,t.NAME AS \'alertRule\',(CASE t.state WHEN 1 THEN \'Enabled\' WHEN 0 THEN \'Disabled\' ELSE \'Unkown\' END) AS state,(CASE t.type WHEN 1 THEN \'Metrics\' WHEN 2 THEN \'Logs\' WHEN 3 THEN \'SNMPTRAP\' ELSE \'Unkown\' END) AS typename,alsc.NAME AS priority,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM alert_rule t LEFT JOIN alert_severity_conf alsc ON t.severity_id=alsc.id LEFT JOIN (SELECT rule_id,count(1) AS c FROM alert_message_active ama WHERE ama.rule_id IS NOT NULL GROUP BY rule_id) amc ON amc.rule_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"type\",\r\n \"expr\": \"typename\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"expr\": \"state\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"priority\",\r\n \"expr\": \"priority\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"alert_rule\",\r\n \"expr\": \"alertRule\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"priority\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_priority_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"alsc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"alsc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"alsc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"alsc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert rule\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_alert_rule_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert message\",\r\n \"datasql\": \"SELECT t.id,t.asset_id,t.endpoint_id,t.rule_id,t.project_id,t.module_id,t.dc_id,alsc.NAME AS severity,ar.NAME AS alert,(CASE ar.type WHEN 1 THEN \'Metrics\' WHEN 2 THEN \'Logs\' WHEN 3 THEN \'SNMPTRAP\' ELSE \'Unkown\' END) AS alertType,mp.NAME AS project,mm.NAME AS module,me.NAME AS endpoint,aa.NAME AS asset,dc.NAME AS datacenter FROM alert_message_active t LEFT JOIN alert_rule ar ON t.rule_id=ar.id LEFT JOIN monitor_project mp ON t.project_id=mp.id LEFT JOIN monitor_module mm ON t.module_id=mm.id LEFT JOIN monitor_endpoint me ON t.endpoint_id=me.id LEFT JOIN asset_asset aa ON t.asset_id=aa.id LEFT JOIN dc ON t.dc_id=dc.id LEFT JOIN alert_severity_conf alsc ON t.severity_id=alsc.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"expr\": \"endpoint\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"alert_rule\",\r\n \"expr\": \"alert\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"priority\",\r\n \"expr\": \"severity\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_asset\",\r\n \"expr\": \"count(DISTINCT t.asset_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_datacenter\",\r\n \"expr\": \"count(DISTINCT t.dc_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_project\",\r\n \"expr\": \"count(DISTINCT t.project_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_module\",\r\n \"expr\": \"count(DISTINCT t.module_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_endpoint\",\r\n \"expr\": \"count(DISTINCT t.endpoint_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_alert_rule\",\r\n \"expr\": \"count(DISTINCT t.rule_id)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mm.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mm.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mm.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mm.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_endpoint_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"me.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"me.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"me.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"me.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"aa.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"aa.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"aa.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"aa.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"priority\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_priority_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"alsc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"alsc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"alsc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"alsc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert rule\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_alert_rule_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"ar.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"ar.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"ar.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"ar.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"agent\",\r\n \"datasql\": \"SELECT \\tt.id, \\tt.type, \\t( CASE t.STATUS WHEN 1 THEN \'Up\' ELSE \'Down\' END ) AS STATUS, \\t( CASE t.type WHEN 1 THEN \'Global\' WHEN 2 THEN \'Per-datacenter\' ELSE \'Unkown\' END ) AS typename, \\tdc.NAME AS datacenter FROM \\tagent t \\tLEFT JOIN dc ON t.dc_id = dc.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"type\",\r\n \"expr\": \"type\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"expr\": \"status\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n]', 1, NULL);
+REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'stat_query_json', '[\r\n {\r\n \"name\": \"asset\",\r\n \"datasql\": \"SELECT t.name as asset,t.*,atc.vm,atc.vmh,atc.NAME AS type,assc.NAME AS state,ab.NAME AS brand,am.NAME AS model,dc.NAME AS datacenter,cabinet.NAME AS cabinet,(CASE ap.`status` WHEN 1 THEN \'Up\' ELSE \'Down\' END) AS ping,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count,(CASE WHEN mc.c IS NULL THEN 0 ELSE mc.c END) AS endpoint_count FROM asset_asset t LEFT JOIN asset_type_conf atc ON t.type_id=atc.id LEFT JOIN asset_state_conf assc ON t.state_id=assc.id LEFT JOIN asset_brand ab ON t.brand_id=ab.id LEFT JOIN asset_model am ON t.model_id=am.id LEFT JOIN dc ON t.dc_id=dc.id LEFT JOIN cabinet ON t.cabinet_id=cabinet.id LEFT JOIN asset_ping ap ON t.id=ap.asset_id LEFT JOIN (SELECT asset_id,count(1) AS c FROM alert_message_active ama WHERE ama.asset_id IS NOT NULL GROUP BY asset_id) amc ON amc.asset_id=t.id LEFT JOIN (SELECT asset_id,count(1) AS c FROM monitor_endpoint me GROUP BY asset_id) mc ON mc.asset_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"ping\",\r\n \"expr\": \"ping\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset_type\",\r\n \"expr\": \"type\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset_state\",\r\n \"expr\": \"state\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"brand\",\r\n \"expr\": \"brand\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"model\",\r\n \"expr\": \"model\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"cabinet\",\r\n \"expr\": \"cabinet\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset type\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_type_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"atc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"atc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"atc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"atc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset state\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_state_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"assc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"assc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"assc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"assc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset brand\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_brand_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"ab.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"ab.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"ab.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"ab.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset model\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_model_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"am.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"am.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"am.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"am.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"id\",\r\n \"type\": 1,\r\n \"rule\": [\r\n {\r\n \"regex\": \"\\\\d+\",\r\n \"tip\": \"filter_asset_id_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \">\",\r\n \"expr\": \"t.id > {{value}}\"\r\n },\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.id = {{value}}\"\r\n },\r\n {\r\n \"name\": \"<\",\r\n \"expr\": \"t.id < {{value}}\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.id != {{value}}\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"datasql\": \"SELECT t.id,t.name as datacenter,(CASE WHEN cc.c IS NULL THEN 0 ELSE cc.c END) AS cabinet_count,(CASE WHEN ac.c IS NULL THEN 0 ELSE ac.c END) AS asset_count,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM dc t LEFT JOIN (SELECT dc_id,count(1) AS c FROM cabinet GROUP BY dc_id) cc ON cc.dc_id=t.id LEFT JOIN (SELECT dc_id,count(1) AS c FROM asset_asset GROUP BY dc_id) ac ON ac.dc_id=t.id LEFT JOIN (SELECT dc_id,count(1) AS c FROM alert_message_active ama WHERE ama.dc_id IS NOT NULL GROUP BY dc_id) amc ON amc.dc_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"cabinet_sum\",\r\n \"expr\": \"sum(cabinet_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"project\",\r\n \"datasql\": \"SELECT t.id,t.name as project,(CASE WHEN mm.c IS NULL THEN 0 ELSE mm.c END) AS module_count,(CASE WHEN aec.c IS NULL THEN 0 ELSE aec.c END) AS endpoint_count,(CASE WHEN aec.ac IS NULL THEN 0 ELSE aec.ac END) AS asset_count,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM monitor_project t LEFT JOIN (SELECT project_id,count(1) AS c FROM monitor_module GROUP BY project_id) mm ON mm.project_id=t.id LEFT JOIN (SELECT project_id,count(1) AS c FROM alert_message_active ama WHERE ama.project_id IS NOT NULL GROUP BY project_id) amc ON amc.project_id=t.id LEFT JOIN (SELECT project_id,count(1) AS c,count(DISTINCT e.asset_id) AS ac FROM monitor_endpoint e LEFT JOIN monitor_module m ON m.id=e.module_id GROUP BY m.project_id) aec ON aec.project_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"module_sum\",\r\n \"expr\": \"sum(module_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"datasql\": \"SELECT t.id,t.NAME AS module,mp.NAME AS project,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count,(CASE WHEN mc.c IS NULL THEN 0 ELSE mc.c END) AS endpoint_count,(CASE WHEN mc.ac IS NULL THEN 0 ELSE mc.ac END) AS asset_count FROM monitor_module t LEFT JOIN monitor_project mp ON t.project_id=mp.id LEFT JOIN (SELECT module_id,count(1) AS c FROM alert_message_active ama WHERE ama.module_id IS NOT NULL GROUP BY module_id) amc ON amc.module_id=t.id LEFT JOIN (SELECT module_id,count(1) AS c,count(DISTINCT asset_id) AS ac FROM monitor_endpoint me GROUP BY module_id) mc ON mc.module_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"endpoint_sum\",\r\n \"expr\": \"sum(endpoint_count)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"asset_sum\",\r\n \"expr\": \"sum(asset_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"datasql\": \"SELECT \\tt.NAME AS endpoint, \\tt.*, \\tmm.NAME AS module, \\tmp.NAME AS project, \\tdc.NAME AS datacenter, \\taa.NAME AS asset, \\tatc.vm, \\tatc.vmh, \\tatc.NAME AS type, \\tassc.NAME AS state, \\tab.NAME AS brand, \\tam.NAME AS model, \\tcabinet.NAME AS cabinet, \\t( CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END ) AS alert_message_count FROM \\tmonitor_endpoint t \\tLEFT JOIN monitor_module mm ON t.module_id = mm.id \\tLEFT JOIN monitor_project mp ON mm.project_id = mp.id \\tLEFT JOIN asset_asset aa ON t.asset_id = aa.id \\tLEFT JOIN asset_type_conf atc ON aa.type_id = atc.id \\tLEFT JOIN asset_state_conf assc ON aa.state_id = assc.id \\tLEFT JOIN asset_brand ab ON aa.brand_id = ab.id \\tLEFT JOIN asset_model am ON aa.model_id = am.id \\tLEFT JOIN dc ON aa.dc_id = dc.id \\tLEFT JOIN cabinet ON aa.cabinet_id = cabinet.id \\tLEFT JOIN asset_ping ap ON aa.id = ap.asset_id \\tLEFT JOIN ( SELECT endpoint_id, count( 1 ) AS c FROM alert_message_active ama WHERE ama.endpoint_id IS NOT NULL GROUP BY endpoint_id ) amc ON amc.endpoint_id = t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"expr\": \"endpoint\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mm.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mm.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mm.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mm.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_endpoint_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"aa.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"aa.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"aa.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"aa.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert rule\",\r\n \"datasql\": \"SELECT t.id,t.NAME AS \'alertRule\',(CASE t.state WHEN 1 THEN \'Enabled\' WHEN 0 THEN \'Disabled\' ELSE \'Unkown\' END) AS state,(CASE t.type WHEN 1 THEN \'Metrics\' WHEN 2 THEN \'Logs\' WHEN 3 THEN \'SNMPTRAP\' ELSE \'Unkown\' END) AS typename,(CASE WHEN amc.c IS NULL THEN 0 ELSE amc.c END) AS alert_message_count FROM alert_rule t LEFT JOIN (SELECT rule_id,count(1) AS c FROM alert_message_active ama WHERE ama.rule_id IS NOT NULL GROUP BY rule_id) amc ON amc.rule_id=t.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"type\",\r\n \"expr\": \"typename\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"expr\": \"state\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"alert_rule\",\r\n \"expr\": \"alertRule\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"alert_message_sum\",\r\n \"expr\": \"sum(alert_message_count)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"alert rule\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_alert_rule_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"t.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"t.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"t.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"t.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert message\",\r\n \"datasql\": \"SELECT t.id,t.asset_id,t.endpoint_id,t.rule_id,t.project_id,t.module_id,t.dc_id,alsc.NAME AS severity,ar.NAME AS alert,(CASE ar.type WHEN 1 THEN \'Metrics\' WHEN 2 THEN \'Logs\' WHEN 3 THEN \'SNMPTRAP\' ELSE \'Unkown\' END) AS alertType,mp.NAME AS project,mm.NAME AS module,me.NAME AS endpoint,aa.NAME AS asset,dc.NAME AS datacenter FROM alert_message_active t LEFT JOIN alert_rule ar ON t.rule_id=ar.id LEFT JOIN monitor_project mp ON t.project_id=mp.id LEFT JOIN monitor_module mm ON t.module_id=mm.id LEFT JOIN monitor_endpoint me ON t.endpoint_id=me.id LEFT JOIN asset_asset aa ON t.asset_id=aa.id LEFT JOIN dc ON t.dc_id=dc.id LEFT JOIN alert_severity_conf alsc ON t.severity_id=alsc.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"project\",\r\n \"expr\": \"project\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"expr\": \"module\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"expr\": \"endpoint\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"expr\": \"asset\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"alert_rule\",\r\n \"expr\": \"alert\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"priority\",\r\n \"expr\": \"severity\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_asset\",\r\n \"expr\": \"count(DISTINCT t.asset_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_datacenter\",\r\n \"expr\": \"count(DISTINCT t.dc_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_project\",\r\n \"expr\": \"count(DISTINCT t.project_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_module\",\r\n \"expr\": \"count(DISTINCT t.module_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_endpoint\",\r\n \"expr\": \"count(DISTINCT t.endpoint_id)\",\r\n \"type\": 1\r\n },\r\n {\r\n \"name\": \"affected_alert_rule\",\r\n \"expr\": \"count(DISTINCT t.rule_id)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"project\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_project_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mp.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mp.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mp.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mp.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"module\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_module_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"mm.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"mm.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"mm.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"mm.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"endpoint\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_endpoint_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"me.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"me.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"me.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"me.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"asset\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_asset_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"aa.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"aa.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"aa.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"aa.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"priority\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_priority_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"alsc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"alsc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"alsc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"alsc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"alert rule\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_alert_rule_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"ar.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"ar.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"ar.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"ar.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"name\": \"agent\",\r\n \"datasql\": \"SELECT \\tt.id, \\tt.type, \\t( CASE t.STATUS WHEN 1 THEN \'Up\' ELSE \'Down\' END ) AS STATUS, \\t( CASE t.type WHEN 1 THEN \'Global\' WHEN 2 THEN \'Per-datacenter\' ELSE \'Unkown\' END ) AS typename, \\tdc.NAME AS datacenter FROM \\tagent t \\tLEFT JOIN dc ON t.dc_id = dc.id\",\r\n \"group\": [\r\n {\r\n \"name\": \"type\",\r\n \"expr\": \"type\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"state\",\r\n \"expr\": \"status\",\r\n \"type\": 2\r\n },\r\n {\r\n \"name\": \"datacenter\",\r\n \"expr\": \"datacenter\",\r\n \"type\": 2\r\n }\r\n ],\r\n \"select\": [\r\n {\r\n \"name\": \"count\",\r\n \"expr\": \"count(1)\",\r\n \"type\": 1\r\n }\r\n ],\r\n \"filter\": [\r\n {\r\n \"name\": \"datacenter\",\r\n \"type\": 2,\r\n \"rule\": [\r\n {\r\n \"regex\": \".+\",\r\n \"tip\": \"filter_datacenter_is_null\"\r\n }\r\n ],\r\n \"opers\": [\r\n {\r\n \"name\": \"=\",\r\n \"expr\": \"dc.name = \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"~=\",\r\n \"expr\": \"dc.name like \'%{{value}}%\'\"\r\n },\r\n {\r\n \"name\": \"!=\",\r\n \"expr\": \"dc.name != \'{{value}}\'\"\r\n },\r\n {\r\n \"name\": \"!~\",\r\n \"expr\": \"dc.name not like \'%{{value}}%\'\"\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n]', 1, NULL);
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'expretmpl_export_header', '[{\"name\":\"name\",\"i18n\":\"config.exprTemp.name\",\"comment\":\"config.exprTemp.name.comment\"},{\"name\":\"group name\",\"i18n\":\"config.exprTemp.gname\",\"comment\":\"config.exprTemp.gname.comment\"},{\"name\":\"expression\",\"i18n\":\"config.exprTemp.expression\",\"comment\":\"config.exprTemp.expression.comment\"},{\"name\":\"remark\",\"i18n\":\"config.exprTemp.remark\",\"comment\":\"config.exprTemp.remark.comment\"}]', 1, '表达式导入导出模板表头信息');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'system_favicon', '', 1, null);
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'system_bgImg', '', 1, null);
@@ -62,7 +62,7 @@ REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`)
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'dc_export_header', '[{\"name\":\"Name\",\"i18n\":\"overall.name\",\"comment\":\"config.dc.name.comment\"},{\"name\":\"Location\",\"i18n\":\"asset.location\",\"comment\":\"config.dc.location.comment\"},{\"name\":\"Telephone\",\"i18n\":\"config.dc.tel\",\"comment\":\"config.dc.tel.comment\"},{\"name\":\"Principal\",\"i18n\":\"config.dc.principal\",\"comment\":\"config.dc.principal.comment\"},{\"name\":\"Longitude\",\"i18n\":\"config.dc.longitude\",\"comment\":\"config.dc.longitude.comment\"},{\"name\":\"Latitude\",\"i18n\":\"config.dc.latitude\",\"comment\":\"config.dc.latitude.comment\"},{\"name\":\"State\",\"i18n\":\"overall.state\",\"comment\":\"config.dc.state.comment\"}]', 1, 'dc 导入导出表头信息');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'model_export_header', '[{\"name\":\"Name\",\"i18n\":\"config.model.name\",\"comment\":\"config.model.name.comment\"},{\"name\":\"Brand\",\"i18n\":\"asset.brand\",\"comment\":\"config.model.brand.comment\"},{\"name\":\"dashboard template\",\"i18n\":\"model.dashboardtemplate\",\"comment\":\"config.model.dashboardtemplate.comment\"},{\"name\":\"Description\",\"i18n\":\"overall.remark\",\"comment\":\"config.model.remark.comment\"},{\"name\":\"Type\",\"i18n\":\"overall.type\",\"comment\":\"asset.assetType.comment\"},{\"name\":\"SysObjectId\",\"i18n\":\"config.model.sysObjectId\",\"comment\":\"config.model.sysObjectId.comment\"}]', 1, 'asset model 导入导出表头信息');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'monitor_endpoint_export_header', '[{\"name\":\"Project Name\",\"i18n\":\"project.project.projectName\",\"comment\":\"project.project.projectName.comment\"},{\"name\":\"Module Name\",\"i18n\":\"overall.module\",\"comment\":\"project.endpoint.moduleName.comment\"},{\"name\":\"Name\",\"i18n\":\"overall.name\",\"comment\":\"project.endpoint.name.comment\"},{\"name\":\"Asset Name\",\"i18n\":\"asset.asset\",\"comment\":\"project.endpoint.asset.comment\"},{\"name\":\"Config\",\"i18n\":\"overall.config\",\"comment\":\"project.endpoint.configs.comment\"}]', 1, 'monitor endpoint 导入表头');
-REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'rule_export_header', '[{\"name\":\"name\",\"i18n\":\"overall.name\",\"comment\":\"alert.config.name.comment\"},{\"name\":\"type\",\"i18n\":\"overall.type\",\"comment\":\"alert.type.comment\"},{\"name\":\"Execution cycle\",\"i18n\":\"alert.config.inr\",\"comment\":\"alert.config.inr.comment\"},{\"name\":\"timeout\",\"i18n\":\"alert.config.timeout\",\"comment\":\"alert.config.timeout.comment\"},{\"name\":\"expr\",\"i18n\":\"alert.config.expr\",\"comment\":\"alert.config.expr.comment\"},{\"name\":\"operator\",\"i18n\":\"alert.config.operator\",\"comment\":\"alert.config.operator.comment\"},{\"name\":\"threshold\",\"i18n\":\"alert.config.threshold\",\"comment\":\"alert.config.threshold.comment\"},{\"name\":\"unit\",\"i18n\":\"dashboard.dashboard.chartForm.unit\",\"comment\":\"alert.config.unit.comment\"},{\"name\":\"last\",\"i18n\":\"alert.config.for\",\"comment\":\"alert.config.for.comment\"},{\"name\":\"severity\",\"i18n\":\"alert.severity\",\"comment\":\"alert.severity.comment\"},{\"name\":\"summary\",\"i18n\":\"alert.summary\",\"comment\":\"alert.summary.comment\"},{\"name\":\"description\",\"i18n\":\"overall.remark\",\"comment\":\"alert.description.comment\"},{\"name\":\"receiver\",\"i18n\":\"alert.receiver\",\"comment\":\"alert.receiver.comment\"},{\"name\":\"notify\",\"i18n\":\"alert.notify\",\"comment\":\"alert.notify.comment\"},{\"name\":\"state\",\"i18n\":\"overall.state\",\"comment\":\"alert.state.comment\"},{\"name\":\"autoExpired\",\"i18n\":\"alert.config.autoExpired\",\"comment\":\"alert.config.autoExpired.comment\"},{\"name\":\"schedEnable\",\"i18n\":\"alert.config.schedEnable\",\"comment\":\"alert.config.schedEnable.comment\"},{\"name\":\"schedDays\",\"i18n\":\"alert.config.schedDays\",\"comment\":\"alert.config.schedDays.comment\"},{\"name\":\"startAt\",\"i18n\":\"overall.startTime\",\"comment\":\"alert.startAt.comment\"},{\"name\":\"endAt\",\"i18n\":\"overall.endTime\",\"comment\":\"alert.endAt.comment\"},{\"name\":\"notifyActive\",\"i18n\":\"alert.config.notifyActive\",\"comment\":\"alert.config.notifyActive.comment\"},{\"name\":\"notifyExpired\",\"i18n\":\"alert.config.notifyExpired\",\"comment\":\"alert.config.notifyExpired.comment\"},{\"name\":\"trbShot\",\"i18n\":\"alert.config.trbShot\",\"comment\":\"alert.config.trbShot.comment\"}]', 1, NULL);
+REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'rule_export_header', '[{\"name\":\"name\",\"i18n\":\"overall.name\",\"comment\":\"alert.config.name.comment\"},{\"name\":\"type\",\"i18n\":\"overall.type\",\"comment\":\"alert.type.comment\"},{\"name\":\"Execution cycle\",\"i18n\":\"alert.config.inr\",\"comment\":\"alert.config.inr.comment\"},{\"name\":\"timeout\",\"i18n\":\"alert.config.timeout\",\"comment\":\"alert.config.timeout.comment\"},{\"name\":\"expr\",\"i18n\":\"alert.config.expr\",\"comment\":\"alert.config.expr.comment\"},{\"name\":\"condition\",\"i18n\":\"alert.config.condition\",\"comment\":\"alert.config.condition.comment\"},{\"name\":\"extLabels\",\"i18n\":\"alert.config.extLabels\",\"comment\":\"alert.config.extLabels.comment\"},{\"name\":\"unit\",\"i18n\":\"dashboard.dashboard.chartForm.unit\",\"comment\":\"alert.config.unit.comment\"},{\"name\":\"last\",\"i18n\":\"alert.config.for\",\"comment\":\"alert.config.for.comment\"},{\"name\":\"summary\",\"i18n\":\"alert.summary\",\"comment\":\"alert.summary.comment\"},{\"name\":\"description\",\"i18n\":\"overall.remark\",\"comment\":\"alert.description.comment\"},{\"name\":\"receiver\",\"i18n\":\"alert.receiver\",\"comment\":\"alert.receiver.comment\"},{\"name\":\"notify\",\"i18n\":\"alert.notify\",\"comment\":\"alert.notify.comment\"},{\"name\":\"state\",\"i18n\":\"overall.state\",\"comment\":\"alert.state.comment\"},{\"name\":\"autoExpired\",\"i18n\":\"alert.config.autoExpired\",\"comment\":\"alert.config.autoExpired.comment\"},{\"name\":\"schedEnable\",\"i18n\":\"alert.config.schedEnable\",\"comment\":\"alert.config.schedEnable.comment\"},{\"name\":\"schedDays\",\"i18n\":\"alert.config.schedDays\",\"comment\":\"alert.config.schedDays.comment\"},{\"name\":\"startAt\",\"i18n\":\"overall.startTime\",\"comment\":\"alert.startAt.comment\"},{\"name\":\"endAt\",\"i18n\":\"overall.endTime\",\"comment\":\"alert.endAt.comment\"},{\"name\":\"notifyActive\",\"i18n\":\"alert.config.notifyActive\",\"comment\":\"alert.config.notifyActive.comment\"},{\"name\":\"notifyExpired\",\"i18n\":\"alert.config.notifyExpired\",\"comment\":\"alert.config.notifyExpired.comment\"},{\"name\":\"trbShot\",\"i18n\":\"alert.config.trbShot\",\"comment\":\"alert.config.trbShot.comment\"}]', 1, NULL);
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'asset_chart_export_header', '[{\"name\":\"group\",\"i18n\":\"dashboard.dashboard.chartForm.group\",\"comment\":\"dashboard.dashboard.chartForm.group.comment\"},{\"name\":\"title\",\"i18n\":\"overall.name\",\"comment\":\"dashboard.dashboard.chartForm.name.comment\"},{\"name\":\"type\",\"i18n\":\"overall.type\",\"comment\":\"dashboard.dashboard.chartForm.type.comment\"},{\"name\":\"varType\",\"i18n\":\"dashboard.dashboard.chartForm.varType\",\"comment\":\"dashboard.dashboard.chartForm.varType.comment\"},{\"name\":\"width\",\"i18n\":\"dashboard.dashboard.chartForm.width\",\"comment\":\"dashboard.dashboard.chartForm.width.comment\"},{\"name\":\"high\",\"i18n\":\"dashboard.dashboard.chartForm.high\",\"comment\":\"dashboard.dashboard.chartForm.high.comment\"},{\"name\":\"unit\",\"i18n\":\"dashboard.dashboard.chartForm.unit\",\"comment\":\"dashboard.dashboard.chartForm.unit.comment\"},{\"name\":\"legendValue\",\"i18n\":\"dashboard.dashboard.chartForm.legendValue\",\"comment\":\"dashboard.dashboard.chartForm.legendValue.comment\"},{\"name\":\"element\",\"i18n\":\"dashboard.dashboard.chartForm.element\",\"comment\":\"dashboard.dashboard.chartForm.element.comment\"},{\"name\":\"remark\",\"i18n\":\"overall.remark\",\"comment\":\"dashboard.dashboard.chartForm.remark.comment\"},{\"name\":\"Datasource\",\"i18n\":\"dashboard.dashboard.chartForm.datasource\",\"comment\":\"dashboard.dashboard.chartForm.datasource.comment\"},{\"name\":\"x\",\"i18n\":\"dashboard.dashboard.chartForm.x\",\"comment\":\"dashboard.dashboard.chartForm.x.comment\"},{\"name\":\"y\",\"i18n\":\"dashboard.dashboard.chartForm.y\",\"comment\":\"dashboard.dashboard.chartForm.y.comment\"}]', 1, NULL);
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'ipam_subnet_import_header', '[{\"name\":\"Name\",\"i18n\":\"overall.name\",\"comment\":\"config.ipamsubnet.name.comment\"},{\"name\":\"Type\",\"i18n\":\"overall.type\",\"comment\":\"config.ipamsubnet.type.comment\"},{\"name\":\"addr\",\"i18n\":\"overall.addr\",\"comment\":\"config.ipam.addr.comment\"},{\"name\":\"mask\",\"i18n\":\"overall.mask\",\"comment\":\"config.ipamsubnet.mask.comment\"},{\"name\":\"vlan\",\"i18n\":\"overall.vlan\",\"comment\":\"config.ipamsubnet.vlan.comment\"},{\"name\":\"Datacenter\",\"i18n\":\"ipamsubnet.dc.dcId\",\"comment\":\"ipamsubnet.dc.dcId.comment\"},{\"name\":\"Remark\",\"i18n\":\"overall.remark\",\"comment\":\"overall.remark.comment\"}]', 1, 'ipamsubnet导出模板');
REPLACE INTO `sys_config`(`id`, `param_key`, `param_value`, `status`, `remark`) VALUES (null, 'ipam_ip_import_header', '[{\"name\":\"Name\",\"i18n\":\"overall.name\",\"comment\":\"config.ipamip.name.comment\"},{\"name\":\"ipamsubnet\",\"i18n\":\"config.ipamip.ipamsubnet\",\"comment\":\"config.ipamip.ipamsubnet.comment\"},{\"name\":\"addr\",\"i18n\":\"overall.addr\",\"comment\":\"config.ipam.addr.comment\"},{\"name\":\"mac\",\"i18n\":\"config.ipamip.mac\",\"comment\":\"config.ipamip.mac.comment\"},{\"name\":\"asset\",\"i18n\":\"asset.asset\",\"comment\":\"config.ipamip.asset.comment\"},{\"name\":\"state\",\"i18n\":\"overall.state\",\"comment\":\"config.ipamip.state.comment\"},{\"name\":\"Remark\",\"i18n\":\"overall.remark\",\"comment\":\"overall.remark.comment\"}]', 1, 'ipamip导入头模板');
diff --git a/nz-admin/src/main/resources/mapper/alert/AlertMessageDao.xml b/nz-admin/src/main/resources/mapper/alert/AlertMessageDao.xml
index 1a6b0e6f..c5297799 100644
--- a/nz-admin/src/main/resources/mapper/alert/AlertMessageDao.xml
+++ b/nz-admin/src/main/resources/mapper/alert/AlertMessageDao.xml
@@ -93,18 +93,6 @@
</foreach>;
</delete>
- <select id="getAlertsStatColumn" resultType="com.nis.modules.alert.entity.AlertMessageEntity">
- SELECT
- rule_id,
- project_id,
- module_id,
- asset_id,
- endpoint_id,
- dc_id
- FROM
- alert_message_active
- </select>
-
<select id="getAlertNumByCabinetId" resultType="java.lang.Long">
select count(1) c from alert_message_active ama right join (
select id from asset_asset aa where cabinet_id = #{id}
@@ -123,23 +111,23 @@
alert_message_active
WHERE
<choose>
- <when test="type == asset">
- and asset_id = #{id}
+ <when test="type == 'asset'">
+ asset_id = #{id}
</when>
- <when test="type == rule">
- and rule_id = #{id}
+ <when test="type == 'rule'">
+ rule_id = #{id}
</when>
- <when test="type == project">
- and project_id = #{id}
+ <when test="type == 'project'">
+ project_id = #{id}
</when>
- <when test="type == module">
- and module_id = #{id}
+ <when test="type == 'module'">
+ module_id = #{id}
</when>
- <when test="type == endpoint">
- and endpoint_id = #{id}
+ <when test="type == 'endpoint'">
+ endpoint_id = #{id}
</when>
- <when test="type == datacenter">
- and dc_id = #{id}
+ <when test="type == 'datacenter'">
+ dc_id = #{id}
</when>
</choose>
) cnt on conf.id = cnt.severity_id
diff --git a/nz-admin/src/main/resources/mapper/alert/AlertRuleDao.xml b/nz-admin/src/main/resources/mapper/alert/AlertRuleDao.xml
index 44f3ab5f..d7c76965 100644
--- a/nz-admin/src/main/resources/mapper/alert/AlertRuleDao.xml
+++ b/nz-admin/src/main/resources/mapper/alert/AlertRuleDao.xml
@@ -11,12 +11,9 @@
<result property="inr" column="inr"/>
<result property="timeout" column="timeout"/>
<result property="expr" column="expr"/>
- <result property="operator" column="operator"/>
- <result property="threshold" column="threshold"/>
<result property="unit" column="unit"/>
<result property="method" column="method"/>
<result property="last" column="last"/>
- <result property="severityId" column="severity_id"/>
<result property="summary" column="summary"/>
<result property="description" column="description"/>
<result property="receiver" column="receiver"/>
@@ -24,6 +21,9 @@
<result property="state" column="state"/>
<result property="starred" column="starred"/>
+ <result property="condition" column="condition"/>
+ <result property="extLabels" column="ext_labels"/>
+
<result property="autoExpired" column="auto_expired"/>
<result property="schedEnable" column="sched_enable"/>
<result property="schedDays" column="sched_days"/>
@@ -34,27 +34,16 @@
<result property="trbShot" column="trb_shot"/>
<result property="alertNum" column="alertNum"/>
- <association property="severity" javaType="com.nis.modules.alert.entity.AlertSeverityConf" columnPrefix="alsc_">
- <result property="id" column="id"/>
- <result property="name" column="name"/>
- <result property="color" column="color"/>
- <result property="remark" column="remark"/>
- </association>
</resultMap>
<select id="queryList" resultMap="alertRuleMap">
SELECT
ar.*,
- alsc.id AS alsc_id,
- alsc.NAME AS alsc_name,
- alsc.color AS alsc_color,
- alsc.remark AS alsc_remark,
IFNULL( am.alertNum, 0 ) AS alertNum,
IFNULL( sta.starred, 0 ) AS starred
FROM
alert_rule ar
LEFT JOIN ( SELECT rule_id, count( 1 ) AS alertNum FROM alert_message_active GROUP BY rule_id ) am ON ar.id = am.rule_id
- LEFT JOIN alert_severity_conf alsc ON ar.severity_id = alsc.id
LEFT JOIN ( SELECT IF(COUNT(1) > 0, 1, 0) AS starred,tid FROM sys_user_starred WHERE TYPE = "alertRule" AND uid = #{params.currentLoginUserID} GROUP BY tid) sta ON ar.id = sta.tid
<where>
@@ -81,13 +70,6 @@
AND ar.last = #{params.last}
</if>
- <if test="params.severityIds != null and params.severityIds != ''">
- AND ar.severity_id in
- <foreach collection="params.severityIds.split(',')" item="id" open="(" separator="," close=")">
- #{id}
- </foreach>
- </if>
-
<if test="params.summary != null and params.summary != ''">
AND locate( #{params.summary} , ar.summary)
</if>
@@ -142,8 +124,8 @@
count( DISTINCT am.id ) as total
FROM
alert_rule ar
- LEFT JOIN alert_severity_conf sc ON ar.severity_id = sc.id
LEFT JOIN alert_message_active am ON ar.id = am.rule_id
+ LEFT JOIN alert_severity_conf sc ON sc.id = am.severity_id
GROUP BY
ar.id
</select>
diff --git a/nz-admin/src/main/resources/mapper/stat/StatDao.xml b/nz-admin/src/main/resources/mapper/stat/StatDao.xml
index d3015da4..20542bcf 100644
--- a/nz-admin/src/main/resources/mapper/stat/StatDao.xml
+++ b/nz-admin/src/main/resources/mapper/stat/StatDao.xml
@@ -403,7 +403,7 @@
</if>
group by ar.severity_id
</select>
-
+
<select id="selectAlertMessageTotal" resultMap="statAnalysis">
select count(*) as num
from alert_message_active am
@@ -868,9 +868,9 @@
</if>
<if test="params.scopeList.contains(&quot;alertrule&quot;)">
select
- 'alertrule' as type, ar.id ,ar.name, CONCAT( ac.name,' / ' ,( CASE ar.type WHEN 1 THEN 'Metrics' WHEN 2 THEN 'Logs' WHEN 3 THEN 'SNMPTRAP' ELSE 'Unkown' END )) as sub
+ 'alertrule' as type, ar.id ,ar.name, CONCAT(( CASE ar.type WHEN 1 THEN 'Metrics' WHEN 2 THEN 'Logs' WHEN 3 THEN 'SNMPTRAP' ELSE 'Unkown' END ),' / ', ar.expr) as sub
from
- alert_rule ar LEFT JOIN alert_severity_conf ac on ar.severity_id = ac.id
+ alert_rule ar
<if test="params.q != null and params.q != ''">
where
locate(#{params.q},ar.name)
@@ -956,9 +956,9 @@
</if>
<if test="params.scopeList.contains(&quot;alertrule&quot;)">
select
- 'alertrule' as type, ar.id ,ar.name, CONCAT( ac.name,' / ' ,( CASE ar.type WHEN 1 THEN 'Metrics' WHEN 2 THEN 'Logs' WHEN 3 THEN 'SNMPTRAP' ELSE 'Unkown' END )) as sub
+ 'alertrule' as type, ar.id ,ar.name, CONCAT(( CASE ar.type WHEN 1 THEN 'Metrics' WHEN 2 THEN 'Logs' WHEN 3 THEN 'SNMPTRAP' ELSE 'Unkown' END ),' / ', ar.expr) as sub
from
- alert_rule ar LEFT JOIN alert_severity_conf ac on ar.severity_id = ac.id
+ alert_rule ar
<if test="params.q != null and params.q != ''">
where
locate(#{params.q},ar.name)
diff --git a/nz-common/src/main/java/com/nis/common/utils/RCode.java b/nz-common/src/main/java/com/nis/common/utils/RCode.java
index 7ab9f961..2a12ca74 100644
--- a/nz-common/src/main/java/com/nis/common/utils/RCode.java
+++ b/nz-common/src/main/java/com/nis/common/utils/RCode.java
@@ -476,6 +476,15 @@ public enum RCode {
ALERTRULE_UNIT_FORMAT(423038,"Alert unit format should be a integer"),
ALERTRULE_UNIT_INVALIDE(423039,"Alert unit is invalide"),
ALERTRULE_UNIT_ISNULL(421040,"Alert unit can not be empty"),
+ ALERTRULE_NOT_EXIST(426041, "Alert rule does not exist"),
+ ALERTRULE_CONDITION_ISNULL(421042, "Alert rule condition cannot be empty"),
+ ALERTRULE_CONDITION_FORMAT(423043, "Alert rule condition format error"),
+ ALERTRULE_CONDITION_ID_ISNULL(421044, "Alert rule condition id attribute cannot be empty"),
+ ALERTRULE_CONDITION_WEIGHT_ISNULL(421045, "Alert rule condition weight attribute cannot be empty"),
+ ALERTRULE_CONDITION_OPERATOR_ISNULL(421046, "Alert rule condition operator attribute cannot be empty"),
+ ALERTRULE_CONDITION_VALUE_ISNULL(421047, "Alert rule condition value attribute cannot be empty"),
+ ALERTRULE_EXTLABELS_FORMAT(423048, "Alert rule extLabels format error"),
+ ALERTRULE_SNMPTRAP_OPERATOR_ERROR(423049, "The SNMP trap type operator only supports regex"),