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

    图片

     

    属性使用说明
    参数  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"将可以手动测试脚本的执行,这个后面我会单独作为系列的一个题目介绍。

    图片

    如果您喜欢这个系列,请扫描关注:

     

  • 相关阅读:
    实战PyQt5: 134-QChart图表之折线图
    【论文阅读】Distilling the Knowledge in a Neural Network
    .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
    智能网联汽车云控系统第2部分:车云数据交互规范
    python419社区疫情综合管理系统django
    汇编语言实验7:子程序结构设计
    PHP7-MySQLi在分页中的应用
    什么是 TypeScript?
    关于移动端H5获取微信非静默授权被拦截进入【微信快照页】问题及解决方案
    C/C++ __builtin 超实用位运算函数总结
  • 原文地址:https://www.cnblogs.com/linwinfan/p/16240423.html