夜鶯 v8 版本的通知媒介介紹,包含 Webhook、Email、簡訊等多種通知方式的使用方法。
在閱讀本節之前,請一定確保你已經閱讀過《通知規則》章節的內容,而且《通知規則》章節中提到的那些外部連結資料,也都閱讀過了。
下面我來模擬一個場景。假設我想使用企微應用(和企微機器人不是一個東西)來做告警通知,我們來捋一下整個流程。
基礎設定
1、企微應用通知的時候,需要知道被通知的人的企微帳號。夜鶯裡預設沒有這個資訊,我們可以自訂一個 wecomid 的聯絡方式的欄位,然後各個使用者自行設定一下。

上圖中,wecomid 是我自訂的欄位名,點擊那個「聯絡方式管理」(只有管理員有權限),可以建立新的聯絡方式,這裡我建立了一個新的聯絡方式叫 wecomid,用於設定各個使用者的企微 ID。
2、建立一個自訂通知媒介,對應我自己的程式,當使用者在夜鶯裡設定要發告警訊息給這個通知媒介的時候,夜鶯就會呼叫我的程式,我的程式就會去呼叫企微介面,使用企微應用的方式發送通知訊息(當然,我這裡不是實際發送,只是一個演示,仍然使用在 事件處理器 章節介紹的 gohttpd 小程式做演示)。

上圖通知媒介的幾個關鍵欄位解釋如下:
- 媒介類型:可以自訂,我這裡隨便取了個名字叫 wecomapp,通知媒介通常要和訊息範本配合使用,只要訊息範本的媒介類型也叫 wecomapp,媒介和訊息範本就可以關聯起來了。
- 聯絡方式:選擇剛才建立的 wecomid 聯絡方式,這樣夜鶯在呼叫我的程式的時候,就會把
告警接收人的企微ID傳給我。 - URL:我的程式的位址,夜鶯會透過 HTTP POST 的方式呼叫這個位址,請求體的內容可以在下面定義。
- 請求體:用於定義回呼的 HTTP request body 內容,可以引用幾個變數,這個例子裡我把三個關鍵變數都引用了
我的請求體:
{
"events": {{ jsonMarshal $events }},
"sendtos": {{ jsonMarshal $sendtos }},
"tpl": {{ jsonMarshal $tpl }}
}
$events是要發送的告警事件列表,雖然是個列表,實際開源版永遠都只會有一條事件$sendtos是要發送給哪些接收者,最終是一個企微ID的列表,如果聯絡方式那裡設定的是 Phone,這個$sendtos就是手機號列表$tpl是訊息範本的內容,下面馬上介紹
訊息範本
最終在呼叫企微的介面發告警訊息的時候,顯然不是要把整個事件 JSON 發出來,那使用者沒法看。我們需要把事件格式化展示(比如 markdown 的方式),就像其他的通知媒介,都有對應的訊息範本,自訂的通知媒介也需要有訊息範本。下面我們就建立一個訊息範本:

訊息範本裡可以建立多個欄位(比如郵件範本,就需要自訂標題和內容,所以有兩個欄位),不過在企微應用這個場景裡,不需要多個欄位,我們就建立一個 content 欄位即可,後面我們可以使用 markdown 格式來定義 content 欄位的內容。比如:

我把 markdown 裡的內容也貼出來供你參考:
**規則標題**: {{$event.RuleName}}
**監控指標**: {{$event.TagsJSON}}
**發送時間**: {{timestamp}}
我這裡僅僅演示,所以 markdown 裡渲染的欄位比較少,你後面可以參考其他的範本來豐富這個內容。
💡 注意,訊息範本的媒介類型需要和通知媒介的媒介類型一致,這樣才能關聯起來,故而我這裡還是寫的 wecomapp。
測試
現在我們就可以去測試一下了,建立一個通知規則:

為了方便測試,我這個通知規則沒有設定任何過濾條件,即任何一個告警事件產生都會發給「企微應用」這個自訂通知媒介。
最後,我們去建立一個告警規則,關聯剛才建立的通知規則:

