华为北向网管NCE开发教程(7)历史告警采集

2024-06-15 10:28

本文主要是介绍华为北向网管NCE开发教程(7)历史告警采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1准备工作

准备一个FTP服务器和网管北向网络通,网管北向生成告警文件,会推送到准备的FTP服务器上。
linux,都是自带FTP的,如果是linux则无需自己搭建,如果是windows则需要自己搭建

2生成告警文件

2.1方法说明getAllHistoryAlarmsByFTP

该方法是接口EMSMgr_I中的方法

void getAllHistoryAlarmsByFTP(
java.lang.String destination, 
java.lang.String userName, 
java.lang.String password, 
mtnm.tmforum.org.globaldefs.NameAndStringValue_T[][] meNameList, 
java.lang.String[] typeList, 
java.lang.String[] excludeProbCauseList, mtnm.tmforum.org.notifications.PerceivedSeverity_T[] excludeSeverityList,
java.lang.String startTime, 
java.lang.String endTime
) throws mtnm.tmforum.org.globaldefs.ProcessingFailureException;

下面这个是华为的文档说明
在这里插入图片描述

2.2getAllHistoryAlarmsByFTP请求参数示例

Common_IHolder commonHolder = new Common_IHolder();
emsSession.getManager("EMS", commonHolder);
EMSMgr_I emsMgr = EMSMgr_IHelper.narrow(commonHolder.value);//指定生成的网元
String managedElement = "3145734"//FTP信息
//生成文件地址实际路径为192.168.1.11服务器的 /home/admin/alarms/,登录用户目录/destination中指定的目录
String destination = "192.168.1.11:alarms/"+managedElement+".txt";
String userName = "admin";
String password = "123456";//构建网元查询条件
NameAndStringValue_T[][] meNameList = new NameAndStringValue_T[1][];//网元名称列表(与typeList 条件不能同时输入)。仅支持网元/光网元,不支持EMS/SNMS。
NameAndStringValue_T[] meName = new NameAndStringValue_T[2];
meName[0] = new NameAndStringValue_T("EMS", "Huawei/NCE");
meName[1] = new NameAndStringValue_T("ManagedElement", managedElement);
meNameList[0] = meName;//网元类型和网元ID互斥,为空即可
String[] typeList = new String[0];//网元类型列表(与meNameList 条件不能同时输入)//告警原因
String[] excludeProbCauseList = new String[0];//符合此类原因的告警不查询。列表为空标识不使用该过滤条件。//告警级别
PerceivedSeverity_T[] excludeSeverityList = new PerceivedSeverity_T[0];//符合此类级别的告警不查询,列表为空标识不使用该过滤条件。//时间范围
String startTime = "20150101000000.0";//起始时间(格式如:20130111000000.0 Z 本地时间及UTC时间均支持)针对告警的清除时间进行过滤,不包括起始时间点。
String endTime = "20240604000000.0";//终止时间(格式如:20130111000000.0 Z 本地时间及UTC时间均支持)针对告警的清除时间进行过滤,包括终止时间点。//调用接口
emsMgr.getAllHistoryAlarmsByFTP(destination, userName, password, meNameList, typeList, excludeProbCauseList, excludeSeverityList, startTime, endTime);

接下来就是怎么采集了。下图所示,我先查询所有的网元,然后再根据网元的managedElement 逐个的生产历史告警。
在这里插入图片描述

2.3接收历史告警的文件传输通知

这里生成历史告警信息,不是实时的,调用方法以后,北向网管异步生成文件上传至FTP,至于最后是否成功或者失败?什么时候生成完毕?只能通过订阅通知获取。
具体的订阅通知代码,具体细节请看
华为北向网管NCE开发教程(6)消息订阅
下面是核心代码及日志记录
在这里插入图片描述

如下是记录的日志信息
在这里插入图片描述

2.4查看告警文件

登录FTP服务器(linux),在文件通知中,可以看到某个文件生成的地址信息。当然了,地址本来就是我们自己给定linux地址。下面是我们使用admin用户登录,则登录linux以后,默认路径就是在home/admin之下,然后生成的全路径也就是home/admin/alarms/xxxxx.txt

String destination = "192.168.1.11:alarms/"+managedElement+".txt";
String userName = "admin";
String password = "123456";

