SNMP:简单网络管理协议,SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP 接收随机消息(及事件报告)网络管理系统获知网络出现问题。目前, SNMP 有 3 种: SNMPV1 、 SNMPV2 、 SNMPV3。第 1 版和第 2 版没有太大差距,但 SNMPV2 是增强版本,包含了其它协议操作。与前两种相比, SNMPV3 则包含更多安全和远程配置。为了解决不同 SNMP 版本间的不兼容问题, RFC3584 种定义了三者共存策略。 要使用weblogic的snmp功能首先要在weblogic的控制台中启用snmp功能,然后就可以使用oid来获得堆栈、内存等使用信息了

一些概念:

 SNMP:简单网络管理协议,SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP 接收随机消息(及事件报告)网络管理系统获知网络出现问题。目前, SNMP 有 3 种: SNMPV1 、 SNMPV2 、 SNMPV3。第 1 版和第 2 版没有太大差距,但 SNMPV2 是增强版本,包含了其它协议操作。与前两种相比, SNMPV3 则包含更多安全和远程配置。为了解决不同 SNMP 版本间的不兼容问题, RFC3584 种定义了三者共存策略。

SNMP OID:SNMP Object Identifiers(对象标示符),SNMP对象标识符(OID)是定义在特定MIB模式中的值,来定义一个特定的在MIB数据库中SNMP目标。SNMP OID是划界序列数字组成a.b.c...x.y.z的周期。它对信息的一个项目是一个独特的标识符,其是一个MIB的一部分。典型的OIDs能够有与它们相关的名字。OIDs在自然中是分等级的。因此1.2.3出现在1.3之前但是在1.2之后。MIB 会为其描述的每个受管对象分配一个唯一的、不可变的编号,称为对象标识符(Object Identifier,简称 OID)。每个 OID 包含一个从左到右的整数序列。此序列定义 MIB 树中的对象的位置,并指定通过树到达此对象的唯一路径。此路径中的每个节点均有一个编号和一个与编号关联的名称。 

    路径 .1.3.6.1.4.1 定义 private.enterprises OID,树上此节点下的每个编号代表树中为特定供应商(如 BEA)保留的分支。BEA MIB 注册在树中的位置 .1.3.6.1.4.1.140,WebLogic Server MIB 包含 .1.3.6.1.4.1.140.625 下的所有 OID

管理信息库(MIB)是一个具有分层特性的信息的集合,我们可以通过 SNMP 去存取它。MIB 的成员是一些被管理的对象(Managed Object),以对象标示符(Object Identifiers)来区分它们。



在bea目录下有一个BEA-WEBLOGIC-MIB.asn1文件,保存了snmp的配置,具体配置的含义可以参照:http://e-docs.bea.com/wls/docs81/snmp/index.html


如果想加入自己的OID,可以将将OID 相应的包放到 %WL_HOME%\server\lib\mbeantypes 目录下就可以了(这个我也没有试过)


要使用weblogic的snmp功能首先要在weblogic的控制台中启用snmp功能,然后就可以使用oid来获得堆栈、内存等使用信息了

在Services/SNMP下:



在weblogic中提供了1万多的oid可以给第三方软件使用,我们也可以使用unix自带的snmpwalk命令去取得各个oid的值,以下列出几个例子:

# jvm runtime Heap size

snmpwalk -v 2c -c public 192.168.88.160:161 .1.3.6.1.4.1.140.625.340.1.30


#host used memory (by jrockit jdk)

snmpwalk -v 2c -c public 192.168.88.160:161 1.3.6.1.4.1.140.625.302.1.40


#The number of idle threads assigned to the queue

snmpwalk -v 2c -c public 192.168.88.160:161 1.3.6.1.4.1.140.625.180.1.25.32.48.101.49.102.50.102.52.97.51.101.102.102.100.98.57.56.55.53.57.54.56.98.98.101.51.53.54.100.101.52.57.53


