monitor: refactor suggest code

This commit is contained in:
Zexi Li
2020-06-19 10:21:12 +08:00
parent eb5e902257
commit 995e5859ef
13 changed files with 168 additions and 98 deletions
+13 -8
View File
@@ -21,15 +21,20 @@ const (
SUGGEST_ALERT_DELETING = "deleting"
)
const (
EIP_UN_USED = "EIP_UNUSED"
DISK_UN_USED = "DISK_UNUSED"
LB_UN_USED = "LB_UNUSED"
SCALE_DOWN = "SCALE_DOWN"
SCALE_UP = "SCALE_UP"
type SuggestDriverType string
DRIVER_ACTION = "DELETE"
SCALE_DOWN_DRIVER_ACTION = "SCALE_DOWN"
type SuggestDriverAction string
const (
EIP_UNUSED SuggestDriverType = "EIP_UNUSED"
DISK_UNUSED SuggestDriverType = "DISK_UNUSED"
LB_UNUSED SuggestDriverType = "LB_UNUSED"
SNAPSHOT_UNUSED SuggestDriverType = "SNAPSHOT_UNUSED"
SCALE_DOWN SuggestDriverType = "SCALE_DOWN"
SCALE_UP SuggestDriverType = "SCALE_UP"
DELETE_DRIVER_ACTION SuggestDriverAction = "DELETE"
SCALE_DOWN_DRIVER_ACTION SuggestDriverAction = "SCALE_DOWN"
)
type MonitorSuggest string
@@ -73,16 +73,16 @@ func (opt SuggestRuleUpdateOptions) Params() (jsonutils.JSONObject, error) {
func newSuggestSysAlertSetting(tp string) *monitor.SSuggestSysAlertSetting {
setting := new(monitor.SSuggestSysAlertSetting)
switch tp {
case monitor.EIP_UN_USED:
switch monitor.SuggestDriverType(tp) {
case monitor.EIP_UNUSED:
setting = &monitor.SSuggestSysAlertSetting{
EIPUnused: &monitor.EIPUnused{},
}
case monitor.DISK_UN_USED:
case monitor.DISK_UNUSED:
setting = &monitor.SSuggestSysAlertSetting{
DiskUnused: &monitor.DiskUnused{},
}
case monitor.LB_UN_USED:
case monitor.LB_UNUSED:
setting = &monitor.SSuggestSysAlertSetting{
LBUnused: &monitor.LBUnused{},
}
@@ -186,31 +186,34 @@ func (man *SSuggestSysAlertManager) FetchCustomizeColumns(
return rows
}
func (man *SSuggestSysRuleManager) GetDriver(drvType monitor.SuggestDriverType) ISuggestSysRuleDriver {
return GetSuggestSysRuleDrivers()[drvType]
}
func (self *SSuggestSysAlert) GetDriver() ISuggestSysRuleDriver {
return SuggestSysRuleManager.GetDriver(self.GetType())
}
func (self *SSuggestSysAlert) GetType() monitor.SuggestDriverType {
return monitor.SuggestDriverType(self.Type)
}
func (self *SSuggestSysAlert) getMoreDetails(out monitor.SuggestSysAlertDetails) monitor.SuggestSysAlertDetails {
err := self.ResMeta.Unmarshal(&out)
if err != nil {
log.Errorln("SSuggestSysAlert getMoreDetails's error:", err)
}
drv := self.GetDriver()
out.Account = self.Cloudaccount
out.ResType = GetSuggestSysRuleDrivers()[self.Type].GetResourceType()
out.RuleName = strings.ToLower(GetSuggestSysRuleDrivers()[self.Type].GetType())
rule, _ := SuggestSysRuleManager.GetRules(self.Type)
out.ResType = string(drv.GetResourceType())
out.RuleName = strings.ToLower(string(drv.GetType()))
rule, _ := SuggestSysRuleManager.GetRules(self.GetType())
if len(rule) != 0 {
out.ShowName = fmt.Sprintf("%s-%s", self.Name, rule[0].Name)
} else {
out.ShowName = fmt.Sprintf("%s-%s", self.Name, self.Type)
}
switch self.Type {
case monitor.EIP_UN_USED:
out.Suggest = string(monitor.EIP_MONITOR_SUGGEST)
case monitor.DISK_UN_USED:
out.Suggest = string(monitor.DISK_MONITOR_SUGGEST)
case monitor.LB_UN_USED:
out.Suggest = string(monitor.LB_MONITOR_SUGGEST)
case monitor.SCALE_DOWN:
out.Suggest = string(monitor.SCALE_DOWN_MONITOR_SUGGEST)
}
out.Suggest = string(drv.GetSuggest())
return out
}
@@ -279,10 +282,10 @@ func (self *SSuggestSysAlert) StartDeleteTask(
ctx context.Context, userCred mcclient.TokenCredential) error {
params := jsonutils.NewDict()
return GetSuggestSysRuleDrivers()[self.Type].StartResolveTask(ctx, userCred, self, params)
return self.GetDriver().StartResolveTask(ctx, userCred, self, params)
}
func (self *SSuggestSysAlertManager) GetResources(tp ...string) ([]SSuggestSysAlert, error) {
func (self *SSuggestSysAlertManager) GetResources(tp ...monitor.SuggestDriverType) ([]SSuggestSysAlert, error) {
resources := make([]SSuggestSysAlert, 0)
query := self.Query()
if len(tp) > 0 {
+19 -10
View File
@@ -65,8 +65,8 @@ type SSuggestSysRule struct {
ExecTime time.Time `list:"user" update:"user"`
}
func (man *SSuggestSysRuleManager) FetchSuggestSysAlartSettings(ruleTypes ...string) (map[string]*monitor.SuggestSysRuleDetails, error) {
suggestSysAlerSettingMap := make(map[string]*monitor.SuggestSysRuleDetails, 0)
func (man *SSuggestSysRuleManager) FetchSuggestSysAlertSettings(ruleTypes ...monitor.SuggestDriverType) (map[monitor.SuggestDriverType]*monitor.SuggestSysRuleDetails, error) {
suggestSysAlerSettingMap := make(map[monitor.SuggestDriverType]*monitor.SuggestSysRuleDetails, 0)
rules, err := man.GetRules(ruleTypes...)
if err != nil {
@@ -77,15 +77,19 @@ func (man *SSuggestSysRuleManager) FetchSuggestSysAlartSettings(ruleTypes ...str
if err != nil {
return suggestSysAlerSettingMap, errors.Wrap(err, "FetchSuggestSysAlartSettings")
}
suggestSysAlerSettingMap[config.Type] = &suggestSysRuleDetails
suggestSysAlerSettingMap[config.GetType()] = &suggestSysRuleDetails
}
return suggestSysAlerSettingMap, nil
}
func (rule *SSuggestSysRule) GetType() monitor.SuggestDriverType {
return monitor.SuggestDriverType(rule.Type)
}
//根据数据库中查询得到的信息进行适配转换,同时更新drivers中的内容
func (dConfig *SSuggestSysRule) getSuggestSysAlertSetting() (*monitor.SSuggestSysAlertSetting, error) {
func (rule *SSuggestSysRule) getSuggestSysAlertSetting() (*monitor.SSuggestSysAlertSetting, error) {
setting := new(monitor.SSuggestSysAlertSetting)
err := dConfig.Setting.Unmarshal(setting)
err := rule.Setting.Unmarshal(setting)
if err != nil {
return nil, errors.Wrap(err, "SSuggestSysRule getSuggestSysAlertSetting error")
}
@@ -134,7 +138,7 @@ func (man *SSuggestSysRuleManager) ValidateCreateData(
if _, err := time.ParseDuration(data.TimeFrom); err != nil {
return data, httperrors.NewInputParameterError("Invalid period format: %s", data.TimeFrom)
}
if dri, ok := suggestSysRuleDrivers[data.Type]; !ok {
if dri, ok := suggestSysRuleDrivers[monitor.SuggestDriverType(data.Type)]; !ok {
return data, httperrors.NewInputParameterError("not support type %q", data.Type)
} else {
//Type is uniq
@@ -142,7 +146,8 @@ func (man *SSuggestSysRuleManager) ValidateCreateData(
if err != nil {
return data, err
}
if data.Type == monitor.SCALE_DOWN || data.Type == monitor.SCALE_UP {
drvType := monitor.SuggestDriverType(data.Type)
if drvType == monitor.SCALE_DOWN || drvType == monitor.SCALE_UP {
if data.Setting == nil {
return data, httperrors.NewInputParameterError("no found rule setting")
}
@@ -157,6 +162,10 @@ func (man *SSuggestSysRuleManager) ValidateCreateData(
return data, nil
}
func (rule *SSuggestSysRule) GetDriver() ISuggestSysRuleDriver {
return GetSuggestSysRuleDrivers()[rule.GetType()]
}
func (rule *SSuggestSysRule) ValidateUpdateData(
ctx context.Context, userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
@@ -172,7 +181,7 @@ func (rule *SSuggestSysRule) ValidateUpdateData(
return data, httperrors.NewInputParameterError("Invalid period format: %s", data.Period)
}
if data.Setting != nil {
err := suggestSysRuleDrivers[rule.Type].ValidateSetting(data.Setting)
err := rule.GetDriver().ValidateSetting(data.Setting)
if err != nil {
return data, errors.Wrap(err, "validate setting error")
}
@@ -238,7 +247,7 @@ func (self *SSuggestSysRule) updateCronjob() {
if self.Enabled.Bool() {
dur, _ := time.ParseDuration(self.Period)
cronman.GetCronJobManager().AddJobAtIntervalsWithStartRun(self.Type, dur,
suggestSysRuleDrivers[self.Type].DoSuggestSysRule, true)
self.GetDriver().DoSuggestSysRule, true)
}
}
@@ -323,7 +332,7 @@ func (self *SSuggestSysRuleManager) GetPropertyMetricMeasurement(ctx context.Con
return DataSourceManager.GetMetricMeasurement(query)
}
func (self *SSuggestSysRuleManager) GetRules(tp ...string) ([]SSuggestSysRule, error) {
func (self *SSuggestSysRuleManager) GetRules(tp ...monitor.SuggestDriverType) ([]SSuggestSysRule, error) {
rules := make([]SSuggestSysRule, 0)
query := self.Query()
if len(tp) > 0 {
+6 -4
View File
@@ -25,12 +25,14 @@ import (
var (
//存储初始化的内容,同时起到默认配置的作用。
suggestSysRuleDrivers = make(map[string]ISuggestSysRuleDriver, 0)
suggestSysRuleDrivers = make(map[monitor.SuggestDriverType]ISuggestSysRuleDriver, 0)
)
type ISuggestSysRuleDriver interface {
GetType() string
GetResourceType() string
GetType() monitor.SuggestDriverType
GetResourceType() monitor.MonitorResourceType
GetAction() monitor.SuggestDriverAction
GetSuggest() monitor.MonitorSuggest
//validate on create
ValidateSetting(input *monitor.SSuggestSysAlertSetting) error
@@ -50,6 +52,6 @@ func RegisterSuggestSysRuleDrivers(drvs ...ISuggestSysRuleDriver) {
}
}
func GetSuggestSysRuleDrivers() map[string]ISuggestSysRuleDriver {
func GetSuggestSysRuleDrivers() map[monitor.SuggestDriverType]ISuggestSysRuleDriver {
return suggestSysRuleDrivers
}
+56
View File
@@ -0,0 +1,56 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package suggestsysdrivers
import (
"yunion.io/x/onecloud/pkg/apis/monitor"
)
type baseDriver struct {
driverType monitor.SuggestDriverType
resourceType monitor.MonitorResourceType
action monitor.SuggestDriverAction
suggest monitor.MonitorSuggest
}
func newBaseDriver(
drvType monitor.SuggestDriverType,
resType monitor.MonitorResourceType,
action monitor.SuggestDriverAction,
suggest monitor.MonitorSuggest,
) *baseDriver {
return &baseDriver{
driverType: drvType,
resourceType: resType,
action: action,
suggest: suggest,
}
}
func (drv baseDriver) GetType() monitor.SuggestDriverType {
return drv.driverType
}
func (drv baseDriver) GetResourceType() monitor.MonitorResourceType {
return drv.resourceType
}
func (drv baseDriver) GetAction() monitor.SuggestDriverAction {
return drv.action
}
func (drv baseDriver) GetSuggest() monitor.MonitorSuggest {
return drv.suggest
}
+17 -8
View File
@@ -40,9 +40,19 @@ type logInput struct {
Limit string `json:"limit"`
}
func DealAlertData(typ string, oldAlerts []models.SSuggestSysAlert, newAlerts []jsonutils.JSONObject) {
rules, _ := models.SuggestSysRuleManager.GetRules(typ)
func DealAlertData(drvType monitor.SuggestDriverType, oldAlerts []models.SSuggestSysAlert, newAlerts []jsonutils.JSONObject) {
rules, err := models.SuggestSysRuleManager.GetRules(drvType)
if err != nil {
log.Errorf("get suggest rule by type %q error: %v", drvType, err)
return
}
if len(rules) == 0 {
log.Errorf("not found suggest rule by type %q", drvType)
return
}
rules[0].UpdateExecTime()
adminCredential := auth.AdminCredential()
oldMap := make(map[string]models.SSuggestSysAlert, 0)
for _, alert := range oldAlerts {
@@ -66,17 +76,16 @@ func DealAlertData(typ string, oldAlerts []models.SSuggestSysAlert, newAlerts []
delete(oldMap, res_id)
} else {
//新增的alert
adminCredential := auth.AdminCredential()
_, err := db.DoCreate(models.SuggestSysAlertManager, context.Background(), adminCredential, nil, newAlert,
adminCredential)
if err != nil {
log.Errorln(err)
log.Errorf("create new suggest alert %v error: %v", newAlert, err)
}
}
}
for _, oldAlert := range oldMap {
err := oldAlert.RealDelete(context.Background(), auth.AdminCredential())
err := oldAlert.RealDelete(context.Background(), adminCredential)
if err != nil {
log.Errorln("删除旧alert数据失败", err)
}
@@ -85,7 +94,7 @@ func DealAlertData(typ string, oldAlerts []models.SSuggestSysAlert, newAlerts []
func doSuggestSysRule(ctx context.Context, userCred mcclient.TokenCredential, isStart bool, rule models.ISuggestSysRuleDriver) {
var instance *monitor.SSuggestSysAlertSetting
suggestSysSettingMap, err := models.SuggestSysRuleManager.FetchSuggestSysAlartSettings(rule.GetType())
suggestSysSettingMap, err := models.SuggestSysRuleManager.FetchSuggestSysAlertSettings(rule.GetType())
if err != nil {
log.Errorln("DoSuggestSysRule error :", err)
return
@@ -119,9 +128,9 @@ func getSuggestSysAlertFromJson(obj jsonutils.JSONObject, rule models.ISuggestSy
if val, err := alertData.GetString("account"); err == nil {
suggestSysAlert.Cloudaccount = val
}
suggestSysAlert.Type = rule.GetType()
suggestSysAlert.Type = string(rule.GetType())
suggestSysAlert.ResMeta = obj
suggestSysAlert.Action = monitor.DRIVER_ACTION
suggestSysAlert.Action = string(rule.GetAction())
suggestSysAlert.Status = monitor.SUGGEST_ALERT_READY
getResourceAmount(suggestSysAlert, time.Now().Add(-30*24*time.Hour))
return suggestSysAlert, nil
+9 -12
View File
@@ -33,34 +33,31 @@ import (
)
type DiskUnused struct {
monitor.DiskUnused
*baseDriver
}
func NewDiskUnusedDriver() models.ISuggestSysRuleDriver {
return &DiskUnused{
DiskUnused: monitor.DiskUnused{},
baseDriver: newBaseDriver(
monitor.DISK_UNUSED,
monitor.DISK_MONITOR_RES_TYPE,
monitor.DELETE_DRIVER_ACTION,
monitor.DISK_MONITOR_SUGGEST,
),
}
}
func (rule *DiskUnused) GetType() string {
return monitor.DISK_UN_USED
}
func (rule *DiskUnused) GetResourceType() string {
return string(monitor.DISK_MONITOR_RES_TYPE)
}
func (rule *DiskUnused) DoSuggestSysRule(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) {
doSuggestSysRule(ctx, userCred, isStart, rule)
}
func (rule *DiskUnused) Run(instance *monitor.SSuggestSysAlertSetting) {
func (rule *DiskUnused) Run(setting *monitor.SSuggestSysAlertSetting) {
oldAlert, err := getLastAlerts(rule)
if err != nil {
log.Errorln(err)
return
}
newAlerts, err := rule.getLatestAlerts(instance)
newAlerts, err := rule.getLatestAlerts(setting)
if err != nil {
log.Errorln(errors.Wrap(err, "DiskUnused getLatestAlerts error"))
return
@@ -38,7 +38,7 @@ func InitSuggestSysRuleCronjob() {
if suggestSysRuleConfig.Enabled.Bool() {
dur, _ := time.ParseDuration(suggestSysRuleConfig.Period)
cronman.GetCronJobManager().AddJobAtIntervalsWithStartRun(suggestSysRuleConfig.Type, dur,
models.GetSuggestSysRuleDrivers()[suggestSysRuleConfig.Type].DoSuggestSysRule, true)
suggestSysRuleConfig.GetDriver().DoSuggestSysRule, true)
}
}
}
+8 -11
View File
@@ -33,20 +33,17 @@ import (
)
type EIPUnused struct {
monitor.EIPUnused
}
func (_ *EIPUnused) GetType() string {
return monitor.EIP_UN_USED
}
func (_ *EIPUnused) GetResourceType() string {
return string(monitor.EIP_MONITOR_RES_TYPE)
*baseDriver
}
func NewEIPUsedDriver() models.ISuggestSysRuleDriver {
return &EIPUnused{
EIPUnused: monitor.EIPUnused{},
baseDriver: newBaseDriver(
monitor.EIP_UNUSED,
monitor.EIP_MONITOR_RES_TYPE,
monitor.DELETE_DRIVER_ACTION,
monitor.EIP_MONITOR_SUGGEST,
),
}
}
@@ -137,7 +134,7 @@ func (rule *EIPUnused) getEIPUnused(instance *monitor.SSuggestSysAlertSetting) (
func (rule *EIPUnused) DoSuggestSysRule(ctx context.Context, userCred mcclient.TokenCredential,
isStart bool) {
var instance *monitor.SSuggestSysAlertSetting
suggestSysSettingMap, err := models.SuggestSysRuleManager.FetchSuggestSysAlartSettings(rule.GetType())
suggestSysSettingMap, err := models.SuggestSysRuleManager.FetchSuggestSysAlertSettings(rule.GetType())
if err != nil {
log.Errorln("DoSuggestSysRule error :", err)
return
+7 -10
View File
@@ -30,23 +30,20 @@ import (
)
type LBUnused struct {
monitor.LBUnused
*baseDriver
}
func NewLBUnusedDriver() models.ISuggestSysRuleDriver {
return &LBUnused{
LBUnused: monitor.LBUnused{},
baseDriver: newBaseDriver(
monitor.LB_UNUSED,
monitor.LB_MONITOR_RES_TYPE,
monitor.DELETE_DRIVER_ACTION,
monitor.LB_MONITOR_SUGGEST,
),
}
}
func (_ *LBUnused) GetType() string {
return monitor.LB_UN_USED
}
func (rule *LBUnused) GetResourceType() string {
return string(monitor.LB_MONITOR_RES_TYPE)
}
func (rule *LBUnused) ValidateSetting(input *monitor.SSuggestSysAlertSetting) error {
obj := new(monitor.LBUnused)
input.LBUnused = obj
+8 -13
View File
@@ -37,24 +37,20 @@ import (
)
type ScaleDown struct {
monitor.ScaleRule
*baseDriver
}
func NewScaleDownDriver() models.ISuggestSysRuleDriver {
return &ScaleDown{
ScaleRule: []monitor.Scale{},
baseDriver: newBaseDriver(
monitor.SCALE_DOWN,
monitor.SCALE_MONTITOR_RES_TYPE,
monitor.SCALE_DOWN_DRIVER_ACTION,
monitor.SCALE_DOWN_MONITOR_SUGGEST,
),
}
}
func (_ *ScaleDown) GetType() string {
return monitor.SCALE_DOWN
}
func (rule *ScaleDown) GetResourceType() string {
return string(monitor.SCALE_MONTITOR_RES_TYPE)
}
func (rule *ScaleDown) ValidateSetting(input *monitor.SSuggestSysAlertSetting) error {
if input.ScaleRule == nil {
return httperrors.NewInputParameterError("no found rule setting ")
@@ -118,7 +114,6 @@ func (rule *ScaleDown) getLatestAlerts(instance *monitor.SSuggestSysAlertSetting
return jsonutils.NewArray(), errors.Wrap(err, "rule getScaleEvalResult happen error")
}
if firing {
serverArr, err := rule.getResourcesByEvalMatchsMap(evalMatchMap, instance)
if err != nil {
return jsonutils.NewArray(), errors.Wrap(err, "rule getResource error")
@@ -205,7 +200,7 @@ func (rule *ScaleDown) getResourcesByEvalMatchsMap(evalMatchsMap map[string][]*m
if err != nil {
return serverArr, errors.Wrap(err, "Scale getSuggestSysAlertFromJson error")
}
suggestSysAlert.Action = monitor.SCALE_DOWN_DRIVER_ACTION
suggestSysAlert.Action = string(monitor.SCALE_DOWN_DRIVER_ACTION)
suggestSysAlert.MonitorConfig = jsonutils.Marshal(instance)
suggestSysAlert.Problem = describeEvalResultTojson(evalMatchsMap, mappingId, mappingVal)
serverArr.Add(jsonutils.Marshal(suggestSysAlert))
+1 -1
View File
@@ -37,7 +37,7 @@ func init() {
func (self *ResolveUnusedTask) OnInit(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {
suggestSysAlert := obj.(*models.SSuggestSysAlert)
err := models.GetSuggestSysRuleDrivers()[suggestSysAlert.Type].Resolve(suggestSysAlert)
err := suggestSysAlert.GetDriver().Resolve(suggestSysAlert)
if err != nil {
msg := fmt.Sprintf("fail to delete %s", err)
self.taskFail(ctx, suggestSysAlert, msg)