Skip to content

Commit

Permalink
lb 负载均衡优化建议
Browse files Browse the repository at this point in the history
通过判断是否包含后端服务器组和后端服务实例进行判断
  • Loading branch information
zhaoxiangchun committed Apr 26, 2020
1 parent 729f8f1 commit fc05c2d
Show file tree
Hide file tree
Showing 12 changed files with 384 additions and 147 deletions.
3 changes: 3 additions & 0 deletions pkg/apis/monitor/suggestsys_const.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package monitor
const (
EIP_UN_USED = "EIP_UNUSED"
DISK_UN_USED = "DISK_UNUSED"
LB_UN_USED = "LB_UNUSED"

DRIVER_ACTION = "DELETE"

Expand All @@ -31,9 +32,11 @@ type MonitorResourceType string
const (
EIP_MONITOR_RES_TYPE = MonitorResourceType("弹性EIP")
DISK_MONITOR_RES_TYPE = MonitorResourceType("云硬盘")
LB_MONITOR_RES_TYPE = MonitorResourceType("负载均衡实例")
)

const (
EIP_MONITOR_SUGGEST = MonitorSuggest("释放未使用的EIP")
DISK_MONITOR_SUGGEST = MonitorSuggest("释放未使用的Disk")
LB_MONITOR_SUGGEST = MonitorSuggest("释放未使用的LB")
)
1 change: 1 addition & 0 deletions pkg/apis/monitor/suggestsysalert.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ type SuggestSysAlertDetails struct {
apis.VirtualResourceDetails
compute.CloudregionResourceInfo
RuleName string `json:"rule_name"`
ShowName string `json:"show_name"`
ResType string `json:"res_type"`
Suggest string `json:"suggest"`
Brand string `json:"brand"`
Expand Down
4 changes: 4 additions & 0 deletions pkg/apis/monitor/suggestsysrule.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ type SuggestSysRuleDetails struct {
type SSuggestSysAlertSetting struct {
EIPUnused *EIPUnused `json:"eip_unused"`
DiskUnused *DiskUnused `json:"disk_unused"`
LBUnused *LBUnused `json:"lb_unused"`
}

type EIPUnused struct {
Expand All @@ -67,3 +68,6 @@ type EIPUnused struct {

type DiskUnused struct {
}

type LBUnused struct {
}
11 changes: 8 additions & 3 deletions pkg/apis/monitor/zz_generated.model.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 20 additions & 9 deletions pkg/mcclient/options/monitor/suggestsysrule.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ type SuggestSysRuleAlertSettingOptions struct {
type SuggestRuleCreateOptions struct {
SuggestSysRuleAlertSettingOptions
Name string `help:"Name of the alert"`
Type string `help:"Type of suggest rule" choices:"EIP_UNUSED|DISK_UNUSED"`
Type string `help:"Type of suggest rule" choices:"EIP_UNUSED|DISK_UNUSED|LB_UNUSED"`
Enabled bool `help:"Enable rule"`
Period string `help:"Period of suggest rule e.g. '5s', '1m'" default:"30s""`
}
Expand All @@ -49,11 +49,7 @@ func (opt SuggestRuleCreateOptions) Params() (jsonutils.JSONObject, error) {
input.Period = opt.Period
input.Type = strings.ToUpper(opt.Type)
input.Enabled = &opt.Enabled
if input.Type == monitor.EIP_UN_USED {
input.Setting = &monitor.SSuggestSysAlertSetting{
EIPUnused: &monitor.EIPUnused{},
}
}
input.Setting = newSuggestSysAlertSetting(input.Type)
return input.JSON(input), nil
}

Expand All @@ -71,12 +67,27 @@ func (opt SuggestRuleUpdateOptions) Params() (jsonutils.JSONObject, error) {
input.Period = opt.Period
input.Enabled = &opt.Enabled
input.Name = opt.Name
if input.Type == monitor.EIP_UN_USED {
input.Setting = &monitor.SSuggestSysAlertSetting{
input.Setting = newSuggestSysAlertSetting(input.Type)
return input.JSON(input), nil
}

func newSuggestSysAlertSetting(tp string) *monitor.SSuggestSysAlertSetting {
setting := new(monitor.SSuggestSysAlertSetting)
switch tp {
case monitor.EIP_UN_USED:
setting = &monitor.SSuggestSysAlertSetting{
EIPUnused: &monitor.EIPUnused{},
}
case monitor.DISK_UN_USED:
setting = &monitor.SSuggestSysAlertSetting{
DiskUnused: &monitor.DiskUnused{},
}
case monitor.LB_UN_USED:
setting = &monitor.SSuggestSysAlertSetting{
LBUnused: &monitor.LBUnused{},
}
}
return input.JSON(input), nil
return setting
}

type SuggestRuleDeleteOptions struct {
Expand Down
37 changes: 34 additions & 3 deletions pkg/monitor/models/suggestsysalart.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package models

import (
"context"
"fmt"
"strings"

"yunion.io/x/jsonutils"
Expand Down Expand Up @@ -184,17 +185,22 @@ func (self *SSuggestSysAlert) getMoreDetails(out monitor.SuggestSysAlertDetails)
log.Errorln("SSuggestSysAlert getMoreDetails's error:", err)
}
out.Account = self.Cloudaccount
suggestSysSettingMap, _ := SuggestSysRuleManager.FetchSuggestSysAlartSettings(self.Type)
out.ResType = GetSuggestSysRuleDrivers()[self.Type].GetResourceType()
out.RuleName = strings.ToLower(GetSuggestSysRuleDrivers()[self.Type].GetType())
if _, ok := suggestSysSettingMap[self.Type]; ok {
out.RuleName = suggestSysSettingMap[self.Type].Name
rule, _ := SuggestSysRuleManager.GetRules(self.Type)
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)

}
return out
}
Expand Down Expand Up @@ -266,3 +272,28 @@ func (self *SSuggestSysAlert) StartDeleteTask(
self.SetStatus(userCred, api.EIP_UNUSED_START_DELETE, "")
return GetSuggestSysRuleDrivers()[self.Type].StartResolveTask(ctx, userCred, self, params)
}

func (self *SSuggestSysAlertManager) GetResources(tp ...string) ([]SSuggestSysAlert, error) {
resources := make([]SSuggestSysAlert, 0)
query := self.Query()
if len(tp) > 0 {
query.In("type", tp)
}
err := db.FetchModelObjects(self, query, &resources)
if err != nil {
return resources, err
}
return resources, nil
}

func (manager *SSuggestSysAlertManager) GetExportExtraKeys(ctx context.Context, keys stringutils2.SSortedStrings, rowMap map[string]string) *jsonutils.JSONDict {
alert := new(SSuggestSysAlert)
manager.Query().RowMap2Struct(rowMap, alert)
input := monitor.SuggestSysAlertDetails{}
input = alert.getMoreDetails(input)
res := jsonutils.Marshal(&input)
dic := res.(*jsonutils.JSONDict)
dic.Add(jsonutils.NewString(input.Account), "manager")
dic.Add(jsonutils.NewString(alert.Provider), "hypervisor")
return dic
}
52 changes: 40 additions & 12 deletions pkg/monitor/models/suggestsysrule.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package models
import (
"context"
"database/sql"
"fmt"
"time"

"yunion.io/x/jsonutils"
Expand Down Expand Up @@ -66,20 +65,13 @@ type SSuggestSysRule struct {
}

func (man *SSuggestSysRuleManager) FetchSuggestSysAlartSettings(ruleTypes ...string) (map[string]*monitor.SuggestSysRuleDetails, error) {
objs := make([]SSuggestSysRule, 0)
suggestSysAlerSettingMap := make(map[string]*monitor.SuggestSysRuleDetails, 0)
q := man.Query()
if q == nil {
fmt.Println(" query is nil")
}
if len(ruleTypes) != 0 {
q.Equals("type", ruleTypes)
}
err := db.FetchModelObjects(man, q, &objs)
if err != nil && err != sql.ErrNoRows {

rules, err := man.GetRules(ruleTypes...)
if err != nil {
return suggestSysAlerSettingMap, errors.Wrap(err, "FetchSuggestSysAlartSettings")
}
for _, config := range objs {
for _, config := range rules {
suggestSysRuleDetails := config.getMoreDetails(monitor.SuggestSysRuleDetails{})
if err != nil {
return suggestSysAlerSettingMap, errors.Wrap(err, "FetchSuggestSysAlartSettings")
Expand Down Expand Up @@ -132,6 +124,10 @@ func (man *SSuggestSysRuleManager) ValidateCreateData(
// default 30s
data.Period = "30s"
}
if data.Enabled == nil {
enable := true
data.Enabled = &enable
}
if _, err := time.ParseDuration(data.Period); err != nil {
return data, httperrors.NewInputParameterError("Invalid period format: %s", data.Period)
}
Expand Down Expand Up @@ -254,3 +250,35 @@ func (self *SSuggestSysRule) PerformEnable(ctx context.Context, userCred mcclien
}
return nil, nil
}

func (self *SSuggestSysRuleManager) AllowGetPropertyRuleType(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
return true
}

func (self *SSuggestSysRuleManager) GetPropertyRuleType(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) {
ret := jsonutils.NewDict()
ruleArr := jsonutils.NewArray()
ret.Add(ruleArr, "rule-type")
rules, err := self.GetRules()
if err != nil {
return ret, err
}
for _, rule := range rules {
ruleArr.Add(jsonutils.NewString(rule.Type))
}
return ret, nil
}

func (self *SSuggestSysRuleManager) GetRules(tp ...string) ([]SSuggestSysRule, error) {
rules := make([]SSuggestSysRule, 0)
query := self.Query()
if len(tp) > 0 {
query.In("type", tp)
}
err := db.FetchModelObjects(self, query, &rules)
if err != nil && err != sql.ErrNoRows {
log.Errorln(errors.Wrap(err, "db.FetchModelObjects"))
return rules, err
}
return rules, nil
}
98 changes: 98 additions & 0 deletions pkg/monitor/suggestsysdrivers/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package suggestsysdrivers

import (
"context"
"fmt"

"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/pkg/errors"

"yunion.io/x/onecloud/pkg/apis/monitor"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/monitor/models"
)

func DealAlertData(oldAlerts []models.SSuggestSysAlert, newAlerts []jsonutils.JSONObject) {
oldMap := make(map[string]models.SSuggestSysAlert, 0)
for _, alert := range oldAlerts {
oldMap[alert.ResId] = alert
}
for _, newAlert := range newAlerts {
res_id, _ := newAlert.GetString("res_id")
if oldAlert, ok := oldMap[res_id]; ok {
//更新的alert
_, err := db.Update(&oldAlert, func() error {
err := newAlert.Unmarshal(&oldAlert)
if err != nil {
errMsg := fmt.Sprintf("unmarshal fail: %s", err)
log.Errorf(errMsg)
}
return nil
})
if err != nil {
log.Errorln("更新alert失败", err)
}
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)
}
}
}

for _, oldAlert := range oldMap {
err := oldAlert.RealDelete(context.Background(), auth.AdminCredential())
if err != nil {
log.Errorln("删除旧alert数据失败", err)
}
}
}

func doSuggestSysRule(ctx context.Context, userCred mcclient.TokenCredential, isStart bool, rule models.ISuggestSysRuleDriver) {
var instance *monitor.SSuggestSysAlertSetting
suggestSysSettingMap, err := models.SuggestSysRuleManager.FetchSuggestSysAlartSettings(rule.GetType())
if err != nil {
log.Errorln("DoSuggestSysRule error :", err)
return
}
if details, ok := suggestSysSettingMap[rule.GetType()]; ok {
instance = details.Setting
}
rule.Run(instance)
}

func getLastAlerts(rule models.ISuggestSysRuleDriver) ([]models.SSuggestSysAlert, error) {
oldAlert, err := models.SuggestSysAlertManager.GetResources(rule.GetType())
if err != nil {
log.Errorln(errors.Wrap(err, "db.FetchModelObjects"))
return oldAlert, err
}
return oldAlert, nil
}

func getSuggestSysAlertFromJson(obj jsonutils.JSONObject, rule models.ISuggestSysRuleDriver) (*models.SSuggestSysAlert, error) {
suggestSysAlert := new(models.SSuggestSysAlert)
alertData := jsonutils.DeepCopy(obj).(*jsonutils.JSONDict)
id, _ := alertData.GetString("id")
alertData.Add(jsonutils.NewString(id), "res_id")
alertData.Remove("id")

err := alertData.Unmarshal(suggestSysAlert)
if err != nil {
return nil, errors.Wrap(err, "getSuggestSysAlertFromJson's alertData Unmarshal error")
}
if val, err := alertData.GetString("account"); err == nil {
suggestSysAlert.Cloudaccount = val
}
suggestSysAlert.Type = rule.GetType()
suggestSysAlert.ResMeta = obj
suggestSysAlert.Action = monitor.DRIVER_ACTION
return suggestSysAlert, nil
}

0 comments on commit fc05c2d

Please sign in to comment.