天天看點

監控告警03--夜莺新增飛書告警子產品-v4版本1 介紹2 方法3 說明

監控告警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 源碼變動

  1. 建立 src/modules/server/feishu/feishu.go 檔案,

    參考src/modules/server/dingtalk/dingtalk.go 子產品,将相關資料結構和函數參數調整即可。

    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)
    //}
               
    也可以直接添加package main,然後通過該檔案測試飛書告警子產品。
  2. 同步修改 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 測試效果

  1. 編譯二進制檔案

    在 src/modules/server 目錄, go build server.go ,生成可執行檔案 server

  2. 覆寫已有的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
               
  3. 測試

    臨時配置一個 記憶體使用率大于40% 的告警,發現很快就觸發告警了,即該子產品生效了。

    監控告警03--夜莺新增飛書告警子產品-v4版本1 介紹2 方法3 說明

3 說明

  1. nightingale github
  2. nightingale github–添加飛書子產品

繼續閱讀