徐浩彬,赵 亮,徐碧裕,叶朗明
(1.江门市新会区气象局,广东新会 529100;2.陇县气象局,陕西陇县 721200;3.江门市气象局,广东江门 529000)
随着气象事业的发展,县级气象探测仪器设备数量及种类日趋增加,确保探测设备正常高效运行,是提供优质气象服务的前提和保证。但与日俱增的探测仪器使设备维护人员的监控及维护压力倍增,人工监控仪器设备的运行状态任务更加繁重。为了及时准确地监控气象区域站数据,缓解监控人员的工作压力,李峰等[1]对综合气象观测运行监控业务现状的分析,提出了运行监控业务的发展设想。孟珍等[2]以"三级管理"的组织结构建立了气象探测设备运行监控与评估体系。张洁等[3]开始探索云计算环境下气象大数据服务的应用研究,以期通过云计算环境提升整体气象业务服务水平。龙亚星等[4]构建了由观测资料指标等组成的自动气象站网监控指标体系并给出了目标值。李源鸿及江崟等[5-6]在省级及市级层面探索并设计了气象监测综合业务平台。齐军岐[7]根据陕西省大探中心提供的128例自动站设备故障案例,将故障发生原因分为6类。王丽玫等[8]基于省级气象宽带网,建设开发集约型信息网络运行管理监控业务系统。王建庄、钟少君等[9-10]运用不同的技术路线完成了气象自动站数据监控平台的设计开发工作。邸永强等[11]基于GSM短信技术路线开发了自动气象站资料传输监控平台,提高了业务可用性。林月兰等[12]应用气象数据监控系统,有效减少气象数据缺测。
为了尝试提高台站设备维护及时率及缓解人工监控区域站运行状态的压力,本文根据县级台站实际需要,提出了一种便于实现、稳定可靠的区域站实时监控解决方案。该系统应用PHP程序,采用定时任务执行方式,调取广东省气象探测数据中心区域站数据,根据各站数据到报情况将缺报站点进行记录,通过邮件通知台站维护人员,以期达到缩短响应时间和及时处理故障的目的。
新会区气象局通过对台站现有人员和业务计算资源的分析,在不增加人员运维压力及业务系统便于使用的条件下,形成了一套应用云平台的区域站实时监控系统。系统由3大功能模块构成:区域站数据的定时下载及推送、气象数据的实时监控、通知消息提示告警服务。数据按顺序流转至各功能模块,实现了对区域站数据来报情况的实时监控。基于上述业务需求,新会区气象局选用了新浪云平台以搭建气象数据实时监控系统。
新浪云应用:新浪云是基于PaaS(Platform-as-a-Service)模式的分布式Web应用/业务开发托管、运行平台,其提供了包括数据库、存储与CDN、应用程序、网络与安全、通讯等一整套服务产品。因其具有所见即所得的程序开发及部署环境,可以快速实现核心业务上线运行,同时无需过多考虑服务器运维管理,可大幅缩减运行维护的人力物力资源,运维成本低,架构精简轻量,便于台站自行搭建和广泛应用,适合县级气象部门业务系统的部署应用。
KVDB存储:KVDB是新浪云开发的分布式key-value数据存储服务,用来支持公有云平台上的海量key-value存储。KVDB支持100GB的存储空间,可支持1 000 000 000条记录,高性能高可靠存储,采用无状态对等的分布式架构,在任一节点发生故障时,仍可保持正常运行。由于其具有稳定高性能的存储能力,适合气象等行业的数据应用。
系统由三个模块组成:一是原始实况数据下载及推送;二是数据的实时监控;三是通知消息提示告警服务。其架构如图1所示。
总体设计思路由以下三个部分组成。
(1)原始数据下载及推送由本地计算机执行,通过Windows计划任务,每五分钟执行预编写的脚本程序进行下载,已获取的数据文件通过FTP方式传输至外网服务器。传送至外网服务器的区域站数据文件以JSON格式保存成文本文件,且每五分钟覆盖重写生成最新数据文件。由于直接调取区域站的实况数据,新增站点可以便捷纳入监控范围。
(2)区域站数据监控是整个系统的核心,该程序部署在新浪云平台。通过调用新浪云计划任务,执行区域站数据检查程序。如区域站数据文件中有站点缺测,则将该站点标记为数据缺测1次,且在新浪云KVDB存储器中保存(仅保存缺测次数,不保存站点原始气象数据)。当KVDB存储器中对应站点的缺测标记为5时,表明数据已缺测20分钟,同时达到监控阈值,该站点缺测标记将流转至信息告警服务程序。
(3)当数据缺测达到监控阈值时,将启用通知消息提示告警服务,通过邮件方式将该站点的缺测情况发送至预设邮箱,以提醒值班人员查看站点故障情况。为了避免重复多次发送提醒邮件,当缺测标记大于阈值时即关闭该站点的提醒发送功能;若该站点恢复正常,缺测标记将被清零,检查程序将进入新的循环,继续监控数据来报情况。
图1 气象数据监控服务架构图
数据下载程序使用PHP: Hypertext Preprocessor语言5.3版本进行服务程序开发,每五分钟调用广东省气象探测数据中心区域站数据接口获取相关数据,并以JSON格式保存。
核心代码如下:
$station =array("XXXXX",……,"XXXXX");
for($i=0;$i<=41;$i++){
$url = "http://172.22.1.175/di/http.action?userId=******&pwd=******&interfaceId=getAwst5MRain4Iiiii&dataFormat=json&iiiii=".$station[$i]."&ymdhms=".$data_time."00";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data_temp = curl_exec($curl);
if ($data_temp != '{"ROWCOUNT":"0","DATA":[]}'){
$data_decode = json_decode($data_temp,true);//解码json格式
$data_area[$i]['STATION'] = $data_decode['DATA'][0]['V01301'];
$data_area[$i]['TIME'] = $data_decode['DATA'][0]['DDATETIME'];
$data_area[$i]['V13023_24'] = $data_decode['DATA'][0]['V13023'];
……
}else{
$data_area[$i]['STATION'] = '';
$data_area[$i]['TIME'] ='';
$data_area[$i]['V13023_24'] = '';
……}
}
$data_encode_area = json_encode($data_area);//重新转换成json数据
$myfile = fopen("D:/area.js" , "w") or die("Unable to open file!");//写入文件
fwrite($myfile, $data_encode_area);
fclose($myfile);
推送功能使用FlashFXP软件,通过设置计划任务的方式,每5 min将生成的数据文件以FTP方式向外网服务器传输数据。
监控模块是整个服务的核心。部署于新浪云的监控检查程序每五分钟读取原始数据的状态,并分站号给予标记。数据正常来报的站点,标记为0,并将标记值存储于新浪云KVDB存储器中;未正常来报的站点,标记为1,标记值将叠加到上述存储器中。同时,检查程序每5 min检测各站点的标记值,若有站点标记值累计达到5,达到监控阈值,触发邮件发送模块。另外,站点缺测标记达6及以上,检查程序将自动关闭该站点的邮件发送功能,避免重复提醒。站点数据恢复正常后,标记值将清零,监控服务进入新一次循环。区域站通过通信网络进行数据传输,容易发生间歇性短时次通讯信号丢失,从而导致该时次数据缺测。因此,为合理监控和避免同一问题多次报警,设定监控标记参数设定为累计达到5后触发邮件发送模块。系统业务运行时,可根据实际情况对缺测标记参数进行增减调整,以适应实际监控需求。
相关实现代码如下:
$kv = new SaeKV();//初始化KVClient对象
$ret = $kv->init('KVDB存储器编号');//加载KVDB存储器
$infomation = $kv->get('infomation');
$url = "http://www.jmqx.gov.cn/xinhui/upload/area.js";//读取数据文件
$curl =curl_init();
$data =curl_exec($curl);
curl_close($curl);
$data_decode = json_decode($data,true);
for($i=0;$i<=41;$i++){
$time[$i] = strtotime($data_decode[$i]['DDATETIME']);
if(empty($time[$i])){
$infomation[$i] = $infomation[$i] + 1; }//对每个站点数据到报情况进行标记
else{
$infomation[$i] = 0;}
//判断每个站是否存在数据,缺数据5次即发出提醒
if($infomation[$i] < 6 and $infomation[$i] > 4){
switch ($i){
case 0:
$station[$i] = "*****";
break;
……
case 41:
$station[$i] = "*****";
break;}
$maildata[$i] = $station[$i].'缺'.$infomation[$i].'次数据';}}
$ret = $kv->set('infomation',$infomation);//更新key-value
若区域站缺测标为5时,触发邮件提醒功能,系统将缺测站点告警信息发送至值班人员。通知消息告警功能使用新浪云平台邮件服务,服务基于SMTP邮件传输协议,对支持SMTP服务的邮箱进行配置,并完成邮箱地址、用户账号及密码等参数设置即可实现邮件消息发送。
邮件发送核心代码如下:
$mail = newPHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 2;
$mail->Host = "smtp.126.com";
$mail->Port = "25";
$mail->SMTPAuth = true;
$mail->CharSet = "utf-8";
$mail->Username = "******@126.com";
$mail->Password = "******";
$mail->AddAddress("******@qq.com");//接收提醒信息的用户邮箱,可添加多个
$mail->SetFrom("******@126.com", "新会区区域站监控程序");//设置发送邮件的邮箱
$mail->IsHTML(false);
$mail->Subject = "区域站缺测提醒";//邮件主题
$mail->MsgHTML("邮件正文");//缺测信息正文
if(!$mail->Send()){
echo "发送失败: " . $mail->ErrorInfo;//输出错误信息}
else{
echo "发送成功";}
目前广东省气象局运行的区域站监控系统,通过短信方式提醒县级运维人员设备运行状态。本文通过固定时段测试,对本系统以及省局监控系统的县级应用层面(下简称“对比系统”)进行对比检验测试。
选取2018年9月16日强台风“山竹”影响期间为测试时间段,区域范围选取广东新会,合共42个区域自动站,汇总统计了本系统及对比系统的监控表达能力,两系统性能如图3所示。
同时,为定量描述监控系统对数据缺测的监控能力,定义测试时段内成功捕捉到的缺测站数占总缺测站数的百分比为监控成功率。查验9月16日16时新会区域站数据来报情况,实际出现缺测的站数为12个。由图2系统性能对比情况可见,本系统捕捉到11站的缺测状态,并发出提醒,监控成功率达91%;而对比系统发送提醒8站,监控成功率67%。可见该测试中,本系统监控成功率优于对比系统。分析具体站点表明,对比系统没有发出监控提醒的3个站点,全部为近年新布设站点。由于本系统架构轻量,易于维护和扩展,因此站点的增减变化能够迅速由台站人员进行修改,站点覆盖率更高,从而使监控成功率占优。从平均反应时间来看,本系统反应时间为50 min,对比系统为26 min,对比系统反应时间明显短于本系统的反应时间。分析造成该结果的原因,对比系统直接读取站点的数据状态,根据数据状态直接反馈缺测提醒,效率更高;本系统通过累积计算5个时次的数据缺测状态,同时经过多流程的信息传输,数据信息由内部网传输至互联网,因此响应时间更长;如需缩短响应时间,可通过调整本系统缺测标记参数,以及优化数据流传输,以提高响应速度。
图2 双轨运行试验系统性能对比图
(1)基于新浪云平台搭建县级气象数据监控服务可实现以下三大功能:气象数据下载、监控信息获取和云存储、主动提示告警服务。
(2)本系统架构方案具有运维成本低、可推广性强、覆盖站点范围广、新布设站点纳入监控速度快、监控成功率高等优点;双轨运行试验显示,本系统平均响应时间为50 min,监控成功率达91%。
(3)本系统存在一些不足,数据传输流程较复杂,平均反应时间较长,与省级系统对比时效性较差,后续本系统的升级将重点整合和利用省级监控资源,作为省级监控的有效补充。同时将进一步改进传输流程,缩短耗时,提高监控提醒的时效性。另外,在监控各气象要素基础上,可进一步开发判别灾害性天气的监控服务,以拓展该服务的应用功能。