監控告警03--夜莺新增飛書告警子產品-v4版本
- 1 介紹
- 2 方法
-
- 2.1 源碼變動
- 2.2 測試效果
- 3 說明
1 介紹
上文 監控告警02–夜莺飛書告警-v4版本 中,筆者通過更改夜莺 v4 源碼 src/modules/server/dingtalk/dingtalk.go 使其發送告警到飛書群。基于上文思路,現在可以在源碼中新增 src/modules/server/feishu/ 子產品,是夜莺server同時可以按需要使用釘釘和飛書告警子產品。
2 方法
2.1 源碼變動
-
建立 src/modules/server/feishu/feishu.go 檔案,
參考src/modules/server/dingtalk/dingtalk.go 子產品,将相關資料結構和函數參數調整即可。
也可以直接添加package main,然後通過該檔案測試飛書告警子產品。vim src/modules/server/feishu/feishu.go package feishu import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" ) type Result struct { ErrCode int `json:"errcode"` ErrMsg string `json:"errmsg"` } type feishuReqData 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 feishuReqData := new(feishuReqData) feishuReqData.Msgtype = "text" reqContent := new(textContent) reqContent.Text = sendContent feishuReqData.Content = reqContent content, err := json.Marshal(feishuReqData) if err != nil { return fmt.Errorf("feishu marshal req data err: %v", err) } data := bytes.NewReader(content) req, err := http.NewRequest("POST", url, data) if err != nil { return fmt.Errorf("feishu 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("feishu do req err: %v", err) } defer r.Body.Close() resp, err := ioutil.ReadAll(r.Body) if err != nil { return fmt.Errorf("feishu read req body err: %v", err) } result := Result{} err = json.Unmarshal(resp, &result) if err != nil { return fmt.Errorf("feishu unmarshal req content err: %v", err) } if result.ErrCode != 0 { err = fmt.Errorf("feishu req return ErrCode = %d ErrMsg = %s", result.ErrCode, result.ErrMsg) } return err } //func main() { // ret := RobotSend("xxx-xxxx-xxxx-xxx-xxx", "This is a test") // fmt.Println(ret) //}
-
同步修改 src/modules/server/cron/sender_im.go
1 在該檔案中導入package feishu
2 在 func sendIm(message *dataobj.Message) 的switch 中新增 case “feishu_robot”
3 新增 func sendImByFeishuRobot(message *dataobj.Message) 函數
此處隻copy修改部分内容
vim src/modules/server/cron/sender_im.go import ( "github.com/didi/nightingale/v4/src/modules/server/feishu" ...... ) func sendIm(message *dataobj.Message) { defer func() { <-ImWorkerChan }() switch Sender["im"].Way { case "api": sendImByAPI(message) case "shell": sendImByShell(message) case "wechat": sendImByWeChat(message) case "wechat_robot": sendImByWeChatRobot(message) case "dingtalk_robot": sendImByDingTalkRobot(message) case "feishu_robot": sendImByFeishuRobot(message) default: logger.Errorf("not support %s to send im, im: %+v", Sender["im"].Way, message) } } func sendImByFeishuRobot(message *dataobj.Message) { cnt := len(message.Tos) if cnt == 0 { logger.Warningf("im send feishu_robot fail, empty tos, message: %+v", message) return } set := make(map[string]struct{}, cnt) for i := 0; i < cnt; i++ { toUser := strings.TrimSpace(message.Tos[i]) if toUser == "" { continue } if _, ok := set[toUser]; !ok { set[toUser] = struct{}{} } } req := regexp.MustCompile("^1[0-9]{10}$") var atUser []string var tokenUser []string for user := range set { if req.MatchString(user) { atUser = append(atUser, user) } else { tokenUser = append(tokenUser, user) } } for _, u := range tokenUser { err := feishu.RobotSend(u, message.Content) if err != nil { logger.Warningf("im feishu_robot send to %s fail: %v", u, err) } else { logger.Infof("im feishu_robot send to %s succ", u) } } }
2.2 測試效果
-
編譯二進制檔案
在 src/modules/server 目錄, go build server.go ,生成可執行檔案 server
-
覆寫已有的n9e-server 并更改im為 feishu_robot
替換原有的server,将 etc/server.yml 中的im 的way更改為feishu_robot ,然後重新開機server即可;
cat server.yml |grep feishu -C 2 im: # five choice: shell|api|wechat|wechat_robot|dingtalk_robot way: feishu_robot worker: 10 api: http://127.0.0.1:2008/im
-
測試
臨時配置一個 記憶體使用率大于40% 的告警,發現很快就觸發告警了,即該子產品生效了。
監控告警03--夜莺新增飛書告警子產品-v4版本1 介紹2 方法3 說明
3 說明
- nightingale github
- nightingale github–添加飛書子產品