@cryptotaxi247 / netdata-1 / commits / 9352039dc

improve(go.d/snmp): add MikroTik type and model detection (#20883)

Ilya Mashchenko committed Aug 24, 2025 at 15:55 UTC 9352039dc3bc6d0e1d43c31a04dd9b960559b5e0
3 files changed +66 -13
src/go/plugin/go.d/collector/snmp/ddsnmp/ddsnmpcollector/collector_device_meta.go
+8 -5
@@ -138,7 +138,7 @@ func (dc *deviceMetadataCollector) processDynamicFields(fields map[string]ddprof
138 switch {
139 case field.Symbol.OID != "":
140 // Single symbol
141 - v, err := dc.processSymbolValue(field.Symbol, pdus)
141 + v, err := dc.processSymbolValue(field.Symbol, pdus, true)
142 if err != nil {
143 errs = append(errs, fmt.Errorf("failed to process metadata field '%s': %w", name, err))
144 continue
@@ -148,8 +148,8 @@ func (dc *deviceMetadataCollector) processDynamicFields(fields map[string]ddprof
148 }
149 case len(field.Symbols) > 0:
150 // Multiple symbols - try each until one succeeds
151 - for _, sym := range field.Symbols {
152 - v, err := dc.processSymbolValue(sym, pdus)
151 + for i, sym := range field.Symbols {
152 + v, err := dc.processSymbolValue(sym, pdus, i == len(field.Symbols)-1)
153 if err != nil {
154 errs = append(errs, fmt.Errorf("failed to process metadata field '%s' symbol '%s': %w",
155 name, sym.Name, err))
@@ -170,7 +170,7 @@ func (dc *deviceMetadataCollector) processDynamicFields(fields map[string]ddprof
170 return nil
171 }
172
173 -func (dc *deviceMetadataCollector) processSymbolValue(cfg ddprofiledefinition.SymbolConfig, pdus map[string]gosnmp.SnmpPDU) (string, error) {
173 +func (dc *deviceMetadataCollector) processSymbolValue(cfg ddprofiledefinition.SymbolConfig, pdus map[string]gosnmp.SnmpPDU, lastSymbol bool) (string, error) {
174 pdu, ok := pdus[trimOID(cfg.OID)]
175 if !ok {
176 return "", nil
@@ -182,7 +182,10 @@ func (dc *deviceMetadataCollector) processSymbolValue(cfg ddprofiledefinition.Sy
182 }
183
184 if cfg.ExtractValueCompiled != nil {
185 - if sm := cfg.ExtractValueCompiled.FindStringSubmatch(val); len(sm) > 1 {
185 + sm := cfg.ExtractValueCompiled.FindStringSubmatch(val)
186 + if len(sm) == 0 && !lastSymbol {
187 + return "", nil
188 + } else if len(sm) > 1 {
189 val = sm[1]
190 }
191 // Note: If extract_value doesn't match, we still use the original value
src/go/plugin/go.d/config/go.d/snmp.profiles/default/mikrotik-router.yaml
+58 -2
@@ -3,7 +3,8 @@ extends:
3 - _std-if-mib.yaml
4
5 sysobjectid:
6 - - 1.3.6.1.4.1.14988.1.*
6 + - 1.3.6.1.4.1.14988.1.* # Router OS
7 + - 1.3.6.1.4.1.14988.2.* # SwOS
8
9 metadata:
10 device:
@@ -11,7 +12,62 @@ metadata:
12 vendor:
13 value: "MikroTik"
14 type:
14 - value: "Router"
15 + symbols:
16 + - OID: 1.3.6.1.2.1.1.1.0
17 + name: sysDescr
18 + # RouterOS devices
19 + match_pattern: 'RouterOS (CCR.*)'
20 + match_value: 'Router'
21 + - OID: 1.3.6.1.2.1.1.1.0
22 + name: sysDescr
23 + match_pattern: 'RouterOS (CRS.*)'
24 + match_value: 'Layer 3 Switch'
25 + - OID: 1.3.6.1.2.1.1.1.0
26 + name: sysDescr
27 + match_pattern: 'RouterOS (hAP.*)'
28 + match_value: 'Wireless'
29 + - OID: 1.3.6.1.2.1.1.1.0
30 + name: sysDescr
31 + match_pattern: 'RouterOS ([wc]AP.*)'
32 + match_value: 'Access Point'
33 + - OID: 1.3.6.1.2.1.1.1.0
34 + name: sysDescr
35 + match_pattern: 'RouterOS (mAP.*)'
36 + match_value: 'Access Point'
37 + - OID: 1.3.6.1.2.1.1.1.0
38 + name: sysDescr
39 + match_pattern: 'RouterOS (SXT.*|LHG.*|LDF.*|Disc.*|DynaDish.*|NetBox.*|NetMetal.*|Groove.*|OmniTIK.*|BaseBox.*|Metal.*|SXTsq.*|QRT.*|Audience.*|Cube.*|Wireless Wire.*)'
40 + match_value: 'Wireless'
41 + - OID: 1.3.6.1.2.1.1.1.0
42 + name: sysDescr
43 + match_pattern: 'RouterOS CHR'
44 + match_value: 'Router'
45 + - OID: 1.3.6.1.2.1.1.1.0
46 + name: sysDescr
47 + match_pattern: 'RouterOS x86'
48 + match_value: 'Router'
49 + - OID: 1.3.6.1.2.1.1.1.0
50 + name: sysDescr
51 + match_pattern: 'RouterOS (RB.*)'
52 + match_value: 'Router'
53 + # SwOS devices - all are switches
54 + - OID: 1.3.6.1.2.1.1.1.0
55 + name: sysDescr
56 + match_pattern: '(.*) SwOS.*'
57 + match_value: 'Switch'
58 + model:
59 + symbols:
60 + # RouterOS model extraction
61 + - OID: 1.3.6.1.2.1.1.1.0
62 + name: sysDescr
63 + extract_value: 'RouterOS ([A-Za-z0-9-+]+)'
64 + # SwOS model extraction
65 + - OID: 1.3.6.1.2.1.1.1.0
66 + name: sysDescr
67 + extract_value: '([A-Za-z0-9-+]+) SwOS'
68 + # MikroTik generic format
69 + - OID: 1.3.6.1.2.1.1.1.0
70 + name: sysDescr
71
72 metric_tags:
73 - OID: 1.3.6.1.4.1.14988.1.1.4.1.0
src/go/plugin/go.d/config/go.d/snmp.profiles/metadata/other.yaml
-6
@@ -6726,12 +6726,6 @@ sysobjectids:
6726 1.3.6.1.4.1.14941.3.1.20843122:
6727 category: Storage
6728 model: EX84-SEC
6729 - 1.3.6.1.4.1.14988.1:
6730 - category: Router
6731 - model: RB1200
6732 - 1.3.6.1.4.1.14988.1.1.1:
6733 - category: Wireless
6734 - model: Mikrotik wireless AP
6729 1.3.6.1.4.1.15004.2.1:
6730 category: Switch
6731 model: RUGGEDCOM RSG2100