Today I’ll show how retrieve additional details from already discoverd QoS-Counters. They are mostly descriptive, for human eyes.
The „Traffic-Direction“-Attribute might be relevant since in most cases only outbound drop-counters might be interesting, so the discovered list of OIDs could get filtered to process only those outbound OIDs.
Refresh: Retrieve all „QoS Packet-Counters“
>>> cbqos = session.walk('1.3.6.1.4.1.9.9.166.1.15.1.1.2') >>> print cbqos [<SNMPVariable value='9' (oid='enterprises.9.9.166.1.15.1.1.2.18.65536', oid_index='', snmp_type='COUNTER')>, <SNMPVariable value='0' (oid='enterprises.9.9.166.1.15.1.1.2.18.131072', oid_index='', snmp_type='COUNTER')>, <SNMPVariable value='1035' (oid='enterprises.9.9.166.1.15.1.1.2.18.196608', oid_index='', snmp_type='COUNTER')>, <SNMPVariable value='0' (oid='enterprises.9.9.166.1.15.1.1.2.34.65536', oid_index='', snmp_type='COUNTER')>, <SNMPVariable value='0' (oid='enterprises.9.9.166.1.15.1.1.2.34.131072', oid_index='', snmp_type='COUNTER')>, <SNMPVariable value='0' (oid='enterprises.9.9.166.1.15.1.1.2.34.196608', oid_index='', snmp_type='COUNTER')>]
There are two Policy-Objects #P:
- Policy #18
- Policy #34
Both Policy-Objects contain three Traffic-Classes #Q:
- Class #65535
- Class #131072
- Class #196608
Attributes of a bound Policy #P
Each Policy has at least two attributes:
- Interface-Type of the Policy (5 : CoPP)
- 1:mainInterface
- 2:subInterface
- 3:frDLCI
- 4:atmPVC
- 5:controlPlane
- 6:vlanPort
- 7:evc
- Traffic-Direction
- 1:input
- 2:output
- Interface bound to
Get the type of a Policy = „cbQosServicePolicyEntry.2.#P“ = „1.3.6.1.4.1.9.9.166.1.1.1.1.2.#P“
- both are type „1“ = Main-Interface
>>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.2.18") <SNMPVariable value='1' (oid='enterprises.9.9.166.1.1.1.1.2.18', oid_index='', snmp_type='INTEGER')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.2.34") <SNMPVariable value='1' (oid='enterprises.9.9.166.1.1.1.1.2.34', oid_index='', snmp_type='INTEGER')>
Direction = „cbQosServicePolicyEntry.3.#P“ = „1.3.6.1.4.1.9.9.166.1.1.1.1.3.#P“
- both are direction „2“ = Output
>>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.3.18") <SNMPVariable value='2' (oid='enterprises.9.9.166.1.1.1.1.3.18', oid_index='', snmp_type='INTEGER')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.3.34") <SNMPVariable value='2' (oid='enterprises.9.9.166.1.1.1.1.3.34', oid_index='', snmp_type='INTEGER')>
Interface-ID = „cbQosServicePolicyEntry.4.#P“ = „1.3.6.1.4.1.9.9.166.1.1.1.1.4.#P“ (cbQosIfIndex)
- Policy#18 is bound to Interface #1
- Policy#34 is bound to Interface #2
>>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.4.18") <SNMPVariable value='1' (oid='enterprises.9.9.166.1.1.1.1.4.18', oid_index='', snmp_type='INTEGER')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.4.34") <SNMPVariable value='2' (oid='enterprises.9.9.166.1.1.1.1.4.34', oid_index='', snmp_type='INTEGER')>
Interface-NAME = „1.3.6.1.2.1.2.2.1.2.#IFID“ (ifDescr)
- Interface#1 is named „GigabitEthernet1“
- Interface#2 is named „GigabitEthernet2“
>>> print session.get("1.3.6.1.2.1.2.2.1.2.1") <SNMPVariable value='GigabitEthernet1' (oid='ifDescr', oid_index='1', snmp_type='OCTETSTR')> >>> print session.get("1.3.6.1.2.1.2.2.1.2.2") <SNMPVariable value='GigabitEthernet2' (oid='ifDescr', oid_index='2', snmp_type='OCTETSTR')>
Attributes of the Traffic-Classes #Q in Policy #P
Each Traffic-Class has (beyond of all counters) the attribute:
- Name
Class-ID = „1.3.6.1.4.1.9.9.166.1.5.1.1.2.#P.#Q“ (cbQosConfigIndex)
- Class #65535 in Policy #18 has ID #309479785
- Class #131072 in Policy #18 has ID #342719994
- Class #196608 in Policy #18 has ID #1593
- Class #65535 in Policy #34 has ID #309479785
- Class #131072 in Policy #34 has ID #342719994
- Class #196608 in Policy #34 has ID #1593
since the Class-IDs are the same, it seems to be one and the same policy-map bound to two interfaces
>>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.18.65536") <SNMPVariable value='309479785' (oid='enterprises.9.9.166.1.5.1.1.2.18.65536', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.18.131072") <SNMPVariable value='342719994' (oid='enterprises.9.9.166.1.5.1.1.2.18.131072', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.18.196608") <SNMPVariable value='1593' (oid='enterprises.9.9.166.1.5.1.1.2.18.196608', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.34.196608") <SNMPVariable value='1593' (oid='enterprises.9.9.166.1.5.1.1.2.34.196608', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.34.65536") <SNMPVariable value='309479785' (oid='enterprises.9.9.166.1.5.1.1.2.34.65536', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.34.131072") <SNMPVariable value='342719994' (oid='enterprises.9.9.166.1.5.1.1.2.34.131072', oid_index='', snmp_type='GAUGE')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2.34.196608") <SNMPVariable value='1593' (oid='enterprises.9.9.166.1.5.1.1.2.34.196608', oid_index='', snmp_type='GAUGE')> >>>
Class-NAME = „1.3.6.1.4.1.9.9.166.1.7.1.1.1.#CLASS-ID“ (cbQosCMName)
- Class #309479785 has the name „CM_VOIP_RTP“
- Class #342719994 has the name „CM_VOIP_CTRL“
- Class #1593 has the name „class-default“
>>> print session.get("1.3.6.1.4.1.9.9.166.1.7.1.1.1.309479785") <SNMPVariable value='CM_VOIP_RTP' (oid='enterprises.9.9.166.1.7.1.1.1.309479785', oid_index='', snmp_type='OCTETSTR')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.7.1.1.1.342719994") <SNMPVariable value='CM_VOIP_CTRL' (oid='enterprises.9.9.166.1.7.1.1.1.342719994', oid_index='', snmp_type='OCTETSTR')> >>> print session.get("1.3.6.1.4.1.9.9.166.1.7.1.1.1.1593") <SNMPVariable value='class-default' (oid='enterprises.9.9.166.1.7.1.1.1.1593', oid_index='', snmp_type='OCTETSTR')>
Put it all together
Fetch the list of all „Packet-Counter“-OIDs.
Get the Queue/Class-Details and the Packet-Counter per Class.
session = Session(hostname='192.168.2.72', community='READ', version=2) cbqos = session.walk('1.3.6.1.4.1.9.9.166.1.15.1.1.2') ifType=["","mainInterface","subInterface","frDLCI","atmPVC","controlPlane","vlanPort","evc"] ifDir=["","input","output"] for i in cbqos: oidList=i.oid.split(".") q=oidList.pop() p=oidList.pop() ifTypeID=int(session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.2."+p).value) ifDirID=int(session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.3."+p).value) ifID=session.get("1.3.6.1.4.1.9.9.166.1.1.1.1.4."+p).value ifName=session.get("1.3.6.1.2.1.2.2.1.2."+ifID).value classID=session.get("1.3.6.1.4.1.9.9.166.1.5.1.1.2."+p+"."+q).value className=session.get("1.3.6.1.4.1.9.9.166.1.7.1.1.1."+classID).value pktCounter=session.get(i.oid).value print ifName+"("+ifType[ifTypeID]+")"+ifDir[ifDirID],className,pktCounter+" Packets"
Example Output:
GigabitEthernet1(mainInterface)output CM_VOIP_RTP 9 Packets GigabitEthernet1(mainInterface)output CM_VOIP_CTRL 0 Packets GigabitEthernet1(mainInterface)output class-default 1716 Packets GigabitEthernet2(mainInterface)output CM_VOIP_RTP 0 Packets GigabitEthernet2(mainInterface)output CM_VOIP_CTRL 0 Packets GigabitEthernet2(mainInterface)output class-default 0 Packets