前后端分离之网络设备监控系统开发三

一、后端开发

  • 数据库
    Mysql5.7
  • springboot2.x
  • 其他陆续加入

二、利用snmp获取服务器数据

1.CPU使用率获取OID

  • 服务器CPU的获取
    服务器的CPU相关的OID:.1.3.6.1.2.1.25.3.3.1.2,该oid的含义是,处理器在最后一分钟内不是空闲的百分比,多核处理器就有多个值,处理思路是,将所有值累加除以核数,即为最后一分钟CPU使用率。
  • Cisco设备的CPU使用率
    OID:.1.3.6.1.4.1.9.2.1.58,该oid的含义是,CPU五分钟内的使用率平均值,这个oid是Cisco私有oid。
    OID:.1.3.6.1.4.1.9.2.1.57,该oid的含义是,CPU一分钟内的使用率平均值,这个oid是Cisco私有oid。
  • 锐捷设备CPU使用率
  • OID:.1.3.6.1.4.1.4881.1.1.10.2.36.1.1.3.0,该oid的含义是CPU使用率,私有

2.使用OID获取信息

 public Cpu GetInfo(String ip) throws Exception {
        SNMPSessionUtil sessionUtil = new SNMPSessionUtil(ip, "161", "public", "2");//该类在文章一中
        String[] isSnmp = {".1.3.6.1.2.1.1.3"};//判断SNMP是否连通
        ArrayList isSnmpGet = sessionUtil.getIsSnmpGet(PDU.GET, isSnmp);
        String[] oids = {".1.3.6.1.2.1.25.3.3.1.2"};//服务器cpu使用率
        String[] oids2 = {".1.3.6.1.2.1.4.1.0"};//是否具有转发功能,路由器和三层交换机会有
        String[] ciscoCpu = {".1.3.6.1.4.1.9.2.1.58"};
        String[] ruijieCpu = {".1.3.6.1.4.1.4881.1.1.10.2.36.1.1.3.0"};
        String[] oids3 = {".1.3.6.1.2.1.1.1.0"};//判断是Cisco或者锐捷
        ArrayList type = sessionUtil.getSnmpGet(PDU.GET, oids3);
        ArrayList dtype = sessionUtil.snmpWalk2(oids);
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ArrayList forwording = sessionUtil.getSnmpGet(PDU.GET, oids2);
        if ("-1".equals(isSnmpGet.get(0))) {
            Cpu c = new Cpu();
            c.setIp(ip);
            c.setCpuRate(0.0);
            c.setTime(df.format(new Date()));
            cpuMapper.insert(c);
            return c;
        } else {
            if (!dtype.isEmpty() && "2".equals(forwording.get(0))) {
                Cpu CpuInfo = new Cpu();
                CpuInfo.setIp(ip);
                List list = GetInformation.getCpuInfo(ip);
                if (list.size() == 1 && list.get(0).getColumns() == null) {
                    throw new Exception("未获取到信息!");
                } else {
                    int percentage = 0;
                    for (TableEvent event : list) {
                        VariableBinding[] values = event.getColumns();
                        System.out.println(values[0].getVariable());
                        percentage += Integer.parseInt(values[0].getVariable().toString());
                    }
                    CpuInfo.setCpuRate((double) (percentage / list.size()));
                }
                CpuInfo.setTime(df.format(new Date()));
                cpuMapper.insert(CpuInfo);
                return CpuInfo;
            } else if (type.get(0).contains("Cisco")) {// cisco设备
                Cpu cisco = new Cpu();
                Integer cp = 0;
                ArrayList cpu = sessionUtil.snmpWalk2(ciscoCpu); //五分钟平均利用率
                List c = new ArrayList<>();
                for (String s : cpu) {
                    c.add(Integer.valueOf(s.substring(s.lastIndexOf("=")).replace("=", "").trim()));
                }
                for (Integer integer : c) {
                    cp += integer;
                }
                cisco.setIp(ip);
                if (c.size()==0){
                    cisco.setCpuRate((double) cp );
                }else {
                    cisco.setCpuRate((double) cp/c.size() );
                }
                cisco.setTime(df.format(new Date()));
                cpuMapper.insert(cisco);
                return cisco;
            } else if (type.get(0).contains("Ruijie")) {
                Cpu ruijie = new Cpu();
                ArrayList cpu = sessionUtil.getSnmpGet(PDU.GET, ruijieCpu); //五分钟平均利用率
                ruijie.setIp(ip);
                ruijie.setCpuRate(Double.parseDouble(cpu.get(0)));
                ruijie.setTime(df.format(new Date()));
                cpuMapper.insert(ruijie);
                return ruijie;
            }
        }
        Cpu c = new Cpu();
        c.setIp(ip);
        c.setCpuRate(0.0);
        c.setTime(df.format(new Date()));
        return c;
    }

CPU类:

@Data
public class Cpu {
    private Integer id;
    private String ip;//所属设备
    private Double cpuRate;//cpu使用率
    //private Integer hrProcessorLoad;//CPU的当前负载,N个核就有N个负载
    private String time;

}

三、数据保存数据库

使用的是mysql5.7,直接存入数据库即可。

四、实时访问

前后端分离之网络设备监控系统开发三_第1张图片
前端使用的是vue,用到了Echarts图形插件。实时的cpu流量监控可以使用ajax轮询请求,如果负担不大一分钟一次,当然这样其实比较浪费资源,那么也可以使用websocket进行数据更新。这里我是用的是ajax轮询,这个页面是之前测试的页面。

路漫漫其修远兮

你可能感兴趣的:(Java)