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/4e97d587-1b05-43d1-afb7-1de31d787d4fn%40googlegroups.com.