diff --git a/config/initialization.tpl b/config/initialization.tpl index c31ea26b..fca705cf 100644 --- a/config/initialization.tpl +++ b/config/initialization.tpl @@ -608,6 +608,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-calakp97h710dpnp1fa2 "id": "builtin-calakp97h710dpnp1fa2", "created": "2022-06-16T03:58:29.437447113Z", "updated": "2022-07-21T23:12:51.111569117Z", + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "name": "CPU utilization is Too High", "enabled": false, "resource": { @@ -734,6 +738,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-cal8n7p7h710dpnoaps0 "updated": "2022-07-13T04:00:06.181994982Z", "name": "Cluster Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -851,6 +859,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-cal8n7p7h710dpnogps1 "updated": "2022-07-22T00:06:26.498903821Z", "name": "Disk utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -980,6 +992,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-cbp20n2anisjmu4gehc5 "updated": "2022-08-09T08:52:44.633455664Z", "name": "Elasticsearch node left cluster", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1074,6 +1090,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-calavvp7h710dpnp32r3 "updated": "2022-07-21T23:10:36.70696738Z", "name": "Index Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1168,6 +1188,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-calaqnh7h710dpnp2bm8 "updated": "2022-07-21T23:12:07.142532243Z", "name": "JVM utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1292,6 +1316,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-cbp2e4ianisjmu4giqs7 "updated": "2022-08-09T09:39:29.604751601Z", "name": "Search latency is great than 500ms", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1414,6 +1442,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/builtin-calgapp7h710dpnpbeb6 "updated": "2022-07-22T00:03:34.044562893Z", "name": "Shard Storage >= 55G", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1509,6 +1541,10 @@ POST $[[INDEX_PREFIX]]alert-rule/_doc/cb34sfl6psfiqtovhpt4 "updated": "2022-08-09T08:40:05.323148338Z", "name": "Too Many Deleted Documents", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1632,8 +1668,8 @@ POST $[[INDEX_PREFIX]]view/_doc/cb34sfl6psfiqtovhpt4 "name": "Gateway Metrics", "description": "", "creator": { - "name": "admin", - "id": "default_user_admin" + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" }, "view_id": "cb34sfl6psfiqtovhpt4", "config":{ diff --git a/config/initialization_v5.tpl b/config/initialization_v5.tpl index 778a2fbb..a04a104d 100644 --- a/config/initialization_v5.tpl +++ b/config/initialization_v5.tpl @@ -573,6 +573,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calakp97h710dpnp1fa2 "updated": "2022-07-21T23:12:51.111569117Z", "name": "CPU utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -697,6 +701,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cal8n7p7h710dpnoaps0 "updated": "2022-07-13T04:00:06.181994982Z", "name": "Cluster Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -814,6 +822,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cal8n7p7h710dpnogps1 "updated": "2022-07-22T00:06:26.498903821Z", "name": "Disk utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -943,6 +955,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cbp20n2anisjmu4gehc5 "updated": "2022-08-09T08:52:44.633455664Z", "name": "Elasticsearch node left cluster", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1037,6 +1053,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calavvp7h710dpnp32r3 "updated": "2022-07-21T23:10:36.70696738Z", "name": "Index Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1131,6 +1151,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calaqnh7h710dpnp2bm8 "updated": "2022-07-21T23:12:07.142532243Z", "name": "JVM utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1255,6 +1279,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cbp2e4ianisjmu4giqs7 "updated": "2022-08-09T09:39:29.604751601Z", "name": "Search latency is great than 500ms", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1377,6 +1405,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calgapp7h710dpnpbeb6 "updated": "2022-07-22T00:03:34.044562893Z", "name": "Shard Storage >= 55G", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1472,6 +1504,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/cb34sfl6psfiqtovhpt4 "updated": "2022-08-09T08:40:05.323148338Z", "name": "Too Many Deleted Documents", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", diff --git a/config/initialization_v6.tpl b/config/initialization_v6.tpl index ff9873fa..80b6e0ce 100644 --- a/config/initialization_v6.tpl +++ b/config/initialization_v6.tpl @@ -630,6 +630,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calakp97h710dpnp1fa2 "updated": "2022-07-21T23:12:51.111569117Z", "name": "CPU utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -754,6 +758,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cal8n7p7h710dpnoaps0 "updated": "2022-07-13T04:00:06.181994982Z", "name": "Cluster Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -871,6 +879,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cal8n7p7h710dpnogps1 "updated": "2022-07-22T00:06:26.498903821Z", "name": "Disk utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1000,6 +1012,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cbp20n2anisjmu4gehc5 "updated": "2022-08-09T08:52:44.633455664Z", "name": "Elasticsearch node left cluster", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1094,6 +1110,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calavvp7h710dpnp32r3 "updated": "2022-07-21T23:10:36.70696738Z", "name": "Index Health Change to Red", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1188,6 +1208,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calaqnh7h710dpnp2bm8 "updated": "2022-07-21T23:12:07.142532243Z", "name": "JVM utilization is Too High", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1312,6 +1336,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-cbp2e4ianisjmu4giqs7 "updated": "2022-08-09T09:39:29.604751601Z", "name": "Search latency is great than 500ms", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1434,6 +1462,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/builtin-calgapp7h710dpnpbeb6 "updated": "2022-07-22T00:03:34.044562893Z", "name": "Shard Storage >= 55G", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", @@ -1529,6 +1561,10 @@ POST $[[INDEX_PREFIX]]alert-rule/doc/cb34sfl6psfiqtovhpt4 "updated": "2022-08-09T08:40:05.323148338Z", "name": "Too Many Deleted Documents", "enabled": false, + "creator": { + "name": "$[[USERNAME]]", + "id": "$[[USER_ID]]" + }, "resource": { "resource_id": "$[[RESOURCE_ID]]", "resource_name": "$[[RESOURCE_NAME]]", diff --git a/model/alerting/rule.go b/model/alerting/rule.go index e676c61d..119f2b79 100644 --- a/model/alerting/rule.go +++ b/model/alerting/rule.go @@ -25,6 +25,10 @@ type Rule struct { LastEscalationTime time.Time `json:"-"` //标识最近一次告警升级发送通知的时间 SearchText string `json:"-" elastic_mapping:"search_text:{type:text,index_prefixes:{},index_phrases:true, analyzer:suggest_text_search }"` Expression string `json:"-"` + Creator struct { + Name string `json:"name" elastic_mapping:"name: { type: keyword }"` + Id string `json:"id" elastic_mapping:"id: { type: keyword }"` + } `json:"creator" elastic_mapping:"creator:{type:object}"` } func (rule *Rule) GetOrInitExpression() (string, error){ diff --git a/plugin/api/alerting/rule.go b/plugin/api/alerting/rule.go index 4d121cc4..12ac28ca 100644 --- a/plugin/api/alerting/rule.go +++ b/plugin/api/alerting/rule.go @@ -12,6 +12,7 @@ import ( "infini.sh/console/model/alerting" alerting2 "infini.sh/console/service/alerting" _ "infini.sh/console/service/alerting/elasticsearch" + "infini.sh/framework/core/api/rbac" httprouter "infini.sh/framework/core/api/router" "infini.sh/framework/core/elastic" "infini.sh/framework/core/event" @@ -40,6 +41,12 @@ func (alertAPI *AlertAPI) createRule(w http.ResponseWriter, req *http.Request, p }, http.StatusInternalServerError) return } + user, err := rbac.FromUserContext(req.Context()) + if err != nil { + log.Error(err) + alertAPI.WriteError(w, err.Error(), http.StatusInternalServerError) + return + } var ids []string for _, rule := range rules { exists, err := checkResourceExists(&rule) @@ -73,6 +80,10 @@ func (alertAPI *AlertAPI) createRule(w http.ResponseWriter, req *http.Request, p } } rule.Metrics.Groups = groups + if user != nil { + rule.Creator.Name = user.Username + rule.Creator.Id = user.UserId + } err = orm.Save(nil, rule) if err != nil { diff --git a/plugin/setup/setup.go b/plugin/setup/setup.go index dcc4cf20..7f832499 100644 --- a/plugin/setup/setup.go +++ b/plugin/setup/setup.go @@ -445,6 +445,10 @@ func (module *Module) initialize(w http.ResponseWriter, r *http.Request, ps http return w.Write([]byte(cfg.ID)) case "RESOURCE_NAME": return w.Write([]byte(cfg.Name)) + case "USER_ID": + return w.Write([]byte("default_user_" + request.BootstrapUsername)) + case "USERNAME": + return w.Write([]byte(request.BootstrapUsername)) } panic(errors.Errorf("unknown tag: %v", tag)) }) diff --git a/service/alerting/elasticsearch/engine.go b/service/alerting/elasticsearch/engine.go index 4cf381b8..f2f3bcf0 100644 --- a/service/alerting/elasticsearch/engine.go +++ b/service/alerting/elasticsearch/engine.go @@ -10,6 +10,7 @@ import ( "fmt" "github.com/Knetic/govaluate" log "github.com/cihub/seelog" + "infini.sh/console/model" "infini.sh/console/model/alerting" alerting2 "infini.sh/console/service/alerting" "infini.sh/console/service/alerting/action" @@ -720,6 +721,23 @@ func (engine *Engine) Do(rule *alerting.Rule) error { if err != nil { return fmt.Errorf("save alert message error: %w", err) } + userID := rule.Creator.Id + if userID == "" { + userID = "*" + } + notification := &model.Notification{ + UserId: util.ToString(userID), + Type: model.NotificationTypeNotification, + MessageType: model.MessageTypeAlerting, + Status: model.NotificationStatusNew, + Title: alertItem.Title, + Body: alertItem.Message, + Link: "/alerting/message", + } + err = orm.Create(nil, notification) + if err != nil { + return fmt.Errorf("failed to create notification, err: %w", err) + } }else{ alertMessage.Title = alertItem.Title alertMessage.Message = alertItem.Message