夜鶯 v8 版本的通知媒介介紹,包含 Webhook、Email、簡訊等多種通知方式的使用方法。

在閱讀本節之前,請一定確保你已經閱讀過《通知規則》章節的內容,而且《通知規則》章節中提到的那些外部連結資料,也都閱讀過了。

下面我來模擬一個場景。假設我想使用企微應用(和企微機器人不是一個東西)來做告警通知,我們來捋一下整個流程。

基礎設定

1、企微應用通知的時候,需要知道被通知的人的企微帳號。夜鶯裡預設沒有這個資訊,我們可以自訂一個 wecomid 的聯絡方式的欄位,然後各個使用者自行設定一下。

add contact

上圖中,wecomid 是我自訂的欄位名,點擊那個「聯絡方式管理」(只有管理員有權限),可以建立新的聯絡方式,這裡我建立了一個新的聯絡方式叫 wecomid,用於設定各個使用者的企微 ID。

2、建立一個自訂通知媒介,對應我自己的程式,當使用者在夜鶯裡設定要發告警訊息給這個通知媒介的時候,夜鶯就會呼叫我的程式,我的程式就會去呼叫企微介面,使用企微應用的方式發送通知訊息(當然,我這裡不是實際發送,只是一個演示,仍然使用在 事件處理器 章節介紹的 gohttpd 小程式做演示)。

media type configuration

上圖通知媒介的幾個關鍵欄位解釋如下:

  • 媒介類型:可以自訂,我這裡隨便取了個名字叫 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 的方式),就像其他的通知媒介,都有對應的訊息範本,自訂的通知媒介也需要有訊息範本。下面我們就建立一個訊息範本:

new message template

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

message template example

我把 markdown 裡的內容也貼出來供你參考:

**規則標題**: {{$event.RuleName}}   
**監控指標**: {{$event.TagsJSON}}   
**發送時間**: {{timestamp}}   

我這裡僅僅演示,所以 markdown 裡渲染的欄位比較少,你後面可以參考其他的範本來豐富這個內容。

💡 注意,訊息範本的媒介類型需要和通知媒介的媒介類型一致,這樣才能關聯起來,故而我這裡還是寫的 wecomapp。

測試

現在我們就可以去測試一下了,建立一個通知規則:

notify rule

為了方便測試,我這個通知規則沒有設定任何過濾條件,即任何一個告警事件產生都會發給「企微應用」這個自訂通知媒介。

最後,我們去建立一個告警規則,關聯剛才建立的通知規則:

alert rule

稍等片刻,去觀察 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 一樣,接收夜鶯的回呼請求,然後解析請求體,拿到事件詳情、接收人列表和訊息範本內容,最後呼叫企微的介面發送訊息。

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