Z.S.K.'s Records

Grafana学习(使用webhook实现微信图文告警)

grafana支持的告警方式很多种, 偏偏不直接支持wechat

就算最新版的prometheus也是不支持企业微信的,github已经有多个开发者提交了支持企业微信的branch, 但一直都没有合并到主分支中, 官方认为已经存在webhook的方式, 企业微信的alert完全可以由webook实现

因此要让grafana支持企业微信, 有两种方式:

  1. 基于开发者支持的企业微信分支进行源码编译grafana,
  2. 使用webhook

第一种方式github上有好几个实现,最新的一个分支实现可参考,

我看了一下,这个开发者同时也使用webhook的方式实现了企业微信的对接,非常的简洁,见github

g2ww

可以来简单分析一下, 最核心的发送消息的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
url := "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + c.Params("key")

msgStr := fmt.Sprintf(`
{
"msgtype": "news",
"news": {
"articles": [
{
"title": "%s",
"description": "%s",
"url": "%s",
"picurl": "%s"
}
]
}
}
`, h.Title, h.Message, h.RuleUrl, h.ImageUrl)

https://qyapi.weixin.qq.com/cgi-bin/webhook/send可以看到使用了机器人来发送群消息

从msgtype可以看到,群消息机器人使用的是news类型, 对于支持的消息类型可以参考

本人需求的最大一个点在于能够通过个人微信来接收企业微信的消息, 测试了下, 机器人发送的消息只会发送到企业微信里,而无法将信息发送到关联的个人微信中.

该库虽然简单,本人并未采用

wechat-work-message-push-go

这个库同样可以实现使用webhook来实现grafana的告警发送到企业微信中,然后通过个人微信关联企业微信实现消息同步.

也来简单分析一下

通过gin实现路由规则

1
2
3
4
5
func SetRoute(r *gin.Engine) {
r.GET("/", controller.Index)
r.POST("/push", middleware.TokenMiddleware, controller.Push)
r.POST("/grafana", middleware.BasicAuth(), controller.GrafaneHandler)
}

实现了两个方法, 一个push,这个用于发送消息, 主要看一下/grafana的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", token)
m := TextCardMessage{
Msgtype: "textcard",
Agentid: config.Config.WechatWork.AgentId,
}
if len(toUser) == 0 {
m.Touser = config.Config.WechatWork.DefaultReceiverUserId
} else {
m.Touser = toUser
}

m.TextCard.Title = title
m.TextCard.URL = imageUrl
m.TextCard.Description = content

jsonStr, err := json.Marshal(m)
if err != nil {
logger.Error("sendMessage error:%s", err)
SendMessage(err.Error(), "")
return err
}
postJson(url, jsonStr)

https://qyapi.weixin.qq.com/cgi-bin/message/send这里跟上面的区别在于上面是webhook这里是message, 从企业微信的官方文档来看, 两者支持的消息的类型也不一样, 可参考) ,这里使用的是textCard

同时,该库使用了一个用户密码认证的过程, 也增加了一层安全.

本人基于该库修改了一点源码编译后通过容器Run.

通过将相关的信息填入到容器的ENV中, 然后在grafana中填入相关信息即可

可以来测试一下/push接口:

1
2
3
4
5
curl -X POST \
http://127.0.0.1:80/push \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'token: your_token' \
-d 'message=1234'

即可在企业微信及个人微信中(前提是两者关联)收到信息

在上面的grafana的配置界面点击send test, 然后即可在微信中收到以下信息

点击进去之后会出现grafana的告警现场

参考文章:

转载请注明出处https://izsk.me

Z.S.K. wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?