grafana发送企业微信报警(alerting)配置,webhook

开始配置

在grafana管理界面
WechatIMG7.jpeg

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

结束

你可能感兴趣的:(grafana发送企业微信报警(alerting)配置,webhook)