提交 7f73945c 编写于 作者: N ning

Merge branch 'main' of github.com:ccfos/nightingale

...@@ -285,6 +285,7 @@ func (rt *Router) Config(r *gin.Engine) { ...@@ -285,6 +285,7 @@ func (rt *Router) Config(r *gin.Engine) {
pages.PUT("/busi-group/:id/recording-rules/fields", rt.auth(), rt.user(), rt.perm("/recording-rules/put"), rt.recordingRulePutFields) pages.PUT("/busi-group/:id/recording-rules/fields", rt.auth(), rt.user(), rt.perm("/recording-rules/put"), rt.recordingRulePutFields)
pages.GET("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes"), rt.bgro(), rt.alertMuteGetsByBG) pages.GET("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes"), rt.bgro(), rt.alertMuteGetsByBG)
pages.POST("/busi-group/:id/alert-mutes/preview", rt.auth(), rt.user(), rt.perm("/alert-mutes/add"), rt.bgrw(), rt.alertMutePreview)
pages.POST("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes/add"), rt.bgrw(), rt.alertMuteAdd) pages.POST("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes/add"), rt.bgrw(), rt.alertMuteAdd)
pages.DELETE("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes/del"), rt.bgrw(), rt.alertMuteDel) pages.DELETE("/busi-group/:id/alert-mutes", rt.auth(), rt.user(), rt.perm("/alert-mutes/del"), rt.bgrw(), rt.alertMuteDel)
pages.PUT("/busi-group/:id/alert-mute/:amid", rt.auth(), rt.user(), rt.perm("/alert-mutes/put"), rt.alertMutePutByFE) pages.PUT("/busi-group/:id/alert-mute/:amid", rt.auth(), rt.user(), rt.perm("/alert-mutes/put"), rt.alertMutePutByFE)
......
...@@ -182,13 +182,19 @@ func (rt *Router) alertCurEventDel(c *gin.Context) { ...@@ -182,13 +182,19 @@ func (rt *Router) alertCurEventDel(c *gin.Context) {
ginx.BindJSON(c, &f) ginx.BindJSON(c, &f)
f.Verify() f.Verify()
rt.checkCurEventBusiGroupRWPermission(c, f.Ids)
ginx.NewRender(c).Message(models.AlertCurEventDel(rt.Ctx, f.Ids))
}
func (rt *Router) checkCurEventBusiGroupRWPermission(c *gin.Context, ids []int64) {
set := make(map[int64]struct{}) set := make(map[int64]struct{})
// event group id is 0, ignore perm check // event group id is 0, ignore perm check
set[0] = struct{}{} set[0] = struct{}{}
for i := 0; i < len(f.Ids); i++ { for i := 0; i < len(ids); i++ {
event, err := models.AlertCurEventGetById(rt.Ctx, f.Ids[i]) event, err := models.AlertCurEventGetById(rt.Ctx, ids[i])
ginx.Dangerous(err) ginx.Dangerous(err)
if _, has := set[event.GroupId]; !has { if _, has := set[event.GroupId]; !has {
...@@ -196,8 +202,6 @@ func (rt *Router) alertCurEventDel(c *gin.Context) { ...@@ -196,8 +202,6 @@ func (rt *Router) alertCurEventDel(c *gin.Context) {
set[event.GroupId] = struct{}{} set[event.GroupId] = struct{}{}
} }
} }
ginx.NewRender(c).Message(models.AlertCurEventDel(rt.Ctx, f.Ids))
} }
func (rt *Router) alertCurEventGet(c *gin.Context) { func (rt *Router) alertCurEventGet(c *gin.Context) {
......
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/ccfos/nightingale/v6/alert/common"
"github.com/ccfos/nightingale/v6/models" "github.com/ccfos/nightingale/v6/models"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
...@@ -29,16 +30,41 @@ func (rt *Router) alertMuteGets(c *gin.Context) { ...@@ -29,16 +30,41 @@ func (rt *Router) alertMuteGets(c *gin.Context) {
} }
func (rt *Router) alertMuteAdd(c *gin.Context) { func (rt *Router) alertMuteAdd(c *gin.Context) {
var f models.AlertMute var f models.AlertMute
ginx.BindJSON(c, &f) ginx.BindJSON(c, &f)
username := c.MustGet("username").(string) username := c.MustGet("username").(string)
f.CreateBy = username f.CreateBy = username
f.GroupId = ginx.UrlParamInt64(c, "id") f.GroupId = ginx.UrlParamInt64(c, "id")
ginx.NewRender(c).Message(f.Add(rt.Ctx)) ginx.NewRender(c).Message(f.Add(rt.Ctx))
} }
//Preview events (alert_cur_event) that match the mute strategy based on the following criteria:
//business group ID (group_id, group_id), product (prod, rule_prod),
//alert event severity (severities, severity), and event tags (tags, tags).
//For products of type not 'host', also consider the category (cate, cate) and datasource ID (datasource_ids, datasource_id).
func (rt *Router) alertMutePreview(c *gin.Context) {
//Generally the match of events would be less.
var f models.AlertMute
ginx.BindJSON(c, &f)
f.GroupId = ginx.UrlParamInt64(c, "id")
ginx.Dangerous(f.Verify()) //verify and parse tags json to ITags
events, err := models.AlertCurEventGetsFromAlertMute(rt.Ctx, &f)
ginx.Dangerous(err)
matchEvents := make([]*models.AlertCurEvent, 0, len(events))
for i := 0; i < len(events); i++ {
events[i].DB2Mem()
if common.MatchTags(events[i].TagsMap, f.ITags) {
matchEvents = append(matchEvents, events[i])
}
}
ginx.NewRender(c).Data(matchEvents, err)
}
func (rt *Router) alertMuteAddByService(c *gin.Context) { func (rt *Router) alertMuteAddByService(c *gin.Context) {
var f models.AlertMute var f models.AlertMute
ginx.BindJSON(c, &f) ginx.BindJSON(c, &f)
......
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
"github.com/ccfos/nightingale/v6/pkg/ctx" "github.com/ccfos/nightingale/v6/pkg/ctx"
"github.com/ccfos/nightingale/v6/pkg/poster" "github.com/ccfos/nightingale/v6/pkg/poster"
"github.com/ccfos/nightingale/v6/pkg/tplx" "github.com/ccfos/nightingale/v6/pkg/tplx"
"github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/logger"
) )
...@@ -307,8 +308,10 @@ func (e *AlertCurEvent) FillNotifyGroups(ctx *ctx.Context, cache map[int64]*User ...@@ -307,8 +308,10 @@ func (e *AlertCurEvent) FillNotifyGroups(ctx *ctx.Context, cache map[int64]*User
} }
func AlertCurEventTotal(ctx *ctx.Context, prods []string, bgid, stime, etime int64, severity int, dsIds []int64, cates []string, query string) (int64, error) { func AlertCurEventTotal(ctx *ctx.Context, prods []string, bgid, stime, etime int64, severity int, dsIds []int64, cates []string, query string) (int64, error) {
session := DB(ctx).Model(&AlertCurEvent{}).Where("trigger_time between ? and ?", stime, etime) session := DB(ctx).Model(&AlertCurEvent{})
if stime != 0 && etime != 0 {
session = session.Where("trigger_time between ? and ?", stime, etime)
}
if len(prods) != 0 { if len(prods) != 0 {
session = session.Where("rule_prod in ?", prods) session = session.Where("rule_prod in ?", prods)
} }
...@@ -341,8 +344,10 @@ func AlertCurEventTotal(ctx *ctx.Context, prods []string, bgid, stime, etime int ...@@ -341,8 +344,10 @@ func AlertCurEventTotal(ctx *ctx.Context, prods []string, bgid, stime, etime int
} }
func AlertCurEventGets(ctx *ctx.Context, prods []string, bgid, stime, etime int64, severity int, dsIds []int64, cates []string, query string, limit, offset int) ([]AlertCurEvent, error) { func AlertCurEventGets(ctx *ctx.Context, prods []string, bgid, stime, etime int64, severity int, dsIds []int64, cates []string, query string, limit, offset int) ([]AlertCurEvent, error) {
session := DB(ctx).Where("trigger_time between ? and ?", stime, etime) session := DB(ctx).Model(&AlertCurEvent{})
if stime != 0 && etime != 0 {
session = session.Where("trigger_time between ? and ?", stime, etime)
}
if len(prods) != 0 { if len(prods) != 0 {
session = session.Where("rule_prod in ?", prods) session = session.Where("rule_prod in ?", prods)
} }
...@@ -560,3 +565,23 @@ func AlertCurEventUpgradeToV6(ctx *ctx.Context, dsm map[string]Datasource) error ...@@ -560,3 +565,23 @@ func AlertCurEventUpgradeToV6(ctx *ctx.Context, dsm map[string]Datasource) error
} }
return nil return nil
} }
// AlertCurEventGetsFromAlertMute find current events from db.
func AlertCurEventGetsFromAlertMute(ctx *ctx.Context, alertMute *AlertMute) ([]*AlertCurEvent, error) {
var lst []*AlertCurEvent
tx := DB(ctx).Where("group_id = ? and rule_prod = ?", alertMute.GroupId, alertMute.Prod)
if len(alertMute.SeveritiesJson) != 0 {
tx = tx.Where("severity IN (?)", alertMute.SeveritiesJson)
}
if alertMute.Prod != HOST {
tx = tx.Where("cate = ?", alertMute.Cate)
if alertMute.DatasourceIdsJson != nil && !IsAllDatasource(alertMute.DatasourceIdsJson) {
tx = tx.Where("datasource_id IN (?)", alertMute.DatasourceIdsJson)
}
}
err := tx.Order("id desc").Find(&lst).Error
return lst, err
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册