`
avery_leo
  • 浏览: 382361 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

snmp4j获取数据实例(一,Linux SNMP OID’s for CPU,Memory a)

    博客分类:
  • JAVA
阅读更多

常用SNMP OID

 

Linux SNMP OID’s for CPU,Memory and Disk Statistics

 

SNMP stands for Simple Network Management Protocol and consists of three key components: managed devices, agents, and network-management systems (NMSs). A managed device is a node that has an SNMP agent and resides on a managed network. These devices can be routers and access server, switches and bridges, hubs, computer hosts, or printers. An agent is a software module residing within a device. This agent translates information into a compatible format with SNMP. An NMS runs monitoring applications. They provide the bulk of processing and memory resources required for network management.

SNMP MIBs, OIDs Overview

MIB stands for Management Information Base and is a collection of information organized hierarchically. These are accessed using a protocol such as SNMP. There are two types of MIBs: scalar and tabular. Scalar objects define a single object instance whereas tabular objects define multiple related object instances grouped in MIB tables.

MIB files for specific devices or systems can be downloaded from here

OIDs or Object Identifiers uniquely identify manged objects in a MIB hierarchy. This can be depicted as a tree, the levels of which are assigned by different organizations. Top level MIB object IDs (OIDs) belong to different standard organizations. Vendors define private branches including managed objects for their own products.

Here is a sample structure of an OID

Iso (1).org(3).dod(6).internet(1).private(4).transition(868).products(2).chassis(4).card(1).slotCps(2)­
.­cpsSlotSummary(1).cpsModuleTable(1).cpsModuleEntry(1).cpsModuleModel(3).3562.3

Most of the people may be looking for OID’s for Linux OID’s for CPU,Memory and Disk Statistics for this first you need to install SNMP server and clients. If you want to install SNMP server and client installation in linux学习 check here

CPU Statistics

Load
1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3

CPU
percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0

Memory Statistics

Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAM Free: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0

Disk Statistics

The snmpd.conf needs to be edited. Add the following (assuming a machine with a single ‘/’ partition):

disk / 100000 (or)

includeAllDisks 10% for all partitions and disks

The OIDs are as follows

Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1

System Uptime: .1.3.6.1.2.1.1.3.0

Examples

These Commands you need to run on the SNMP server

Get available disk space for / on the target host

#snmpget -v 1 -c “community” target_name_or_ip .1.3.6.1.4.1.2021.9.1.7.1

this will return available disk space for the first entry in the ‘disk’ section of snmpd.conf; replace 1 with n for the nth entry

Get the 1-minute system load on the target host

#snmpget -v 1 -c “community” target_name_or_ip .1.3.6.1.4.1.2021.10.1.3.1

Get the 5-minute system load on the target host

#snmpget -v 1 -c “community” target_name_or_ip .1.3.6.1.4.1.2021.10.1.3.2

Get the 15-minute system load on the target host

#snmpget -v 1 -c “community” target_name_or_ip .1.3.6.1.4.1.2021.10.1.3.3

Get amount of available swap space on the target host

#snmpget -v 1 -c “community” target_name_or_ip .1.3.6.1.4.1.2021.4.4.0

 

import java.io.IOException;
import java.net.InetAddress;
import java.util.Vector;
import org.snmp4j.AbstractTarget;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
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;

public class SNMP_oper
...{
    
    public static void main(String[] args)
    ...{
        try
        ...{
            Address targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
            TransportMapping transport = new DefaultUdpTransportMapping();
            Snmp snmp = new Snmp(transport);
            transport.listen();//监听
            
            
            CommunityTarget target = new CommunityTarget();
            target.setCommunity(new OctetString("public"));//设置共同体名
            target.setAddress(targetAddress);//设置目标Agent地址
            target.setRetries(2);//重试次数
            target.setTimeout(5000);//超时设置
            target.setVersion(1);//版本
            
            PDU request = new PDU();
            request.setType(PDU.GET);//操作类型GET
            request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.1.0")));//OID_sysDescr
            request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.2.0")));//OID_sysObjectID
            request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3.0")));//OID_sysUpTime

            System.out.println("Request UDP:" + request);
            
            ResponseEvent respEvt = snmp.send(request, target);
            
            //读取得到的绑定变量
            if (respEvt != null && respEvt.getResponse()!=null)
            ...{
                Vector <VariableBinding> revBindings = respEvt.getResponse().getVariableBindings();
                for (int i=0; i<revBindings.size();i++)
                ...{
                    VariableBinding vbs = revBindings.elementAt(i);
                    System.out.println(vbs.getOid()+":"+vbs.getVariable());
                }
            }

        }
        catch (IOException e)
        ...{
            e.printStackTrace();
        }
    }
}

 

更详细是资料 http://blog.chinaunix.net/u/10921/showart_202809.html

分享到:
评论
6 楼 zhang0135 2009-07-22  
您好,我在学习snmp,想请教您一下:
使用您的这段代码试了一下,能读取到本机的一些信息,然后我把IP改成远程主机的就读取不到信息了,但是我用MG-SOFT MIB Browser能读取到那台的信息,比如已运行时间什么的,这是为什么?
是不是OID的格式有问题,最前面的那个点代表什么?
谢谢
5 楼 avery_leo 2009-05-11  
银翼魔术师 写道

你好又有个问题要问你,table型的数据要怎么全部读出来。例如网络流入数据包这个信息,它的oid是1.3.6.1.2.1.2.2.1.10.0,这个oid对应着是一个表格。如果按照上面讲的方法去做,那么只能读出table的第一个数据。如果想全部读出来要怎么做呢?网上搜来一段程序,如下......OID[] columns = new OID[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; columns[0] =&nbsp; new VariableBinding(new OID ("1.3.6.1.2.1.2.2.1.10.0")).getOid();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = tu.getTable(target, columns, null, null);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(list.size());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;list.size();i++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; System.out.println("aaaaaa");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; System.out.println(list);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TableEvent te = (TableEvent)list.get(i);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("bbbb");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VariableBinding [] vbs = te.getColumns();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(vbs[0]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;vbs.length;j++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(vbs[j]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }..............但是运行会出错误,不知道该怎么办,能指导下吗,谢谢


上面的例子,返回的是个ResponseEvent,如果返回的是个Table,我觉得应该用TableEvent,这个我没有用到过,你可以试试看。

The TableEvent class reports events in a table retrieval operation.
4 楼 银翼魔术师 2009-05-10  
你好又有个问题要问你,table型的数据要怎么全部读出来。例如网络流入数据包这个信息,它的oid是1.3.6.1.2.1.2.2.1.10.0,这个oid对应着是一个表格。如果按照上面讲的方法去做,那么只能读出table的第一个数据。如果想全部读出来要怎么做呢?

网上搜来一段程序,如下

......

OID[] columns = new OID[1];
            
             columns[0] =  new VariableBinding(new OID ("1.3.6.1.2.1.2.2.1.10.0")).getOid();
             List list = tu.getTable(target, columns, null, null);
             System.out.println(list.size());
             for(int i=0;i<list.size();i++){
              System.out.println("aaaaaa");
              System.out.println(list);
                 TableEvent te = (TableEvent)list.get(i);
                 System.out.println("bbbb");
                 VariableBinding [] vbs = te.getColumns();
                
                 System.out.println(vbs[0]);
                 for(int j=0;j<vbs.length;j++){
                     System.out.println(vbs[j]);
                 }
             }
..............

但是运行会出错误,不知道该怎么办,能指导下吗,谢谢
3 楼 银翼魔术师 2009-04-27  
avery_leo 写道


不同硬件设备的OID是不一样的,与设备的制造商有关,通过一些开源的监控设备可以检测到这些OID的值,或者咨询设备生产商。

如果开发通用的监控程序,必须知道你所检测设备中各项功能的OID值,如果只是自己公司内部用的,可以自己实现这些功能,比如监测CPU等信息。

谢谢!明白了
2 楼 avery_leo 2009-04-27  
银翼魔术师 写道

你好,我最近也在做一个snmp4j的开发项目,类似于网络监测系统。要显示服务器的cpu和内存以及磁盘的使用情况。看了你的关于snmp的资料,收获很多。这里有个问题想请教下:服务器的cpu、内存的oid,不同的机器是一样的吗?还是说不同的机器的cpu和内存有不同的oid?我写了一个target的程序,能够读出public的oid,例如系统的名字和运行时间等。那如果要读取cpu的相关信息的话,直接按照你给的oid去读取如:CPUpercentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0raw user cpu time: .1.3.6.1.4.1.2021.11.50.0percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0raw system cpu time: .1.3.6.1.4.1.2021.11.52.0percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0还是要查找针对相应机器的cpu的oid。还有就是如果我想查看我的目标服务器的cpu和内存以及磁盘的oid的话,要怎么做,谢谢!


不同硬件设备的OID是不一样的,与设备的制造商有关,通过一些开源的监控设备可以检测到这些OID的值,或者咨询设备生产商。

如果开发通用的监控程序,必须知道你所检测设备中各项功能的OID值,如果只是自己公司内部用的,可以自己实现这些功能,比如监测CPU等信息。
1 楼 银翼魔术师 2009-04-25  

你好,我最近也在做一个snmp4j的开发项目,类似于网络监测系统。要显示服务器的cpu和内存以及磁盘的使用情况。看了你的关于snmp的资料,收获很多。这里有个问题想请教下:服务器的cpu、内存的oid,不同的机器是一样的吗?还是说不同的机器的cpu和内存有不同的oid?我写了一个target的程序,能够读出public的oid,例如系统的名字和运行时间等。

那如果要读取cpu的相关信息的话,直接按照你给的oid去读取
如:
CPU
percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0

还是要查找针对相应机器的cpu的oid。

还有就是如果我想查看我的目标服务器的cpu和内存以及磁盘的oid的话,要怎么做,谢谢!

相关推荐

Global site tag (gtag.js) - Google Analytics