Re: DSCP/COS stats on Cisco router

"Volk,Gregory B" <[email protected]>
Newsgroups gmane.network.mrtg.user
Message-ID <59BAB46E43BCE04EBDC6B05646C3E714336274D0@TWPEXMBX05.edj.ad.edwardjones.com>
I've attached cbqos-cfgmaker.txt. This is a perl script that I wrote using mib variables defined in CISCO-CLASS-BASED-QOS-MIB and CISCO-CLASS-BASED-QOS-CAPABILITY. I've had reasonably good luck with it running against several Cisco models including 2900, 6509, 7304, ASR1003, and even all the way back to 7206XVR.

One downside to it is that the cbQosIfIndex instance numbers are not necessarily static through some config changes and reboots, but those are rare enough in my environment that it hasn't been a major issue for me.







If you are not the intended recipient of this message (including attachments), or if you have received this message in error,  immediately notify us and delete it and any attachments.

If you do not wish to receive any email messages from us, excluding administrative communications, please email this request to [email protected] along with the email address you wish to unsubscribe.

For important additional information related to this email, visit www.edwardjones.com/US_email_disclosure. Edward
D. Jones & Co., L.P. d/b/a Edward Jones, 12555 Manchester Road, St. Louis, MO 63131 © Edward Jones. All rights reserved.


-----Original Message-----
From: mrtg [mailto:[email protected]] On Behalf Of Alan Lehman
Sent: Friday, September 19, 2014 3:44 PM
To: [email protected]
Subject: [mrtg] DSCP/COS stats on Cisco router

Hello,
I’m new to this list, but have been using mrtg for ages. Recently we implemented COS on our MPLS network. I would like to be able to see traffic on our Cisco 2901 broken down by COS/DSCP classification. Has anyone been able to accomplish this?
Thanks,
Alan



CONFIDENTIALITY NOTICE: This e-mail message including attachments, if any, is intended for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply e-mail and destroy all copies of the original message. Thank you.

_______________________________________________
mrtg mailing list
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/mrtg

_______________________________________________
mrtg mailing list
[email protected]
https://lists.oetiker.ch/cgi-bin/listinfo/mrtg
cbqos-cfgmaker.txt (text/plain, 11 KB)
#!/usr/bin/perl -w
###
### cbqos-cfgmaker.pl - A perl script that interrogates cisco routers
### and generates per-queue, per-interface bit rate and drop-rate
### MRTG targets.
### Greg Volk 20091127
###
### This program was based off of OIDs found in the following cisco
### mib files:
### CISCO-CLASS-BASED-QOS-MIB
### CISCO-CLASS-BASED-QOS-CAPABILITY
###
### The invocation syntax is ./cbqos_cfgmaker.pl <community>@<device> > <filename>
###                          ./cbqos_cfgmaker.pl public@router > router.cfg
###
### This template is licensed under the GNU GPL. For more information, please
### see http://www.gnu.org/copyleft/gpl.html.
###
### Newer/older/different versions might be available at http://mrtg.gvolk.com
###

use strict;
use locale;
use Socket;

# Where are your mrtg (SNMP_util) libraries?
use lib "/opt/ejnmrtg/usr/lib/mrtg2";
use SNMP_util;


# Some important OIDs for finding port names, port descrs, QOS indexes, etc
my %indexhash = (
   "ifDescr" => ".1.3.6.1.2.1.2.2.1.2",
   "ifAlias" => ".1.3.6.1.2.1.31.1.1.1.18",
   "ifSpeed" => ".1.3.6.1.2.1.2.2.1.5",
   "cbQosIfIndex" => ".1.3.6.1.4.1.9.9.166.1.1.1.1.4",
   "cbQosCMName" => ".1.3.6.1.4.1.9.9.166.1.7.1.1.1",
   "cbQosCMDesc" => ".1.3.6.1.4.1.9.9.166.1.7.1.1.2",
   "cbQosMatchStmtName" => ".1.3.6.1.4.1.9.9.166.1.8.1.1.1",
   "cbQosConfigIndex" => ".1.3.6.1.4.1.9.9.166.1.5.1.1.2",
   "cbQosObjectType" => ".1.3.6.1.4.1.9.9.166.1.5.1.1.3",
   "cbQosParentObjectsIndex" => ".1.3.6.1.4.1.9.9.166.1.5.1.1.4"
   );

