crocodile项目中,对于告警通知的实现方式有:
- dingding
- slack
- telegram
- send.wechat
大概的流程图:
首先,我们先构建一个告警通知的接口:
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("×tamp=%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
}
没有什么特别复杂的点,根据各个告警通知的类型,按照对应的请求规则,去实现就好。
剩下的几种消息通知类型,自己可以私下研究下。