Improving Nexenta SNMP daemon

       436 words, 3 minutes

Nexenta has SNMP capability. Configured from the Web interface, you can set the various communities for SNMP version. But there is more. You can improve it a lot using the Nexenta Management Console (NMC).

Here’s what you get from the default SNMP daemon:

  # snmpwalk -c public -v 2c nexenta.tumfatig.net system 
  SNMPv2-MIB::sysDescr.0 = STRING: NexentaOS
  SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::org
  SNMPv2-MIB::sysUpTime.0 = Timeticks: (6172) 0:01:01.72
  SNMPv2-MIB::sysContact.0 = STRING: Root <root@example.org>
  SNMPv2-MIB::sysName.0 = STRING: nexenta
  SNMPv2-MIB::sysLocation.0 = STRING: Huge Data Center

The first option to properly configure community is the Web interface. The second one is the NMC:

  nmc@nexenta:/$ setup network service snmp-agent configure                       
  Read-only community string                                    : secret
  Read-write community string                                   : secret
  User name for SNMPv3 agent                                    : secret
  Password for SNMPv3 agent. Must be at least 8 characters long : secret00
  Destination of SNMP-traps                                     : localhost

From there, the community values have be set ; of course “secret” is not a good community string. But the system information are still not correct. Let’s edit the SNMPd configuration file by hand:

  nmc@nexenta:/$ setup network service snmp-agent edit-settings snmpd.conf        
  (...)
  sysLocation             Paris, France
  sysContact              Joel Carnat <joel@carnat.net>
  (...)
  Re-read 'snmp-agent' service configuration?  Yes

The snmpd has been reloaded and you now have the updated information available:

  # snmpwalk -c secret -v 2c nexenta system   
  SNMPv2-MIB::sysDescr.0 = STRING: NexentaOS
  SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::org
  SNMPv2-MIB::sysUpTime.0 = Timeticks: (2218) 0:00:22.18
  SNMPv2-MIB::sysContact.0 = STRING: Joel Carnat <joel@carnat.net>
  SNMPv2-MIB::sysName.0 = STRING: nexenta
  SNMPv2-MIB::sysLocation.0 = STRING: Paris, France

Tada!!! But wait, there is more…
As every decent snmpd implementation, you can extend Nexenta snmp daemon.
Have a look at help snmpd.conf for more information.

For further monitoring purpose, we are going to improve SNMPd so that we can remotely get the CPU times:

  nmc@nexenta:/$ setup network service snmp-agent edit-settings snmpd.conf        
  (...)
  extend                  cputime /root/scripts/cputime

Now we need to create the script that will be run by snmpd:

  nmc@nexenta:/$ options expert_mode=1                                            
  nmc@nexenta:/$ !bash                                                            
  # mkdir /root/scripts
  # vi /root/scripts/cputime
  #!/usr/bin/env bash
  #
  # Display CPU activity time dispatch
  #
  
  PATH=/bin:/usr/bin:/sbin:/usr/sbin
  
  vmstat 1 3 | \
  awk 'END { print "us: " $(NF-2) "\nsy " $(NF-1) "\nid: " $NF }'
  
  exit 0

The information can now be pooled from the monitoring server using the proper snmpcmd:

  # snmpwalk -c secret -t 5 -v 2c nexenta 'NET-SNMP-EXTEND-MIB::nsExtendOutLine."cputime"'
  NET-SNMP-EXTEND-MIB::nsExtendOutLine."cputime".1 = STRING: us: 0
  NET-SNMP-EXTEND-MIB::nsExtendOutLine."cputime".2 = STRING: sy 1
  NET-SNMP-EXTEND-MIB::nsExtendOutLine."cputime".3 = STRING: id: 99

Note the “-t 5” parameters that is required to increase timeout (used by vmstat). The various CPU times can now be fetched (and graphed) from any good monitoring tool. You can do the same thing for Memory, Temperature of ZFS status.

Hope this helps!