Yes, like anything, some vendors do a bad job of implementing things. SNMP is a common one that vendors implement because they're told they need to for "standards reasons", but they don't put in the effort to understand the subtleties. I know SNMP pretty well, but I consider it a method of last resort.
IMO, if any device/server has a JSON or similar API I would write a custom exporter for it rather than use SNMP. It's pretty normal to store the info stuff in Prometheus. Because the data is static (a series of 1 values), the data compresses extremely well. And yes, having firmware versions in the TSDB is very useful to do reporting and sometimes alerts on deviations over a fleet of instances. PromQL makes it reasonably easy to report on deviations like this. On Sun, Aug 6, 2023 at 8:49 PM Elliott Balsley <[email protected]> wrote: > Thanks Ben. I think it will take me some time to wrap my head around this > information. It's my first time working with SNMP, and I'm trying to learn > several tools at once including Prometheus, Grafana, and Loki. > Maybe a time-series database is not the best way to store the "info" parts > of this, since things like IP, MAC address, and deviceType should never > change. It's more like a long term inventory. Some of the other items > like deviceFirmware and deviceStatus are useful to track over time and be > able to trigger alerts. > > Some of the other OIDs like serverMemoryUsage should be tracked as > numbers, but they are returned as strings. Can you advise how to convert > this properly? For example snmpwalk shows serverMemoryUsage like this: > > SNMPv2-SMI::enterprises.25119.1.3.2.0 = STRING: "63%" > > So I tried using regex to remove the percent symbol > serverMemoryUsage: > regex_extracts: > '': > - regex: '(.*)%' > value: '$1' > > But I don't get any value this way and it logs this error: > msg="No match found for regexp" metric=serverMemoryUsage value=0x363425 > regex=^(?:^(?:(.*)%)$)$ > > > > On Sun, Aug 6, 2023 at 12:40 AM Ben Kochie <[email protected]> wrote: > >> The `deviceIndex` already indicates that it is one "device". Each metric >> is a different property of that device. Prometheus metrics are single >> float64 values, tables are mapped into metric names (think columns) and >> each unique label index (deviceIndex in this case) is a different row in >> the table. >> >> You can use lookups to map the deviceName onto the metrics to make them >> easier to select in Grafana via variables. >> >> Then when you want to lookup a specific property of the device you would >> query it like this: >> >> deviceEth1Status_info{deviceName="ENG 4021T"} >> >> I think what you're asking for is you want to consolidate all of the >> information data (IPs, MACs, SerialNum) onto a single info metric. >> Unfortunately this is not easy with the current SNMP exporter generator. >> What you want is to have a whole bunch of lookups that map all of the >> various properties. But these lookups are "global" within each module. So >> you will end up with a bunch of noise on all metrics in the table. There's >> no filter to say "Only apply this lookup onto this metric". >> >> Something like this: >> >> deviceName_info{deviceIndex="4201",deviceIP1="10.49.55.136",deviceIP2="",deviceMAC1="00:0f:58:07:9b:df",deviceMAC2="00:0f:58:07:9b:e0",deviceName="ENG >> 4021T",deviceSerialNum="2004A0241038"} >> >> This is technically possible in the exporter/snmp.yml config, but the >> generator doesn't have a syntax to make this. This is something we could >> support, but it would require some code changes to add a "only lookup for >> this metric" feature. >> >> One workaround would be to have separate modules. One to gather the state >> information and one to gather the info. >> >> I've published an example here: >> https://github.com/SuperQ/tools/tree/master/snmp_exporter/adder >> >> On Sun, Aug 6, 2023 at 1:33 AM 'Elliott Balsley' via Prometheus Users < >> [email protected]> wrote: >> >>> Yes I do think this sounds similar to network switch interfaces, where >>> each interface has a set of properties. >>> >>> I've attached the MIB file here in case that's helpful, and the >>> generator file I'm currently using. >>> There is a deviceIndex column but I'm not sure how it's supposed to >>> work. As an example, for one particular device with index 4201, the data >>> looks like this. Do I need to configure lookups, in order to merge all >>> these data points into a single "device"? >>> >>> deviceEth1Status_info{deviceEth1Status="online",deviceIndex="*4201*"} 1 >>> >>> deviceEth2Status_info{deviceEth2Status="unconfigured",deviceIndex=" >>> *4201*"} 1 >>> >>> deviceFirmware{deviceFirmware="5.5.0",deviceIndex="*4201*"} 1 >>> >>> deviceIP1{deviceIP1="10.49.55.136",deviceIndex="*4201*"} 1 >>> >>> deviceIP2{deviceIP2="",deviceIndex="*4201*"} 1 >>> >>> deviceIdentifier{deviceIdentifier="000f58fffe079bdd",deviceIndex="*4201*"} >>> 1 >>> >>> deviceIndex{deviceIndex="*4201*"} *4201* >>> >>> deviceLock_info{deviceIndex="*4201*",deviceLock="none"} 1 >>> >>> deviceMAC1{deviceIndex="*4201*",deviceMAC1="00:0f:58:07:9b:df"} 1 >>> >>> deviceMAC2{deviceIndex="*4201*",deviceMAC2="00:0f:58:07:9b:e0"} 1 >>> >>> deviceName{deviceIndex="*4201*",deviceName="ENG 4021T"} 1 >>> >>> deviceSerialNum{deviceIndex="*4201*",deviceSerialNum="2004A0241038"} 1 >>> >>> deviceStatus_info{deviceIndex="*4201*",deviceStatus="online"} 1 >>> >>> deviceType{deviceIndex="*4201*",deviceType="tx4"} 1 >>> >>> >>> >>> >>> On Sat, Aug 5, 2023 at 2:47 AM Brian Candler <[email protected]> >>> wrote: >>> >>>> > This table has 15 columns and 65 rows. >>>> >>>> That sound similar to ifTable/ifXTable in IF-MIB. >>>> >>>> > Each row represents a "sub-device" >>>> >>>> That sounds similar to "interfaces" on a network device. Is there some >>>> column which can be used to identify the sub-device, similar to >>>> ifName/ifDescr/ifAlias? >>>> >>>> > Ideally, I'd like to create some kind of time series graph for each >>>> metric/column, each of which has lines for each device/row. >>>> >>>> Like plotting graphs for ifHCInOctets, ifHCOutOctets, ifErrors etc. >>>> See if you can model on that. >>>> >>>> As for enums, there's some info here: >>>> >>>> https://github.com/prometheus/snmp_exporter/blob/v0.23.0-rc.1/generator/README.md#enumasinfo-and-enumasstateset >>>> >>>> You'd use EnumAsStateSet only if you want a single SNMP data point to >>>> be exploded into N different timeseries, one for each possible value. e.g. >>>> suppose you have a single enumerated value for the status of a UPS, it >>>> could expand to >>>> >>>> apcups_status{status="online"} 0 >>>> apcups_status{status="onbatt"} 1 >>>> apcups_status{status="trim"} 0 >>>> apcups_status{status="boost"} 0 >>>> apcups_status{status="overload"} 0 >>>> ...etc >>>> >>>> EnumAsInfo will apply a single label which changes (therefore, if it >>>> ever changes, the timeseries will change; only use this for labels which >>>> are essentially static). Alternatively, you could represent enums as a >>>> plain integer stored as a numeric metric, and then in Grafana you map each >>>> integer value to a different label and/or colour. >>>> >>>> On Saturday, 5 August 2023 at 08:13:01 UTC+1 Ben Kochie wrote: >>>> >>>>> What you need is to take the device MIB and use the SNMP exporter's >>>>> generator to translate the table into metrics. Unfortunately, Adder >>>>> Technology doesn't seem to have their MIB publicly available, so I can't >>>>> see what it specifies in the table. >>>>> >>>>> On Sat, Aug 5, 2023 at 3:42 AM 'Elliott Balsley' via Prometheus Users < >>>>> [email protected]> wrote: >>>>> >>>>>> I've just started using Grafana and Prometheus with SNMP Exporter. >>>>>> My Adder AIM server provides SNMP data in a table format, which is very >>>>>> hard to comprehend in Grafana. Is there some recommended way to handle >>>>>> this type of data? >>>>>> This table has 15 columns and 65 rows. Each row represents a >>>>>> "sub-device", or an Adder KVM endpoint. Attached is a screenshot from >>>>>> the >>>>>> open-source SnmpB app showing it nicely. >>>>>> >>>>>> The data comes into Prometheus looking like this (just a few lines >>>>>> example), with each metric on a separate line: >>>>>> # HELP deviceEth1Status Status of eth1 interface - >>>>>> 1.3.6.1.4.1.25119.1.1.1.30 (EnumAsStateSet) # TYPE deviceEth1Status gauge >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="101"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1101"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1201"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1301"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1401"} 0 >>>>>> deviceEth1Status{deviceEth1Status="absent",deviceIndex="1501"} 0 >>>>>> >>>>>> It also includes dozens of extra "rows" for devices which don't >>>>>> actually exist. >>>>>> Ideally, I'd like to create some kind of time series graph for each >>>>>> metric/column, each of which has lines for each device/row. >>>>>> >>>>>> -- >>>>>> 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/fc2aceb2-6b45-4c8f-9297-eee882bdf8acn%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/prometheus-users/fc2aceb2-6b45-4c8f-9297-eee882bdf8acn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> -- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "Prometheus Users" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/prometheus-users/J8P5NNe5ez4/unsubscribe >>>> . >>>> To unsubscribe from this group and all its topics, send an email to >>>> [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/prometheus-users/3f83a84d-2fb1-4320-afeb-5d6b088d750en%40googlegroups.com >>>> <https://groups.google.com/d/msgid/prometheus-users/3f83a84d-2fb1-4320-afeb-5d6b088d750en%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/CALajkdgjWcUQtUuUFRycmjA9J5KnR%2BaU_V5vqDwZyY-rehVyvA%40mail.gmail.com >>> <https://groups.google.com/d/msgid/prometheus-users/CALajkdgjWcUQtUuUFRycmjA9J5KnR%2BaU_V5vqDwZyY-rehVyvA%40mail.gmail.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/CABbyFmrKXRLdWD_4A3dDCYc4MzYNFvGR3RVKAd-%3D%2BG%3DDcehi4A%40mail.gmail.com.

