自定义通知媒介
在阅读本节之前,请一定确保你已经阅读过《通知规则》章节的内容,而且《通知规则》章节中提到的那些外部链接资料,也都阅读过了。
下面我来模拟一个场景。假设我想使用企微应用(和企微机器人不是一个东西)来做告警通知,我们来捋一下整个流程。
基础配置
1、企微应用通知的时候,需要知道被通知的人的企微账号。夜莺里默认没有这个信息,我们可以自定义一个 wecomid 的联系方式的字段,然后各个用户自行配置一下。

上图中,wecomid 是我自定义的字段名,点击那个“联系方式管理”(只有管理员有权限),可以创建新的联系方式,这里我创建了一个新的联系方式叫 wecomid,用于配置各个用户的企微 ID。
2、创建一个自定义通知媒介,对应我自己的程序,当用户在夜莺里配置要发告警消息给这个通知媒介的时候,夜莺就会调用我的程序,我的程序就会去调用企微接口,使用企微应用的方式发送通知消息(当然,我这里不是实际发送,只是一个演示,仍然使用在 事件处理器 章节介绍的 gohttpd 小程序做演示)。

上图通知媒介的几个关键字段解释如下:
- 媒介类型:可以自定义,我这里随便取了个名字叫 wecomapp,通知媒介通常要和消息模板配合使用,只要消息模板的媒介类型也叫 wecomapp,媒介和消息模板就可以关联起来了。
- 联系方式:选择刚才创建的 wecomid 联系方式,这样夜莺在调用我的程序的时候,就会把
告警接收人的企微ID传给我。 - URL:我的程序的地址,夜莺会通过 HTTP POST 的方式调用这个地址,请求体的内容可以在下面定义。
- 请求体:用于定义回调的 HTTP request body 内容,可以引用几个变量,这个例子里我把三个关键变量都引用了
我的请求体:
{ |
$events是要发送的告警事件列表,虽然是个列表,实际开源版永远都只会有一条事件$sendtos是要发送给哪些接收者,最终是一个企微ID的列表,如果联系方式那里配置的是 Phone,这个$sendtos就是手机号列表$tpl是消息模板的内容,下面马上介绍
消息模板
最终在调用企微的接口发告警消息的时候,显然不是要把整个事件 JSON 发出来,那用户没法看。我们需要把事件格式化展示(比如 markdown 的方式),就像其他的通知媒介,都有对应的消息模板,自定义的通知媒介也需要有消息模板。下面我们就创建一个消息模板:

消息模板里可以创建多个字段(比如邮件模板,就需要自定义标题和内容,所以有两个字段),不过在企微应用这个场景里,不需要多个字段,我们就创建一个 content 字段即可,后面我们可以使用 markdown 格式来定义 content 字段的内容。比如:

我把 markdown 里的内容也贴出来供你参考:
**规则标题**: {{$event.RuleName}} |
我这里仅仅演示,所以 markdown 里渲染的字段比较少,你后面可以参考其他的模板来丰富这个内容。
💡 注意,消息模板的媒介类型需要和通知媒介的媒介类型一致,这样才能关联起来,故而我这里还是写的 wecomapp。
测试
现在我们就可以去测试一下了,创建一个通知规则:

为了方便测试,我这个通知规则没有配置任何过滤条件,即任何一个告警事件产生都会发给“企微应用”这个自定义通知媒介。
最后,我们去创建一个告警规则,关联刚才创建的通知规则:

稍等片刻,去观察 http://10.99.1.107:8888/print 这个程序是否收到回调的 HTTP 请求。我的环境里看到的结果如下:

我把 HTTP request body 的内容贴出来给你参考:
{ |
这个 request body 中不但有事件详情,还有 tpl,tpl 是渲染好的内容,你可以直接拿着这个内容去调用企微的接口。其中 sendtos 是企微 ID 的列表,因为我们在企微应用这个通知媒介里配置的联系方式是 wecomid,所以最终的 sendtos 里就是企微 ID 的列表,如果你在通知媒介里配置的联系方式是 Phone,那么 sendtos 里就是手机号的列表。
数据都拿到了,后面就是你的自定义逻辑以及调用企微的接口了。这里我使用 gohttpd 只是为了演示请求体的内容,显然 gohttpd 工具不具备发送企微应用消息的能力,你需要自己实现这个逻辑。即:需要你自己写一个程序,监听 HTTP 端口,提供一个 HTTP POST 接口,就像上面的 gohttpd 一样,接收夜莺的回调请求,然后解析请求体,拿到事件详情、接收人列表和消息模板内容,最后调用企微的接口发送消息。