func (this *SafeEvents) Put(event *model.Event) { if event.Status == "OK" { this.Delete(event.Id) return } dto := &EventDto{} dto.Id = event.Id dto.Endpoint = event.Endpoint dto.Metric = event.Metric() dto.Counter = event.Counter() dto.Func = event.Func() dto.LeftValue = utils.ReadableFloat(event.LeftValue) dto.Operator = event.Operator() dto.RightValue = utils.ReadableFloat(event.RightValue()) dto.Note = event.Note() dto.MaxStep = event.MaxStep() dto.CurrentStep = event.CurrentStep dto.Priority = event.Priority() dto.Status = event.Status dto.Timestamp = event.EventTime dto.ExpressionId = event.ExpressionId() dto.StrategyId = event.StrategyId() dto.TemplateId = event.TplId() dto.Link = Link(event) this.Lock() defer this.Unlock() this.M[dto.Id] = dto }
// 处理事件(去掉了优先级区分) func consumeEvents(event *model.Event, action *api.Action) { if action.Uic == "" { return } //获取联系方式 phones, mails, ims := api.ParseTeams(action.Uic) smsContent := GenerateSmsContent(event) mailContent := GenerateMailContent(event) imContent := GenerateIMSmsContent(event) phoneContent := GeneratePhoneContent(event) // level 0 will have phone,im,mail // level 1-2 will have im,mail // level 3-6 will only have im if event.Priority() == 0 { redis.WritePhone(phones, phoneContent) } if event.Priority() < 3 { redis.WriteMail(mails, smsContent, mailContent) } redis.WriteIMSms(ims, imContent) }
func ParseUserMail(event *model.Event, action *api.Action) { userMap := api.GetUsers(action.Uic) metric := event.Metric() subject := GenerateSmsContent(event) content := GenerateMailContent(event) status := event.Status priority := event.Priority() queue := g.Config().Redis.UserMailQueue rc := g.RedisConnPool.Get() defer rc.Close() for _, user := range userMap { dto := MailDto{ Priority: priority, Metric: metric, Subject: subject, Content: content, Email: user.Email, Status: status, } bs, err := json.Marshal(dto) if err != nil { log.Println("json marshal MailDto fail:", err) continue } _, err = rc.Do("LPUSH", queue, string(bs)) if err != nil { log.Println("LPUSH redis", queue, "fail:", err, "dto:", string(bs)) } } }
// 低优先级的做报警合并 func consumeLowEvents(event *model.Event, action *api.Action) { if action.Uic == "" { return } if event.Priority() < 3 { ParseUserSms(event, action) } ParseUserMail(event, action) }
// 高优先级的不做报警合并 func consumeHighEvents(event *model.Event, action *api.Action) { if action.Uic == "" { return } phones, mails := api.ParseTeams(action.Uic) smsContent := GenerateSmsContent(event) mailContent := GenerateMailContent(event) if event.Priority() < 3 { redis.WriteSms(phones, smsContent) } redis.WriteMail(mails, smsContent, mailContent) }
func sendEvent(event *model.Event) { // update last event g.LastEvents.Set(event.Id, event) bs, err := json.Marshal(event) if err != nil { log.Printf("json marshal event %v fail: %v", event, err) return } // send to redis redisKey := fmt.Sprintf(g.Config().Alarm.QueuePattern, event.Priority()) rc := g.RedisConnPool.Get() defer rc.Close() rc.Do("LPUSH", redisKey, string(bs)) }
func BuildCommonSMSContent(event *model.Event) string { return fmt.Sprintf( "[P%d][%s][%s][][%s %s %s %s %s%s%s][O%d %s]", event.Priority(), event.Status, event.Endpoint, event.Note(), event.Func(), event.Metric(), utils.SortedTags(event.PushedTags), utils.ReadableFloat(event.LeftValue), event.Operator(), utils.ReadableFloat(event.RightValue()), event.CurrentStep, event.FormattedTime(), ) }
func BuildCommonMailContent(event *model.Event) string { link := g.Link(event) return fmt.Sprintf( "%s\r\nP%d\r\nEndpoint:%s\r\nMetric:%s\r\nTags:%s\r\n%s: %s%s%s\r\nNote:%s\r\nMax:%d, Current:%d\r\nTimestamp:%s\r\n%s\r\n", event.Status, event.Priority(), event.Endpoint, event.Metric(), utils.SortedTags(event.PushedTags), event.Func(), utils.ReadableFloat(event.LeftValue), event.Operator(), utils.ReadableFloat(event.RightValue()), event.Note(), event.MaxStep(), event.CurrentStep, event.FormattedTime(), link, ) }
func Callback(event *model.Event, action *api.Action) string { if action.Url == "" { return "callback url is blank" } L := make([]string, 0) if len(event.PushedTags) > 0 { for k, v := range event.PushedTags { L = append(L, fmt.Sprintf("%s:%s", k, v)) } } tags := "" if len(L) > 0 { tags = strings.Join(L, ",") } req := httplib.Get(action.Url).SetTimeout(3*time.Second, 20*time.Second) req.Param("endpoint", event.Endpoint) req.Param("metric", event.Metric()) req.Param("status", event.Status) req.Param("step", fmt.Sprintf("%d", event.CurrentStep)) req.Param("priority", fmt.Sprintf("%d", event.Priority())) req.Param("time", event.FormattedTime()) req.Param("tpl_id", fmt.Sprintf("%d", event.TplId())) req.Param("exp_id", fmt.Sprintf("%d", event.ExpressionId())) req.Param("stra_id", fmt.Sprintf("%d", event.StrategyId())) req.Param("tags", tags) resp, e := req.String() success := "success" if e != nil { success = fmt.Sprintf("fail:%s", e.Error()) } message := fmt.Sprintf("curl %s %s. resp: %s", action.Url, success, resp) return message }