夜鶯 v9 消息範本:用 Go template 語法定義告警通知的標題和正文,平台內建 30+ 範本覆蓋主流 IM/簡訊/Webhook 通道,可基於事件欄位做高度自訂。

概述

消息範本 = 通知發到 IM / 郵箱 / Webhook 時最終長什麼樣的定義。

側欄路徑:通知 → 消息範本,URL /notification-templates

它和通知媒介的關係:

  • 通知媒介 = 答「怎麼發」— 拿什麼 SMTP/Webhook 把消息送出去;
  • 消息範本 = 答「發什麼內容」— 標題、正文、HTML 樣式、變數引用;
  • 通知規則 = 答「發給誰」+ 選媒介 + 選範本。

平台內建了 30+ 套常見通道的範本(覆蓋釘釘、企業微信、飛書、Lark、Email、PagerDuty 等),多數場景直接用就行。需要個性化(公司 logo、企業話術、補充欄位)時基於內建範本複製一份再改

頁面版面

左右兩欄:

  • 左側:範本列表 + 搜尋框 + 新增按鈕
    • 每條顯示:範本標識(如 Email / Dingtalk / Wecom)+ 可見性(公開 / 僅自己 / 指定團隊)
  • 右側:選中範本的詳情
    • 頭部:標識、媒介類型、編輯 / 複製 / 刪除按鈕;
    • 中間:欄位標識區域(如 contentsubjecttitle)— 每個媒介需要哪些欄位是它定的;
    • 編輯器: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
特色範本 北極星釘釘/飛書/企微消息、滅火圖 釘釘/飛書/企微卡片

新裝的環境就有這些,無需手工建立。直接在 通知規則 裡挑選即可。

欄位標識:範本 ↔ 媒介的對接契約

關鍵概念:消息範本裡定義的欄位名(如 subjectcontenttitle),必須和通知媒介在 body 設定裡引用的欄位名一一對應

舉例:釘釘媒介在 body 裡寫:

{
  "msgtype": "markdown",
  "markdown": {
    "title": "{{$tpl.title}}",
    "text": "{{$tpl.content}}"
  }
}

它引用了 $tpl.title$tpl.content —— 所以釘釘對應的消息範本必須有 titlecontent 兩個欄位標識。否則發出去標題/內容會是空。

如果自己加新欄位(比如想多加一段「建議處理」),記得兩邊都改 — 範本裡加欄位 + 媒介 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範本函式介紹 文件。

實操:複製 + 改造一個範本

不要直接改內建範本(升級會被覆蓋)。推薦流程:

  1. 在左側列表選要參考的範本,比如 Dingtalk
  2. 在右側上方點「複製」按鈕 — 自動新建一份 Dingtalk_copy 副本;
  3. 改副本:起個新標識(如 Dingtalk-ops 表示運維專用版)、修改 content 內容;
  4. 預覽範本內容」按鈕:拿一條樣例事件渲染看看效果;
  5. 滿意後儲存;
  6. 通知規則 把要用這套樣式的規則切換到新範本。

AI 生成範本

「AI 生成」按鈕呼叫平台 LLM 管理 設定的預設大模型,用自然語言產生範本片段。典型 prompt 例子:

  • 「產生一個帶 emoji、按級別分顏色的釘釘 markdown 告警範本」
  • 「產生一個簡潔的郵件主題,要包含級別和規則名」

產生的內容會自動填入編輯器,可以再人工調整。前置條件是 LLM 管理裡至少有一條啟用 + 預設的 LLM 設定。

常見問題

Q1:儲存範本後通知裡沒生效?

A:檢查這 3 點:

  1. 快取:範本快取幾秒,等 10-30 秒再觸發告警;
  2. 正確選擇通知規則 裡「消息範本」那一欄選的是不是新範本;
  3. 欄位標識對:範本裡的欄位名(contentsubject 等)必須和通知媒介 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 轉發。

參考資料

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云