- 需求背景:统一将所有监控告警归档到xxxx监控系统发出,包括zabbix;
- 需求描述:需将zabbix所有告警内容,通过.json的文件格式发送到指定的http地址。
- 实现方案:如下:
方案一:
设置ExportDir、ExportFileSize、ExportType参数,用于以换行符分隔的 JSON 格式实时导出事件、历史记录和趋势的目录。如果设置,则启用实时导出。参考:官方文档:https://www.zabbix.com/documentation/6.0/en/manual/config/notifications/media/script
导出之后,再用filebeat发送到指定url即可。
不过对于本需求,导出内容不只包括告警,要实现该需要还需二次过滤出告警内容,比较麻烦,可直接使用第二种方案;
方案二:
在zabbix管理端界面,选择:管理-报警媒介类型,右上角:创建媒体类型,类型选脚本,脚本参数等自定义即可,设置好后,将写好的脚本放在zabbix服务器上的指定路径即可;
PS:
①类型有四种,Webhook、电子邮件、短信、脚本,参考官方文档:1 媒体类型 (zabbix.com)
②脚本参数:即宏,zabbix自带一些宏,可参考官方文档:1 支持的宏 (zabbix.com),比如本次选择7个:{EVENT.TIME}、{EVENT.DATE}、{EVENT.NAME}、{HOST.NAME}、{EVENT.SEVERITY}、{EVENT.OPDATA}、{EVENT.ID}
③脚本参考:
版本1,测试用,指定内容:
curl --location --request POST 'http://ip/fio-alert/api/alert/v1/event/push?apiKey=0cdc376669d445beb7a5ab7a8667531d' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: text/plain' \
--header 'Accept: */*' \
--header 'Host: ip' \
--header 'Connection: keep-alive' \
--data '{
"Problem": "测试内容",
"Severity": "123",
"Problemname": "测试内容名称",
"Operational data": "测试告警时间",
"OriginalproblemID": "测试告警编号",
}'
版本2,生产用,传参:
#!/bin/bash
#触发动作的事件时间
eventtime=$1
#触发动作的事件的日期
eventdate=$2
#触发动作的问题事件名称,eg:java进程缺失
eventname=$3
#可见的主机名,ip
hostname=$4
#时间严重性等级的名称,eg:告警、警告、严重等等
eventseverity=$5
#问题对应触发器的当前值
eventopdata=$6
#触发动作的事件的数字ID(Zabbix内部事件号)
eventid=$7
curl --location --request POST "http://***ip***/fio-alert/api/alert/v1/event/push?apiKey=19c8f7f6f45b4884805981c86f8e708f" \
--header "User-Agent: Apifox/1.0.0 (https://apifox.com)" \
--header "Content-Type: application/json" \
--header "Accept: */*" \
--header "Host:***ip***" \
--header "Connection: keep-alive" \
-d "{
\"eventtime\":\"$eventtime\",
\"eventdate\":\"$eventdate\",
\"eventname\":\"$eventname\",
\"hostname\":\"$hostname\",
\"eventseverity\":\"$eventseverity\",
\"eventopdata\":\"$eventopdata\",
\"eventid\":\"$eventid\"
}"
版本1指定内容,使用的--data,括号外面是单引号:
--data '{
内容
}'
版本2需输入参数,使用的-d,括号外面是双引号,并且括号里面添加了转义符\(它告诉解释器紧跟其后的字符具有特殊含义或应该被当作普通字符处理,而不是它们原本可能具有的特殊功能或意义,eg:”,加了转义字符\,解释器就知道这个双引号只是字符串内容的一部分,而不是字符串的边界),不加\则不能传参,变量符$在大括号{}中会被当作普通字符处理:
-d "{
\"eventtime\":\"$eventtime\",
内容内容
}"