Occasionally you will come across a device or a situation where collecting a single SNMP variable is insufficient, for example when two or more SNMP properties need to be combined to provide a meaningful measurement.
NMIS version 8.4.8G and later support modelling such scenarios using custom variables, or CVAR
s. With this mechanism you can temporarily capture up to 10 separate SNMP properties as a CVAR
and define an arbitrarily complex expression (in perl) that transforms these CVAR
s into the one measurement that you want to collect and/or display.
CVAR
s are supported
test
and value
expressions in the NMIS alert and threshold subsystem,calculate
expressions in the general modelling subsystem,control
expressions evereywhere (in versions before that only a single CVAR
was supported in control
).To use CVAR
s you define the required CVAR
s as holding a previously specified SNMP variable at the beginning of one of the supported expressions; Subsequently you can then reference the CVAR
value in the part of the expression that calculates the desired value to be used by NMIS.
The DS3 MIB defines a variety or error counters for DS3 circuits like "dsx3CurrentLCVs" which are based on a 15 minute observation interval and reset automatically at the end of the interval. As the interval start and end is arbitrary and up to the device to set, just capturing the error counters themselves is not quite workable. However, the DS3 MIB also specifies the variable "dsx3TimeElapsed" that holds the seconds elapsed since the start of the current observation interval. Dividing the raw error counter by the number of seconds into the interval results in a normalised errors-per-second rate which works well for collection and display.
Here is an excerpt of the relevant model file:
'systemHealth' => { 'sections' => 'ds3Errors', 'sys' => { 'ds3Errors' => { 'indexed' => 'dsx3CurrentIndex', 'index_oid' => '1.3.6.1.2.1.10.30.6.1.1', 'headers' => 'ds3intf,ds3linestatus', 'snmp' => { 'ds3intf' => { 'oid' => '1.3.6.1.2.1.2.2.1.2', # ifDescr 'title' => 'DS3 Interface', }, 'ds3linestatus' => { 'oid' => '1.3.6.1.2.1.10.30.5.1.10', # dsx3LineStatus 'title' => "DS3 Line Status", 'calculate' => 'my @x; my %triggers=(1,"No Alarm",2,"Rx Remote Alarm",4,"Tx Remote Alarm",8,"Rx AIS",16,"Tx AIS",32,"Rx LOF",64,"Rx LOS",128,"Loopback",256,"Test Pattern",512,"Unknown",1024,"Near end unavailable signal",2048,"Carrier Equip OOS"); while (my ($num,$txt)=each(%triggers)) { push (@x,$txt) if (int($r) & int($num)); }; return join(", ",@x); ', }, ... 'ds3LCV' => { 'oid' => '1.3.6.1.2.1.10.30.6.1.6', # dsx3CurrentLCVs 'title' => 'Line Coding Violations per second', 'calculate' => 'CVAR1=ds3Elapsed; return ($CVAR1? $r/$CVAR1 : 0);', }, }, # sys 'rrd' => { 'ds3Errors' => { 'indexed' => 'true', "graphtype" => "ds3Errors", "snmp" => { 'ds3Elapsed' => { 'oid' => '1.3.6.1.2.1.10.30.5.1.3', # dsx3TimeElapsed 'title' => 'elapsed seconds in current measurement interval', 'option' => 'gauge,0:U', }, ... "ds3LCV" => { 'oid' => '1.3.6.1.2.1.10.30.6.1.6', 'option' => 'gauge,0:U', 'title' => "Line Coding Violations per second", 'calculate' => 'CVAR1=ds3Elapsed; return ($CVAR1? $r/$CVAR1 : 0);', }, }, # rrd }, # systemhealth |
In the example above, the calculate
expressions are used in two ways:
dsx3CurrentLCVs
error count by the dsx3TimeElapsed
interval length.In both cases the syntax is very straight-forward:
$r
, and CVAR0
to CVAR9
are interpreted by NMIS; everything else is perl.my
is ok, but don't attempt to change any global NMIS variables."CVAR1=some_snmp_var
;" defines what SNMP object CVAR1 is supposed to hold. The parser understands CVAR0
to CVAR9
for a total of 10 captures.return $r/$CVAR1;
" accesses the value of CVAR1
in an expression. The variable "$r
" represents the SNMP variable that the calculate
expression is attached to.Please note that the $CVAR
n replacement in the expression is performed on a purely textual basis, before the expression is handed to the perl interpreter for evaluation :
For string variables you have to provide quotes in your expression, e.g.
calculate => 'CVAR1=somestringthing; return 42 if ("$CVAR1" eq "online");' |