router_alert_cur_event.go 4.8 KB
Newer Older
U
UlricQin 已提交
1 2 3
package router

import (
U
Ulric Qin 已提交
4
	"net/http"
U
Ulric Qin 已提交
5 6
	"sort"
	"strings"
U
UlricQin 已提交
7

N
ning 已提交
8 9
	"github.com/ccfos/nightingale/v6/models"

U
UlricQin 已提交
10 11 12 13
	"github.com/gin-gonic/gin"
	"github.com/toolkits/pkg/ginx"
)

U
Ulric Qin 已提交
14
func parseAggrRules(c *gin.Context) []*models.AggrRule {
U
Ulric Qin 已提交
15
	aggrRules := strings.Split(ginx.QueryStr(c, "rule", ""), "::") // e.g. field:group_name::field:severity::tagkey:ident
U
Ulric Qin 已提交
16 17

	if len(aggrRules) == 0 {
U
Ulric Qin 已提交
18
		ginx.Bomb(http.StatusBadRequest, "rule empty")
U
Ulric Qin 已提交
19 20 21 22 23 24
	}

	rules := make([]*models.AggrRule, len(aggrRules))
	for i := 0; i < len(aggrRules); i++ {
		pair := strings.Split(aggrRules[i], ":")
		if len(pair) != 2 {
U
Ulric Qin 已提交
25
			ginx.Bomb(http.StatusBadRequest, "rule invalid")
U
Ulric Qin 已提交
26 27 28
		}

		if !(pair[0] == "field" || pair[0] == "tagkey") {
U
Ulric Qin 已提交
29
			ginx.Bomb(http.StatusBadRequest, "rule invalid")
U
Ulric Qin 已提交
30 31 32 33 34 35 36 37
		}

		rules[i] = &models.AggrRule{
			Type:  pair[0],
			Value: pair[1],
		}
	}

U
Ulric Qin 已提交
38 39 40
	return rules
}

N
ning 已提交
41
func (rt *Router) alertCurEventsCard(c *gin.Context) {
U
Ulric Qin 已提交
42 43 44 45
	stime, etime := getTimeRange(c)
	severity := ginx.QueryInt(c, "severity", -1)
	query := ginx.QueryStr(c, "query", "")
	busiGroupId := ginx.QueryInt64(c, "bgid", 0)
N
ning 已提交
46
	dsIds := queryDatasourceIds(c)
U
Ulric Qin 已提交
47
	rules := parseAggrRules(c)
N
ning 已提交
48 49 50 51 52 53 54

	prod := ginx.QueryStr(c, "prods", "")
	prods := []string{}
	if prod != "" {
		prods = strings.Split(prod, ",")
	}

55 56 57 58 59
	cate := ginx.QueryStr(c, "cate", "$all")
	cates := []string{}
	if cate != "$all" {
		cates = strings.Split(cate, ",")
	}
U
Ulric Qin 已提交
60

U
Ulric Qin 已提交
61
	// 最多获取50000个,获取太多也没啥意义
N
ning 已提交
62
	list, err := models.AlertCurEventGets(rt.Ctx, prods, busiGroupId, stime, etime, severity, dsIds, cates, query, 50000, 0)
U
Ulric Qin 已提交
63 64
	ginx.Dangerous(err)

U
Ulric Qin 已提交
65
	cardmap := make(map[string]*AlertCard)
U
Ulric Qin 已提交
66 67
	for _, event := range list {
		title := event.GenCardTitle(rules)
U
Ulric Qin 已提交
68 69 70
		if _, has := cardmap[title]; has {
			cardmap[title].Total++
			cardmap[title].EventIds = append(cardmap[title].EventIds, event.Id)
U
Ulric Qin 已提交
71 72 73
			if event.Severity < cardmap[title].Severity {
				cardmap[title].Severity = event.Severity
			}
U
Ulric Qin 已提交
74 75 76 77 78
		} else {
			cardmap[title] = &AlertCard{
				Total:    1,
				EventIds: []int64{event.Id},
				Title:    title,
U
Ulric Qin 已提交
79
				Severity: event.Severity,
U
Ulric Qin 已提交
80 81
			}
		}
U
UlricQin 已提交
82 83
	}

U
Ulric Qin 已提交
84 85
	titles := make([]string, 0, len(cardmap))
	for title := range cardmap {
U
Ulric Qin 已提交
86
		titles = append(titles, title)
U
UlricQin 已提交
87 88
	}

U
Ulric Qin 已提交
89 90
	sort.Strings(titles)

U
Ulric Qin 已提交
91
	cards := make([]*AlertCard, len(titles))
U
Ulric Qin 已提交
92
	for i := 0; i < len(titles); i++ {
U
Ulric Qin 已提交
93
		cards[i] = cardmap[titles[i]]
U
Ulric Qin 已提交
94 95
	}

96 97 98 99 100 101 102
	sort.SliceStable(cards, func(i, j int) bool {
		if cards[i].Severity != cards[j].Severity {
			return cards[i].Severity < cards[j].Severity
		}
		return cards[i].Total > cards[j].Total
	})

U
Ulric Qin 已提交
103 104 105 106
	ginx.NewRender(c).Data(cards, nil)
}