# OIDs for the stats that we want to collect
my %stathash = (
   "cbQosCMPrePolicyByte64" => ".1.3.6.1.4.1.9.9.166.1.15.1.1.6",
   "cbQosCMPostPolicyByte64" => ".1.3.6.1.4.1.9.9.166.1.15.1.1.10",
   "cbQosCMDropByte64" => ".1.3.6.1.4.1.9.9.166.1.15.1.1.17"
   );

# Some general use vars
my ($element,@array,@data,$host,$community,$router,@cbqoscmname,
    @cbqosconfigindex,%classnum,@keys,$entry,$key,$class,$indexnum,
    $statname,$i,$oid,@cbqosifindex,@ifdescr,@ifalias,%descrhash,%aliashash,
    $subindex,%qosifindex,$portname,$portalias,$target_name,$classname,
    $router_connect,$oid1,$oid2,$fileid,$statname1,$statname2,@ifspeed,
    %speedhash,$portspeed,$qindex);

# Need debug output?
my $debug = 1;

unless($ARGV[0]) { 
  print STDERR "Need command line args (community\@router)\n";
  print STDERR "Example usage is:\n";
  print STDERR "  ./cbqos-cfgmaker public\@router > router.cfg\n";
  die;
}

# Get some command line args
@array = split "\@",$ARGV[0];

$community = $array[0];
$router = $array[1];

# Add ":::::2" for snmp v2c 64 bit counters
$host = "$community\@$router".":::::2";
$router_connect = $host;

if ($debug) { print STDERR "\n\nGot command line args: @ARGV\n"; }

# Walk the qos index OIDs
if($debug) { print STDERR "Walking cbQosIfIndex on $host\n"; }
(@cbqosifindex) = &snmpwalk("$host",$indexhash{'cbQosIfIndex'});
if($debug) { print STDERR "Found $#cbqosifindex enteries in cbQosIfIndex table\n"; }

# Store the qos index OIDs in a hash table
foreach $i (@cbqosifindex) {
  @array = split ":",$i;
  $qosifindex{$array[0]} = $array[1];
  if($debug) { print STDERR "loaded qosifindex with $array[0] -> $array[1]\n"; }
}

# Walk the regular interfaces OIDs
if($debug) { print STDERR "Walking ifDescr on $host\n"; }
(@ifdescr) = &snmpwalk("$host",$indexhash{'ifDescr'});
if($debug) { print STDERR "Found $#ifdescr enteries in ifDescr table\n"; }

# Store the ifdescr data in a hash table
foreach $i (@ifdescr) {
  @array = split ":",$i;
  $descrhash{$array[0]} = $array[1];
}

# Walk the ifalias table
if($debug) { print STDERR "Walking ifAlias on $host\n"; }
(@ifalias) = &snmpwalk("$host",$indexhash{'ifAlias'});
if($debug) { print STDERR "Found $#ifalias enteries in ifAlias table\n"; }

# Store ifalias in a hash table
foreach $i (@ifalias) {
  @array = split ":",$i;
  $aliashash{$array[0]} = $array[1];
}

# Walk the ifSpeed table
if($debug) { print STDERR "Walking ifSpeed on $host\n"; }
(@ifspeed) = &snmpwalk("$host",$indexhash{'ifSpeed'});
if($debug) { print STDERR "Found $#ifspeed enteries in ifSpeed table\n"; }

# Store ifspeed in a hash table
foreach $i (@ifspeed) {
  @array = split ":",$i;
  $speedhash{$array[0]} = $array[1];
}


