Cisco IP SLA Support

From OpenNMS

Contents

Version Notes

This works on OpenNMS release 1.3.3 with no code changes. Previous releases lack support for custom resource types in the collectors, so this would be a bit more of a hack, and would support only pre-selected indexes in the rttMon MIB tables.

All modern IOS images should support these tests, even IP base. If in doubt, check Cisco's Feature Navigator.

Caution - Start with a small sample

Do not configure a bunch of IP SLA tests on your routers without carefully considering the impact that they will have on router performance. Cisco recommends deploying "shadow routers" if you intend to do lots of IP SLA tests.

Set up the routers and OpenNMS

Configure tests on routers

There are two ways to configure these tests. The more straightforward is to set them up from the IOS CLI. The other way is to use SNMP set requests to build the tests. Tools like Cisco CNS use this method. At some point it is conceivable that OpenNMS will have this capability as well, enabling large-scale creation of meshed tests without going to an external tool and without the error-prone process of driving the CLI. For now, though, we just need to get a test running.

Assume two routers at either end of a link you would like to test for VoIP quality. Router A's loopback address is 10.2.0.1, and router B's is 10.2.0.32. We will configure an equivalent test on each router, with each pointed at the other as its destination. Note also that we enable a responder on each router. The commands vary slightly among families of IOS releases; the config below is for IOS Version 12.4(10a).

On Router A:

ip sla monitor responder
ip sla monitor 1
 type jitter dest-ipaddr 10.2.0.1 dest-port 16384 codec g711ulaw
 tos 5
 owner PerfMgmt
 tag Router A to Router B
ip sla monitor schedule 1 life forever start-time now

On Router B:

ip sla monitor responder
ip sla monitor 1
 type jitter dest-ipaddr 10.2.0.32 dest-port 16384 codec g711ulaw
 tos 5
 owner PerfMgmt
 tag Router B to Router A
ip sla monitor schedule 1 life forever start-time now


Configure OpenNMS

Add OIDs for collection

Edit datacollection-config.xml, adding the objects related to the tests we have just created.

# Add a custom resource type for the RTTMON test number index
    <resourceType name="rttMonCtrlAdminIndex" label="RTTMON Stats (Cisco RTTMON MIB)"
                  resourceLabel="${rttMonCtrlAdminTag} (index ${index})">
      <persistenceSelectorStrategy class="org.opennms.netmgt.collectd.PersistAllSelectorStrategy"/>
      <storageStrategy class="org.opennms.netmgt.dao.support.IndexStorageStrategy"/>
    </resourceType>

