Multi-MIB Table Support

Some situations exist where you must collect the raw data for a particular metric family from two or more  MIB tables. Custom certification includes support for multiple MIB tables. The XML structure is similar to a standard vendor certification, and uses a common key (index) to join data that is collected from multiple tables.
capm320
HID_Multi-MIB_Table_Support
Some situations exist where you must collect the raw data for a particular metric family from two or more  MIB tables. Custom certification includes support for multiple MIB tables. The XML structure is similar to a standard vendor certification, and uses a common key (index) to join data that is collected from multiple tables.
Example:
In this example, the Frame Relay PVCs can be named using a combination of the ifName MIB object in the ifXTable and the frCircuitDlci object that provides the data link connection identifier (DLCI) for this PVC. This kind of naming convention is useful for determining which Frame Relay interface the PVC is layered onto.
To support both MIB tables, add the following information to the XML:
  • Add an attribute to the existing AttributeGroup to represent the frCircuitDlci MIB object.
  • The ifName MIB object comes from a MIB that is not included in your custom vendor certification. Add an AttributeGroup (in this case, ifXTable), and then add the new attribute (ifName).
<?xml version="1.0" encoding="UTF-8" ?> 
<!-- Auto-generated by the type catalog local manager.--> 
<DataModel namespace="http://im.ca.com/certifications/snmp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SNMPCertificationFacet.xsd"> 
   <FacetType name="frPVCInfoCustom" descriptorClass="com.ca.im.core.datamodel.certs.CertificationFacetDescriptorImpl"> 
     <Documentation>Frame Relay PVC Vendor Certification</Documentation> 
     <FacetOf namespace="http://im.ca.com/core" name="Item" /> 
    
 <AttributeGroup name="ifXTableGroup" external="true" list="true">
<Documentation>This pulls data from the ifXTable so that the ifName corresponding to the PVC can be referenced</Documentation>
<UseIndex>ifXIndexTag</UseIndex>
     
<Attribute name="ifXTableIndex" type="ObjectID">
<Documentation />
<IsKey>false</IsKey>
<IsIndex>true</IsIndex>
<Source>1.3.6.1.2.1.31.1.1.1.1</Source>
<Polled>false</Polled>
</Attribute>
<Attribute name="ifName" type="OctetString">
<Documentation />
<IsKey>false</IsKey>
<IsIndex>false</IsIndex>
<Source>1.3.6.1.2.1.31.1.1.1.1</Source>
<Polled>false</Polled>
</Attribute>
</AttributeGroup>
     
<IndexTagList>
<PrimaryTag>PVCIndexTag</PrimaryTag>
<IndexTag>
<Name>ifXIndexTag</Name>
<PrimaryKeyExpression>snmpOIDParser(INDEX,1,1)</PrimaryKeyExpression>
<ThisTagKeyExpression>ifXTableIndex</ThisTagKeyExpression>
</IndexTag>
</IndexTagList>
     <AttributeGroup name="AttributeGroup" external="true" list="true"> 
       <Documentation /> 
       <UseIndex>PVCIndexTag</UseIndex> 
       <Attribute name="INDEX" type="ObjectID"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.4</Source> 
         <IsIndex>true</IsIndex> 
         <IsKey>false</IsKey> 
         <NeedsDelta>false</NeedsDelta> 
       </Attribute> 
       <
Attribute name="frCircuitReceivedFECNs" type="Long">
<Documentation />
<Source>1.3.6.1.2.1.10.32.2.1.4</Source>
<IsIndex>false</IsIndex>
<IsKey>true</IsKey>
<NeedsDelta>true</NeedsDelta>
</Attribute>
       <Attribute name="frCircuitReceivedBECNs" type="Long"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.5</Source> 
         <IsIndex>false</IsIndex> 
         <IsKey>true</IsKey> 
         <NeedsDelta>true</NeedsDelta> 
       </Attribute> 
       <Attribute name="frCircuitSentFrames" type="Long"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.6</Source> 
         <IsIndex>false</IsIndex> 
         <IsKey>true</IsKey> 
         <NeedsDelta>true</NeedsDelta> 
       </Attribute> 
       <Attribute name="frCircuitSentOctets" type="Long"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.6</Source> 
         <IsIndex>false</IsIndex> 
         <IsKey>true</IsKey> 
         <NeedsDelta>true</NeedsDelta> 
       </Attribute> 
       <Attribute name="frCircuitReceivedFrames" type="Long"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.8</Source> 
         <IsIndex>false</IsIndex> 
         <IsKey>true</IsKey> 
         <NeedsDelta>true</NeedsDelta> 
       </Attribute> 
       <Attribute name="frCircuitReceivedOctets" type="Long"> 
         <Documentation /> 
         <Source>1.3.6.1.2.1.10.32.2.1.9</Source> 
         <IsIndex>false</IsIndex> 
         <IsKey>true</IsKey> 
         <NeedsDelta>true</NeedsDelta> 
        </Attribute> 
        
