郭 茜,刘国强,李从英,支亚京,彭宇翔,金石声
(1.贵州省气象信息中心,贵州 贵阳 550002;2.贵州省人工影响天气办公室,贵州 贵阳 550081)
近年来,气象信息化高速发展,通过大数据、云计算等现代科技信息技术在气象领域的应用与发展,目前气象行业已进入建设智慧气象的新阶段。贵州省气象信息中心在气象信息化建设基础上,进一步升级扩展,形成国家级设计,升级CIMISS分布式数据存储,在多中心协同的气象云数据管理能力建设,气象服务大数据平台、支撑精准预报的众创业务平台,基础设施资源监控和气象预报预测业务评估信息化系统建设等方面开展工作,建立了基于混合云结构及标准化体系的气象数据分布式存储系统,完成CIMISS系统的云化升级,提供高效的数据支撑。并建立国省数据协同、服务协同流程以及专有云、公有云同步的数据流程,整体提升了气象数据的服务能力和气象业务服务的能力[2]。
数十年来,气象信息化基础资源建设得到大力发展,计算资源、数据资源在各行各业广泛应用,大量的数据传输给气象系统运维人员带来了巨大的挑战,为了提高气象数据传输的及时率、缓解系统运维人员监控和维护气象业务数据传输的巨大压力,本文根据省级气象系统维护的实际需要,在前期贵州省气象信息中心搭建的Zabbix气象业务系统监控框架的基础之上,通过使用编程语言开发相应的程序模块,使Zabbix框架对接企业微信、睿象云等社交软件,便于监控维护人员实时了解当前被监控对象的运行情况,并及时接收告警通知,以实现高效处理故障和缩短维护响应时间。
Zabbix监控框架支持的插件多、组件多,集成了多种告警推送的方式,但是邮件告警信息常因没有专门的邮件应用分类,容易被运维人员忽略未及时查看,错过解决问题的最佳时机;短信告警的内容不仅不全面还容易被忽略,且通信资费高昂[3]。微信目前是国内最受欢迎的即时通讯软件,因其体积小、速度快、功能多的特点、用户超十亿人,涵盖社会各类人群。企业微信在微信的用户群基础上建立,保留了用户对微信的使用习惯,在服务、功能和使用目的上区别于微信,使工作团体间能便利地沟通与应用,使企业和组织能够提高整体运营效率。大量的企业通过使用企业微信丰富、免费、多样化的第三方接口对接监控应用软件来推送告警信息,这样可以方便系统和数据运维人员及时查看告警信息,得以高效处理故障[4]。
因此,本文在贵州省气象信息中心初步搭建的Zabbix监控气象数据传输框架的基础上进行企业微信告警推送功能的探索和研究[5]。
贵州省气象信息中心搭建的Zabbix采用的是分布式的分层架构:客户端采集数据在服务器端进行处理后通过Web前端交互界面以图表等方式展示给用户,代理服务器做代理,图1展示了Zabbix监控报警流程。告警触发是Zabbix监控报警流程中的关键环节,监控平台能够根据告警级别区分发送对象和范围[6]。Zabbix可以通过Zabbix服务器到客户端主动采集数据,也可以通过安装Zabbix监控代理后将数据由代理推送至Zabbix-Server的方式获取。通过配置监控项Item周期性地从主机里采集数据,并存到其对应的数据库中,同时将所采集到的数据信息通知到框架触发器Trigger,由Trigger进行采集值与告警阈值的比较判断。若采集到的监控项数据超过触发器阈值,达到触发条件则产生告警事件Event,Zabbix将按照该告警事件所对应的Action(动作)来进行处理。Action会根据预设流程,利用Zabbix框架通过告警状态体形成相应告警信息,将告警推送给数据系统维护人员。产生的该事件可以通过多种方式,例如:企业微信告警、短信、邮件等方式通知触发器所属的主机组负责人;若监控项数据未超过触发器阈值,则不产生告警事件,监控项Item将继续进行该主机监控数据采集工作[7]。
图1 Zabbix监控报警流程
企业微信区别于个人微信的优势在于它支持一键群发、标签群发,并且客户资源属于企业,以便员工利用社交账号专门处理企业工作内容。同时企业微信的后台开放API接口,可以通过专门的企业微信ID号对接各开源告警平台,将公众号、小程序等流量池数据打通,实现精细化的运营管理。大多数故障是通过监控系统发现、推送告警信息给系统维护人员,由运维人员及时处理以避免造成重大损失。因此,及时、准确地分析和处理各类告警成为系统运维重中之重的工作内容。在系统监控运维工作中,传统告警方式是邮件和短信,但邮件告警的及时性比较差,告警邮件容易被忽略;短信告警及时性比较强,但告警内容单一,维护人员不能够及时精确地判断故障的具体情况。另一种告警方式就是通过企业微信进行监控告警,保证运维人员日常使用社交软件的同时,也能够关注到监控系统的告警信息,并及时进行维护和处理[8]。本文基于Zabbix监控框架与企业微信进行关联,利用Python语言开发相应的功能模块实现企业微信应用推送运维告警信息。
通过企业微信创建Zabbix应用,并添加气象业务系统的运维成员账户,所有与Zabbix相关的告警信息将通过该应用进行推送。
创建成功后,企业微信会分配出每个成员的账号,AgentID(应用ID)、CorpID(企业ID)和CorpSecret(秘钥),Zabbix框架在调用API接口时用以上信息作为身份ID识别码。企业微信告警模块是基于Python环境开发的,该Python程序主要是用于对接Zabbix框架与企业微信中建立的Zabbix应用,以实现通过Zabbix监控目标主机数据触发告警,并通过企业微信应用推送到系统运维人员。将编写好的模块.py放入Zabbix服务器端/etc/Zabbix/alertscripts目录下,并赋予权限,使Zabbix用户能够执行该程序。测试该模块是否能够正常与企业微信对接时,可以在Zabbix服务端bin目录下进行,通过命令行对已编译的WXAlert.py进行测试,若能够正常在企业微信中收到消息,证明该程序运行正常,测试命令如下:
[root@localhost alertscripts]# ./WXAlert.py username test 1615helloZabbixTest https://qyapi.weixin.qq.com/cgi-bin/- gettoken?corpid=ww1***cd&corpsecret=1wV5***ZywVEW2dIac。
在企业微信告警核心代码程序中,主要创建2个函数:Gettoken函数与Senddata函数。Gettoken函数用于创建令牌。从已注册的企业微信中获取CorpID(企业号标识)、CorpSecret(企业号秘钥)并对2个参数进行编码后一并存入Token中。创建Token令牌主要是用于企业微信客户端访问服务端时的身份验证,当客户端第一次访问服务端时,服务端生成Token后返回给客户端,之后客户端无需重复输入用户名和密码,只需携带身份令牌Token便可频繁地访问企业微信服务端。否则每次发送告警信息时客户端都需输入账户密码,造成服务端访问压力过大,客户端发送告警通知的流程变复杂,同时账户和密码泄漏风险增大,增加了黑客截取账户的机会。因此,在核心程序中,使用Token令牌进行身份验证,而非将账户密码存储于Session中。Gettoken函数如下:
def gettoken(corpid,corpsecret):
gettoken_url=
'https://qyapi.weixin.qq.com/cgi-bin/gettoken ?corpid='+corpid+'&corpsecret='+corpsecret
print gettoken_url
try:
token_file=urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data=token_file.read().decode('utf-8')
token_json=json.loads(token_data)
token_json.keys()
token=token_json['access_token']
return token
函数Senddata用于传送企业微信告警接收用户(企业微信用户账号touser:aa、bb、cc、dd)、Toparty是企业微信中的部门ID:8、agentid是企业微信中的应用ID:100003、告警主题Subject以及告警内容Content。
def senddata(access_token,user,subject,content):
send_url=
'https://qyapi.weixin.qq.com/cgi-bin/message/send ?access_token='+access_token
send_values={
"touser":"aa|bb|cc|dd",
"toparty":"8"
"msgtype":"text"
"agentid":"1000003"
"text":{
"content":subject+' '+content
}
"safe":"0"
}
主程序接收以上程序传递过来的3个数组:企业微信接收用户、企业微信告警主题、企业微信告警内容。
if_name_=='_main_':user=str(sys.argv[1])
subject=str(sys.argv[2])
content=str(sys.argv[3])
从企业微信号中找到企业号标识ww1***cd、企业号秘钥1wV5***ZywVEW2dIac,并在程序中分别赋值给CorpID、CorpSecret参数,将Gettoken令牌函数获取到的参数赋值给Accesstoken参数,并将以上形成的实际参数全部赋予Senddata函数进行处理。
在Zabbix网页显示端,对报警媒介和触发报警动作进行配置,使得Zabbix框架网页显示端与WXAlert.py程序关联起来。Web端配置报警媒介:点击管理→报警媒介→创建报警媒介→设置用户。
Web端配置触发报警动作:点击配置→动作→创建动作→编辑告警信息状态体,动作的事件源为触发器,可以设置发送告警的时间间隔等。
本文以设置某主机CPU负载率超过1%作为触发告警事件项测试企业微信告警。当该主机CPU负载率超过1%时,在企业微信Zabbix应用中产生了准确的告警信息。至此,Zabbix框架对接企业微信告警模块的开发和部署已完成,运维人员可在Zabbix创建的企业微信Zabbix应用信息对话框中看到Zabbix框架监控到的测试主机项目告警信息:当该主机CPU负载>1%时告警,并且当该故障及时得到恢复的时候,Zabbix同样也将已恢复的告警信息发送至该企业微信应用。
Zabbix虽然能够直接推送告警至企业微信平台,但如遇到网络中断、闪断,监控内容多、设备多的情况下,会产生海量的告警信息,从而导致告警风暴,运维人员很难从海量告警中筛选出重要告警信息。Zabbix框架推送的告警信息经过睿象云智能告警平台可以实现告警压缩与降噪,在不遗漏重要告警的前提下,通过聚类算法快速智能合并重复信息,减少告警。本文利用睿象云智能告警平台CloudAlert对接Zabbix框架进行企业微信的告警推送。首先,通过睿象云平台集成Zabbix框架,并在Zabbix-Server服务端安装睿象云采集告警的代理AGENT,并得到代理安装秘钥:ec1ec423***ce050cc。
在睿象云平台集成企业微信应用,获取企业微信机器人webhook url:https://qyapi. weixin.qq.com/cgi-bin/webhook/send?key=7a493f1d-***1d1e2 在企业微信Zabbix应用中点击添加群机器人→添加机器人→输入机器人名字→填写webhook url。睿象云智能告警平台通过告警机器人集成推送告警信息至企业微信。
本文利用Zabbix开源监控框架监测气象核心业务系统的运行状况,并开发框架内相应程序模块,通过企业微信成功实现告警推送,同时通过搭建睿象云智能告警平台对Zabbix框架内告警信息进行降噪、压缩后再推送告警至企业微信。在Zabbix框架内配置各个监控项对应采集值的触发策略以及告警动作,根据对告警信息的不同等级的综合分级及判定,利用程序模块对接企业微信开源API接口高效、及时推送告警信息以便运维人员及时处理,实现对气象核心系统进程的自动化运维。利用企业微信推送基于Zabbix框架的告警信息,既有效地控制运维的成本,又能保障气象IT系统业务正常、安全、有效运行。