# An OID group for RTTMON MIB objects specific to Jitter tests
      <group name="cisco-rttmon-latest-jitter-stats" ifType="all">
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.2.1.1.3" instance="rttMonCtrlAdminIndex" alias="rttMonCtrlAdminTag" type="string" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.2.2.1.18" instance="rttMonCtrlAdminIndex" alias="echoNumPackets" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.1" instance="rttMonCtrlAdminIndex" alias="jitterNumRTT" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.2" instance="rttMonCtrlAdminIndex" alias="jitterRTTSum" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.3" instance="rttMonCtrlAdminIndex" alias="jitterRTTSum2" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.4" instance="rttMonCtrlAdminIndex" alias="jitterRTTMin" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.5" instance="rttMonCtrlAdminIndex" alias="jitterRTTMax" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.6" instance="rttMonCtrlAdminIndex" alias="jitterMinPosSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.7" instance="rttMonCtrlAdminIndex" alias="jitterMaxPosSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.8" instance="rttMonCtrlAdminIndex" alias="jitterNumPosSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.9" instance="rttMonCtrlAdminIndex" alias="jitterSumPosSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.10" instance="rttMonCtrlAdminIndex" alias="jitterSum2PosSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.11" instance="rttMonCtrlAdminIndex" alias="jitterMinNegSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.12" instance="rttMonCtrlAdminIndex" alias="jitterMaxNegSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.13" instance="rttMonCtrlAdminIndex" alias="jitterNumNegSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.14" instance="rttMonCtrlAdminIndex" alias="jitterSumNegSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.15" instance="rttMonCtrlAdminIndex" alias="jitterSum2NegSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.16" instance="rttMonCtrlAdminIndex" alias="jitterMinPosDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.17" instance="rttMonCtrlAdminIndex" alias="jitterMaxPosDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.18" instance="rttMonCtrlAdminIndex" alias="jitterNumPosDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.19" instance="rttMonCtrlAdminIndex" alias="jitterSumPosDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.20" instance="rttMonCtrlAdminIndex" alias="jitterSum2PosDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.21" instance="rttMonCtrlAdminIndex" alias="jitterMinNegDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.22" instance="rttMonCtrlAdminIndex" alias="jitterMaxNegDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.23" instance="rttMonCtrlAdminIndex" alias="jitterNumNegDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.24" instance="rttMonCtrlAdminIndex" alias="jitterSumNegDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.25" instance="rttMonCtrlAdminIndex" alias="jitterSum2NegDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.26" instance="rttMonCtrlAdminIndex" alias="jitterPktLossSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.27" instance="rttMonCtrlAdminIndex" alias="jitterPktLossDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.28" instance="rttMonCtrlAdminIndex" alias="jitterPktOOSeq" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.29" instance="rttMonCtrlAdminIndex" alias="jitterPktMIA" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.30" instance="rttMonCtrlAdminIndex" alias="jitterPktLateArr" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.33" instance="rttMonCtrlAdminIndex" alias="jitterOWSumSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.34" instance="rttMonCtrlAdminIndex" alias="jitterOWSum2SD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.35" instance="rttMonCtrlAdminIndex" alias="jitterOWMinSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.36" instance="rttMonCtrlAdminIndex" alias="jitterOWMaxSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.37" instance="rttMonCtrlAdminIndex" alias="jitterOWSumDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.38" instance="rttMonCtrlAdminIndex" alias="jitterOWSum2DS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.39" instance="rttMonCtrlAdminIndex" alias="jitterOWMinDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.40" instance="rttMonCtrlAdminIndex" alias="jitterOWMaxDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.41" instance="rttMonCtrlAdminIndex" alias="jitterNumOW" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.42" instance="rttMonCtrlAdminIndex" alias="jitterMOS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.43" instance="rttMonCtrlAdminIndex" alias="jitterICPIF" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.44" instance="rttMonCtrlAdminIndex" alias="jitterIAJOut" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.45" instance="rttMonCtrlAdminIndex" alias="jitterIAJIn" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.46" instance="rttMonCtrlAdminIndex" alias="jitterAvgJitter" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.47" instance="rttMonCtrlAdminIndex" alias="jitterAvgSDJ" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.48" instance="rttMonCtrlAdminIndex" alias="jitterAvgDSJ" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.49" instance="rttMonCtrlAdminIndex" alias="jitterOWAvgSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.2.1.50" instance="rttMonCtrlAdminIndex" alias="jitterOWAvgDS" type="gauge" />
      </group>

