2014-05-10 1 views
1

J'cris un code java qui récupère des informations à partir de plusieurs serveurs. tout fonctionne bien, sauf ifInOctets et ifOutOctets qui retournent « noSuchInstance » au lieu de leur valeur. Je peux récupérer ifInOctets et ifOutOctets des mêmes serveurs en utilisant iReasoning MIB Browser.ifInOctets et ifOutOctets retour noSuchInstance

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; 
} 

donc des idées sur ce qui pourrait être le problème?

Répondre

2

Vous devez spécifier l'index d'interface après .1.3.6.1.2.1.2.2.1.10 et .1.3.6.1.2.1.2.2.1.16. (Par exemple, si l'index est 17, ajoutez .17 aux deux OID.) Sinon, le serveur cible ne sait pas à quelle interface vous souhaitez renvoyer les valeurs du compteur de trafic.

Les serveurs et les routeurs peuvent avoir de multiples interfaces, et ils comptent le trafic sur chaque interface séparément. Je ne peux pas vous dire quel devrait être l'index d'interface correct; vous devrez regarder cela sur le serveur/routeur vous-même. Sinon, vous pouvez utiliser une requête GETNEXT au lieu de GET, si vous voulez juste retourner le trafic sur l'interface avec l'index le plus bas. Cependant, cela pourrait ne pas être nécessairement la bonne interface.

+0

Thanx, cela fonctionne. Je ne sais pas pourquoi je n'ai rien trouvé à ce sujet dans les exemples qui ont utilisé ceux-ci. – raven