专栏|Zabbix使用JavaScript配置Webhook发送告警通知
【摘要】 背景Zabbix从4.4开始支持使用自定义的JavaScript代码来配置Webhook媒介类型实现故障报警通知,这又为用户提供了一种使用前端代码来进行报警通知的方式。相比于在后端配置告警脚本的好处是代码可维护性更强,支持媒介类型的导入导出,省去了后端调试代码的步骤,使Zabbix更加的开箱即用。本文介绍Webhook的媒介类型是怎么配置的。实现原理首先看官方文档有详细介绍,Zabbix官方...
背景
Zabbix从4.4开始支持使用自定义的JavaScript代码来配置Webhook媒介类型实现故障报警通知,这又为用户提供了一种使用前端代码来进行报警通知的方式。相比于在后端配置告警脚本的好处是代码可维护性更强,支持媒介类型的导入导出,省去了后端调试代码的步骤,使Zabbix更加的开箱即用。本文介绍Webhook的媒介类型是怎么配置的。
实现原理
Zabbix封装的JavaScript对象
写入zabbix日志的对象
方法 | 描述 |
---|---|
Log(loglevel, message) | 按照日志级别将写入 Zabbix 日志,日志级别可参考配置文件 |
例如:
Zabbix.Log(3, "this is a log entry written with 'Warning' log level")
http请求对象
方法 | 描述 |
---|---|
AddHeader(name, value) | 添加HTTP报头字段。此字段用于所有后续请求,直到使用ClearHeader()方法清除为止 |
ClearHeader() | 清除 HTTP 标头。如果没有设置报头字段,且发送的数据是 json 格式,默认会将 Content-Type 设置为 application/json,否则设置为 text/plain。 |
GetHeaders() | 返回接收到的 HTTP 标头字段的对象。 |
Get(url, data) | 将HTTP GET请求发送到带有可选_data_的URL,并返回响应 |
Put(url, data) | 将HTTP PUT请求发送到带有可选data的URL,并返回响应 |
Post(url, data) | 将HTTP POST请求发送到带有可选_data_的URL,并返回响应 |
Delete(url, data) | 将HTTP DELETE请求发送到带有可选data的URL,并返回响应 |
Status() | 返回最后一个HTTP请求的状态码 |
SetProxy(proxy) | 设置HTTP代理为“proxy”值。如果该参数为空,则不使用代理 |
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/等)。 -
响应是否包含所有必需的字段或数据。 -
响应数据中有没有错误。
返回值
OK
)来表示执行成功。如果 webhook 使用标签(标记Process tags复选框):webhook 应始终返回一个 JSON 对象,其中至少包含一个空对象的标签:{tags: {}}
。
日志记录
-
应提供调试级别信息。 这可用于找出 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;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)