集群的报警是通过程序批量注入的,大多集群使用相同的报警规则,有些集群需要根据业务使用特点及其敏感程度等因素定制化合适的报警规则,这些定制化的报警项配置通过配置中心来配置,由于单个配置项字段繁多,手动配置繁琐,为了简化工作量,只配置需要定制化的字段,这时在校验的时候就需要识别哪些是配置了值的字段,就需要用到映射
直接上代码
specialAlarmRules 是map类型,key格式为KaTeX parse error: Expected group after '_' at position 6: {集群名}_̲_{规则唯一字段1}__${规则唯一字段2}
遍历定制化的报警规则specialRule与当前待注入的报警规则rule做比较,如果同一报警项就取出specialRule设置了值的字段覆盖rule对应的字段
//将定制化配置的报警规则字段覆盖rule的字段
for key, specialRule := range specialAlarmRules {
keyList := strings.Split(key, "__")
if len(keyList) >= 3 {
key1, key2 := keyList[1], keyList[2]
if strings.Contains(rule.Name, key1) && strings.Contains(rule.Name, key2) {
//获取specialRule结构体中所有字段的名称及类型信息
specialRuleType := reflect.TypeOf(specialRule)
//获取specialRule结构体中所有字段的名称及其值信息
specialRuleValue := reflect.ValueOf(specialRule)
//获取待注入的规则实体种字段值的存放地址
ruleValueAddr := reflect.ValueOf(&rule).Elem()
for i := 0; i < specialRuleType.NumField(); i++ {
fieldType := specialRuleType.Field(i)
valueType := fieldType.Type
value := specialRuleValue.FieldByName(fieldType.Name)
if (valueType.String() == "int" && value.Int() != 0) || (valueType.String() == "string" && value.String() != "") {
ruleValueAddr.FieldByName(fieldType.Name).Set(value)//更改内存中值
}
}
}
} else {
logs.Error("specialRule format is wrong,specialRuleName=%v", key)
continue
}
}