vlambda博客
学习文章列表

ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统

     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"。

ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统

 

属性 使用说明
参数  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的最佳实践是配置对应的专用用户并联系对应的报警媒介。

ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统


ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统


5.配置触发器动作来执行Webhook

ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统

创建一个新的动作

ZABBIX新功能系列1-使用Webhook将告警主动推送至第三方系统


如果上面一切配置正常,当发生对应的告警将会执行对应的WEBHOOK操作,而且在5.4的版本可以定义Webhook脚本,复制上面定义的脚本到“管理”-“脚本”中创建一个新的脚本,并配置脚本作用于“Manual event action"将可以手动测试脚本的执行,这个后面我会单独作为系列的一个题目介绍。