ZABBIX新功能系列1-使用Webhook將告警主動推送至第三方系統

linwinfan發表於2022-05-06

       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"將可以手動測試指令碼的執行,這個後面我會單獨作為系列的一個題目介紹。

圖片

如果您喜歡這個系列,請掃描關注:

 

相關文章