I decided to try a different switch and I'm getting different results. The
config looks identical so I need to troubleshoot some more.
On Wednesday, July 24, 2024 at 2:55:00 AM UTC-4 Brian Candler wrote:
> Depending on what you mean by "fails", you may be able to get some more
> info by adding debug=true to the query params, e.g.
>
> curl 'localhost:9116/snmp?target=x.x.x.x&module=foo&auth=bar&debug=true'
>
> On Tuesday 23 July 2024 at 16:26:26 UTC+1 Matthew Koch wrote:
>
>> Well you made rethink how I had the context setup in the auth and I did
>> find something interesting, for the context I had tried vlan-, vlan-*, *
>> and nothing worked previously. I just tried it with the context variable
>> there in the auth but without anything preceding it and I'm starting to get
>> some results. The original yml I sent works and now grabs every VLAN but
>> the second I try to add the ifIndex lookups it fails.
>>
>> ReadOnly:
>> security_level: authPriv
>> username: User
>> password: password
>> auth_protocol: SHA
>> priv_protocol: AES
>> priv_password: password
>> context_name: vlan-200
>> version: 3
>>
>> ReadOnly:
>> security_level: authPriv
>> username: User
>> password: password
>> auth_protocol: SHA
>> priv_protocol: AES
>> priv_password: password
>> context_name:
>> version: 3
>> On Tuesday, July 23, 2024 at 9:49:57 AM UTC-4 Brian Candler wrote:
>>
>>> And you can't create an SNMP context on the device that exposes all the
>>> parts of the MIB tree that you're interested in?
>>>
>>> On Tuesday 23 July 2024 at 14:19:14 UTC+1 Matthew Koch wrote:
>>>
>>>>
>>>> *Correct, the SNMP context I am using is specific to the VLAN that I am
>>>> trying to get data from. *
>>>> *Non-Cisco Switch: *
>>>>
>>>> dot1dTpFdbStatus_info{dot1dTpFdbAddress="0x000000D51541",dot1dTpFdbPort="5",dot1dTpFdbStatus="learned",ifAlias="Switch5",ifDescr="Module:
>>>>
>>>> 1 Port: 5 - 10/100 Mbit TX",ifIndex="5",ifName="1/5"} 1
>>>> *Cisco Switch - No SNMP Context:*
>>>>
>>>> # HELP dot1dBasePortCircuit For a port which (potentially) has the same
>>>> value of dot1dBasePortIfIndex as another port on the same bridge, this
>>>> object contains the name of an object instance unique to this port -
>>>> 1.3.6.1.2.1.17.1.4.1.3 # TYPE dot1dBasePortCircuit gauge
>>>> dot1dBasePortCircuit{dot1dBasePort="25",dot1dBasePortCircuit="0.0"} 1 #
>>>> HELP dot1dBasePortDelayExceededDiscards The number of frames discarded by
>>>> this port due to excessive transit delay through the bridge -
>>>> 1.3.6.1.2.1.17.1.4.1.4 # TYPE dot1dBasePortDelayExceededDiscards counter
>>>> dot1dBasePortDelayExceededDiscards{dot1dBasePort="25"} 0 # HELP
>>>> dot1dBasePortIfIndex The value of the instance of the ifIndex object,
>>>> defined in MIB-II, for the interface corresponding to this port. -
>>>> 1.3.6.1.2.1.17.1.4.1.2 # TYPE dot1dBasePortIfIndex gauge
>>>> dot1dBasePortIfIndex{dot1dBasePort="25"} 25 # HELP
>>>> dot1dBasePortMtuExceededDiscards The number of frames discarded by this
>>>> port due to an excessive size - 1.3.6.1.2.1.17.1.4.1.5 # TYPE
>>>> dot1dBasePortMtuExceededDiscards counter
>>>> dot1dBasePortMtuExceededDiscards{dot1dBasePort="25"} 0 # HELP ifIndex
>>>> interface index reported by the SNMP agent - 1.3.6.1.2.1.2.2.1.1 # TYPE
>>>> ifIndex gauge ifIndex{ifIndex="1"} 1 ifIndex{ifIndex="10"} 1
>>>> ifIndex{ifIndex="11"} 1 ifIndex{ifIndex="12"} 1 ifIndex{ifIndex="13"} 1
>>>> ifIndex{ifIndex="14"} 1 *Cisco Switch with VLAN-100 context*
>>>> dot1dTpFdbStatus_info{dot1dTpFdbAddress="0x000000BD4526",dot1dTpFdbPort="1",dot1dTpFdbStatus="learned",ifAlias="",ifDescr="",ifIndex="",ifName=""}
>>>>
>>>> 1
>>>> dot1dTpFdbStatus_info{dot1dTpFdbAddress="0x000000013B93",dot1dTpFdbPort="11",dot1dTpFdbStatus="learned",ifAlias="",ifDescr="",ifIndex="",ifName=""}
>>>>
>>>> 1
>>>> dot1dTpFdbStatus_info{dot1dTpFdbAddress="0x0000006664FA",dot1dTpFdbPort="4",dot1dTpFdbStatus="learned",ifAlias="",ifDescr="",ifIndex="",ifName=""}
>>>>
>>>> 1
>>>> On Tuesday, July 23, 2024 at 6:21:05 AM UTC-4 Brian Candler wrote:
>>>>
>>>>> Ah right - so we're talking about SNMP v3 context then, not "VLAN
>>>>> context"?
>>>>>
>>>>> As I understand it, the SNMP context gives you a selected subset of
>>>>> the OID tree. From RFC 5343:
>>>>>
>>>>>
>>>>> * An SNMP context is a collection of management information accessible
>>>>> by an SNMP entity. An item of management information may exist in more
>>>>> than
>>>>> one context and an SNMP entity potentially has access to many contexts
>>>>> [RFC3411 <https://datatracker.ietf.org/doc/html/rfc3411>]. A context is
>>>>> identified by the snmpEngineID value of the entity hosting the management
>>>>> information (also called a contextEngineID) and a context name that
>>>>> identifies the specific context (also called a contextName).*
>>>>> On Tuesday 23 July 2024 at 10:53:11 UTC+1 Ben Kochie wrote:
>>>>>
>>>>>> SNMP has the concept of a "Context Name" that is part of the walk, in
>>>>>> addition to the community and other security parameters.
>>>>>>
>>>>>> This can be included in the auth section of the config[0], or as a
>>>>>> URL parameter in the latest release[1].
>>>>>>
>>>>>> [0]:
>>>>>> https://github.com/prometheus/snmp_exporter/tree/main/generator#file-format
>>>>>> [1]: https://github.com/prometheus/snmp_exporter/pull/1163
>>>>>>
>>>>>> On Tue, Jul 23, 2024 at 11:40 AM 'Brian Candler' via Prometheus Users
>>>>>> <[email protected]> wrote:
>>>>>>
>>>>>>> > The Cisco switches I am using require you to specify the VLAN
>>>>>>> context to retrieve the data
>>>>>>>
>>>>>>> I'm not sure I follow. Clearly, you "retrieve" the data simply by
>>>>>>> walking the relevant SNMP MIB, for which you need to specify nothing
>>>>>>> more
>>>>>>> than the OID to walk. Are you saying that Cisco have a proprietary MIB
>>>>>>> for
>>>>>>> this data, and/or that the VLAN is part of the table key? Does it not
>>>>>>> have
>>>>>>> an equivalent to dot1dTpFdbPort, or does dot1dBasePortIfIndex not match
>>>>>>> with ifIndex?
>>>>>>>
>>>>>>> If you show some examples of snmpwalk output it may be clearer.
>>>>>>> Although I don't have anything to test with here (except perhaps IOSv)
>>>>>>>
>>>>>>> > In a perfect world I'm able to get ifIndex, ifDescr, ifAlias,
>>>>>>> ifName, mac address and IP address in one call.
>>>>>>>
>>>>>>> One call to what - Prometheus? If the IP--to-MAC mapping and
>>>>>>> MAC-to-port mapping are in different SNMP tables then it would not be
>>>>>>> straightforward to combine them in snmp_exporter (it might be possible
>>>>>>> with
>>>>>>> chained lookups). You could also have a recording rule
>>>>>>> <https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/>
>>>>>>>
>>>>>>> in prometheus which performs the join and stores the result.
>>>>>>>
>>>>>>> On Monday 22 July 2024 at 19:42:56 UTC+1 Matthew Koch wrote:
>>>>>>>
>>>>>>>> Unfortunately adding the ifIndex only works on some switches. The
>>>>>>>> Cisco switches I am using require you to specify the VLAN context to
>>>>>>>> retrieve the data which doesn't pull the ifIndex information. This
>>>>>>>> definitely helps though, I was hoping there was a way trick it into
>>>>>>>> using dot1dBasePortIfIndex instead of ifIndex because they are
>>>>>>>> equivalents
>>>>>>>> to pull ifAlias, ifDescr, ifName etc. This would also be useful to get
>>>>>>>> the
>>>>>>>> IP address in the same poll. In a perfect world I'm able to get
>>>>>>>> ifIndex,
>>>>>>>> ifDescr, ifAlias, ifName, mac address and IP address in one call.
>>>>>>>>
>>>>>>>> On Saturday, July 20, 2024 at 7:56:10 AM UTC-4 Brian Candler wrote:
>>>>>>>>
>>>>>>>>> I had a play with this and I think I got most of the way there.
>>>>>>>>> Here's generator.yml:
>>>>>>>>>
>>>>>>>>> modules:
>>>>>>>>> bridge_mib:
>>>>>>>>> walk:
>>>>>>>>> - dot1dBasePortTable
>>>>>>>>> - dot1dTpFdbTable
>>>>>>>>> lookups:
>>>>>>>>> - source_indexes: [dot1dTpFdbAddress]
>>>>>>>>> lookup: dot1dTpFdbPort
>>>>>>>>> - source_indexes: [dot1dTpFdbPort]
>>>>>>>>> lookup: dot1dBasePortIfIndex
>>>>>>>>> overrides:
>>>>>>>>> dot1dBasePort:
>>>>>>>>> ignore: true
>>>>>>>>> dot1dTpFdbStatus:
>>>>>>>>> type: EnumAsInfo
>>>>>>>>> dot1dTpFdbPort:
>>>>>>>>> ignore: true
>>>>>>>>>
>>>>>>>>> Here's the snmp.yml that it creates:
>>>>>>>>>
>>>>>>>>> # WARNING: This file was auto-generated using snmp_exporter
>>>>>>>>> generator, manual changes will be lost.
>>>>>>>>> modules:
>>>>>>>>> bridge_mib:
>>>>>>>>> walk:
>>>>>>>>> - 1.3.6.1.2.1.17.1.4
>>>>>>>>> - 1.3.6.1.2.1.17.4.3
>>>>>>>>>
>>>>>>>>> metrics:
>>>>>>>>> - name: dot1dBasePortIfIndex
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>> type: gauge
>>>>>>>>> help: The value of the instance of the ifIndex object,
>>>>>>>>> defined in IF-MIB, for
>>>>>>>>>
>>>>>>>>> the interface corresponding to this port. -
>>>>>>>>> 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dBasePort
>>>>>>>>> type: gauge
>>>>>>>>> - name: dot1dBasePortCircuit
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.3
>>>>>>>>> type: OctetString
>>>>>>>>> help: For a port that (potentially) has the same value of
>>>>>>>>> dot1dBasePortIfIndex
>>>>>>>>> as another port on the same bridge - 1.3.6.1.2.1.17.1.4.1.3
>>>>>>>>>
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dBasePort
>>>>>>>>> type: gauge
>>>>>>>>> - name: dot1dBasePortDelayExceededDiscards
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.4
>>>>>>>>> type: counter
>>>>>>>>> help: The number of frames discarded by this port due to
>>>>>>>>> excessive transit delay
>>>>>>>>> through the bridge - 1.3.6.1.2.1.17.1.4.1.4
>>>>>>>>>
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dBasePort
>>>>>>>>> type: gauge
>>>>>>>>> - name: dot1dBasePortMtuExceededDiscards
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.5
>>>>>>>>> type: counter
>>>>>>>>> help: The number of frames discarded by this port due to an
>>>>>>>>> excessive size -
>>>>>>>>> 1.3.6.1.2.1.17.1.4.1.5
>>>>>>>>>
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dBasePort
>>>>>>>>> type: gauge
>>>>>>>>> - name: dot1dTpFdbAddress
>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.1
>>>>>>>>> type: PhysAddress48
>>>>>>>>> help: A unicast MAC address for which the bridge has
>>>>>>>>> forwarding and/or filtering
>>>>>>>>> information. - 1.3.6.1.2.1.17.4.3.1.1
>>>>>>>>>
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dTpFdbAddress
>>>>>>>>> type: PhysAddress48
>>>>>>>>> fixed_size: 6
>>>>>>>>> - labelname: dot1dTpFdbPort
>>>>>>>>> type: gauge
>>>>>>>>> lookups:
>>>>>>>>> - labels:
>>>>>>>>> - dot1dTpFdbAddress
>>>>>>>>> labelname: dot1dTpFdbPort
>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.2
>>>>>>>>> type: gauge
>>>>>>>>> - labels:
>>>>>>>>> - dot1dTpFdbPort
>>>>>>>>> labelname: dot1dBasePortIfIndex
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>> type: gauge
>>>>>>>>>
>>>>>>>>> - name: dot1dTpFdbStatus
>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.3
>>>>>>>>> type: EnumAsInfo
>>>>>>>>> help: The status of this entry - 1.3.6.1.2.1.17.4.3.1.3
>>>>>>>>> indexes:
>>>>>>>>> - labelname: dot1dTpFdbAddress
>>>>>>>>> type: PhysAddress48
>>>>>>>>> fixed_size: 6
>>>>>>>>> - labelname: dot1dTpFdbPort
>>>>>>>>> type: gauge
>>>>>>>>> lookups:
>>>>>>>>> - labels:
>>>>>>>>> - dot1dTpFdbAddress
>>>>>>>>> labelname: dot1dTpFdbPort
>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.2
>>>>>>>>> type: gauge
>>>>>>>>> - labels:
>>>>>>>>> - dot1dTpFdbPort
>>>>>>>>> labelname: dot1dBasePortIfIndex
>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>> type: gauge
>>>>>>>>>
>>>>>>>>> enum_values:
>>>>>>>>> 1: other
>>>>>>>>> 2: invalid
>>>>>>>>> 3: learned
>>>>>>>>> 4: self
>>>>>>>>> 5: mgmt
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Output:
>>>>>>>>>
>>>>>>>>> # HELP dot1dBasePortCircuit For a port that (potentially) has the
>>>>>>>>> same value of dot1dBasePortIfIndex as another port on the same bridge
>>>>>>>>> -
>>>>>>>>> 1.3.6.1.2.1.17.1.4.1.3
>>>>>>>>> # TYPE dot1dBasePortCircuit gauge
>>>>>>>>> dot1dBasePortCircuit{dot1dBasePort="15",dot1dBasePortCircuit="0.0"}
>>>>>>>>> 1
>>>>>>>>> dot1dBasePortCircuit{dot1dBasePort="16",dot1dBasePortCircuit="0.0"}
>>>>>>>>> 1
>>>>>>>>> dot1dBasePortCircuit{dot1dBasePort="17",dot1dBasePortCircuit="0.0"}
>>>>>>>>> 1
>>>>>>>>> ...
>>>>>>>>> # HELP dot1dBasePortIfIndex The value of the instance of the
>>>>>>>>> ifIndex object, defined in IF-MIB, for the interface corresponding to
>>>>>>>>> this
>>>>>>>>> port. - 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>> # TYPE dot1dBasePortIfIndex gauge
>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="15"} 6
>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="16"} 7
>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="17"} 8
>>>>>>>>> ...
>>>>>>>>> # HELP dot1dTpFdbAddress A unicast MAC address for which the
>>>>>>>>> bridge has forwarding and/or filtering information. -
>>>>>>>>> 1.3.6.1.2.1.17.4.3.1.1
>>>>>>>>> # TYPE dot1dTpFdbAddress gauge
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> *dot1dTpFdbAddress{dot1dBasePortIfIndex="",dot1dTpFdbAddress="XX:XX:XX:9C:3A:06",dot1dTpFdbPort="0"}
>>>>>>>>>
>>>>>>>>> 1dot1dTpFdbAddress{dot1dBasePortIfIndex="10",dot1dTpFdbAddress="XX:XX:XX:5F:6C:B2",dot1dTpFdbPort="23"}
>>>>>>>>>
>>>>>>>>> 1dot1dTpFdbAddress{dot1dBasePortIfIndex="10",dot1dTpFdbAddress="XX:XX:XX:81:98:C4",dot1dTpFdbPort="23"}
>>>>>>>>>
>>>>>>>>> 1*
>>>>>>>>> ...
>>>>>>>>> # HELP dot1dTpFdbStatus_info The status of this entry -
>>>>>>>>> 1.3.6.1.2.1.17.4.3.1.3 (EnumAsInfo)
>>>>>>>>> # TYPE dot1dTpFdbStatus_info gauge
>>>>>>>>> dot1dTpFdbStatus_info{dot1dBasePortIfIndex="",dot1dTpFdbAddress="XX:XX:XX:9C:3A:06",dot1dTpFdbPort="0",dot1dTpFdbStatus="self"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> dot1dTpFdbStatus_info{dot1dBasePortIfIndex="10",dot1dTpFdbAddress="XX:XX:XX:5F:6C:B2",dot1dTpFdbPort="23",dot1dTpFdbStatus="learned"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> dot1dTpFdbStatus_info{dot1dBasePortIfIndex="10",dot1dTpFdbAddress="XX:XX:XX:81:98:C4",dot1dTpFdbPort="23",dot1dTpFdbStatus="learned"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>> I think dot1dTpFdbAddress now gives more or less what you want. A
>>>>>>>>> few niggles:
>>>>>>>>>
>>>>>>>>> (1) I would like to change "dot1dBasePortIfIndex" to "ifIndex" to
>>>>>>>>> make joins easier, without having to use label_replace(). I couldn't
>>>>>>>>> see a
>>>>>>>>> way to rename a metric in snmp_exporter.
>>>>>>>>>
>>>>>>>>> (2) I would like to merge the enumerated dot1dTpFdbStatus strings
>>>>>>>>> into dot1dTpFdbAddress. However if I add this:
>>>>>>>>>
>>>>>>>>> lookups:
>>>>>>>>> - source_indexes: [dot1dTpFdbAddress]
>>>>>>>>> lookup: dot1dTpFdbPort
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> * - source_indexes: [dot1dTpFdbAddress] lookup:
>>>>>>>>> dot1dTpFdbStatus* - source_indexes: [dot1dTpFdbPort]
>>>>>>>>> lookup: dot1dBasePortIfIndex
>>>>>>>>>
>>>>>>>>> then I get scraping errors, e.g.
>>>>>>>>>
>>>>>>>>> * error collecting metric Desc{fqName: "snmp_error", help: "Error
>>>>>>>>> calling NewConstMetric for EnumAsInfo", constLabels: {},
>>>>>>>>> variableLabels:
>>>>>>>>> {}}: error for metric dot1dTpFdbStatus with labels [9 3 5
>>>>>>>>> XX:XX:XX:27:29:BA
>>>>>>>>> learned]: duplicate label names in constant and variable labels for
>>>>>>>>> metric
>>>>>>>>> "dot1dTpFdbStatus_info"
>>>>>>>>>
>>>>>>>>> If I remove the override
>>>>>>>>>
>>>>>>>>> dot1dTpFdbStatus:
>>>>>>>>> type: EnumAsInfo
>>>>>>>>>
>>>>>>>>> then scraping works, but I only get the numeric status code
>>>>>>>>> e.g. dot1dTpFdbStatus="3"
>>>>>>>>>
>>>>>>>>> -------
>>>>>>>>>
>>>>>>>>> Note that if you want to avoid the join in PromQL, you *can* walk
>>>>>>>>> if[X]Table as well:
>>>>>>>>>
>>>>>>>>> modules:
>>>>>>>>> bridge_mib:
>>>>>>>>> walk:
>>>>>>>>> - dot1dBasePortTable
>>>>>>>>> - dot1dTpFdbTable
>>>>>>>>> - ifIndex
>>>>>>>>> - ifAlias
>>>>>>>>> - 1.3.6.1.2.1.2.2.1.2
>>>>>>>>> - 1.3.6.1.2.1.31.1.1.1.1
>>>>>>>>> lookups:
>>>>>>>>> - source_indexes: [dot1dTpFdbAddress]
>>>>>>>>> lookup: dot1dTpFdbPort
>>>>>>>>> - source_indexes: [dot1dTpFdbPort]
>>>>>>>>> lookup: dot1dBasePortIfIndex
>>>>>>>>> - source_indexes: [dot1dBasePortIfIndex]
>>>>>>>>> lookup: ifIndex
>>>>>>>>> drop_source_indexes: true
>>>>>>>>> - source_indexes: [ifIndex]
>>>>>>>>> lookup: ifAlias
>>>>>>>>> - source_indexes: [ifIndex]
>>>>>>>>> # Uis OID to avoid conflict with PaloAlto PAN-COMMON-MIB.
>>>>>>>>> lookup: 1.3.6.1.2.1.2.2.1.2 # ifDescr
>>>>>>>>> - source_indexes: [ifIndex]
>>>>>>>>> # Use OID to avoid conflict with Netscaler NS-ROOT-MIB.
>>>>>>>>> lookup: 1.3.6.1.2.1.31.1.1.1.1 # ifName
>>>>>>>>> overrides:
>>>>>>>>> dot1dBasePort:
>>>>>>>>> ignore: true
>>>>>>>>> dot1dTpFdbStatus:
>>>>>>>>> type: EnumAsInfo
>>>>>>>>> dot1dTpFdbPort:
>>>>>>>>> ignore: true
>>>>>>>>> ifAlias:
>>>>>>>>> ignore: true
>>>>>>>>> ifDescr:
>>>>>>>>> ignore: true
>>>>>>>>> ifName:
>>>>>>>>> ignore: true
>>>>>>>>>
>>>>>>>>> In this case, dot1dTpFdbAddress includes ifIndex *and* the other
>>>>>>>>> interface info, which makes the metric rather convenient to use:
>>>>>>>>>
>>>>>>>>> # HELP dot1dTpFdbAddress A unicast MAC address for which the
>>>>>>>>> bridge has forwarding and/or filtering information. -
>>>>>>>>> 1.3.6.1.2.1.17.4.3.1.1
>>>>>>>>> # TYPE dot1dTpFdbAddress gauge
>>>>>>>>> dot1dTpFdbAddress{dot1dTpFdbAddress="XX:XX:XX:C5:A2:F2",dot1dTpFdbPort="9",ifAlias="",ifDescr="ether5",ifIndex="5",ifName="ether5"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> dot1dTpFdbAddress{dot1dTpFdbAddress="XX:XX:XX:12:91:4B",dot1dTpFdbPort="6",ifAlias="",ifDescr="ether2",ifIndex="2",ifName="ether2"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> dot1dTpFdbAddress{dot1dTpFdbAddress="XX:XX:XX:27:FE:A9",dot1dTpFdbPort="6",ifAlias="",ifDescr="ether2",ifIndex="2",ifName="ether2"}
>>>>>>>>>
>>>>>>>>> 1
>>>>>>>>> ...
>>>>>>>>>
>>>>>>>>> But I suspect that if you're scraping if_mib as well, then
>>>>>>>>> snmp_exporter will end up walking bits of ifTable/ifXTable twice,
>>>>>>>>> making it
>>>>>>>>> less efficient network-wise.
>>>>>>>>>
>>>>>>>>> On Saturday 20 July 2024 at 10:20:53 UTC+1 Brian Candler wrote:
>>>>>>>>>
>>>>>>>>>> I found a relevant issue:
>>>>>>>>>> https://github.com/prometheus/snmp_exporter/issues/405
>>>>>>>>>>
>>>>>>>>>> Firstly, the PromQL count_values
>>>>>>>>>> <https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators>
>>>>>>>>>>
>>>>>>>>>> operator can be used to convert a metric value to a label (very neat
>>>>>>>>>> trick).
>>>>>>>>>>
>>>>>>>>>> And secondly, the ability to do "chainable lookups" was added:
>>>>>>>>>> https://github.com/prometheus/snmp_exporter/pull/527/files
>>>>>>>>>> This might be a way to solve this in the exporter - but I haven't
>>>>>>>>>> got my head around this. I'm not sure if you'd need to walk ifTable
>>>>>>>>>> in your
>>>>>>>>>> generator, even if you're not actually interested in any additional
>>>>>>>>>> values
>>>>>>>>>> from ifTable.
>>>>>>>>>>
>>>>>>>>>> On Saturday 20 July 2024 at 09:48:26 UTC+1 Brian Candler wrote:
>>>>>>>>>>
>>>>>>>>>>> > dot1dBasePortIfIndex{dot1dBasePort="12"} 12 - *This won't
>>>>>>>>>>> always be the same number*
>>>>>>>>>>>
>>>>>>>>>>> The MIB help text says "The value of the instance of the ifIndex
>>>>>>>>>>> object". So I'm guessing that what you currently get as
>>>>>>>>>>>
>>>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="12"} 42
>>>>>>>>>>>
>>>>>>>>>>> would be more usefully returned as
>>>>>>>>>>>
>>>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="12",ifIndex="42"} 1
>>>>>>>>>>>
>>>>>>>>>>> But I'm afraid I don't have enough generator.yml foo to know how
>>>>>>>>>>> to do that :-(
>>>>>>>>>>>
>>>>>>>>>>> On Thursday 18 July 2024 at 20:04:35 UTC+1 Matthew Koch wrote:
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> *This is a physical port ifIndex example*
>>>>>>>>>>>>
>>>>>>>>>>>> ifAdminStatus{ifAlias="Device; Device
>>>>>>>>>>>> (DEVICE)",ifDescr="GigabitEthernet1/12",ifIndex="12",ifName="Gi1/12"}
>>>>>>>>>>>>
>>>>>>>>>>>> 1
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> *1. dot1dBasePortIfIndex is an equivalent of ifIndex but
>>>>>>>>>>>> dot1dBasePort is not. dot1dBasePort is used to get the MAC
>>>>>>>>>>>> address. *
>>>>>>>>>>>>
>>>>>>>>>>>> dot1dBasePortIfIndex{dot1dBasePort="12"} 12 - *This won't
>>>>>>>>>>>> always be the same number*
>>>>>>>>>>>>
>>>>>>>>>>>> *2. I get the MAC address and port pair from this*
>>>>>>>>>>>>
>>>>>>>>>>>> dot1dTpFdbPort{dot1dTpFdbAddress="11:E0:E4:66:5E:11"} 12
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> *3. I get the MAC address and IP pair from this. But
>>>>>>>>>>>> the ipNetToMediaIfIndex is a VLAN not a physical port. *
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ipNetToMediaPhysAddress{ipNetToMediaIfIndex="28",ipNetToMediaNetAddress="
>>>>>>>>>>>> 10.10.1.33",ipNetToMediaPhysAddress="11:E0:E4:66:5E:11"} 1
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thursday, July 18, 2024 at 2:42:10 PM UTC-4 Brian Candler
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> > The challenge I am having is using promql to join the data
>>>>>>>>>>>>> so I can show the IP associated with the MAC address on the
>>>>>>>>>>>>> physical port.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Can you show some examples of the metrics you're trying to
>>>>>>>>>>>>> join?
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Thursday 18 July 2024 at 18:48:35 UTC+1 Matthew Koch wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> I am working on a project to gather the MAC address and IP
>>>>>>>>>>>>>> which is on a specific port on a network switch. I've been able
>>>>>>>>>>>>>> to gather
>>>>>>>>>>>>>> this information with the below SNMP config but the challenge is
>>>>>>>>>>>>>> the MAC
>>>>>>>>>>>>>> address comes back against the physical port index and the IPs
>>>>>>>>>>>>>> come back
>>>>>>>>>>>>>> against the VLANs index which is expected. The challenge I am
>>>>>>>>>>>>>> having is
>>>>>>>>>>>>>> using promql to join the data so I can show the IP associated
>>>>>>>>>>>>>> with the MAC
>>>>>>>>>>>>>> address on the physical port.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> walk:
>>>>>>>>>>>>>> - 1.3.6.1.2.1.17.1.4.1
>>>>>>>>>>>>>> - 1.3.6.1.2.1.17.4.3.1
>>>>>>>>>>>>>> - 1.3.6.1.2.1.4.22.1
>>>>>>>>>>>>>> - 1.3.6.1.2.1.4.35.1
>>>>>>>>>>>>>> metrics:
>>>>>>>>>>>>>> - name: dot1dBasePortIfIndex
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> help: The value of the instance of the ifIndex object,
>>>>>>>>>>>>>> defined in MIB-II, for
>>>>>>>>>>>>>> the interface corresponding to this port. -
>>>>>>>>>>>>>> 1.3.6.1.2.1.17.1.4.1.2
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: dot1dBasePort
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - name: dot1dTpFdbPort
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.2
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> help: Either the value '0', or the port number of the
>>>>>>>>>>>>>> port on which a frame
>>>>>>>>>>>>>> having a source address equal to the value of the
>>>>>>>>>>>>>> corresponding instance of
>>>>>>>>>>>>>> dot1dTpFdbAddress has been seen -
>>>>>>>>>>>>>> 1.3.6.1.2.1.17.4.3.1.2
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: dot1dTpFdbAddress
>>>>>>>>>>>>>> type: PhysAddress48
>>>>>>>>>>>>>> fixed_size: 6
>>>>>>>>>>>>>> - name: dot1dTpFdbStatus
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.17.4.3.1.3
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: The status of this entry - 1.3.6.1.2.1.17.4.3.1.3
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: dot1dTpFdbAddress
>>>>>>>>>>>>>> type: PhysAddress48
>>>>>>>>>>>>>> fixed_size: 6
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 1: other
>>>>>>>>>>>>>> 2: invalid
>>>>>>>>>>>>>> 3: learned
>>>>>>>>>>>>>> 4: self
>>>>>>>>>>>>>> 5: mgmt
>>>>>>>>>>>>>> - name: ipNetToMediaPhysAddress
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.22.1.2
>>>>>>>>>>>>>> type: PhysAddress48
>>>>>>>>>>>>>> help: ' - 1.3.6.1.2.1.4.22.1.2'
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToMediaIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToMediaNetAddress
>>>>>>>>>>>>>> type: InetAddressIPv4
>>>>>>>>>>>>>> - name: ipNetToMediaType
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.22.1.4
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: ' - 1.3.6.1.2.1.4.22.1.4'
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToMediaIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToMediaNetAddress
>>>>>>>>>>>>>> type: InetAddressIPv4
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 1: other
>>>>>>>>>>>>>> 2: invalid
>>>>>>>>>>>>>> 3: dynamic
>>>>>>>>>>>>>> 4: static
>>>>>>>>>>>>>> - name: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.1
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> help: The index value that uniquely identifies the
>>>>>>>>>>>>>> interface to which this entry
>>>>>>>>>>>>>> is applicable - 1.3.6.1.2.1.4.35.1.1
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> - name: ipNetToPhysicalNetAddressType
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.2
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: The type of ipNetToPhysicalNetAddress. -
>>>>>>>>>>>>>> 1.3.6.1.2.1.4.35.1.2
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 0: unknown
>>>>>>>>>>>>>> 1: ipv4
>>>>>>>>>>>>>> 2: ipv6
>>>>>>>>>>>>>> 3: ipv4z
>>>>>>>>>>>>>> 4: ipv6z
>>>>>>>>>>>>>> 16: dns
>>>>>>>>>>>>>> - name: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.3
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> help: The IP Address corresponding to the
>>>>>>>>>>>>>> media-dependent `physical' address
>>>>>>>>>>>>>> - 1.3.6.1.2.1.4.35.1.3
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> - name: ipNetToPhysicalPhysAddress
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.4
>>>>>>>>>>>>>> type: PhysAddress48
>>>>>>>>>>>>>> help: The media-dependent `physical' address -
>>>>>>>>>>>>>> 1.3.6.1.2.1.4.35.1.4
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> - name: ipNetToPhysicalLastUpdated
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.5
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> help: The value of sysUpTime at the time this entry was
>>>>>>>>>>>>>> last updated - 1.3.6.1.2.1.4.35.1.5
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> - name: ipNetToPhysicalType
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.6
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: The type of mapping - 1.3.6.1.2.1.4.35.1.6
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 1: other
>>>>>>>>>>>>>> 2: invalid
>>>>>>>>>>>>>> 3: dynamic
>>>>>>>>>>>>>> 4: static
>>>>>>>>>>>>>> 5: local
>>>>>>>>>>>>>> - name: ipNetToPhysicalState
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.7
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: The Neighbor Unreachability Detection state for
>>>>>>>>>>>>>> the interface when the
>>>>>>>>>>>>>> address mapping in this entry is used -
>>>>>>>>>>>>>> 1.3.6.1.2.1.4.35.1.7
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 1: reachable
>>>>>>>>>>>>>> 2: stale
>>>>>>>>>>>>>> 3: delay
>>>>>>>>>>>>>> 4: probe
>>>>>>>>>>>>>> 5: invalid
>>>>>>>>>>>>>> 6: unknown
>>>>>>>>>>>>>> 7: incomplete
>>>>>>>>>>>>>> - name: ipNetToPhysicalRowStatus
>>>>>>>>>>>>>> oid: 1.3.6.1.2.1.4.35.1.8
>>>>>>>>>>>>>> type: EnumAsInfo
>>>>>>>>>>>>>> help: The status of this conceptual row -
>>>>>>>>>>>>>> 1.3.6.1.2.1.4.35.1.8
>>>>>>>>>>>>>> indexes:
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalIfIndex
>>>>>>>>>>>>>> type: gauge
>>>>>>>>>>>>>> - labelname: ipNetToPhysicalNetAddress
>>>>>>>>>>>>>> type: InetAddress
>>>>>>>>>>>>>> enum_values:
>>>>>>>>>>>>>> 1: active
>>>>>>>>>>>>>> 2: notInService
>>>>>>>>>>>>>> 3: notReady
>>>>>>>>>>>>>> 4: createAndGo
>>>>>>>>>>>>>> 5: createAndWait
>>>>>>>>>>>>>> 6: destroy
>>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Prometheus Users" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/prometheus-users/becefc77-874c-4ccf-a222-5a2c6e09c5aen%40googlegroups.com
>>>>>>>
>>>>>>> <https://groups.google.com/d/msgid/prometheus-users/becefc77-874c-4ccf-a222-5a2c6e09c5aen%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>
--
You received this message because you are subscribed to the Google Groups
"Prometheus Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/prometheus-users/40c246b9-3e91-4df1-8d62-8d6ef07a46c4n%40googlegroups.com.