夜莺监控 v8.0 新版通知规则 | 对接钉钉告警,如何配置 at 人
前置知识
想要了解钉钉告警如何配置 at 人,需要一些前置知识,请先阅读下面两篇文章:
- 新版通知规则的介绍文章:夜莺监控巨大革新:抽象出通知规则,增强告警通知的灵活性
- 新版通知规则对接钉钉:夜莺监控 v8.0 新版通知规则 | 对接钉钉告警
逻辑讲解
钉钉中,text 消息和 markdown 消息的 at 人逻辑是不一样的,不知道是哪个鬼才设计的。我使用两条 curl 命令来演示:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"msgtype": "text",
"text": {
"content": "这是 text 文本消息 at: 2025-03"
},
"at": {
"atMobiles": ["18612185520"],
"isAtAll": false
}
}' \
'https://oapi.dingtalk.com/robot/send?access_token=your_access_token'
上面是 text 类型的消息,你想 at 谁,就把手机号写到 atMobiles 里边,atMobiles 是一个数组,可以 at 多个人。text.content
是消息内容,里边不需要写 @18612185520
这种字符串。另外,消息内容中我故意写了一个日期 2025-03
,因为我这个机器人使用关键字鉴权,我配置的关键字是 20
,所以消息中必须包含 20
这个字符串,否则消息发送失败。
你可以把上面的手机号换成自己的,把 your_access_token
换成自己的机器人 token,然后执行一下,看看效果。
实际在告警消息中,钉钉告警一般会采用 markdown 消息,下面再演示一下 markdown 消息的发送命令:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"msgtype": "markdown",
"markdown": {
"title": "测试标题",
"text": "#### 测试标题\n\n> 这是一条2025年的测试消息 \n\n@18612185520"
},
"at": {
"atMobiles": ["18612185520"],
"isAtAll": false
}
}' \
'https://oapi.dingtalk.com/robot/send?access_token=your_access_token'
markdown 类型的消息体和 text 的消息体格式不同,请注意。atMobiles 和 isAtAll 两个字段和 text 类型的消息体一样。但是 markdown 类型的消息体中,想要 at 某些人,只把手机号写到 atMobiles 中是不够的,还需要在消息体中显式的写 @18612185520
这种字符串,否则 at 人不生效。如果想 at 多个人,就写多个 @18612185520
这种字符串,比如 @18612185520 @18612185521
。
夜莺中使用钉钉 at 人的逻辑
上面内容消化了之后,再来看夜莺中如何实现这个 at 人的逻辑。这需要夜莺 v8.0.0-beta.8 以上的版本。有两个办法来做到 at 人的效果:
- 方案一:在 DingTalk 通知媒介里,「变量配置」那里,定义一个“自定义参数变量”,比如叫 ats,让用户在通知规则里用到这个媒介的时候,顺便填写一下要 at 的人。这个方法不太好,因为手机号写死了,不够灵活。万一后面用户想修改手机号,就得修改通知规则,这个不太好。
- 方案二:在 DingTalk 通知媒介里,「变量配置」那里,联系方式选择「Phone」,这样在通知规则里就可以选择联系人了,选择了哪些联系人,就自动获取这些人的手机号,然后 at 这些手机号。这个方法相对更好。
根据上文讲解的钉钉的消息格式,我们可以知道,在 markdown 类型的消息中,需要把要 at 的手机号放到 atMobiles 中,同时在文本里写 @18612185520
这种字符串。那怎么实现这个效果呢?实际也简单,就是在 DingTalk 通知媒介最下面的请求体中写如下内容:
{"msgtype": "markdown", "markdown": {"title": "{{$tpl.title}}", "text": "{{$tpl.content}}\n\n{{batchContactsAts $sendtos}}"}, "at": {"atMobiles": {{batchContactsJsonMarshal $sendtos}} }}
很明显,这就是钉钉的 markdown 消息模板,其中引用了 $tpl.title
、$tpl.content
、$sendtos
这三个变量。$tpl.title
和 $tpl.content
是告警事件的标题和内容,来自「通知规则」里指定的钉钉消息模板,$sendtos
是一批联系方式,因为「联系方式」那里选择的 Phone,所以 $sendtos
就是用户选择的人员的手机号列表。batchContactsAts
和 batchContactsJsonMarshal
是两个函数:
batchContactsAts
是把手机号列表转换成@18612185520 @18612185521
这种字符串batchContactsJsonMarshal
是把手机号列表转换成["18612185520", "18612185521"]
这种 json 字符串
这两个函数是夜莺 v8.0.0-beta.8 以上版本内置的,你不需要关心,直接用就行。