# A group for the specific case of RTP Jitter tests
      <group name="cisco-rttmon-latest-rtp-stats" ifType="all">
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.1" instance="rttMonCtrlAdminIndex" alias="rtpOperRTT" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.2" instance="rttMonCtrlAdminIndex" alias="rtpIAJitterDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.3" instance="rttMonCtrlAdminIndex" alias="rtpPktLossDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.4" instance="rttMonCtrlAdminIndex" alias="rtpPktLateDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.5" instance="rttMonCtrlAdminIndex" alias="rtpPktEarlyDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.6" instance="rttMonCtrlAdminIndex" alias="rtpPktOOSeqDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.7" instance="rttMonCtrlAdminIndex" alias="rtpFrameLossDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.8" instance="rttMonCtrlAdminIndex" alias="rtpRFactorDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.9" instance="rttMonCtrlAdminIndex" alias="rtpMOSCQDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.10" instance="rttMonCtrlAdminIndex" alias="rtpMOSLQDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.13" instance="rttMonCtrlAdminIndex" alias="rtpIAJitterSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.14" instance="rttMonCtrlAdminIndex" alias="rtpPktLossSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.15" instance="rttMonCtrlAdminIndex" alias="rtpPktsMIA" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.16" instance="rttMonCtrlAdminIndex" alias="rtpRFactorSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.17" instance="rttMonCtrlAdminIndex" alias="rtpMOSCQSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.18" instance="rttMonCtrlAdminIndex" alias="rtpMinOWSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.19" instance="rttMonCtrlAdminIndex" alias="rtpMaxOWSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.20" instance="rttMonCtrlAdminIndex" alias="rtpAvgOWSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.21" instance="rttMonCtrlAdminIndex" alias="rtpMinOWDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.22" instance="rttMonCtrlAdminIndex" alias="rtpMaxOWDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.23" instance="rttMonCtrlAdminIndex" alias="rtpAvgOWDS" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.24" instance="rttMonCtrlAdminIndex" alias="rtpTotalPktsSD" type="gauge" />
        <mibObj oid=".1.3.6.1.4.1.9.9.42.1.5.3.1.25" instance="rttMonCtrlAdminIndex" alias="rtpTotalPktsDS" type="gauge" />
      </group>

Once these OID groups exist, the collector needs to know to look for them on Cisco devices. All Cisco routers are capable of running IP SLA tests (depending on the IOS image they run). Still in datacollection-config.xml:

# Now tie these two OID groups to all Cisco gear
      <systemDef name="Cisco Routers">
        <sysoidMask>.1.3.6.1.4.1.9.1.</sysoidMask>
        <collect>
          <includeGroup>cisco-memory</includeGroup> <!-- exists already in 1.3.2 -->
          <includeGroup>cisco-router</includeGroup> <!-- exists already in 1.3.2 -->
          <includeGroup>adsl-line</includeGroup> <!-- exists already in 1.3.2 -->
          <includeGroup>cisco-rttmon-latest-jitter-stats</includeGroup>
          <includeGroup>cisco-rttmon-latest-rtp-stats</includeGroup>
        </collect>
      </systemDef>

Add graph definitions

Collecting these stats is great, but managers like to see pretty pictures, so we'd better make some graphs. Open up snmp-graph.properties. You did make a backup copy, right? This file is one of the easiest to dork up. So you made that backup copy? OK, now you can edit. Add the following to the reports= extended line near the top of the file. In a fresh 1.3.2 installation, I inserted them at line 61, right below cisco.1550bb and above adsl.attenuation:

cisco.rttmon.jitter.rtt, cisco.rttmon.jitter.icpif, cisco.rttmon.jitter.mos, \
cisco.rttmon.jitter.avgj, cisco.rttmon.jitter.owavg, \
cisco.rttmon.jitter.owmax, cisco.rttmon.jitter.owmin, \
cisco.rttmon.jitter.owstddev, \
cisco.rttmon.jitter.maxjds, cisco.rttmon.jitter.maxjsd, \
cisco.rttmon.jitter.pktloss, \

Now add the corresponding graph definitions to the bottom of snmp-graph.properties:

