專欄|Zabbix使用JavaScript配置Webhook發送告警通知
背景
zabbix從4.4開始支持使用自定義的javaScript代碼來配置Webhook媒介類型實現故障報警通知,這又為用戶提供了一種使用前端代碼來進行報警通知的方式。相比于在后端配置告警腳本的好處是代碼可維護性更強,支持媒介類型的導入導出,省去了后端調試代碼的步驟,使zabbix更加的開箱即用。本文介紹Webhook的媒介類型是怎么配置的。
實現原理
Zabbix封裝的javaScript對象
寫入zabbix日志的對象
例如:
Zabbix.Log(3, "this is a log entry written with 'Warning' log level")
http請求對象
try { Zabbix.Log(4, 'jira webhook script value='+value); var result = { 'tags': { 'endpoint': 'jira' } }, params = JSON.parse(value), req = new CurlHttpRequest(), fields = {}, resp; 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.Status() != 201) { throw 'Response code: '+req.Status(); } resp = JSON.parse(resp); result.tags.issue_id = resp.id; result.tags.issue_key = resp.key; } catch (error) { Zabbix.Log(4, 'jira issue creation failed json : '+JSON.stringify({"fields": fields})); Zabbix.Log(4, 'jira issue creation failed : '+error); result = {}; } return JSON.stringify(result);
配置Webhook
Webhook開發指南
Webhook 配置或 Webhook 測試中使用的值無效。
缺少網絡鉤子參數。webhook 代碼應該驗證所需的參數并確定必需的參數是否存在。
宏是否被解析。
是否有響應并且沒有 HTTP 錯誤。
響應是否包含預期格式的數據(原始/JSON/XML/等)。
響應是否包含所有必需的字段或數據。
響應數據中有沒有錯誤。
應提供調試級別信息。?這可用于找出 webhook 邏輯中錯誤的原因。
不需要在更高級別創建日志條目,因為 Zabbix 服務器會自動在“警告”(3)級別記錄失敗的 webhooks。
日志條目應以 WEBHOOK 名稱為前綴。這樣是為了區分 webhook 創建的日志與和Zabbix Server 日志文件中的其他日志。
無需在 WEBHOOK 的每一步都創建日志條目。
編寫自定義webhook媒介類型實現發送釘釘報警通知
完成設置,保存好webhook,https://oapi.dingtalk.com/robot/send?access_token=e5906a9b879fe615323bd9489f46334f5539d6a46f8e29c5740ba02c7ee90e84
var Dingding = { params: {}, proxy: null, setParams: function (params) { if (typeof params !== 'object') { return; } Dingding.params = params; }, request: function () { var data = { msgtype: "markdown", markdown: { title: "報警", text: "## 通知:\n " + Dingding.params.Message, }, at: { atUserIds: [Dingding.params.To], isAtAll: false, }, }, response, url = Dingding.params.URL, request = new HttpRequest(); request.addHeader('Content-Type: application/json'); if (typeof Dingding.HTTPProxy !== 'undefined' && Dingding.HTTPProxy !== '') { request.setProxy(Dingding.HTTPProxy); } if (typeof data !== 'undefined') { data = JSON.stringify(data); } Zabbix.Log(4, "[Dingding Webhook] message is: " + data); response = request.post(url, data); Zabbix.log(4, '[ Dingding Webhook ] Received response with status code ' + request.getStatus() + '\n' + response); if (response !== null) { try { response = JSON.parse(response); } catch (error) { Zabbix.log(4, '[ Dingding Webhook ] Failed to parse response received from Dingding'); response = null; } } if (request.getStatus() !== 200 || response.errcode !== 0) { var message = 'Request failed with status code '+request.getStatus(); if (response !== null && typeof response.errmsg !== 'undefined') { message += ': '+ JSON.stringify(response.errmsg) ; } throw message + '. Check debug log for more information.'; } return response; }, }; try { var params = JSON.parse(value); if (typeof params.URL !== 'undefined' && typeof params.To !== 'undefined' && typeof params.Message !== 'undefined') { Zabbix.log(4, '[ Dingding Webhook ] webhookURL "' + params.URL + '" sendto "'+ params.To )+'"'; } else { throw 'Missing parameter. URL, message, to parameter is required' } if (params.HTTPProxy) { Dingding.proxy = params.HTTPProxy; } Dingding.setParams(params); Dingding.request(); return 'OK'; }catch (error) { Zabbix.log(3, '[ Dingding Webhook ] ERROR: ' + error); throw 'Sending failed: ' + error; }
JavaScript Zabbix
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。