夜莺监控 v8.0 新版通知规则 | 对接钉钉告警,如何配置 at 人

Product Team @快猫星云 2025-03-11 07:54:23

前置知识

想要了解钉钉告警如何配置 at 人,需要一些前置知识,请先阅读下面两篇文章:

逻辑讲解

钉钉中,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 就是用户选择的人员的手机号列表。batchContactsAtsbatchContactsJsonMarshal 是两个函数:

  • batchContactsAts 是把手机号列表转换成 @18612185520 @18612185521 这种字符串
  • batchContactsJsonMarshal 是把手机号列表转换成 ["18612185520", "18612185521"] 这种 json 字符串

这两个函数是夜莺 v8.0.0-beta.8 以上版本内置的,你不需要关心,直接用就行。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat