开始配置
在grafana管理界面Name: 自己随便取
Type: 选择webhook
封装发消息类型
通过配置上图中的Url(这里可以自己随便写个api,接收grafana传过来的参数),所传参数如下
{
"imageUrl": "https://domain.com/assets/img/blog/mixed_styles.png",
"message": "Someone is testing the alert notification within grafana.",
"ruleUrl": "http://domain.com/rules/",
"title": "[Alerting] Test notification"
}
上代码(通过自己封装的api, 去请求微信)
部分代码
type Hook struct {
DashboardId string `json:"dashboardId"`
EvalMatches string `json:"evalMatches"`
ImageUrl string `json:"imageUrl"`
Message string `json:"message"`
OrgId string `json:"orgId"`
PanelId string `json:"panelId"`
RuleId string `json:"ruleId"`
RuleName string `json:"ruleName"`
RuleUrl string `json:"ruleUrl"`
State string `json:"state"`
Tags string `json:"tags"`
Title string `json:"title"`
}
const (
Url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="
OKMsg = "告警恢复"
AlertingMsg = "触发告警"
OK = "OK"
Alerting = "Alerting"
ColorGreen = "info"
ColorGray = "comment"
ColorRed = "warning"
)
// 发送消息
func SendMsg(c *gin.Context) {
h := &Hook{}
if err := c.BindJSON(&h); err != nil {
fmt.Println(err)
_, _ = c.Writer.WriteString("Error on JSON format")
return
}
marshal, _ := json.Marshal(h)
fmt.Println("接受参数数据:", string(marshal))
// 字符串替换
h.RuleUrl = strings.ReplaceAll(h.RuleUrl, ":3000", "")
color := ColorGreen
if strings.Contains(h.Title, OK) {
h.Title = strings.ReplaceAll(h.Title, OK, OKMsg)
} else {
h.Title = strings.ReplaceAll(h.Title, Alerting, AlertingMsg)
color = ColorRed
}
// Send to WeChat Work
url := Url + c.Query("key")
// 处理数据格式
msgStr := MsgMarkdown(h, color)
if c.Query("type") == "news" {
msgStr = MsgNews(h)
}
fmt.Println("发送的消息是:", msgStr)
jsonStr := []byte(msgStr)
// 发送http请求
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
_, _ = c.Writer.WriteString("Error sending to WeChat Work API")
return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("shuju:", string(body))
_, _ = c.Writer.Write(body)
return
}
// 发送消息类型 news
func MsgNews(h *Hook) string {
return fmt.Sprintf(`
{
"msgtype": "news",
"news": {
"articles": [
{
"title": "%s",
"description": "%s",
"url": "%s",
"picurl": "%s"
}
]
}
}
`, h.Title, h.Message, h.RuleUrl, h.ImageUrl)
}
// 发送消息类型
func MsgMarkdown(h *Hook, color string) string {
return fmt.Sprintf(`
{
"msgtype": "markdown",
"markdown": {
"content": "%s\r\n%s\r\n[点击查看详情](%s)![](%s)"
}
}`, color, h.Title, h.Message, h.RuleUrl, h.ImageUrl)
}
完整代码 github
企业微信配置这里不再讲解
- 前提你已经在 企业微信文档 申请过账号,也已经配置好配置好key
打包文件
go build -o wechat-alert main.go
配置请求方式
1. 在grafana中配置webhook
2. Webhook settings里添写
http://你的ip:88/send?key=微信的key
3. 点击Send Test
备注:Username和Password 无关紧要,可以随意填写。
备注
代码里实现了 发送企业微信的两种类型的消息。
- markdown(默认)
- news