夜鶯 v9 消息範本:用 Go template 語法定義告警通知的標題和正文,平台內建 30+ 範本覆蓋主流 IM/簡訊/Webhook 通道,可基於事件欄位做高度自訂。
概述
消息範本 = 通知發到 IM / 郵箱 / Webhook 時最終長什麼樣的定義。
側欄路徑:通知 → 消息範本,URL /notification-templates。
它和通知媒介的關係:
- 通知媒介 = 答「怎麼發」— 拿什麼 SMTP/Webhook 把消息送出去;
- 消息範本 = 答「發什麼內容」— 標題、正文、HTML 樣式、變數引用;
- 通知規則 = 答「發給誰」+ 選媒介 + 選範本。
平台內建了 30+ 套常見通道的範本(覆蓋釘釘、企業微信、飛書、Lark、Email、PagerDuty 等),多數場景直接用就行。需要個性化(公司 logo、企業話術、補充欄位)時基於內建範本複製一份再改。
頁面版面
左右兩欄:
- 左側:範本列表 + 搜尋框 + 新增按鈕
- 每條顯示:範本標識(如
Email/Dingtalk/Wecom)+ 可見性(公開 / 僅自己 / 指定團隊)
- 每條顯示:範本標識(如
- 右側:選中範本的詳情
- 頭部:標識、媒介類型、編輯 / 複製 / 刪除按鈕;
- 中間:欄位標識區域(如
content、subject、title)— 每個媒介需要哪些欄位是它定的; - 編輯器:Go template 語法的 Markdown / HTML / Text 內容;
- 「AI 生成」按鈕:用 LLM 直接生成範本片段(需先設定 LLM 管理);
- 底部:儲存、預覽範本內容;
- 右下:可用欄位速查文件(含
$event.*完整欄位表)。
內建範本速覽
按通道分類的內建範本:
| 通道類型 | 內建範本 |
|---|---|
| 企業 IM | Dingtalk、Wecom、Feishu、FeishuCard、Lark、LarkCard、Telegram、Discord、SlackBot、SlackWebhook、Mm、MattermostBot、MattermostWebhook |
| 郵件 / 簡訊 / 語音 | Email、Tencent SMS、Tencent Voice、Aliyun SMS、Aliyun Voice |
| 運維平台 | Callback、JSMAlert、Jira |
| 特色範本 | 北極星釘釘/飛書/企微消息、滅火圖 釘釘/飛書/企微卡片 |
新裝的環境就有這些,無需手工建立。直接在 通知規則 裡挑選即可。
欄位標識:範本 ↔ 媒介的對接契約
關鍵概念:消息範本裡定義的欄位名(如 subject、content、title),必須和通知媒介在 body 設定裡引用的欄位名一一對應。
舉例:釘釘媒介在 body 裡寫:
{
"msgtype": "markdown",
"markdown": {
"title": "{{$tpl.title}}",
"text": "{{$tpl.content}}"
}
}
它引用了 $tpl.title 和 $tpl.content —— 所以釘釘對應的消息範本必須有 title 和 content 兩個欄位標識。否則發出去標題/內容會是空。
如果自己加新欄位(比如想多加一段「建議處理」),記得兩邊都改 — 範本裡加欄位 + 媒介 body 裡引用。
範本語法快速回顧
範本使用 Go template 語法,可以引用告警事件(AlertCurEvent)的所有欄位。
最簡範本範例
級別狀態: S{{$event.Severity}} {{if $event.IsRecovered}}Recovered{{else}}Triggered{{end}}
規則名稱: {{$event.RuleName}}{{if $event.RuleNote}}
規則備註: {{$event.RuleNote}}{{end}}
監控指標: {{$event.TagsJSON}}
{{if $event.IsRecovered}}恢復時間:{{timeformat $event.LastEvalTime}}{{else}}觸發時間: {{timeformat $event.TriggerTime}}
觸發時值: {{$event.TriggerValue}}{{end}}
傳送時間: {{timestamp}}
{{$domain := "http://your-n9e-domain"}}
事件詳情: {{$domain}}/alert-his-events/{{$event.Id}}
常用控制語法
| 用法 | 範例 |
|---|---|
| 條件判斷 | {{if eq $event.Severity 1}}🚨 緊急{{else if eq $event.Severity 2}}⚠️ 警告{{else}}ℹ️ 資訊{{end}} |
| 迴圈 | {{range $i, $tag := $event.TagsJSON}}- {{$tag}}{{"\n"}}{{end}} |
| 變數賦值 | {{$dashboard_url := printf "%s/alert-his-events/%d" $domain $event.Id}} |
| 函式呼叫 | {{timeformat $event.LastEvalTime}}、{{timestamp}} |
| 引用標籤 | {{$event.TagsMap.instance}}、{{$event.TagsMap.service}} |
| 引用註解 | {{$event.AnnotationsJSON.summary}} |
常用事件欄位
| 欄位 | 含義 |
|---|---|
$event.RuleName |
告警規則名 |
$event.RuleNote |
規則備註 |
$event.Severity |
1/2/3 三級 |
$event.IsRecovered |
true = 恢復事件 |
$event.TagsJSON |
標籤陣列 |
$event.TagsMap.<key> |
單個標籤值 |
$event.TriggerValue |
觸發瞬時值 |
$event.TriggerTime |
觸發時間戳 |
$event.LastEvalTime |
最近評估時間戳 |
$event.GroupName |
業務組名 |
$event.TargetIdent |
目標裝置標識 |
$event.Cluster |
資料來源名 |
$event.AnnotationsJSON.<key> |
註解值 |
完整欄位表和範本函式列表見右下角的「可用欄位說明」區域(頁面內嵌的欄位速查表)。範本函式實現見 ccfos/nightingale 的 tplx.go 和 範本函式介紹 文件。
實操:複製 + 改造一個範本
不要直接改內建範本(升級會被覆蓋)。推薦流程:
- 在左側列表選要參考的範本,比如
Dingtalk; - 在右側上方點「複製」按鈕 — 自動新建一份
Dingtalk_copy副本; - 改副本:起個新標識(如
Dingtalk-ops表示運維專用版)、修改 content 內容; - 「預覽範本內容」按鈕:拿一條樣例事件渲染看看效果;
- 滿意後儲存;
- 去 通知規則 把要用這套樣式的規則切換到新範本。
AI 生成範本
「AI 生成」按鈕呼叫平台 LLM 管理 設定的預設大模型,用自然語言產生範本片段。典型 prompt 例子:
- 「產生一個帶 emoji、按級別分顏色的釘釘 markdown 告警範本」
- 「產生一個簡潔的郵件主題,要包含級別和規則名」
產生的內容會自動填入編輯器,可以再人工調整。前置條件是 LLM 管理裡至少有一條啟用 + 預設的 LLM 設定。
常見問題
Q1:儲存範本後通知裡沒生效?
A:檢查這 3 點:
- 快取:範本快取幾秒,等 10-30 秒再觸發告警;
- 正確選擇:通知規則 裡「消息範本」那一欄選的是不是新範本;
- 欄位標識對:範本裡的欄位名(
content、subject等)必須和通知媒介 body 裡引用的$tpl.xxx完全一致。
Q2:預覽看著對,發出去全是 <no value>?
A:範本裡用了事件沒有的欄位。比如 $event.TagsMap.dept,但實際事件標籤裡沒 dept 這個 key。兩種處理:
- 用條件判斷:
{{if $event.TagsMap.dept}}{{$event.TagsMap.dept}}{{else}}未知{{end}}; - 或者直接保證標籤必填(用標籤詞表注入預設值)。
Q3:想發企業微信/釘釘的圖片或連結卡片,但內建範本裡沒找到?
A:
- 釘釘群機器人有「卡片消息」格式 — 用
Dingtalk範本,把content改成釘釘 ActionCard 格式即可; - 飛書/Lark 用
FeishuCard/LarkCard範本,它們已經是卡片樣式; - 想發完全自訂的內容,用
Callback範本 + 通用回呼媒介,自己拼 JSON 轉發。