open-falcon 微信报警45009 优化

2022-10-07  本文已影响0人  jojo1313

组件:falcon-wechat

现象:告警消息发送失败,错误状态码45009


image.png

原因:每发一次告警都去获取 access_token,腾讯对access_token获取频率有限制

解决方法: 使用redis缓存access_token 2小时,不要每次发告警都取access_token

我的方案:
1.自己写微信告警消息发送api,falcon-wechat把消息发给自己api, api发到微信
2.也可直接改falcon-wechat源码,实现redis读写功能也可修复此问题

我的示例:


image.png

falcon-wechat源码修改后,go build 重新编译即可使用

API部分代码示例:

func SendMs(datas Warndata)(rep string){
        var token string
        var tkstr  interface{}
        idstr := strconv.Itoa(datas.Agentid)
        //发送告警前,先redis取access_token,redis没有就去腾讯api拿,拿完存redis
        tokenofcache,_ :=gredis.GetLocal(idstr)
        if tokenofcache != nil {
            err := json.Unmarshal(tokenofcache,&tkstr)
            if err!=nil{
              fmt.Println(err)
            }
            token = tkstr.(string)
        }else{
            //请求腾讯api拿access_token, 拿完再存redis
            token=Token(datas.Agentid)
            if len(token)>20{
                gredis.SetLocal(idstr,token,7100) //缓存tonken近2小时
            }
        }
        url:= fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", token)
        jsonStr, _ := json.Marshal(datas)
        req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
        if err != nil {
                panic(err)
        }
        defer req.Body.Close()
        client := &http.Client{Timeout: 5 * time.Second}
        resp, error := client.Do(req)
        if error != nil {
                panic(error)
        }
        defer resp.Body.Close()
        result, _ := ioutil.ReadAll(resp.Body)
        rep = string(result)
        return rep
}

上一篇下一篇

猜你喜欢

热点阅读