企业邮件系统搭建的关键要素与效率提升策略探讨
872
2022-05-30
背景
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小时内删除侵权内容。