# Get a list of qos class names, store in a hash table
if($debug) { print STDERR "Walking cbQosCMName on $host\n"; }
(@cbqoscmname) = &snmpwalk("$host",$indexhash{'cbQosCMName'});
foreach $element (@cbqoscmname) {
  @array = split ":",$element;
  $classnum{$array[0]} = $array[1];
}

if($debug) { 
  print STDERR "Found $#cbqoscmname enteries in cbqoscmname table\n";
  @keys = keys %classnum;
  print STDERR "cbqoscmname values are: @cbqoscmname\n\n";
}


# Get a list of qos index numbers
if($debug) { print STDERR "Walking cbQosConfigIndex on $host\n"; }
(@cbqosconfigindex) = &snmpwalk("$host",$indexhash{'cbQosConfigIndex'});
if($debug) { print STDERR "Found $#cbqosconfigindex enteries in cbQosConfigIndex table\n"; }

if($#cbqosconfigindex < 1) { 
  print STDERR "cbqosconfigindex less than 1, are you sure this is a cbqos-enabled host?\n"; 
  die;
}

# Iterate over each class number
foreach $class (keys %classnum) {
  print "\n\n";
  # Iterate over each qos index number
  foreach $indexnum (@cbqosconfigindex) {
    # If class num = index num we are interested in building an oid
    if($indexnum =~ /$class$/) {
      # Break up the data, we need subindex to get ifdescr & ifalias data
      @array = split ":",$indexnum;
      @data = split /\./,$array[0];
      $qindex = $data[1];
      $subindex = $data[0];

      # What stats are we looking for?
      $statname1 = "cbQosCMDropByte64";
      $statname2 = "cbQosCMDropByte64";
      $fileid = "drops";

      # Build some oids
      $oid1 = "$stathash{$statname1}.$array[0]";
      $oid2 = "$stathash{$statname2}.$array[0]";
 
      # Define the class name
      $classname = $classnum{$class};

      # Get the port name info
      if($descrhash{$qosifindex{$subindex}}) { 
        $portname = $descrhash{$qosifindex{$subindex}};
      } else {
        if($debug) { print STDERR "WARNING!!! Port name for $subindex -> $qosifindex{$subindex} ($classname) is not defined, skipping this target!\n"; }
        next;
      }

      # Get the ifspeed
      if($speedhash{$qosifindex{$subindex}}) { 
        $portspeed = $speedhash{$qosifindex{$subindex}};
      } else {
        if($debug) { print STDERR "WARNING!!! Speed for $subindex -> $qosifindex{$subindex} ($classname) is not defined, skipping this target!\n"; }
        next;
      }

      # Get the port alias info
      $portalias = $aliashash{$qosifindex{$subindex}};


      # Create the config target name
      $target_name = $router."_".$portname."_".$classname."_".$fileid."_".$qindex;
      # Replace slashes with underscores
      $target_name =~ s/\//_/g;
      if($debug) { print STDERR "Generating config for $target_name\n";}

      print "ShortLegend[$target_name]: drops\n";
      print "YLegend[$target_name]: drops\n";
      print "Legend1[$target_name]: drops\n";
      print "Legend2[$target_name]: drops\n";
      print "Legend3[$target_name]: Max drops\n";
      print "Legend4[$target_name]: Max drops\n";
      print "LegendI[$target_name]: drops\n";
      print "LegendO[$target_name]: drops\n";
      print "Directory[$target_name]: $router\n";
      print "WithPeak[$target_name]: ywm\n";
      print "MaxBytes[$target_name]: $portspeed\n";
      print "Options[$target_name]: growright, nopercent\n";
      print "Title[$target_name]: $router $portname $classname.$qindex drops\n";
      print "Target[$target_name]: $oid1&$oid2:$router_connect\n";
      print "PageTop[$target_name]: <H1>$router $portname $classname.$qindex drops</H1>\n";
      print "      <TABLE>\n";
      print "      <TR><TD>System:</TD><TD>$router</TD></TR>\n";
      print "      <TR><TD VALIGN=\"top\">Description:</TD><TD>$router $portname $classname.$qindex drops<br></TD></TR>\n";
      print "      <TR><TD>ifType:</TD><TD>counter</TD></TR>\n";
      print "      <TR><TD>Resource:</TD><TD><br>\n";
      print "      $router $portname $classname.$qindex drops<br>\n";
      print "      $statname1 ($oid1) & $statname2.$qindex ($oid2)<br>\n";
      print "      </TD></TR><br>\n";
      print "      </TABLE>\n";
      print "\n\n";

            
      # What stats are we looking for?
      $statname1 = "cbQosCMPrePolicyByte64";
      $statname2 = "cbQosCMPostPolicyByte64";
      $fileid = "prepostrate";

      # Build some oids
      $oid1 = "$stathash{$statname1}.$array[0]";
      $oid2 = "$stathash{$statname2}.$array[0]";

      # Define the class name
      $classname = $classnum{$class};

      # Get the port name info
      if($descrhash{$qosifindex{$subindex}}) { 
        $portname = $descrhash{$qosifindex{$subindex}};
      } else {
        if($debug) { print STDERR "WARNING!!! Port name for $subindex -> $qosifindex{$subindex} ($classname) is not defined, skipping this target!\n"; }
        next;
      }

      # Get the ifspeed
      if($speedhash{$qosifindex{$subindex}}) { 
        $portspeed = $speedhash{$qosifindex{$subindex}};
      } else {
        if($debug) { print STDERR "WARNING!!! Speed for $subindex -> $qosifindex{$subindex} ($classname) is not defined, skipping this target!\n"; }
        next;
      }
 
     # Get the port alias info
      $portalias = $aliashash{$qosifindex{$subindex}};


      # Create the config target name
      $target_name = $router."_".$portname."_".$classname."_".$fileid."_".$qindex;
      # Replace slashes with underscores
      $target_name =~ s/\//_/g;
      if($debug) { print STDERR "Generating config for $target_name\n";}

      print "ShortLegend[$target_name]: b/s\n";
      print "YLegend[$target_name]: bits\n";
      print "Legend1[$target_name]: cbQosCMPrePolicy\n";
      print "Legend2[$target_name]: cbQosCMPostPolicy\n";
      print "Legend3[$target_name]: Max cbQosCMPrePolicy\n";
      print "Legend4[$target_name]: Max cbQosCMPostPolicy\n";
      print "LegendI[$target_name]: cbQosCMPrePolicy\n";
      print "LegendO[$target_name]: cbQosCMPostPolicy\n";
      print "Directory[$target_name]: $router\n";
      print "WithPeak[$target_name]: ywm\n";
      print "MaxBytes[$target_name]: $portspeed\n";
      print "Options[$target_name]: growright, nopercent, bits\n";
      print "Title[$target_name]: $router $portname $classname.$qindex Pre/Post Policy bit rate\n";
      print "Target[$target_name]: $oid1&$oid2:$router_connect\n";
      print "PageTop[$target_name]: <H1>$router $portname $classname.$qindex Pre/Post Policy bit rate</H1>\n";
      print "      <TABLE>\n";
      print "      <TR><TD>System:</TD><TD>$router</TD></TR>\n";
      print "      <TR><TD VALIGN=\"top\">Description:</TD><TD>$router $portname $classname.$qindex Pre/Post Policy bit rate<br></TD></TR>\n";
      print "      <TR><TD>ifType:</TD><TD>counter</TD></TR>\n";
      print "      <TR><TD>Resource:</TD><TD><br>\n";
      print "      $router $portname $classname.$qindex Pre/Post Policy bit rate<br>\n";
      print "      $statname1 ($oid1) & $statname2 ($oid2)<br>\n";
      print "      </TD></TR><br>\n";
      print "      </TABLE>\n";
      print "\n\n";
    }
  }
}

if($debug) { print STDERR "Finished with cfg generation for $router\n"; }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.