备注:此处建议FTP就直接用部署解析数据的程序linux服务器,这样北向网管上传的文件其实对于程序来说,就是在本地,对于你程序后续解析文件或者其他操作比较方便。不然还得单独写从FTP获取文件增加工作量。然后再很多公司的安全要求里面,FTP被当做不安全的文件传输协议,到时候开发起来,麻烦事比较多。
如果你以为万一这个服务器蹦了,考虑不考虑用集群或者负载均衡等方式,多用几台服务器来采集数据,那就别想了,这个问题无解,对接北向corba就只能单体部署。否则你就只能用rest或者kafka了。当然了用这两个,是要收钱的。

为了方便调试,我把生成在linux的文件,下载到我本地电脑上
在这里插入图片描述

3解析告警文件

其实这一块,可以不写的,毕竟解析和北向网管对接,其实没啥关系了,不过也说一下,毕竟这个确实不好弄

3.1查看文件结构

这是接口文档给的,每一列的含义,告你你用\来分割
在这里插入图片描述
这是我们打开告警文件看到的
在这里插入图片描述
将一整行拆开,可以看到,有些在标签中,有些不在标签中。
在这里插入图片描述

3.2解析思路一:XML报文

1按照行\n切割,得到一条告警信息
2按照每行的 \t分割,得到每个字段
3重新构建一个xml报文
3.1将带标签的转成标准的标签
3.2将没有标签的带上标签
4将xml报文转java对象

生成新的XML报文如下,此方法适用于,你要的数据基本都在标签中

3.2.1生成新的XLM报文

我们需要将原来的txt文件的内容变成如下这种形式