#The date and time that the longest waiting request was placed in the queue --900563304

snmpwalk -v 2c -c public 192.168.88.160:161 .1.3.6.1.4.1.140.625.180.1.30.32.48.101.49.102.50.102.52.97.51.101.102.102.100.98.57.56.55.53.57.54.56.98.98.101.51.53.54.100.101.52.57.53

其中第二个oid和jrockit有关,所有和jrockit有关的oid在默认情况下都是不可以使用的,必须在weblogic启动时将jdk改为jrockit jdk才可以,这个是bea公司自己的jdk

在java中我们也可以使用snmp4j去存取snmp的值,进行远程控制,下面一段代码就是用来取得所有的oid的:

package test;


import java.io.IOException;

import .InetAddress;


import org.snmp4j.CommunityTarget;

import org.snmp4j.PDU;

import org.snmp4j.Snmp;

import org.snmp4j.event.ResponseEvent;

import .SnmpConstants;

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 test1

zabbix添加snmp cpu怎么查_java

{


    public static void main(String[] args)

    

zabbix添加snmp cpu怎么查_java

{

        try

zabbix添加snmp cpu怎么查_java

{

            Snmp snmp = new Snmp(new DefaultUdpTransportMapping());

            CommunityTarget target = new CommunityTarget();//agent对象

            target.setCommunity(new OctetString("public"));//设置共同体名,没发现设置RWCommnity的方法,大概只能设一个.

            

            target.setVersion(SnmpConstants.version1);//设置版本

            target.setAddress(new UdpAddress("127.0.0.1/161"));//设置IP地址和端口号,这里竟然用'/'来分隔,当初确实没有料到,JDOC的说明等于没有.

            target.setRetries(1);                      //设置重试次数

            target.setTimeout(5000);             //设置超时

            

            snmp.listen();                                 //监听

            

            String m_oid = "1.3.6.1.4.1.140.625.10.1.0";

            int w=0;

            while(true) 

zabbix添加snmp cpu怎么查_java

{

                w++;

                //set pud type and set oid

                PDU request = new PDU();         //new request PDU包

                request.setType(PDU.GETNEXT); //设置PDU类型,

                //            request.add(new VariableBinding(new OID("1.3.6.1.2.1.1"))); //OID添加

                //            request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1"))); //OID添加

                request.add(new VariableBinding(new OID(m_oid)));

//                System.out.println("request UDP:" + request);//请求包内内容输出,

                PDU response = null;//定义response包

                ResponseEvent responseEvent = snmp.send(request, target); //发出request PDU

                //接收response PDU

                response = responseEvent.getResponse();


                //response PDU包解析

                if (response != null) 

zabbix添加snmp cpu怎么查_java

{

                    if (response.getErrorIndex() == response.noError

                            && response.getErrorStatus() == response.noError) 

zabbix添加snmp cpu怎么查_java

{

//                        System.out.println("no error.");

                        String pause = responseEvent.getResponse()

                                .getVariableBindings().toString();

                        String getvalue = pause.substring(

                                pause.indexOf("= ") + 2, pause.indexOf(']'));

                        String oid = pause.substring(pause.indexOf("VBS[") + 2,

                                pause.indexOf("=") - 1);

                        System.out.println(oid);

//                        System.out.println(response);

                        m_oid = oid;


                    } else 

zabbix添加snmp cpu怎么查_java

{

                        System.out.println("get error:"

                                + response.getErrorStatusText());

                        break;

                    }


                } else 

zabbix添加snmp cpu怎么查_java

{

                    System.out.println("get response error");

                    break;

                }

                

                if (m_oid.equals("1.3.6.1.4.1.140.625.10.1.0")) 

zabbix添加snmp cpu怎么查_java

{

                    break;

                }

            }

            System.out.println(":::::::" + w);

            

        } catch (IOException e)

zabbix添加snmp cpu怎么查_java

{

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        

    }

}


要特别注意ip、端口、版本号、community和配置的一致