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