监控是运维进行业务上线后的末了一个环节,我们须要通过监控理解业务的运行状态,对告警及时干预,担保业务的稳定。
版本发布在系统版本发布过程中,须要对运用做事进行重启,此时在监控的检测周期内会触发运用告警,而这个告警属于正常的例行掩护,该当将此告警屏蔽,待发版完成并测试正常后再规复告警,担保监控井井有条的运行。
上述版本发布流程如下:

版本发布过程中可能会涉及多个开源产品,如jenkins、git、cmdb、运用容器、zabbix等,而大多公司内部没有一条ESB总线将各个平台或系统串联,因此须要通过各独立的接口供运维直接访问调用。
在此我们紧张先容下版本发布过程中,通过调用zabbix API实现zabbix屏蔽告警/规复告警。
屏蔽/规复告警1.流程
以上流程是版本发布流水线触发调用zabbix api实现屏蔽/规复告警功能,把稳这个过程不做版本测试是否成功(在上游流水线中自行判断),只是用来禁用/启用监控项。
2.环境解释
此套流程用于已经确定好ip的情形下,匹配的是此ip下的监控项,因此:
请修正:
ZBX #zabbix api 地址
hostip #主机ip
3.代码实现
#!/bin/bash#comment: 此脚本用于发版过程中屏蔽zabbix监控项,发版正常后规复zabbix监控项#grep -Po 利用perl正则 \K 左边的所有东西被"退回"且不作为该正则表达式的匹配部分#获取主机hostidfunction get_hostid(){ #获取hostid hostid=`curl -s --connect-timeout 10 -m 20 -X POST -H 'Content-Type:application/json' -d' { "jsonrpc": "2.0", "method": "host.get", "params": { "filter": { "host": [ "'"${hostip}"'" ] } }, "auth": "'"${zabbix_token}"'", "id": 1 }' $ZBX|grep -Po '"hostid[":]+\K[^"]+'` echo $hostid}#获取监控项itemidfunction get_itemid(){ #获取itemid itemid=`curl -s --connect-timeout 10 -m 20 -X POST -H 'Content-Type:application/json' -d' { "jsonrpc": "2.0", "method": "item.get", "params": { "output": "extend", "hostids": "'"${hostid}"'", "search": { "key_": "'"$1"'" }, "sortfield": "name" }, "auth": "'"${zabbix_token}"'", "id": 1 }' $ZBX|grep -Po '"itemid[":]+\K[^"]+'` echo $itemid }#屏蔽/规复监控项,status:1禁用;status:0启用function update_itemid(){ update_itemid=`curl -w %{http_code} -s -X POST -H 'Content-Type:application/json' -d' { "jsonrpc": "2.0", "method": "item.update", "params": { "itemid": "'"$1"'", "status": '$2' }, "auth": "'"${zabbix_token}"'", "id": 1 }' $ZBX` echo $update_itemid}#主程序#zabbix-server的地址,请自行修正ZBX="http://zabbix.server.api/api_jsonrpc.php" ##zabbix api token,请自行修正zabbix_token=xxxxxxxxxxxxxxxxxxxxxxx#主机ip,请自行修正hostip=xxxxxecho -e "\033[33m进入zabbix监控屏蔽及规复过程中,是否失落败不影响发版,请放心利用\033[0m"KEY=$2case $1 in"masking_alarm")echo -e "\033[32m开始屏蔽zabbix监控项\033[0m"echo $KEY#屏蔽监控项#status:1 禁用status=1if [ -z "$KEY" ];then echo -e "\033[31m 请输入监控项的健值\033[0m" exit 1else hostid=$(get_hostid) if [ ${#hostid} -eq 0 ];then echo -e "\033[31mhostid为空,请检讨api能否访问\033[0m" exit 1 else key_list=($KEY) for key in ${key_list[@]} do itemid_list=$(get_itemid $key) if [ "${#itemid_list}" -eq 9 ];then echo -e "\033[31mitemid为空,请在zabbix上检讨key是否存在\033[0m" exit 1 else for itemid in ${itemid_list} do update_itemid $itemid $status done fi done fifi;;#规复监控项"recovery_alarm")echo -e "\033[32m开始规复zabbix监控项\033[0m"echo $KEY#status:0 启用status=0if [ -z "$KEY" ];then echo -e "\033[31m 请输入监控项的健值\033[0m" exit 1else hostid=$(get_hostid) if [ ${#hostid} -eq 0 ];then echo -e "\033[31mhostid为空,请检讨api能否访问\033[0m" exit 1 else key_list=($KEY) for key in ${key_list[@]} do itemid_list=$(get_itemid $key) if [ "${#itemid_list}" -eq 9 ];then echo -e "\033[31mitemid为空,请在zabbix上检讨key是否存在\033[0m" exit 1 else for itemid in ${itemid_list} do update_itemid $itemid $status done fi done fifi;;)echo "请选择masking_alarm或recovery_alarm"exit 1;;esac
4.代码实行
#屏蔽告警bash zabbix.sh masking_alarm website.code[http://xxxxxxx/1]进入zabbix监控屏蔽及规复过程中,是否失落败不影响发版,请放心利用开始屏蔽zabbix监控项website.code[http://xxxxxxx]{"jsonrpc":"2.0","result":{"itemids":["111502"]},"id":1}200#规复告警bash zabbix.sh recovery_alarm website.code[http://xxxxxxx/1]进入zabbix监控屏蔽及规复过程中,是否失落败不影响发版,请放心利用开始规复zabbix监控项website.code[http://xxxxxxxx]{"jsonrpc":"2.0","result":{"itemids":["111502"]},"id":1}200
屏蔽或规复后,请至zabbix检讨监控监控项状态是否同等。
把稳:
1.此脚本也可进行监控项的模糊匹配
#匹配监控项key包含xxxxxxxbash zabbix.sh recovery_alarm xxxxxxx
2. 此脚本可以进行多行匹配,须担保每个key值回车换行
总结1.普通的监控项,基本可以通过以上脚本的模糊匹配办理;
2.对付同一个接口,可能会有url和port监控同时存在的情形,此时我们须在监控项key中做下关联,以便可以通过两个key中的同一字符模糊匹配同时操作这两个监控项,减少屏蔽规复的韶光,从而提高版本发布效率。