<Attribute name="frCircuitState" type="int">
<Documentation />
<Source>1.3.6.1.2.1.10.32.2.1.3</Source>
<IsIndex>false</IsIndex>
<IsKey>false</IsKey>
<NeedsDelta>false</NeedsDelta>
</Attribute>
     
 <Attribute name="frCircuitDlci" type="int">
<Documentation />
<Source>1.3.6.1.2.1.10.32.2.1.2</Source>
<IsIndex>false</IsIndex>
<IsKey>false</IsKey>
<NeedsDelta>false</NeedsDelta>
</Attribute>
      </AttributeGroup> 
      <Protocol>SNMP</Protocol> 
      <DisplayName>Frame Relay PVC Certification</DisplayName> 
      <Expressions> 
       <ExpressionGroup destCert="{http://im.ca.com/normalizer}frPVCInfo" name="frPVCInfoDS"> 
       <Filter>(frCircuitState==2)</Filter> 
       <Expression destAttr="Indexes">INDEX</Expression> 
       <Expression destAttr="Names">isdef(ifName)? (isdef(frCircuitDlci) ? ifName + " DCLI:" + frCircuitDlci : "Frame Relay " + INDEX) : "Frame Relay " + INDEX</Expression> 
       <Expression destAttr="FECNIn">frCircuitReceivedFECNs</Expression> 
       <Expression destAttr="BECNIn">frCircuitReceivedBECNs</Expression> 
       <Expression destAttr="FramesIn">frCircuitReceivedFrames</Expression> 
       <Expression destAttr="FramesOut">frCircuitSentFrames</Expression> 
       <Expression destAttr="BytesIn">frCircuitReceivedOctets</Expression> 
       <Expression destAttr="BytesOut">frCircuitSentOctets</Expression> 
       <Expression destAttr="BitsIn">frCircuitReceivedOctets*8</Expression> 
       <Expression destAttr="BitsOut">frCircuitSentOctets*8</Expression> 
      </ExpressionGroup> 
     </Expressions> 
    <MIB>RFC1315-MIB</MIB> 
   </FacetType> 
</DataModel>
AttributeGroup
Each table must go into its own AttributeGroup section. Each Attribute on that table is added as a child of that AttributeGroup.
Refer to these sections for the following information:
  • The AttributeGroup information
    Details about the XML elements that are used to define primary and secondary table attributes.
  • The UseIndex and IndexTagList information
    Details about the XML elements that are used to join the primary and secondary attribute groups.
In the example, the primary attribute group represents the table that you want to “extend” with more information. The secondary attribute group contains the “extension” information for the primary one.
The primary AttributeGroup contains an Attribute identifying the MIB table variable serving as the common “key” into the secondary AttributeGroup.
The secondary AttributeGroup includes the Attribute definitions for all MIB table variables carrying the “extension” information for the primary table. In addition, there is an Attribute identifying the variable matching the common “key” from the primary AttributeGroup.
UseIndex
Each AttributeGroup is given a UseIndex tag. The UseIndex tag lets you group OIDs under a common name. This common name is associated with a given variable serving as the common key (index) into the respective MIB table.
The following information summarizes the XML elements to customize:
  • AttributeGroup/UseIndex
    Uniquely identifies the primary and secondary tag name (respectively) that is used in the IndexTagList section.
    Recommendation:
    Set to the value of the AttributeGroup/name property.
IndexTagList
The IndexTagList section is a mechanism to relate two attribute groups (or MIB tables) with different indexes. When the groups are related, one item has multiple index IDs from multiple tables.
The IndexTagList section contains all the join information, including an IndexTag section for every secondary attribute group.
  • IndexTagList/PrimaryTag
    Defines the primary attribute group (or MIB table). Set to the value of the UseIndex property of the primary AttributeGroup.
  • IndexTag/Name
    Defines the secondary attribute group. Set to the value of the UseIndex property of the secondary AttributeGroup.
  • IndexTag/PrimaryKeyExpression
    Specifies the expression to generate the common key in the primary table. Consider using the MVEL functions to derive a common key from the designated primary table index Attribute.
  • IndexTag/ThisTagKeyExpression
    Specifies the expression to generate the common key in the secondary table. Consider using the MVEL functions to derive a common key from the designated secondary table index Attribute.
The multitable approach supports the chaining of more than two tables. Two types of relationships exist in multiple table joins:
  • Primary - > Secondary #1, Primary - > Secondary #2
    Ordering of the secondary tables does not matter in an index tag list.
  • Primary - > Secondary #1 - > Secondary #2
    List secondary table #1 before secondary table #2 because of the way tables are merged.
One or more rows in the primary table can legally map to the same row in the secondary table. Keys on the secondary table are searched in order, and the first match wins.