夜莺监控 v8 从 beta7 版本开始引入新版通知规则。本文不再重复新版通知规则的背景,直接说明如何使用通知规则对接飞书告警。
如果你还没有看过相关基础文章,建议先读:
- 新版通知规则介绍:夜莺监控巨大革新:抽象出通知规则,增强告警通知的灵活性
- 新版通知规则对接钉钉:夜莺监控 v8.0 新版通知规则 | 对接钉钉告警
- 新版通知规则对接企微:夜莺监控 v8.0 新版通知规则 | 对接企微告警
开源夜莺和飞书的对接支持 text 和飞书卡片两种方式,不支持飞书应用。Flashduty 和飞书应用的对接非常丝滑,感兴趣的小伙伴可以试试 Flashduty。
核心要点
- 夜莺飞书通知可以使用普通 text 消息,也可以使用飞书卡片消息。
- 实际告警通知更推荐飞书卡片,因为告警和恢复的展示区分更清楚。
- 通知媒介保持默认即可工作,重点是修改
feishu和feishucard消息模板里的domain变量。 - 如果卡片消息缺少告警标签详情,可以在
feishucard模板中补充$event.TagsJSON或基于$event.TagsMap自定义展示。
通知规则如何配置

通知规则中可以同时对接多个媒介。上例中同时对接了普通飞书 text 消息和飞书卡片消息,并复用了同一个机器人 Token。
理论上,每次告警触发时会同时发送两条消息:
- 一条普通 text 格式的飞书消息。
- 一条飞书卡片格式的消息。
如果生产环境只想保留一种方式,建议优先保留卡片消息。卡片在告警、恢复等状态上更容易区分,阅读体验也更好。
消息模板需要修改什么
找到 feishu 和 feishucard 两个消息模板,修改其中的 domain 变量:
{{$domain := "http://10.211.55.3:17000" }}
把这个地址改成你自己的夜莺访问地址。这个变量用于生成告警通知中的操作入口,例如“事件详情”“屏蔽 1 小时”“查询曲线”等。
如果 domain 没有改,飞书消息可能仍然能收到,但按钮会跳到错误地址,值班人员无法直接进入夜莺处理事件。
最终效果
通知媒介不用改,保持默认即可工作。最终效果如下:

上图里有 4 条消息:前两条是告警消息,后两条是恢复消息。对于飞书卡片类型,告警消息和恢复消息的卡片颜色有区别,识别起来更直接。
v8.0.0-beta7 中需要注意的问题
原文测试的 v8.0.0-beta7 版本还不是特别完善,测试时发现两个问题:
- text 类型消息中,“屏蔽 1 小时”按钮没有把事件相关字段带到屏蔽规则中,推测是
&符号转义问题,需要后续版本完善。 - 卡片消息模板中缺少
{{$event.TagsJSON}},也就是告警事件的标签信息。如果需要展示标签,可以自行添加。
如果你使用的是这个版本,建议优先测试飞书卡片方式,并检查按钮链接和告警详情字段。
如何在飞书卡片中展示告警详情
可以把 feishucard 模板改成下面的内容,重点是添加 **告警详情:** {{$event.TagsJSON}}:
{{ if $event.IsRecovered }}
{{- if ne $event.Cate "host"}}
**告警集群:** {{$event.Cluster}}{{end}}
**级别状态:** S{{$event.Severity}} Recovered
**告警名称:** {{$event.RuleName}}
**告警详情:** {{$event.TagsJSON}}
**恢复时间:** {{timeformat $event.LastEvalTime}}
**告警描述:** **服务已恢复**
{{- else }}
{{- if ne $event.Cate "host"}}
**告警集群:** {{$event.Cluster}}{{end}}
**级别状态:** S{{$event.Severity}} Triggered
**告警名称:** {{$event.RuleName}}
**告警详情:** {{$event.TagsJSON}}
**触发时间:** {{timeformat $event.TriggerTime}}
**发送时间:** {{timestamp}}
**触发时值:** {{$event.TriggerValue}}
{{if $event.RuleNote }}**告警描述:** **{{$event.RuleNote}}**{{end}}
{{- end -}}
{{$domain := "http://10.211.55.3:17000" }}
[事件详情]({{$domain}}/alert-his-events/{{$event.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{$event.GroupId}}&cate={{$event.Cate}}&datasource_ids={{$event.DatasourceId}}&prod={{$event.RuleProd}}{{range $key, $value := $event.TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{$event.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{$event.PromQl|escape}})
添加之后,生成的告警事件如下:

如何避免告警名称和标签重复展示
如果你发现告警名称和告警详情字段中的 rulename 重复,可以把:
**告警详情:** {{$event.TagsJSON}}
改成:
**告警详情:** [{{range $key, $value := $event.TagsMap}}{{if ne $key "rulename"}}{{$key}}={{$value}} {{end}}{{end}}]
这样会遍历 TagsMap,并排除 rulename 标签。最终 feishucard 消息模板可以写成:
{{ if $event.IsRecovered }}
{{- if ne $event.Cate "host"}}
**告警集群:** {{$event.Cluster}}{{end}}
**级别状态:** S{{$event.Severity}} Recovered
**告警名称:** {{$event.RuleName}}
**告警详情:** [{{range $key, $value := $event.TagsMap}}{{if ne $key "rulename"}}{{$key}}={{$value}} {{end}}{{end}}]
**恢复时间:** {{timeformat $event.LastEvalTime}}
**告警描述:** **服务已恢复**
{{- else }}
{{- if ne $event.Cate "host"}}
**告警集群:** {{$event.Cluster}}{{end}}
**级别状态:** S{{$event.Severity}} Triggered
**告警名称:** {{$event.RuleName}}
**告警详情:** [{{range $key, $value := $event.TagsMap}}{{if ne $key "rulename"}}{{$key}}={{$value}} {{end}}{{end}}]
**触发时间:** {{timeformat $event.TriggerTime}}
**发送时间:** {{timestamp}}
**触发时值:** {{$event.TriggerValue}}
{{if $event.RuleNote }}**告警描述:** **{{$event.RuleNote}}**{{end}}
{{- end -}}
{{$domain := "http://10.211.55.3:17000" }}
[事件详情]({{$domain}}/alert-his-events/{{$event.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{$event.GroupId}}&cate={{$event.Cate}}&datasource_ids={{$event.DatasourceId}}&prod={{$event.RuleProd}}{{range $key, $value := $event.TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{$event.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{$event.PromQl|escape}})
配置检查清单
飞书告警配置完成后,建议检查:
- 通知规则中是否添加了飞书或飞书卡片通知媒介。
- 机器人 Token 是否来自正确的飞书机器人。
feishu或feishucard模板中的domain是否是自己的夜莺访问地址。- 告警消息和恢复消息是否能正确区分。
- “事件详情”“屏蔽 1 小时”“查看曲线”等链接是否能正常打开。
- 卡片消息是否展示了值班人员需要的标签信息。
总结
夜莺 v8 对接飞书告警的重点不在通知媒介本身,而在消息模板。通知媒介保持默认即可工作,但 feishu 和 feishucard 模板中的 domain 必须改成真实夜莺地址。实际使用时,优先选择飞书卡片方式,并根据团队排障习惯补充告警标签详情。