add tags, category field

This commit is contained in:
liugq 2023-08-16 10:02:48 +08:00
parent bb7a3c167f
commit d7578a2743
4 changed files with 90 additions and 15 deletions

View File

@ -70,6 +70,8 @@ type AlertMessage struct {
IgnoredUser string `json:"ignored_user,omitempty" elastic_mapping:"ignored_user: { type: keyword,copy_to:search_text }"` IgnoredUser string `json:"ignored_user,omitempty" elastic_mapping:"ignored_user: { type: keyword,copy_to:search_text }"`
Priority string `json:"priority" elastic_mapping:"priority: { type: keyword }"` Priority string `json:"priority" elastic_mapping:"priority: { type: keyword }"`
SearchText string `json:"-" elastic_mapping:"search_text:{type:text,index_prefixes:{},index_phrases:true, analyzer:suggest_text_search }"` SearchText string `json:"-" elastic_mapping:"search_text:{type:text,index_prefixes:{},index_phrases:true, analyzer:suggest_text_search }"`
Category string `json:"category,omitempty" elastic_mapping:"category: { type: keyword,copy_to:search_text }"`
Tags []string `json:"tags,omitempty" elastic_mapping:"tags: { type: keyword,copy_to:search_text }"`
} }
/* /*

View File

@ -31,6 +31,8 @@ type Rule struct {
Name string `json:"name" elastic_mapping:"name: { type: keyword }"` Name string `json:"name" elastic_mapping:"name: { type: keyword }"`
Id string `json:"id" elastic_mapping:"id: { type: keyword }"` Id string `json:"id" elastic_mapping:"id: { type: keyword }"`
} `json:"creator" elastic_mapping:"creator:{type:object}"` } `json:"creator" elastic_mapping:"creator:{type:object}"`
Category string `json:"category,omitempty" elastic_mapping:"category: { type: keyword,copy_to:search_text }"`
Tags []string `json:"tags,omitempty" elastic_mapping:"tags: { type: keyword,copy_to:search_text }"`
} }
func (rule *Rule) GetOrInitExpression() (string, error){ func (rule *Rule) GetOrInitExpression() (string, error){

View File

@ -25,6 +25,7 @@ func (h *AlertAPI) ignoreAlertMessage(w http.ResponseWriter, req *http.Request,
body := struct { body := struct {
Messages []alerting.AlertMessage `json:"messages"` Messages []alerting.AlertMessage `json:"messages"`
IgnoredReason string `json:"ignored_reason"` IgnoredReason string `json:"ignored_reason"`
IsReset bool `json:"is_reset"`
}{} }{}
err := h.DecodeJSON(req, &body) err := h.DecodeJSON(req, &body)
if err != nil { if err != nil {
@ -41,29 +42,44 @@ func (h *AlertAPI) ignoreAlertMessage(w http.ResponseWriter, req *http.Request,
messageIDs = append(messageIDs, msg.ID) messageIDs = append(messageIDs, msg.ID)
} }
currentUser := h.GetCurrentUser(req) currentUser := h.GetCurrentUser(req)
must := []util.MapStr{
{
"terms": util.MapStr{
"_id": messageIDs,
},
},
}
var source string
if body.IsReset {
must = append(must, util.MapStr{
"term": util.MapStr{
"status": util.MapStr{
"value": alerting.MessageStateIgnored,
},
},
})
source = fmt.Sprintf("ctx._source['status'] = '%s'", alerting.MessageStateAlerting)
}else {
must = append(must, util.MapStr{
"term": util.MapStr{
"status": util.MapStr{
"value": alerting.MessageStateAlerting,
},
},
})
source = fmt.Sprintf("ctx._source['status'] = '%s';ctx._source['ignored_time']='%s';ctx._source['ignored_reason']='%s';ctx._source['ignored_user']='%s'", alerting.MessageStateIgnored, time.Now().Format(time.RFC3339Nano), body.IgnoredReason, currentUser)
}
queryDsl := util.MapStr{ queryDsl := util.MapStr{
"query": util.MapStr{ "query": util.MapStr{
"bool": util.MapStr{ "bool": util.MapStr{
"must": []util.MapStr{ "must": must,
{
"terms": util.MapStr{
"_id": messageIDs,
},
},
{
"term": util.MapStr{
"status": util.MapStr{
"value": alerting.MessageStateAlerting,
},
},
},
},
}, },
}, },
"script": util.MapStr{ "script": util.MapStr{
"source": fmt.Sprintf("ctx._source['status'] = '%s';ctx._source['ignored_time']='%s';ctx._source['ignored_reason']='%s';ctx._source['ignored_user']='%s'", alerting.MessageStateIgnored, time.Now().Format(time.RFC3339Nano), body.IgnoredReason, currentUser), "source": source,
}, },
} }
log.Info(util.MustToJSON(queryDsl))
err = orm.UpdateBy(alerting.AlertMessage{}, util.MustToJSONBytes(queryDsl)) err = orm.UpdateBy(alerting.AlertMessage{}, util.MustToJSONBytes(queryDsl))
if err != nil { if err != nil {
h.WriteError(w, err.Error(), http.StatusInternalServerError) h.WriteError(w, err.Error(), http.StatusInternalServerError)
@ -160,10 +176,53 @@ func (h *AlertAPI) getAlertMessageStats(w http.ResponseWriter, req *http.Request
return return
} }
statusCounts[alerting.MessageStateIgnored] = countRes.Count statusCounts[alerting.MessageStateIgnored] = countRes.Count
queryDsl = util.MapStr{
"size": 0,
"aggs": util.MapStr{
"terms_by_category": util.MapStr{
"terms": util.MapStr{
"field": "category",
"size": 100,
},
},
"terms_by_tags": util.MapStr{
"terms": util.MapStr{
"field": "tags",
"size": 100,
},
},
},
}
searchRes, err = esClient.SearchWithRawQueryDSL(indexName, util.MustToJSONBytes(queryDsl) )
if err != nil {
h.WriteJSON(w, util.MapStr{
"error": err.Error(),
}, http.StatusInternalServerError)
return
}
categories := []string{}
if termsAgg, ok := searchRes.Aggregations["terms_by_category"]; ok {
for _, bk := range termsAgg.Buckets {
if cate, ok := bk["key"].(string); ok {
categories = append(categories, cate)
}
}
}
tags := []string{}
if termsAgg, ok := searchRes.Aggregations["terms_by_tags"]; ok {
for _, bk := range termsAgg.Buckets {
if tag, ok := bk["key"].(string); ok {
tags = append(tags, tag)
}
}
}
h.WriteJSON(w, util.MapStr{ h.WriteJSON(w, util.MapStr{
"alert": util.MapStr{ "alert": util.MapStr{
"current": statusCounts, "current": statusCounts,
}, },
"categories": categories,
"tags": tags,
}, http.StatusOK) }, http.StatusOK)
} }
@ -182,6 +241,8 @@ func (h *AlertAPI) searchAlertMessage(w http.ResponseWriter, req *http.Request,
max = h.GetParameterOrDefault(req, "max", "now") max = h.GetParameterOrDefault(req, "max", "now")
mustBuilder = &strings.Builder{} mustBuilder = &strings.Builder{}
sortBuilder = strings.Builder{} sortBuilder = strings.Builder{}
category = h.GetParameterOrDefault(req, "category", "")
tags = h.GetParameterOrDefault(req, "tags", "")
) )
mustBuilder.WriteString(fmt.Sprintf(`{"range":{"created":{"gte":"%s", "lte": "%s"}}}`, min, max)) mustBuilder.WriteString(fmt.Sprintf(`{"range":{"created":{"gte":"%s", "lte": "%s"}}}`, min, max))
if ruleID != "" { if ruleID != "" {
@ -213,6 +274,14 @@ func (h *AlertAPI) searchAlertMessage(w http.ResponseWriter, req *http.Request,
mustBuilder.WriteString(",") mustBuilder.WriteString(",")
mustBuilder.WriteString(fmt.Sprintf(`{"term":{"priority":{"value":"%s"}}}`, priority)) mustBuilder.WriteString(fmt.Sprintf(`{"term":{"priority":{"value":"%s"}}}`, priority))
} }
if category != "" {
mustBuilder.WriteString(",")
mustBuilder.WriteString(fmt.Sprintf(`{"term":{"category":{"value":"%s"}}}`, category))
}
if tags != "" {
mustBuilder.WriteString(",")
mustBuilder.WriteString(fmt.Sprintf(`{"term":{"tags":{"value":"%s"}}}`, tags))
}
size, _ := strconv.Atoi(strSize) size, _ := strconv.Atoi(strSize)
if size <= 0 { if size <= 0 {
size = 20 size = 20

View File

@ -745,6 +745,8 @@ func (engine *Engine) Do(rule *alerting.Rule) error {
Priority: priority, Priority: priority,
Title: alertItem.Title, Title: alertItem.Title,
Message: alertItem.Message, Message: alertItem.Message,
Tags: rule.Tags,
Category: rule.Category,
} }
err = saveAlertMessage(msg) err = saveAlertMessage(msg)
if err != nil { if err != nil {