I am looking at data from Cisco Wireless Controllers on a very large wireless site; let's say on the order of 5,000 APs, with obviously many many more clients.
My main value I'm wanting to get from this is to try and find APs / Buildings that have poor service quality (how best to define that, I'm not yet sure). To assist me in this I've already got snmp_exporter configured to poll the WLC (Wireless LAN Controllers) getting information about APs, and using some metric rewriting to extract the building code from the AP name.
To make this more concrete, there is an SNMP table CISCO-LWAPP-DOT11-CLIENT-MIB:cldcClientTable, which contains one row for each client. I certainly don't want that kind of cardinality problem, so I'm wanting to get some summary data. One of the columns is cldcClientReasonCode, which gives the reason for a client being disassociated, and is one of the columns I would be most interesting in exposing.
What I think I would like is a metric like the following:
cldcClientTable_summary_ClientReasonCode{ap=AP_NAME,reason_code=previousAuthNotValid} = 12
cldcClientTable_summary_ClientReasonCode{ap=AP_NAME,reason_code=disassociationStaHasLeft} = 23
cldcClientTable_summary_count{ap=AP_NAME,reason_code=previousAuthNotValid} = 113
(I've not done any summary type of things yet in Prometheus, so my strategy may be off).
Is this something that is achievable using snmp_exporter (I don't think it does), or should I expect to create my own exporter for this? If people think it may be something of value, I could have a stab at extending snmp_exporter (and the generator....), although I haven't done (much) Golang.
I'm wondering what the generator.yml would look like. Currently, my generator.yml (actually, this is the Jinja template that Ansible will populate) contains this:
cisco_wireless_controllers:
{{ snmp_credentials.cisco_wireless_controllers | to_nice_yaml(indent=2) | indent(4) }}
walk:
- 1.3.6.1.4.1.9.9.513.1.1.1 # CISCO-LWAPP-AP-MIB::cLApTable
- 1.3.6.1.4.1.14179.2.1.1 # AIRESPACE-WIRELESS-MIB::bsnDot11EssTable
lookups:
- source_indexes: ['cLApSysMacAddress']
lookup: cLApName
drop_source_indexes: true
- source_indexes: ['bsnDot11EssIndex']
lookup: bsnDot11EssSsid
drop_source_indexes: true
overrides:
# CISCO-LWAPP-AP-MIB::cLApTable, which is very wide and often useful. We omit many columns
# It would be very helpful if we could specify a whitelist of table columns
#
cLApSysMacAddress: # index for each row
type: PhysAddress48
ignore: false
cLApIfMacAddress:
type: PhysAddress48
ignore: false
cLApMaxNumberOfDot11Slots:
ignore: true
cLApEntPhysicalIndex:
ignore: true
cLApName:
ignore: false
cLApUpTime:
ignore: false
cLLwappUpTime:
ignore: false
... and many other ignores; which I generated with some scripting based around snmptable to get just the headers, and ignored everything by default
You'd only want to summary particular tables though, so it might be more useful to have this specied under the relevant 'walk' key.
Maybe something like this would be useful:
walk:
- 1.3.6.1.4.1.9.9.513.1.1.1 # CISCO-LWAPP-AP-MIB::cLApTable
- 1.3.6.1.4.1.14179.2.1.1 # AIRESPACE-WIRELESS-MIB::bsnDot11EssTable
- oid: 1.3.6.1.4.1.9.9.599.1.3.1 # CISCO-LWAPP-DOT11-CLIENT-MIB:cldcClientTable
# EITHER produce a summary for each column of the table independently
summarize_individually:
- cldcClientStatus
- cldcClientReasonCode
- cldcClientProtocol
- cldcAssociationMode
# OR perhaps the count for each combination of summarized values, but
# potential cardinality risk there though, perhaps.
summarize_combinations:
- cldcClientStatus
- cldcClientReasonCode
lookups:
Thanks for all the work on this product, its been very very useful.
Cheers,
Cameron