<allRoot><root><node><name>EMS</name><value>Huawei/NCE</value></node><node><name>ManagedElement</name><value>167772176</value></node><node><name>PTP</name><value>/rack=1/shelf=1/sub_shelf=0/slot=5/domain=eth/type=mac/port=1</value></node><ProposedRepairActionList_T/><oneParam><name>Location</name><value>NA</value></oneParam><oneParam><name>Direction</name><value>NA</value></oneParam><oneParam><name>MaintenanceStatus</name><value>NotInMaintenance</value></oneParam><oneParam><name>AlarmSerialNo</name><value>6833516</value></oneParam><oneParam><name>AlarmReason</name><value>缃戝彛杩炴帴涓㈠け</value></oneParam><oneParam><name>ProductName</name><value>OptiX OSN 1800 V</value></oneParam><oneParam><name>EquipmentName</name><value>B2EFS8</value></oneParam><oneParam><name>AffirmState</name><value>TRUE</value></oneParam><oneParam><name>DetailInfo</name><value/></oneParam><oneParam><name>SlaveShelf</name><value>涓诲瓙鏋?</value></oneParam><oneParam><name>HandlingSuggestion</name><value>(1)端口已使能但端口的网线或光纤没有连接好;(2)网线或光纤故障;(3)对端发送部分故障;(4)本端接收部分故障。(5)灰光光模块与彩光光模块对接,端口可能上ETH_LOS。(6)彩光光模块对接,配置不同波长。(7)对接端口的传输模式不一致或者FEC模式不一致。</value></oneParam><oneParam><name>LocationInfo</name><value>0-涓诲瓙鏋?-5-B2EFS8-1(鑷冲竷鏃ラ兘鍐呰挋璋冨害鏁版嵁缃?34M)-MAC:1</value></oneParam><oneParam><name>DeviceIP</name><value/></oneParam><oneParam><name>ROUTE_CAUSE</name><value>0</value></oneParam><oneParam><name>lResSubType</name><value>124321792</value></oneParam><alarmAffect>SA_SERVICE_AFFECTING</alarmAffect><alarmNeTime>1712600372000</alarmNeTime></root><root><node><name>EMS</name><value>Huawei/NCE</value></node><node><name>ManagedElement</name><value>167772176</value></node><node><name>EquipmentHolder</name><value>/rack=1/shelf=1/sub_shelf=0/slot=18</value></node><node><name>Equipment</name><value>1</value></node><ProposedRepairActionList_T/><oneParam><name>Location</name><value>NA</value></oneParam><oneParam><name>Direction</name><value>NA</value></oneParam><oneParam><name>MaintenanceStatus</name><value>NotInMaintenance</value></oneParam><oneParam><name>AlarmSerialNo</name><value>6835838</value></oneParam><oneParam><name>AlarmReason</name><value>鐢垫簮鏁呴殰</value></oneParam><oneParam><name>ProductName</name><value>OptiX OSN 1800 V</value></oneParam><oneParam><name>EquipmentName</name><value>F5PIU</value></oneParam><oneParam><name>AffirmState</name><value>TRUE</value></oneParam><oneParam><name>DetailInfo</name><value>48V涓荤數婧愭瑺鍘?鍛婅?﹀弬鏁癐I(16杩涘埗) 0x50</value></oneParam><oneParam><name>SlaveShelf</name><value>涓诲瓙鏋?</value></oneParam><oneParam><name>HandlingSuggestion</name><value>(1)备份电源板开关未打开;(2)电源板失效;(3)单板电源老化。</value></oneParam><oneParam><name>LocationInfo</name><value>0-涓诲瓙鏋?-18-F5PIU-OTHER</value></oneParam><oneParam><name>DeviceIP</name><value/></oneParam><oneParam><name>ROUTE_CAUSE</name><value>0</value></oneParam><oneParam><name>lResSubType</name><value>124321792</value></oneParam><alarmAffect>SA_SERVICE_AFFECTING</alarmAffect><alarmNeTime>1712616472000</alarmNeTime></root><root><node><name>EMS</name><value>Huawei/NCE</value></node><node><name>ManagedElement</name><value>167772176</value></node><node><name>PTP</name><value>/rack=1/shelf=1/sub_shelf=0/slot=5/domain=eth/type=mac/port=1</value></node><ProposedRepairActionList_T/><oneParam><name>Location</name><value>NA</value></oneParam><oneParam><name>Direction</name><value>NA</value></oneParam><oneParam><name>MaintenanceStatus</name><value>NotInMaintenance</value></oneParam><oneParam><name>AlarmSerialNo</name><value>6845135</value></oneParam><oneParam><name>AlarmReason</name><value>缃戝彛杩炴帴涓㈠け</value></oneParam><oneParam><name>ProductName</name><value>OptiX OSN 1800 V</value></oneParam><oneParam><name>EquipmentName</name><value>B2EFS8</value></oneParam><oneParam><name>AffirmState</name><value>TRUE</value></oneParam><oneParam><name>DetailInfo</name><value/></oneParam><oneParam><name>SlaveShelf</name><value>涓诲瓙鏋?</value></oneParam><oneParam><name>HandlingSuggestion</name><value>(1)端口已使能但端口的网线或光纤没有连接好;(2)网线或光纤故障;(3)对端发送部分故障;(4)本端接收部分故障。(5)灰光光模块与彩光光模块对接,端口可能上ETH_LOS。(6)彩光光模块对接,配置不同波长。(7)对接端口的传输模式不一致或者FEC模式不一致。</value></oneParam><oneParam><name>LocationInfo</name><value>0-涓诲瓙鏋?-5-B2EFS8-1(鑷冲竷鏃ラ兘鍐呰挋璋冨害鏁版嵁缃?34M)-MAC:1</value></oneParam><oneParam><name>DeviceIP</name><value/></oneParam><oneParam><name>ROUTE_CAUSE</name><value>0</value></oneParam><oneParam><name>lResSubType</name><value>124321792</value></oneParam><alarmAffect>SA_SERVICE_AFFECTING</alarmAffect><alarmNeTime>1712681968000</alarmNeTime></root>
</allRoot>

3.2.2定义新XML报文实体类

定义一个java实体类来接收上面的XML报文

