SNMP Property Extenders

When collecting tabular numerical metrics from an MIB table, it’s helpful to include one or more string properties from each conceptual row of the table in question. These properties can be used in the resourceLabel attribute of the resourceType that is associated with the collected data.

When the string property exists as a column in the same table that contains the numerical metrics, it’s easy to associate the string with the correct resource by adding a mibObj with the same instance attribute and the string type. For example, the Cisco ENVMON MIB’s temperature status table contains both a numeric gauge for the temperature value and a string describing the associated temperature sensor. A partial snmpwalk of this table illustrates this direct relationship:

ciscoEnvMonTemperatureStatusIndex ciscoEnvMonTemperatureStatusDescr
(.1.3.6.1.4.1.9.9.13.1.3.1.2)
ciscoEnvMonTemperatureStatusValue
(.1.3.6.1.4.1.9.9.13.1.3.1.3)

1

I/O Cont Inlet

22

2

I/O Cont Outlet

23

3

NPE Inlet

22

4

NPE Outlet

24

Examples

To collect the ciscoEnvMonTemperatureStatusDescr and ciscoEnvMonTemperatureStatusValue columns in an SNMP data-collection group, you need a resourceType and a group to hold the two mibObj elements corresponding to these two columns. The mibObj aliases are shortened to maintain compatibility with storage engines that limit the length of column names to 19 characters.

<resourceType name="ciscoEnvMonTemperatureStatusIndex<1>" label="Cisco Temperature" resourceLabel="${cvmTempStatusDescr} (index ${index})">
   <persistenceSelectorStrategy class="org.opennms.netmgt.collection.support.PersistAllSelectorStrategy"/>
   <storageStrategy class="org.opennms.netmgt.collection.support.IndexStorageStrategy"/>
</resourceType>
...
<group name="cisco-temperature" ifType="all">
   <mibObj oid=".1.3.6.1.4.1.9.9.13.1.3.1.2" instance="ciscoEnvMonTemperatureStatusIndex" alias="cvmTempStatusDescr" type="string"/>
   <mibObj oid=".1.3.6.1.4.1.9.9.13.1.3.1.3" instance="ciscoEnvMonTemperatureStatusIndex" alias="cvmTempStatusValue" type="gauge"/>
</group>

Even in cases where the string property exists in a separate MIB table, it’s straightforward to include it as long as the "source" table uses an identical set of index variables. For example, the ifXTable augments the ifTable, meaning that the two tables use the same set of instance identifiers (ifIndex). Whether or not the MIB definition of the second table declares an AUGMENTS relationship to the first table, objects from tables with this kind of relationship can be mixed in the same group.

In this contrived configuration example, ifDescr (from ifTable) is freely mixed with ifName and ifAlias (from ifXTable):

<group name="mib2-string-properties-example" ifType="all">
   <mibObj oid=".1.3.6.1.2.1.2.2.1.2" instance="ifIndex" alias="ifDescr" type="string"/>
   <mibObj oid=".1.3.6.1.2.1.31.1.1.1.1" instance="ifIndex" alias="ifName" type="string"/>
   <mibObj oid=".1.3.6.1.2.1.31.1.1.1.18" instance="ifIndex" alias="ifAlias" type="string"/>
</group>

Most SNMP property extenders make it possible to include string properties from a "source" MIB table that is indexed differently from the table containing most of the relevant data. When configuring property extenders, the table containing the majority of the data (and into which we want to include the string properties) is called the "target table", and the table containing the string property is called the "source table". Several different extenders are available; selecting the right one depends on the relationship between the target table and the source table.

A few property extenders also exist whose effect is strictly local to the "target" resource. These extenders are useful to deal with partial indices and other similar operations that do not involve looking outside the target MIB table.

You can use SNMP property extenders in the context of a property element inside an SNMP data-collection group parent element. The property element, when it appears, is a sibling of any mibObj elements beneath the same parent group. The instance and alias attributes of the property element are both required, and serve the same purpose as the same attributes of mibObj. The class-name attribute of the property element contains the full class name (including package) of the property extender class needed to join the source and target tables. The property element takes a number of parameter child elements. Use these parameters to configure the property extender class named in class-name. Each extender class recognizes a different set of parameters.