package service import ( "github.com/google/uuid" "github.com/jinzhu/copier" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/jsontime" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "xorm.io/xorm" ) type AlertRulesSvc struct { User entity.SystemUserInfo } func (m *AlertRulesSvc) Add(req request.AddAlertRules) error { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return err } now := jsontime.Now() data := entity.AlertRules{ Id: uuid.New().String(), CreatedBy: m.User.SystemAccount, CreatedAt: now, UpdatedBy: m.User.SystemAccount, UpdatedAt: now, } _ = copier.Copy(&data, &req) switch req.DetectionType { case 1: _, err = db.Update(&data) if err != nil { return err } case 2: // 自定义 _, err = db.Transaction(func(session *xorm.Session) (interface{}, error) { // 添加自定义分类 var ( classParentId int classId int addMetricConfig request.AddMetricConfig metricConfigId string ) alertClassSvc := AlertClassSvc{User: m.User} classParentId, err = alertClassSvc.Add(session, request.AddAlertClass{ ClassName: req.ClassParentName, SortOrder: -1, SourceFrom: 2, }) if err != nil { return nil, err } classId, err = alertClassSvc.Add(session, request.AddAlertClass{ ClassName: req.ClassName, ParentId: classParentId, SortOrder: -1, SourceFrom: 2, }) if err != nil { return nil, err } data.ClassId = classId // 添加指标配置 metricConfigSvc := MetricConfigSvc{User: m.User} _ = copier.Copy(&addMetricConfig, &req) addMetricConfig.SourceFrom = 2 addMetricConfig.MetricName = req.MetricConfigName metricConfigId, err = metricConfigSvc.Add(session, addMetricConfig) if err != nil { return nil, err } data.MetricConfigId = metricConfigId // 添加预警规则配置 _, err = session.Insert(&data) return nil, err }) } // TODO 告警规则添加到普罗米修斯表 return nil } func (m *AlertRulesSvc) Update(req request.UpdateAlertRules) error { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return err } now := jsontime.Now() data := entity.AlertRules{ UpdatedBy: m.User.SystemAccount, UpdatedAt: now, } _ = copier.Copy(&data, &req) session := db.NewSession() var dbAlertRules entity.AlertRules _, err = session.Table(data.TableName()).ID(data.Id).Get(&dbAlertRules) if err != nil { return err } switch req.DetectionType { case 1: _, err = db.Update(&data) if err != nil { return err } case 2: // 自定义 _, err = db.Transaction(func(session *xorm.Session) (interface{}, error) { // 更新自定义分类 var ( updateMetricConfig request.UpdateMetricConfig alertClassItem response.AlertClassItem ) alertClassSvc := AlertClassSvc{User: m.User} alertClassItem, err = alertClassSvc.GetDataById(request.DetailAlertClass{ClassId: dbAlertRules.ClassId}) if err != nil { return nil, err } err = alertClassSvc.Update(session, request.UpdateAlertClass{ ClassId: dbAlertRules.ClassId, ClassName: req.ClassName, }) if err != nil { return nil, err } err = alertClassSvc.Update(session, request.UpdateAlertClass{ ClassId: alertClassItem.ParentId, ClassName: req.ClassParentName, }) if err != nil { return nil, err } // 更新指标配置 metricConfigSvc := MetricConfigSvc{User: m.User} _ = copier.Copy(&updateMetricConfig, &req) updateMetricConfig.SourceFrom = 2 updateMetricConfig.Id = dbAlertRules.MetricConfigId err = metricConfigSvc.Update(session, updateMetricConfig) if err != nil { return nil, err } // 更新预警规则配置 _, err = session.Update(&data) return nil, err }) } return nil } func (m *AlertRulesSvc) GetDataById(req request.DetailAlertRules) (resp response.AlertRulesItem, err error) { db, err := client.GetDbClient() if err != nil { return } _, err = db.NewSession().Table(resp.TableName()).Where("id = ?", req.Id).Get(&resp) return } func (m *AlertRulesSvc) List(req request.ListAlertRules) (resp response.MetricConfigList, err error) { db, err := client.GetDbClient() if err != nil { return } session := db.NewSession() defer session.Close() if req.Id != "" { session.Where("id = ?", req.Id) } if req.ClassId != 0 { session.Where("class_id = ?", req.ClassId) } if req.MetricName != "" { session.Where("metric_name LIKE ?", "%"+req.MetricName+"%") } if req.IsEnabled != 0 { session.Where("is_enabled = ?", req.IsEnabled) } resp.TotalCount, err = session.Table(new(entity.AlertRules)).Limit(req.GetPageSize(), (req.GetPage()-1)*req.GetPageSize()). OrderBy("id").FindAndCount(&resp.List) return } func (m *AlertRulesSvc) Delete(ids []string) (err error) { db, err := client.GetDbClient() if err != nil { return } // TODO 批量删除表中的多出数据 _, err = db.NewSession().In("id", ids).Delete(new(entity.AlertRules)) return }