java 通過服務器ip以及snmp協議讀取cpu使用率,和內存使用率

java 通過服務器ip以及snmp協議讀取cpu使用率,和內存使用率

github地址 https://github.com/Plumblumpb/snmp-demo.git

環境配置

window環境配置:https://jingyan.baidu.com/article/7f766dafe17d394101e1d0f9.html
linux環境配置:https://blog.csdn.net/c_royi/article/details/86640800

代碼及運行流程

  pom.xml文件

 <dependency>
     <groupId>org.snmp4j</groupId>
     <artifactId>snmp4j</artifactId>
     <version>2.5.11</version>
 </dependency>

  實體類(存儲ip,port,version,等信息)
沒有展示getter,setter方法

**
 * @Auther: cpb
 * @Date: 2019/1/24 10:41
 * @Description:
 */
public class SnmpModel {
    private String communityName;
    private String hostIp;
    private Integer port;
    private int version;
    private int async;//是否同步查詢

    private String serverId; // 受監控服務器標識
    private String code; // 受監控服務器編碼
    private String name; // 受監控服務器名稱
    private String type; // 服務器的應用類型(如應用服務,數據庫服務,前置機服務器),在維護時輸入,在界面中相應字段呈現
    private String systemName; // 受監控服務器操作系統
    private String ip; // 受監控服務器IP地址
    private String address; // 受監控服務的存放地址
    private String statusid; // 狀態(1爲可用,0爲不可用,默認爲1),用於是否對這個服務器進行監控
    private String remark; // 備註
    private String cpu;
    private String memory;
    private String time;
    private boolean ethernetConnection;

    // 服務service字段
    private String serviceId; // 受監控服務標識
    private String serviceName; // 受監控服務名稱
    private String serverName; // 受監控服務所在服務器名稱
    private String serverIp; // 受監控服務所在服務器IP
    private String processeName; // 受監控服務進行名稱
    private String serviceStatus; // 狀態(1爲可用,0爲禁用,默認值爲1),用於是否對這個服務進程進行監控
    private String serviceRemark; // 備註
}

  snmp服務類

import org.apache.log4j.Logger;
import java.io.IOException;
import java.net.InetAddress;
import java.util.List;

/**
 * @Auther: cpb
 * @Date: 2019/1/24 10:42
 * @Description:
 */
public class SnmpService {
    private static final Logger logger = Logger.getLogger(SnmpService.class);
    SnmpDao snmpDao = new SnmpDao();

    public SnmpDao getInstanceSnmpDao() {
        return snmpDao;
    }
    /**
     * 獲取CPU使用率
     *
     * @param snmpModel
     * @return 正常返回CPU當前使用率,否則返回-1
     */
    public Integer getCpuUtilization(SnmpModel snmpModel) {
        List<String> result = getInstanceSnmpDao().walkByTable(
                ".1.3.6.1.2.1.25.3.3.1.2", snmpModel);
        if (result == null || result.size() == 0) {
            return -1;
        }
        double sum = 0;
        for (String s : result) {
            sum += Double.parseDouble(s);
        }
        return (int) (sum / result.size());
    }

    /**
     * 獲取Memory佔用率
     *
     * @param snmpModel
     * @return 正常返回當前內存使用率,否則返回-1
     * @throws IOException
     */
    public Integer getMemoryUtilization(SnmpModel snmpModel){

        // 使用
        try{
            List<String> usedresultList = getInstanceSnmpDao().walkByTable(".1.3.6.1.2.1.25.2.3.1.6", snmpModel);
            // 總
            List<String> allresultList = getInstanceSnmpDao().walkByTable(".1.3.6.1.2.1.25.2.3.1.5", snmpModel);

            if (usedresultList != null && usedresultList.size() > 0 && allresultList !=null && allresultList.size() >0) {

                double used = 0;
                // 最後一個纔是使用的內存(單位是數目 ) 因系統而不同 本機有5項
                // System.out.println(usedresultList.size());
                // for(String s:usedresultList){
                // System.out.println(s);
                // }
                String usedStr = usedresultList.get(usedresultList.size() - 1);
                used = Double.parseDouble(usedStr);
                double all = 0;
                String allStr = allresultList.get(allresultList.size() - 1);
                all = Double.parseDouble(allStr);
                return (int) ((used / all) * 100);
            }
        }catch (Exception e) {
            logger.error("獲取Memory佔用率:"+e.getMessage());
        }
        return -1;
    }

    /**
     * 測網絡通不通 類似 ping ip
     *
     * @param snmpModel
     * @return
     * @throws IOException
     */
    public boolean isEthernetConnection(SnmpModel snmpModel) throws IOException {

        InetAddress ad = InetAddress.getByName(snmpModel.getHostIp());
        boolean state = ad.isReachable(2000);// 測試是否可以達到該地址 2秒超時
        return state;
    }



}

  snmp實現類


import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: cpb
 * @Date: 2019/1/24 10:43
 * @Description:
 */
public class SnmpDao {
    private String communityName;
    private String hostIp;
    private Integer port;
    private int version;
    private static final Logger logger = Logger.getLogger(SnmpDao.class);

    /**
     * 獲取指定OID對應的table值
     * @param oid
     * @param snmpModel
     * @return
     */
    public List<String> walkByTable(String oid, SnmpModel snmpModel){
        //initSnmp(snmpModel);

        Snmp snmp = null;
        PDU pdu;
        CommunityTarget target;
        List<String> result = new ArrayList<String>();

        communityName = snmpModel.getCommunityName();
        hostIp = snmpModel.getHostIp();
        port = snmpModel.getPort();
        version = snmpModel.getVersion();
        try {
            DefaultUdpTransportMapping dm = new DefaultUdpTransportMapping();
//			dm.setSocketTimeout(5000);
            snmp = new Snmp(dm);
            snmp.listen();
            target = new CommunityTarget();
            target.setCommunity(new OctetString(communityName));
            target.setVersion(version);
            target.setAddress(new UdpAddress(hostIp+"/"+port));
            target.setTimeout(1000);
            target.setRetries(1);

            TableUtils tutils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
            OID[] columns = new OID[1];
            columns[0] = new VariableBinding(new OID(oid)).getOid();
            List<TableEvent> list = (List<TableEvent>) tutils.getTable(target, columns, null, null);
            for(TableEvent e : list){
                VariableBinding[] vb = e.getColumns();
                if(null == vb)continue;
                result.add(vb[0].getVariable().toString());
//				 System.out.println(vb[0].getVariable().toString());
            }
            snmp.close();
        } catch (IOException e) {
            //e.printStackTrace();
            logger.error(e.getMessage());
        }finally{
            try {
                if(snmp != null)
                {
                    snmp.close();
                }
            } catch (IOException e) {
                logger.error(e.getMessage());
            }
        }
        return result;

    }
}

  方法測試

import java.io.IOException;

/**
 * @Auther: cpb
 * @Date: 2019/1/24 10:45
 * @Description:
 */
public class Demo {
    public static void main(String[] args) {
        SnmpService snmpService = new SnmpService();
        SnmpModel snmpModel = new SnmpModel();
        snmpModel.setIp("127.0.0.1");
        snmpModel.setCommunityName("public");
        snmpModel.setHostIp("127.0.0.1");
        snmpModel.setPort(161);
        snmpModel.setVersion(1);
        try {
            //是否連接
            System.out.println("是否連接:"+snmpService.isEthernetConnection(snmpModel));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("cpu利用率:"+ snmpService.getCpuUtilization(snmpModel));
        System.out.println("內存使用率:"+ snmpService.getMemoryUtilization(snmpModel));

    }
}

測試結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章