report.cisco.rttmon.jitter.rtt.name=RTT (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.rtt.columns=jitterRTTSum,jitterNumRTT
report.cisco.rttmon.jitter.rtt.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.rtt.command=--title="Round-Trip Time (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 DEF:sumRTT={rrd1}:jitterRTTSum:AVERAGE \
 DEF:numRTT={rrd2}:jitterNumRTT:AVERAGE \
 CDEF:avgRTT=sumRTT,numRTT,/ \
 LINE2:avgRTT#0000ff:"Round-Trip Time (ms)  " \
 GPRINT:avgRTT:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:avgRTT:MIN:"Min  \\: %8.2lf %s" \ 
 GPRINT:avgRTT:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.icpif.name=ICPIF (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.icpif.columns=jitterICPIF
report.cisco.rttmon.jitter.icpif.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.icpif.command=--title="ICPIF (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ICPIF \
 DEF:ICPIF={rrd1}:jitterICPIF:AVERAGE \
 LINE2:ICPIF#0000ff:"Actual  " \
 GPRINT:ICPIF:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:ICPIF:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:ICPIF:MAX:"Max  \\: %8.2lf %s\\n" \
 COMMENT:"[Guideline: Good 10; Adequate 20; Limiting 30]\\n"

report.cisco.rttmon.jitter.mos.name=MOS (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.mos.columns=jitterMOS
report.cisco.rttmon.jitter.mos.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.mos.command=--title="Estimated MOS (Cisco IP SLA Jitter Monitor)" \
 --vertical-label Estimated MOS \
 DEF:mosRaw={rrd1}:jitterMOS:AVERAGE \
 CDEF:MOS=mosRaw,100,/ \
 AREA:MOS#0000ff:"MOS  " \
 GPRINT:MOS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:MOS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:MOS:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.owavg.name=Avg One-Way Time (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.owavg.columns=jitterOWSumDS,jitterOWSumSD,jitterNumOW
report.cisco.rttmon.jitter.owavg.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.owavg.command=--title="Avg One-Way Time (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 DEF:sumDS={rrd1}:jitterOWSumDS:AVERAGE \
 DEF:sumSD={rrd2}:jitterOWSumSD:AVERAGE \
 DEF:numOW={rrd3}:jitterNumOW:AVERAGE \
 CDEF:timeDS=sumDS,numOW,/ \
 CDEF:timeSD=sumSD,numOW,/,-1,* \
 AREA:timeDS#00ff00:"In  " \
 GPRINT:timeDS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:timeDS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:timeDS:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:timeSD#0000ff:"Out  " \
 GPRINT:timeSD:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:timeSD:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:timeSD:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.owmax.name=Max One-Way Time (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.owmax.columns=jitterOWMaxDS,jitterOWMaxSD,jitterNumOW
report.cisco.rttmon.jitter.owmax.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.owmax.command=--title="Max One-Way Time (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 DEF:maxDS={rrd1}:jitterOWMaxDS:AVERAGE \
 DEF:maxSDRaw={rrd2}:jitterOWMaxSD:AVERAGE \
 DEF:numOW={rrd3}:jitterNumOW:AVERAGE \
 CDEF:maxSD=maxSDRaw,-1,* \
 AREA:maxDS#00ff00:"In  " \
 GPRINT:maxDS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxDS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxDS:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:maxSD#0000ff:"Out  " \
 GPRINT:maxSD:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxSD:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxSD:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.owmin.name=Min One-Way Time (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.owmin.columns=jitterOWMinDS,jitterOWMinSD,jitterNumOW
report.cisco.rttmon.jitter.owmin.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.owmin.command=--title="Min One-Way Time (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 DEF:minDS={rrd1}:jitterOWMinDS:AVERAGE \
 DEF:minSDRaw={rrd2}:jitterOWMinSD:AVERAGE \
 DEF:numOW={rrd3}:jitterNumOW:AVERAGE \
 CDEF:minSD=minSDRaw,-1,* \
 AREA:minDS#00ff00:"In  " \
 GPRINT:minDS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:minDS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:minDS:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:minSD#0000ff:"Out  " \
 GPRINT:minSD:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:minSD:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:minSD:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.owstddev.name=One-Way Time StdDev (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.owstddev.columns=jitterOWSum2DS,jitterOWSumDS,jitterOWSum2SD,jitterOWSumSD,jitterNumOW
report.cisco.rttmon.jitter.owstddev.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.owstddev.command=--title="One-Way Time StdDev (Cisco IP SLA Jitter Monitor)" \
 --vertical-label="StdDev (ms)" \
 --units-exponent 0 \
 DEF:sum2DS={rrd1}:jitterOWSum2DS:AVERAGE \
 DEF:sumDS={rrd2}:jitterOWSumDS:AVERAGE \ 
 DEF:sum2SD={rrd3}:jitterOWSum2SD:AVERAGE \
 DEF:sumSD={rrd4}:jitterOWSumSD:AVERAGE \
 DEF:numOW={rrd5}:jitterNumOW:AVERAGE \
 CDEF:stddevIn=sum2DS,numOW,/,sumDS,numOW,/,sumDS,numOW,/,*,-,SQRT \
 CDEF:stddevOut=sum2SD,numOW,/,sumSD,numOW,/,sumSD,numOW,/,*,-,SQRT,-1,* \
 AREA:stddevIn#00ff00:"In  " \
 GPRINT:stddevIn:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:stddevIn:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:stddevIn:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:stddevOut#0000ff:"Out  " \
 GPRINT:stddevOut:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:stddevOut:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:stddevOut:MAX:"Max  \\: %8.2lf %s\\n"
 
report.cisco.rttmon.jitter.avgj.name=Average Jitter (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.avgj.columns=jitterSumPosDS,jitterSumNegDS,jitterSumPosSD,jitterSumNegSD,jitterNumRTT
report.cisco.rttmon.jitter.avgj.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.avgj.command=--title="Average Jitter (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 --units-exponent 0 \
 DEF:sumPosDS={rrd1}:jitterSumPosDS:AVERAGE \
 DEF:sumNegDS={rrd2}:jitterSumNegDS:AVERAGE \
 DEF:sumPosSD={rrd3}:jitterSumPosSD:AVERAGE \
 DEF:sumNegSD={rrd4}:jitterSumNegSD:AVERAGE \
 DEF:numRTT={rrd5}:jitterNumRTT:AVERAGE \
 CDEF:avgIn=sumPosDS,sumNegDS,+,numRTT,/ \
 CDEF:avgOut=sumPosSD,sumNegSD,+,numRTT,/ \
 LINE2:avgIn#00ff00:"In  " \
 GPRINT:avgIn:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:avgIn:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:avgIn:MAX:"Max  \\: %8.2lf %s\\n" \
 LINE2:avgOut#0000ff:"Out  " \
 GPRINT:avgOut:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:avgOut:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:avgOut:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.pktloss.name=Packet Loss (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.pktloss.columns=jitterPktLossSD,jitterPktLossDS,echoNumPackets
report.cisco.rttmon.jitter.pktloss.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.pktloss.command=--title="Packet Loss (Cisco IP SLA Jitter Monitor)" \
 --vertical-label percent \
 --lower-limit -100 --upper-limit 100 --rigid \
 --units-exponent 0 \
 DEF:pktLossSD={rrd1}:jitterPktLossSD:AVERAGE \
 DEF:pktLossDS={rrd2}:jitterPktLossDS:AVERAGE \
 DEF:numPackets={rrd3}:echoNumPackets:AVERAGE \
 CDEF:pctLossIn=pktLossDS,numPackets,/,100,* \
 CDEF:pctLossOut=pktLossSD,numPackets,/,100,*,-1,* \
 AREA:pctLossIn#00ff00:"In  " \
 GPRINT:pctLossIn:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:pctLossIn:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:pctLossIn:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:pctLossOut#0000ff:"Out  " \
 GPRINT:pctLossOut:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:pctLossOut:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:pctLossOut:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.maxjds.name=Max Jitter Dest-Src (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.maxjds.columns=jitterMaxNegDS,jitterMaxPosDS,jitterNumRTT
report.cisco.rttmon.jitter.maxjds.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.maxjds.command=--title="Max Jitter Dest-Src (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 --units-exponent 0 \
 DEF:maxNegDSRaw={rrd1}:jitterMaxNegDS:AVERAGE \
 DEF:maxPosDS={rrd2}:jitterMaxPosDS:AVERAGE \
 DEF:numRTT={rrd3}:jitterNumRTT:AVERAGE \
 CDEF:maxNegDS=maxNegDSRaw,-1,* \
 AREA:maxPosDS#00ff00:"Positive  " \
 GPRINT:maxPosDS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxPosDS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxPosDS:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:maxNegDS#0000ff:"Negative  " \
 GPRINT:maxNegDS:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxNegDS:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxNegDS:MAX:"Max  \\: %8.2lf %s\\n"

report.cisco.rttmon.jitter.maxjsd.name=Max Jitter Src-Dest (Cisco IP SLA Jitter Monitor)
report.cisco.rttmon.jitter.maxjsd.columns=jitterMaxNegSD,jitterMaxPosSD,jitterNumRTT
report.cisco.rttmon.jitter.maxjsd.type=rttMonCtrlAdminIndex
report.cisco.rttmon.jitter.maxjsd.command=--title="Max Jitter Src-Dest (Cisco IP SLA Jitter Monitor)" \
 --vertical-label ms \
 --units-exponent 0 \
 DEF:maxNegSDRaw={rrd1}:jitterMaxNegSD:AVERAGE \
 DEF:maxPosSD={rrd2}:jitterMaxPosSD:AVERAGE \ 
 DEF:numRTT={rrd3}:jitterNumRTT:AVERAGE \
 CDEF:maxNegSD=maxNegSDRaw,-1,* \
 AREA:maxPosSD#00ff00:"Positive  " \
 GPRINT:maxPosSD:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxPosSD:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxPosSD:MAX:"Max  \\: %8.2lf %s\\n" \
 AREA:maxNegSD#0000ff:"Negative  " \
 GPRINT:maxNegSD:AVERAGE:"Avg  \\: %8.2lf %s" \
 GPRINT:maxNegSD:MIN:"Min  \\: %8.2lf %s" \
 GPRINT:maxNegSD:MAX:"Max  \\: %8.2lf %s\\n"

Note that I have not yet added any graphs for the RTP-specific tests. That is because I have not yet configured any such tests.

Eye Candy

The following images are from a 1.3.2 installation using the instructions above.

Image:Rtt-rtt.gif

Image:Rtt-pktloss.gif

Image:Rtt-avgj.gif

Image:Rtt-maxj-ds.gif

Image:Rtt-maxj-sd.gif

Image:Rtt-icpif.gif

Image:Rtt-mos.gif

Image:Rtt-owavg.gif

Image:Rtt-owmax.gif

Image:Rtt-owmin.gif

Image:Rtt-owstddev.gif

TODO

  1. Clean up the objects added to datacollection-config.xml that end up being unused -- there are bound to be some, and any that can be removed will lessen the load on the SNMP collector and therefore on the whole OpenNMS system.
  2. Discuss other things to do with the collected data, such as thresholding
  3. Make graphs for RTP tests
  4. Discussion of a deeper integration into OpenNMS, including test creation via SNMP and the possibility of considering IP SLA to be "just another Distributed Monitor" -- this would probably be something to consider for 2.0 or later.
  5. Add a blurb on what IP SLA is, its history as RTTMON, and its ancestor Cisco Remote Ping
Personal tools
DevJam 2008 Sponsors
DevJam 2008 Sponsor: Google
DevJam 2008 Sponsor: Netregistry
DevJam 2008 Sponsor: Papa John's
NewEdge Networks
OpenNMS takes home the gold award!
Join the Free Software Foundation
Support This Project Commercial OpenNMS Support OpenNMS Italia Get OpenNMS at SourceForge.net. Fast, secure and Free Open Source software downloads Our Network Simulator Our Java Profiler