@XmlRootElement(name = "allRoot")
@ToString
public class AllRoot {private List<Root> roots;@XmlElement(name = "root")public List<Root> getRoots() {return roots;}public void setRoots(List<Root> roots) {this.roots = roots;}
}@XmlRootElement(name = "root")
@ToString
public class Root {private List<Node> nodes;private List<OneParam> oneParams;private String alarmAffect;private Long alarmNeTime;public Root() {}@XmlElement(name = "node")public List<Node> getNodes() {return nodes;}public void setNodes(List<Node> nodes) {this.nodes = nodes;}@XmlElement(name = "oneParam")public List<OneParam> getOneParams() {return oneParams;}public void setOneParams(List<OneParam> oneParams) {this.oneParams = oneParams;}@XmlElement(name = "alarmAffect")public String getAlarmAffect() {return alarmAffect;}public void setAlarmAffect(String alarmAffect) {this.alarmAffect = alarmAffect;}@XmlElement(name = "alarmNeTime")public Long getAlarmNeTime() {return alarmNeTime;}public void setAlarmNeTime(Long alarmNeTime) {this.alarmNeTime = alarmNeTime;}}@XmlRootElement(name = "node")
@ToString
public class Node {private String name;private String value;@XmlElement(name = "name")public String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElement(name = "value")public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}@XmlRootElement(name = "oneParam")
@ToString
public class OneParam {private String name;private String value;@XmlElement(name = "name")public String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElement(name = "value")public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

3.2.3代码实现

private static final Set<String> ALARM_AFFECT = new HashSet<>(Arrays.asList("SA_UNKNOWN", "SA_SERVICE_AFFECTING", "SA_NON_SERVICE_AFFECTING"));public AllRoot getAlarmDataByPath(String path) throws JAXBException {String alarmStr = JsonUtils.readStringFromSystemPath(path);String[] rows = alarmStr.split("\n");StringBuilder rootStr = new StringBuilder();rootStr.append("<allRoot>");for (int i = 1; i < rows.length; i++) {String alarmAffect = "";Long alarmNeTime = null;rootStr.append("<root>");String[] columns = rows[i].split("\t");for (int j = 1; j < columns.length; j++) {//提取标准标签内容if(columns[j].contains("<") && columns[j].contains(">")) {rootStr.append(columns[j]);//提取标签外的内容时间和ALARM_AFFECT,这里是需要特殊处理的,根据你要的业务来特殊处理,我所需要的两个字段刚好都可以满足我的需求进行特殊处理}else {if(ALARM_AFFECT.contains(columns[j])) {alarmAffect = columns[j];}else if(columns[j].contains(".0Z")){//大时间是emsTime,小时间是neTimeLong date = DateUtils.StrToLongTime(columns[j], FORMAT);if(alarmNeTime == null) {alarmNeTime = date;}else {alarmNeTime = Math.min(alarmNeTime, date);}}}}//追加标签外的alarmAffect和alarmNeTime到新报文中rootStr.append("<alarmAffect>");rootStr.append(alarmAffect);rootStr.append("</alarmAffect>");rootStr.append("<alarmNeTime>");rootStr.append(alarmNeTime.toString());rootStr.append("</alarmNeTime>");rootStr.append("</root>");}rootStr.append("</allRoot>");//新XML报文转Java对象JAXBContext jaxbContext = JAXBContext.newInstance(AllRoot.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();StringReader reader = new StringReader(rootStr.toString());return (AllRoot) unmarshaller.unmarshal(reader);}

3.3解析思路二:按照顺序列赋值

1按照行\n切割,得到一条告警信息
2按照每行的 \t分割,得到每个字段
3假定每行切割的第一个字段是aa属性,第二个字段是bb属性,第三个字段是cc属性

核心代码

String alarmStr = JsonUtils.readStringFromSystemPath(path);
String[] rows = alarmStr.split("\n");
String[] title = rows[0].split("\t");
StringBuilder rootStr = new StringBuilder();
for (int i = 1; i < rows.length; i++) {String[] columns = rows[i].split("\t");for (int j = 1; j < columns.length; j++) {System.out.println("第:" + j +"列");System.out.println("标题:"+title[j]);System.out.println("对应值:"+columns[j]);System.out.println("------------------");}
}

在这里插入图片描述
完毕。

这篇关于华为北向网管NCE开发教程(7)历史告警采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063191

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

最便宜的8口2.5G网管交换机! 水星SE109 Pro拆机测评

《最便宜的8口2.5G网管交换机!水星SE109Pro拆机测评》水星SE109Pro价格很便宜,水星SE109Pro,外观、接口,和SE109一样,区别Pro是网管型的,下面我们就来看看详细拆... 听说水星SE109 Pro开卖了,PDD卖 220元,于是买回来javascript拆机看看。推荐阅读:水

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.