组件:falcon-wechat
现象:告警消息发送失败,错误状态码45009
原因:每发一次告警都去获取 access_token,腾讯对access_token获取频率有限制
解决方法: 使用redis缓存access_token 2小时,不要每次发告警都取access_token
我的方案:
1.自己写微信告警消息发送api,falcon-wechat把消息发给自己api, api发到微信
2.也可直接改falcon-wechat源码,实现redis读写功能也可修复此问题
我的示例:
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
}