1 介绍
v4版本的夜莺集成了shell、api、wechat、wechat_robot、dingtalk_robot 等5中常见的告警,然而没有集成飞书告警。当前飞书已经被很多企业采纳,因此做企业运维平台的时候很有必要将告警通知发送到飞书。
使用过钉钉和飞书的小伙伴肯定都知道,可以通过群机器人的webhook来发送告警,基于这种方式我们只需要改动源码中 send_im模块,去掉多余的参数和数据结构,将钉钉相关的接口更改为飞书接口,然后重新编译生成server即可。
本文基于v4源码dingtalk模块,将其改动为支持飞书告警。笔者会在下一篇博文参考dingtalk模块追加一个feishu模块,使其能同时保持飞书和钉钉告警通知功能。
2 方法
笔者在之前的博文 监控告警01–夜莺部署与接入 已经介绍了夜莺的基础安装方法,此处不再重复,本文主要介绍一种快速让夜莺v4向飞书发送告警的方式,具体改动如下。
2.1 源码改动
- 修改 src/modules/server/dingtalk/dingtalk.go
此处修改了部分原有的数据结构,去掉了不必要的参数,也调整了RobotSend 的参数,具体如下:package dingtalk import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" ) type Result struct { ErrCode int `json:"errcode"` ErrMsg string `json:"errmsg"` } type dingReqData struct { Msgtype string `json:"msg_type"` Content *textContent `json:"content"` } type textContent struct { Text string `json:"text"` } // RobotSend robot发送信息 func RobotSend(tokenUser, sendContent string) error { url := "https://open.feishu.cn/open-apis/bot/v2/hook/" + tokenUser dingReqData := new(dingReqData) dingReqData.Msgtype = "text" reqContent := new(textContent) reqContent.Text = sendContent dingReqData.Content = reqContent // fmt.Println(dingReqData) content, err := json.Marshal(dingReqData) if err != nil { return fmt.Errorf("dingtalk marshal req data err: %v", err) } data := bytes.NewReader(content) req, err := http.NewRequest("POST", url, data) if err != nil { return fmt.Errorf("dingtalk create new req err: %v", err) } req.Header.Set("Content-Type", "application/json") r, err := http.DefaultClient.Do(req) if err != nil { return fmt.Errorf("dingtalk do req err: %v", err) } defer r.Body.Close() resp, err := ioutil.ReadAll(r.Body) if err != nil { return fmt.Errorf("dingtalk read req body err: %v", err) } result := Result{} err = json.Unmarshal(resp, &result) if err != nil { return fmt.Errorf("dingtalk unmarshal req content err: %v", err) } if result.ErrCode != 0 { err = fmt.Errorf("dingtalk req return ErrCode = %d ErrMsg = %s", result.ErrCode, result.ErrMsg) } return err } //func main() { // ret := RobotSend("********-change to your webhook code-************", "This is a test") // fmt.Println(ret) //}
- 修改 src/modules/server/cron/sender_im.go
需要同步修改sendImByDingTalkRobot 函数中的 dingtalk.RobotSend 调用func sendImByDingTalkRobot(message *dataobj.Message) { ...... for _, u := range tokenUser { err := dingtalk.RobotSend(u, message.Content) if err != nil { logger.Warningf("im dingtalk_robot send to %s fail: %v", u, err) } else { logger.Infof("im dingtalk_robot send to %s succ", u) } } }
2.2 测试效果
修改代码后,直接在src/modules/server 执行go build 就会生成server可执行文件,此时将该文件拷贝到之前安装的目录,覆盖已有的二进制文件,然后重启server即可。
此处为测试的告警信息: