使用JAVA SNMP监控HP UNIX的CPU和内存

        通过SNMP协议访问HP-UNIX的内存/CPU使用情况的OID为:
          "1.3.6.1.4.1.11.2.3.1.1.7.0      //FreeMemory
          "1.3.6.1.4.1.11.2.3.1.1.8.0"     //TotalMemory
          "1.3.6.1.4.1.11.2.3.1.1.13.0"    //CPUUser
          "1.3.6.1.4.1.11.2.3.1.1.14.0"    //CPUSystem
          "1.3.6.1.4.1.11.2.3.1.1.15.0"    //CPUIdle
          "1.3.6.1.4.1.11.2.3.1.1.16.0"    //CPUNice
        其中前两项为数量值,以KB为单位,所以可以很方便的取到内存使用情况。后四项时计数项,所以要计算CPU的使用率,就比较麻烦了。

        通过使用JAVA SNMP包(网上可以找到),可以方便的连接到要监控的机器上:

=================================================
  private SNMPv1CommunicationInterface _snmpConn;
  private long _lOldIdle = 0;
  private long _lOldSystem = 0;
  private long _lOldNice = 0;
  private long _lOldUser = 0;
  
  public static void main(String[] sArgs)
  {
   InetAddress hostAddress = InetAddress.getByName("127.0.0.1");  //machine ip
   SNMPv1CommunicationInterface snmpConn = new SNMPv1CommunicationInterface(0, hostAddress, "public");
   while(true)
   {
    try
    {
     double[] dCpu = getCPUInfo();
     long[] lMemory = getMemoryInfo();
     System.out.println("values");     //将这些值输出到屏幕,也可以到文档或数据结构中
     Thread.sleep(1000);               //每秒取一次,可以自行调整
    }
    catch(Exception E)
    {
     E.printStackTrace();
    }
   }
  }
  
       //取得CPU空闲率,使用率(User/System/Nice)
       //需要保存上一个监控点的计数,再将本次监控的值减去上一个监控点的计数
       //将Idel/System/User/Nice四个值相加得到总CPU计数
       //分别和Idel/System/User/Nice四个值相比就得到CPU空闲率和使用率了
  protected double[] getCPUInfo()
  {
   long lCurCpuUser = getValue("1.3.6.1.4.1.11.2.3.1.1.13.0");
   long lCurCpuSystem = getValue("1.3.6.1.4.1.11.2.3.1.1.14.0");
   long lCurCpuIdle = getValue("1.3.6.1.4.1.11.2.3.1.1.15.0");
   long lCurCpuNice = getValue("1.3.6.1.4.1.11.2.3.1.1.16.0");
   long lSubCpuUser = lCurCpuUser - _lOldUser;
   long lSubCpuSystem = lCurCpuSystem - _lOldSystem;
   long lSubCpuIdle = lCurCpuIdle - _lOldIdle;
   long lSubCpuNice = lCurCpuNice - _lOldNice;
   long lTotal = lSubCpuUser + lSubCpuSystem + lSubCpuIdle + lSubCpuNice;

   _lOldUser = lCurCpuUser;
   _lOldSystem = lCurCpuSystem;
   _lOldIdle = lCurCpuIdle;
   _lOldNice = lCurCpuNice;
   if(lTotal != 0)
   {
    double dCpuUser = (double)(lSubCpuUser * 100) / (double)lTotal;
    double dCpuSystem = (double)(lSubCpuSystem * 100) / (double)lTotal;
    double dCpuIdle = (double)(lSubCpuIdle * 100) / (double)lTotal;
    double dCpuNice = (double)(lSubCpuNice * 100) / (double)lTotal;
    return new double[]{dCpuUser, dCpuSystem, dCpuIdle, dCpuNice};
   }
   else
   {
    return new double[]{0.0, 0.0, 0.0, 0.0};
   }
  }
  
       //取得空闲物理内存和总物理内存
       //直接取得相应OID的值
       //如果要计算内存使用率,将(lSystemMemory-lFreeMemory)*100/lSystemMemory即可,计算前要转换成double型计算
  protected long[] getMemoryInfo()
  {
   long lFreeMemory = getValue("1.3.6.1.4.1.11.2.3.1.1.7.0");
   long lSystemMemory = getValue("1.3.6.1.4.1.11.2.3.1.1.8.0);
   return new long[]{lFreeMemory, lSystemMemory};
  }
  
        //通过SNMP协议取得指定OID的值
  protected long getValue(String sOID)
  {
   try
   {
    SNMPVarBindList newVars = snmpConn.getMIBEntry(sOID);
    SNMPSequence pair = (SNMPSequence)(newVars.getSNMPObjectAt(0));
    SNMPObject snmpValue = pair.getSNMPObjectAt(1);
    BigInteger biValue = (BigInteger)snmpValue.getValue();
    return biValue.longValue();
   }
   catch(Exception E)
   {
    System.out.println("Encounter exception while getting value " +
     "which OID is " + sOID + " by SNMP: " + E.getMessage());
    return 0;
   }
  }
=================================================

        结合JFreeChart等开源包,将监控结果作成图型,就比较完美了。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值