1

複数のサーバーから情報を取得する Java コードを書いています。値の代わりに「noSuchInstance」を返す ifInOctets と ifOutOctets を除いて、すべて正常に動作しています。iReasoning MIB Browser を使用して、同じサーバーの ifInOctets と ifOutOctets を取得できます。

public Map<String, Object> getStatus() throws IOException{
    Snmp snmp4j = new Snmp(new DefaultUdpTransportMapping());
    snmp4j.listen();
    CommunityTarget target = new CommunityTarget();
    Map<String, Object> result = new HashMap<>();
    List<Map<String, Object>> servers = new LinkedList<>();
    for(SnmpServer snmpServer : snmpServers){
        Map<String, Object> server = new HashMap<>();
        server.put("name", snmpServer.getName());
        List<Map<String, Object>> parameters = new LinkedList<>();
        target.setAddress(new UdpAddress(snmpServer.getAddress()));
        target.setTimeout(500);
        target.setRetries(3);
        target.setCommunity(new OctetString("public"));
        target.setVersion(SnmpConstants.version2c);
        List<String> keys = new ArrayList<>();
        PDU request = new PDU();
        request.setType(PDU.GET);
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.2.2.1.10")));
        keys.add("ifInOctets");
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.2.2.1.16")));
        keys.add("ifOutOctets");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.9.1")));
        keys.add("diskPercentage");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.4.6.0")));
        keys.add("usedMemory");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.4.5.0")));
        keys.add("totalMemory");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.11.11.0")));
        keys.add("idleCpuPercentage");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.6.1")));
        keys.add("totalDisk");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.8.1")));
        keys.add("usedDisk");
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3.0")));
        keys.add("systemUpTime");
        ResponseEvent responseEvent;
        responseEvent = snmp4j.send(request, target);
        PDU responsePDU = responseEvent.getResponse();
        try{
            Vector<VariableBinding> variableBindings = responsePDU.getVariableBindings();
            for(int j = 0; j < variableBindings.size(); j++){
                Map<String, Object> parameter = new HashMap<>();
                parameter.put("name", keys.get(j));
                parameter.put("value", variableBindings.get(j).getVariable().toString());
                parameters.add(parameter);
            }
            server.put("parameters", parameters);
        }catch(NullPointerException e){
            server.put("offline", true);
        }
        servers.add(server);
    }
    result.put("servers", servers);
    return result;
}

何が問題なのかについてのアイデアはありますか?

4

1 に答える 1

2

.1.3.6.1.2.1.2.2.1.10との後にインターフェイス インデックスを指定する必要があります.1.3.6.1.2.1.2.2.1.16。(たとえば、インデックスが 17 の場合、.17両方の OID に追加します。) そうでない場合、ターゲット サーバーは、トラフィック カウンター値を返す必要があるインターフェイスを認識できません。

サーバーとルーターは複数のインターフェイスを持つことができ、各インターフェイスのトラフィックを個別にカウントします。正しいインターフェイス インデックスがどうあるべきかはわかりません。サーバー/ルーターで自分で調べる必要があります。または、インデックスが最も低いインターフェイスのトラフィックを返すだけの場合は、GET の代わりに GETNEXT 要求を使用できます。ただし、それが必ずしも適切なインターフェイスであるとは限りません。

于 2014-05-10T09:28:11.117 に答える