type AlertCard struct {
U
Ulric Qin 已提交
107 108 109
	Title    string  `json:"title"`
	Total    int     `json:"total"`
	EventIds []int64 `json:"event_ids"`
U
Ulric Qin 已提交
110
	Severity int     `json:"severity"`
U
Ulric Qin 已提交
111 112
}

N
ning 已提交
113
func (rt *Router) alertCurEventsCardDetails(c *gin.Context) {
U
Ulric Qin 已提交
114 115
	var f idsForm
	ginx.BindJSON(c, &f)
U
Ulric Qin 已提交
116

N
ning 已提交
117
	list, err := models.AlertCurEventGetByIds(rt.Ctx, f.Ids)
U
Ulric Qin 已提交
118 119 120
	if err == nil {
		cache := make(map[int64]*models.UserGroup)
		for i := 0; i < len(list); i++ {
N
ning 已提交
121
			list[i].FillNotifyGroups(rt.Ctx, cache)
U
Ulric Qin 已提交
122 123 124 125
		}
	}

	ginx.NewRender(c).Data(list, err)
U
Ulric Qin 已提交
126 127 128
}

// 列表方式,拉取活跃告警
N
ning 已提交
129
func (rt *Router) alertCurEventsList(c *gin.Context) {
U
Ulric Qin 已提交
130 131 132 133 134
	stime, etime := getTimeRange(c)
	severity := ginx.QueryInt(c, "severity", -1)
	query := ginx.QueryStr(c, "query", "")
	limit := ginx.QueryInt(c, "limit", 20)
	busiGroupId := ginx.QueryInt64(c, "bgid", 0)
N
ning 已提交
135 136 137 138 139 140 141 142 143 144 145 146
	dsIds := queryDatasourceIds(c)

	prod := ginx.QueryStr(c, "prods", "")
	if prod == "" {
		prod = ginx.QueryStr(c, "rule_prods", "")
	}

	prods := []string{}
	if prod != "" {
		prods = strings.Split(prod, ",")
	}

147 148 149 150 151
	cate := ginx.QueryStr(c, "cate", "$all")
	cates := []string{}
	if cate != "$all" {
		cates = strings.Split(cate, ",")
	}
U
Ulric Qin 已提交
152

N
ning 已提交
153
	total, err := models.AlertCurEventTotal(rt.Ctx, prods, busiGroupId, stime, etime, severity, dsIds, cates, query)
U
Ulric Qin 已提交
154
	ginx.Dangerous(err)
U
UlricQin 已提交
155

N
ning 已提交
156
	list, err := models.AlertCurEventGets(rt.Ctx, prods, busiGroupId, stime, etime, severity, dsIds, cates, query, limit, ginx.Offset(c, limit))
U
UlricQin 已提交
157 158 159 160
	ginx.Dangerous(err)

	cache := make(map[int64]*models.UserGroup)
	for i := 0; i < len(list); i++ {
N
ning 已提交
161
		list[i].FillNotifyGroups(rt.Ctx, cache)
U
UlricQin 已提交
162 163 164 165 166 167 168 169
	}

	ginx.NewRender(c).Data(gin.H{
		"list":  list,
		"total": total,
	}, nil)
}

N
ning 已提交
170
func (rt *Router) alertCurEventDel(c *gin.Context) {
U
UlricQin 已提交
171 172 173 174
	var f idsForm
	ginx.BindJSON(c, &f)
	f.Verify()

U
Ulric Qin 已提交
175 176 177
	set := make(map[int64]struct{})

	for i := 0; i < len(f.Ids); i++ {
N
ning 已提交
178
		event, err := models.AlertCurEventGetById(rt.Ctx, f.Ids[i])
U
Ulric Qin 已提交
179 180 181
		ginx.Dangerous(err)

		if _, has := set[event.GroupId]; !has {
N
ning 已提交
182
			rt.bgrwCheck(c, event.GroupId)
U
Ulric Qin 已提交
183 184 185 186
			set[event.GroupId] = struct{}{}
		}
	}

N
ning 已提交
187
	ginx.NewRender(c).Message(models.AlertCurEventDel(rt.Ctx, f.Ids))
U
UlricQin 已提交
188 189
}

N
ning 已提交
190
func (rt *Router) alertCurEventGet(c *gin.Context) {
U
UlricQin 已提交
191
	eid := ginx.UrlParamInt64(c, "eid")
N
ning 已提交
192
	event, err := models.AlertCurEventGetById(rt.Ctx, eid)
U
UlricQin 已提交
193 194 195 196 197 198 199 200
	ginx.Dangerous(err)

	if event == nil {
		ginx.Bomb(404, "No such active event")
	}

	ginx.NewRender(c).Data(event, nil)
}