diff --git a/server/dao/rule.go b/server/dao/rule.go index c5f921219ab4f06fee769fc2d9609db92b801f94..df3dd7bb50ddbc75b759d781ccd7f03f474aa08e 100644 --- a/server/dao/rule.go +++ b/server/dao/rule.go @@ -78,3 +78,41 @@ func DeleteRule(id string) error { err := db.MySQL.Where("id = ?", id).Delete(&model.Rule{}).Error return err } + +func UpdateRule(id int, alert *model.Rule) error { + tx := db.MySQL.Begin() + + if err := tx.Model(&model.Rule{}).Where("id = ?", id).Select("alert_name", "custom_desc", "monitor_metrics", "alarm_threshold", "forsearch", "severity", "batches").Updates(alert).Error; err != nil { + tx.Rollback() + return err + } + + if err := tx.Where("rule_id = ?", id).Delete(&model.RuleTarget{}).Error; err != nil { + tx.Rollback() + return err + } + + for _, target := range alert.AlertTargets { + target.RuleId = id + if err := tx.Clauses(clause.OnConflict{ + DoNothing: true, + }).Create(&target).Error; err != nil { + tx.Rollback() + return err + } + } + + return tx.Commit().Error +} + +func QueryRules() ([]model.Rule, error) { + var alerts []model.Rule + err := db.MySQL.Order("id desc").Preload("AlertTargets").Find(&alerts).Error + return alerts, err +} + +func QueryRulesNotIncludedId(id string) ([]model.Rule, error) { + var alerts []model.Rule + err := db.MySQL.Order("id desc").Where("id <> ?", id).Preload("AlertTargets").Find(&alerts).Error + return alerts, err +} diff --git a/server/service/ruletemplate.go b/server/service/ruletemplate.go index db91810b5edd384e09dec1eccb2475a9ff6a0375..147edc71d719da92e45e611cd7e6e3e62c018329 100644 --- a/server/service/ruletemplate.go +++ b/server/service/ruletemplate.go @@ -210,3 +210,65 @@ func deleteRuleDataJoinToYaml(id string) (*model.AlertRuleYaml, error) { } return Yml, nil } +func updateRuleDataJoinToYaml(alert *model.Rule) (*model.AlertRuleYaml, error) { + rules, err := dao.QueryRules() + if err != nil { + return &model.AlertRuleYaml{}, err + } + var alertRules []model.AlertRule + for _, rule := range rules { + if rule.ID != alert.ID { + template := alertTemplate(rule.MonitorMetrics, rule.AlarmThreshold, rule.AlertLabel) + alertRule := &model.AlertRule{ + AlertName: rule.AlertName, + Expression: template.Expression, + Forsearch: rule.Forsearch + "s", + Labels: struct { + Severity string "yaml:\"severity\" json:\"severity\"" + Metric string "yaml:\"metric\" json:\"metric\"" + }{ + Severity: rule.Severity, + Metric: rule.MonitorMetrics, + }, + Annotations: struct { + Description string "yaml:\"description\" json:\"description\"" + Summary string "yaml:\"summary\" json:\"summary\"" + }{ + Summary: template.Summary, + Description: template.Description, + }, + } + alertRules = append(alertRules, *alertRule) + } else { + template := alertTemplate(alert.MonitorMetrics, alert.AlarmThreshold, alert.AlertLabel) + alertRule := &model.AlertRule{ + AlertName: alert.AlertName, + Expression: template.Expression, + Forsearch: alert.Forsearch + "s", + Labels: struct { + Severity string "yaml:\"severity\" json:\"severity\"" + Metric string "yaml:\"metric\" json:\"metric\"" + }{ + Severity: alert.Severity, + Metric: alert.MonitorMetrics, + }, + Annotations: struct { + Description string "yaml:\"description\" json:\"description\"" + Summary string "yaml:\"summary\" json:\"summary\"" + }{ + Summary: template.Summary, + Description: template.Description, + }, + } + alertRules = append(alertRules, *alertRule) + } + } + alerts := &model.AlertRules{ + RuleName: "监控规则", + AlertRules: alertRules, + } + Yml := &model.AlertRuleYaml{ + Groups: []model.AlertRules{*alerts}, + } + return Yml, nil +}