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即可。
此处为测试的告警信息:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210702000211224.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTExMjcyNDI=,size_16,color_FFFFFF,t_70)
3 说明
nightingale github
监控告警01–夜莺部署与接入