查看原文
其他

版本发布过程中的屏蔽/恢复告警

木讷大叔爱运维 木讷大叔爱运维 2022-07-13



监控是运维进行业务上线后的最后一个环节,我们需要通过监控了解业务的运行状态,对告警及时干预,保证业务的稳定。


版本发布

在系统版本发布过程中,需要对应用服务进行重启,此时在监控的检测周期内会触发应用告警,而这个告警属于正常的例行维护,应该将此告警屏蔽,待发版完成并测试正常后再恢复告警,保证监控有条不紊的运行。


上述版本发布流程如下:


版本发布过程中可能会涉及多个开源产品,如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=$2
case $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中的同一字符模糊匹配同时操作这两个监控项,减少屏蔽恢复的时间,从而提高版本发布效率。




 END 


关注我们






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存