Zabbix5以來的新版本與以前的版本除UI介面變化較大外,在很多功能上也有許多亮點,我這裡計劃安排1個系列來和大家交流一些新功能的使用,這是第一篇:使用Webhook將告警主動推送至第三方系統。
首先說一下什麼是Webhook?它是一個api概念,微服務api的使用正規化之一,簡單來說Webhook就是一個接收HTTP POST(或GET,PUT,DELETE)的URL。一個實現了Webhook的API就是在當事件發生的時候會向這個配置好的URL傳送一條資訊,與請求-響應式不同,使用Webhook,可以實時接收到訊息。以往Zabbix的告警主動推送主要有2種方法,一種是使用郵件或簡訊等方式,另一種是使用自定義Shell指令碼的方式來實現,現在Zabbix與主流技術接軌,使用Webhook就可以推送到第三方系統,且已提供了與許多系統的示例,如Jira,Redmine,OTRS等。
下面我們就來講講如定義一個Webhook來推送告警。
1.點選“管理”-“報警媒介型別"-"建立媒介型別"
2.在”報警媒介型別“頁面選擇”型別“為“Webhook”,然後輸入相關引數,如果新建,建議可以從一個已有的如"Jira"。
屬性 | 使用說明 |
---|---|
引數 | webhook 變數是屬性與值的字典。
對於預配置的 webhook,引數列表會有所不同,具體取決於Webhook服務介面的定義。 對於新的 webhook,預設包含幾個常用變數(URL:<empty>、HTTPProxy:<empty>、To:{ALERT.SENDTO}、Subject:{ALERT.SUBJECT}、Message:{ALERT.MESSAGE }),你可以保留或刪除它們。引數支援問題通知中支援的 所有巨集。如果使用 HTTP 代理,代理字串需要字首[scheme]://指定使用哪種代理(例如 https、socks4、socks5;) |
指令碼 |
這裡輸入 JavaScript 程式碼,程式碼執行 webhook 操作。 該指令碼是一個接受屬性-值(即上面編輯的引數)的函式程式碼。使用 JSON.parse() 方法將值轉換為 JSON 物件,例如:var params = JSON.parse(value);. 該程式碼可以訪問所有引數,它可以執行 HTTP GET、POST、PUT 和 DELETE 請求,並且可以控制 HTTP 的header與body。 指令碼必須包含返回值,否則將無效。它可能會返回執行成功狀態以及TAG和VALUE的可選列表或錯誤資訊。 請注意,該指令碼僅在建立警報後執行。如果指令碼配置為返回TAG,這些TAG不會在最近的告警訊息和恢復訊息中的 {EVENT.TAGS} 和 {EVENT.RECOVERY.TAGS} 巨集中得到解析。 |
超時 |
JavaScript 執行超時(1-60 秒,預設 30 秒)。 |
Process tags |
選擇它會將返回的 JSON 作為TAG處理。這些TAG將被新增到 Zabbix 中已經存在的(如果有的話)問題事件標籤中。 如果選擇了它,則 webhook 應始終返回一個 JSON 物件,其中至少包含一個空的TAG物件:var result = {tags: {}};。 示例:‘Jira ID’: ‘PROD-1234’等 |
Include event menu entry |
選擇它將“動作”選單中包含一個連結到建立的外部系統的選單專案。 如果選擇它,則不應該使用 webhook 向不同使用者傳送通知,因為這樣將可能生成多個與單個問題事件相關的多個警報操作 |
Menu entry name | 指定選單名稱。可以使用{EVENT.TAGS.<tag name>} 巨集. 如果選擇了 Include event menu entry 該項必填. |
Menu entry URL | 指定選單的入口URL。Specify the underlying URL of the menu entry.可以使用{EVENT.TAGS.<tag name>} 巨集. 如果選擇了 Include event menu entry 該項必填. |
3.輸入指令碼,示例程式碼:
try {
Zabbix.log(4, '[ Jira webhook ] Started with params: ' + value);
var result = {
'tags': {
'endpoint': 'jira'
}
},
params = JSON.parse(value),
req = new HttpRequest(),
fields = {},
resp;
if (params.HTTPProxy) {
req.setProxy(params.HTTPProxy);
}
req.addHeader('Content-Type: application/json');
req.addHeader('Authorization: Basic ' + params.authentication);
fields.summary = params.summary;
fields.description = params.description;
fields.project = {key: params.project_key};
fields.issuetype = {id: params.issue_id};
resp = req.post('https://tsupport.zabbix.lan/rest/api/2/issue/',
JSON.stringify({"fields": fields})
);
if (req.getStatus() != 201) {
throw 'Response code: ' + req.getStatus();
}
resp = JSON.parse(resp);
result.tags.issue_id = resp.id;
result.tags.issue_key = resp.key;
return JSON.stringify(result);
}
catch (error) {
Zabbix.log(4, '[ Jira webhook ] Issue creation failed json : ' + JSON.stringify({"fields": fields}));
Zabbix.log(3, '[ Jira webhook ] issue creation failed : ' + error);
throw 'Failed with error: ' + error;
}
4.配置專用使用者並配報警媒介
Webhook的最佳實踐是配置對應的專用使用者並聯系對應的報警媒介。
5.配置觸發器動作來執行Webhook
建立一個新的動作
如果上面一切配置正常,當發生對應的告警將會執行對應的WEBHOOK操作,而且在5.4的版本可以定義Webhook指令碼,複製上面定義的指令碼到“管理”-“指令碼”中建立一個新的指令碼,並配置指令碼作用於“Manual event action"將可以手動測試指令碼的執行,這個後面我會單獨作為系列的一個題目介紹。
如果您喜歡這個系列,請掃描關注: