crocodile对于告警通知的实现

117 阅读1分钟

crocodile项目中,对于告警通知的实现方式有:

  • dingding
  • email
  • slack
  • telegram
  • send.wechat

大概的流程图:

image.png

首先,我们先构建一个告警通知的接口:

type Sender interface {
   Send(to []string, title string, content string) error
}

所有的告警通知类型去实现这个接口:

type sendNotify struct {
   dingding, email, slack,
   telegram, wechat notify.Sender
}

我们拿钉钉来举例,看下具体的实现流程:

首先,我们先new一个dingding


func InitAlarm() {
    log.Info("start init alarm")
    send = sendNotify{}
    notifycfg := config.CoreConf.Notify
    if notifycfg.DingDing.Enable {
       log.Debug("init dingding alarm")
       send.dingding = dingding.NewDing(notifycfg.DingDing.WebHook,
          dingding.Secrue(notifycfg.DingDing.SecureLevel),
          notifycfg.DingDing.Secret)
    }
}
func NewDing(webhookurl string, sl Secrue, secret string) notify.Sender {
   d := Ding{
      webhookurl: webhookurl,
      MsgType:    "text",
      sl:         sl,
      secret:     secret,
   }

   return &d
}

然后实现Send方法

func (d *Ding) Send(tos []string, title string, content string) error {
   var requrl = d.webhookurl
   if d.sl == Sign {
      now := strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
      sign := getsign(d.secret, now)
      requrl += fmt.Sprintf("&timestamp=%s&sign=%s", now, sign)
   }
   sendmsg := SendMsg{
      MsgType: "text",
      Text: text{
         Content: title + "\n" + content + "\n",
      },
      At: at{
         AtMobiles: tos,
         IsAtAll:   false,
      },
   }

   resp, err := notify.JSONPost(http.MethodPost, requrl, sendmsg, http.DefaultClient)
   if err != nil {
      return err
   }
   res := Result{}
   err = json.Unmarshal(resp, &res)
   if err != nil {
      return err
   }
   if res.ErrCode != 0 {
      return fmt.Errorf("errmsg: %s errcode: %d", res.ErrMsg, res.ErrCode)
   }
   return nil
}

没有什么特别复杂的点,根据各个告警通知的类型,按照对应的请求规则,去实现就好。

剩下的几种消息通知类型,自己可以私下研究下。