稍等片刻,去觀察 http://10.99.1.107:8888/print 這個程式是否收到回呼的 HTTP 請求。我的環境裡看到的結果如下:

我把 HTTP request body 的內容貴出來給你參考:
{
"events": [{
"id": 1097655,
"cate": "prometheus",
"cluster": "prom",
"datasource_id": 1,
"group_id": 2,
"group_name": "DBA-Postgres",
"hash": "f75556af7cedbe250d3d8ab709634c96",
"rule_id": 56,
"rule_name": "测试自定义通知媒介2",
"rule_note": "",
"rule_prod": "metric",
"rule_algo": "",
"severity": 2,
"prom_for_duration": 0,
"prom_ql": "cpu_usage_active{ident=\"ulric-flashcat.local\"} > 0",
"rule_config": {
"queries": [{
"from": 0,
"prom_ql": "cpu_usage_active{ident=\"ulric-flashcat.local\"} > 0",
"range": {
"display": "now to now",
"end": "now",
"start": "now"
},
"severity": 2,
"to": 0,
"unit": "none"
}]
},
"prom_eval_interval": 15,
"callbacks": [],
"runbook_url": "",
"notify_recovered": 1,
"target_ident": "ulric-flashcat.local",
"target_note": "",
"trigger_time": 1749196393,
"trigger_value": "33.06867",
"trigger_values": "",
"trigger_values_json": {
"values_with_unit": {
"v": {
"value": 33.06867479671808,
"unit": "",
"text": "33.07",
"stat": 33.06867479671808
}
}
},
"tags": ["__name__=cpu_usage_active", "cpu=cpu-total", "ident=ulric-flashcat.local", "rulename=测试自定义通知媒介2"],
"tags_map": {
"__name__": "cpu_usage_active",
"cpu": "cpu-total",
"ident": "ulric-flashcat.local",
"rulename": "测试自定义通知媒介2"
},
"original_tags": ["", "", "", ""],
"annotations": {},
"is_recovered": false,
"last_eval_time": 1749196393,
"last_sent_time": 1749196393,
"notify_cur_number": 1,
"first_trigger_time": 1749196393,
"extra_config": {
"enrich_queries": []
},
"status": 0,
"claimant": "",
"sub_rule_id": 0,
"extra_info": null,
"target": null,
"recover_config": {
"judge_type": 0,
"recover_exp": ""
},
"rule_hash": "3c73b1b7f98f4c5a0178c85dedabf008",
"extra_info_map": null,
"notify_rule_ids": [4],
"notify_version": 0,
"notify_rules": null
}],
"sendtos": ["qinxiaohui"],
"tpl": {
"content": "**规则标题**: 测试自定义通知媒介2 \\n**监控指标**: [__name__=cpu_usage_active cpu=cpu-total ident=ulric-flashcat.local rulename=测试自定义通知媒介2] \\n**发送时间**: 2025-06-06 15:53:13 "
}
}
這個 request body 中不但有事件詳情,還有 tpl,tpl 是渲染好的內容,你可以直接拿著這個內容去呼叫企微的介面。其中 sendtos 是企微 ID 的列表,因為我們在企微應用這個通知媒介裡設定的聯絡方式是 wecomid,所以最終的 sendtos 裡就是企微 ID 的列表,如果你在通知媒介裡設定的聯絡方式是 Phone,那麼 sendtos 裡就是手機號的列表。
資料都拿到了,後面就是你的自訂邏輯以及呼叫企微的介面了。這裡我使用 gohttpd 只是為了演示請求體的內容,顯然 gohttpd 工具不具備發送企微應用訊息的能力,你需要自己實作這個邏輯。即:需要你自己寫一個程式,監聽 HTTP 連接埠,提供一個 HTTP POST 介面,就像上面的 gohttpd 一樣,接收夜鶯的回呼請求,然後解析請求體,拿到事件詳情、接收人列表和訊息範本內容,最後呼叫企微的介面發送訊息。