go.d/snmp: add "organization" label (vnode) (#18529)
Ilya Mashchenko committed
Sep 11, 2024 at 21:56 UTC
f0f3d470805d1b2dbe9b298c8e7a6872393a422d
5 files changed
+47
-4
src/go/plugin/go.d/modules/snmp/charts.go
+2
@@ -162,6 +162,7 @@ func (s *SNMP) addNetIfaceCharts(iface *netInterface) {
162
for _, chart := range *charts {
163
chart.ID = fmt.Sprintf(chart.ID, cleanIfaceName(iface.ifName))
164
chart.Labels = []module.Label{
165
+ {Key: "organization", Value: s.sysInfo.organization},
166
{Key: "sysName", Value: s.sysInfo.name},
167
{Key: "ifDescr", Value: iface.ifDescr},
168
{Key: "ifName", Value: iface.ifName},
@@ -190,6 +191,7 @@ func (s *SNMP) removeNetIfaceCharts(iface *netInterface) {
191
func (s *SNMP) addSysUptimeChart() {
192
chart := uptimeChart.Copy()
193
chart.Labels = []module.Label{
194
+ {Key: "organization", Value: s.sysInfo.organization},
195
{Key: "sysName", Value: s.sysInfo.name},
196
}
197
if err := s.Charts().Add(chart); err != nil {
src/go/plugin/go.d/modules/snmp/collect.go
+7
@@ -77,6 +77,7 @@ func (s *SNMP) setupVnode(si *sysInfo) *vnodes.VirtualNode {
77
if si.location != "" {
78
labels["sysLocation"] = si.descr
79
}
80
+ labels["organization"] = si.organization
81
82
return &vnodes.VirtualNode{
83
GUID: s.Vnode.GUID,
@@ -96,6 +97,12 @@ func pduToString(pdu gosnmp.SnmpPDU) (string, error) {
97
return strings.ToValidUTF8(string(bs), "�"), nil
98
case gosnmp.Counter32, gosnmp.Counter64, gosnmp.Integer, gosnmp.Gauge32:
99
return gosnmp.ToBigInt(pdu.Value).String(), nil
100
+ case gosnmp.ObjectIdentifier:
101
+ v, ok := pdu.Value.(string)
102
+ if !ok {
103
+ return "", fmt.Errorf("ObjectIdentifier is not a string but %T", pdu.Value)
104
+ }
105
+ return strings.TrimPrefix(v, "."), nil
106
default:
107
return "", fmt.Errorf("unussported type: '%v'", pdu.Type)
108
}
src/go/plugin/go.d/modules/snmp/collect_sys_info.go
renamed
+18
-2
@@ -6,11 +6,14 @@ import (
6
"errors"
7
"fmt"
8
"strings"
9
+
10
+ "github.com/netdata/netdata/go/plugins/plugin/go.d/modules/snmp/entnum"
11
)
12
13
const (
14
rootOidMibSystem = "1.3.6.1.2.1.1"
15
oidSysDescr = "1.3.6.1.2.1.1.1.0"
16
+ oidSysObject = "1.3.6.1.2.1.1.2.0"
17
oidSysUptime = "1.3.6.1.2.1.1.3.0"
18
oidSysContact = "1.3.6.1.2.1.1.4.0"
19
oidSysName = "1.3.6.1.2.1.1.5.0"
@@ -22,6 +25,8 @@ type sysInfo struct {
25
contact string
26
name string
27
location string
28
+
29
+ organization string
30
}
31
32
func (s *SNMP) getSysInfo() (*sysInfo, error) {
@@ -30,7 +35,9 @@ func (s *SNMP) getSysInfo() (*sysInfo, error) {
35
return nil, err
36
}
37
33
- var si sysInfo
38
+ si := &sysInfo{
39
+ organization: "Unknown",
40
+ }
41
42
for _, pdu := range pdus {
43
oid := strings.TrimPrefix(pdu.Name, ".")
@@ -38,6 +45,15 @@ func (s *SNMP) getSysInfo() (*sysInfo, error) {
45
switch oid {
46
case oidSysDescr:
47
si.descr, err = pduToString(pdu)
48
+ case oidSysObject:
49
+ var sysObj string
50
+ if sysObj, err = pduToString(pdu); err == nil {
51
+ org := entnum.LookupBySysObject(sysObj)
52
+ s.Debugf("device sysObject '%s', organization '%s'", sysObj, org)
53
+ if org != "" {
54
+ si.organization = org
55
+ }
56
+ }
57
case oidSysContact:
58
si.contact, err = pduToString(pdu)
59
case oidSysName:
@@ -54,7 +70,7 @@ func (s *SNMP) getSysInfo() (*sysInfo, error) {
70
return nil, errors.New("no system name")
71
}
72
57
- return &si, nil
73
+ return si, nil
74
}
75
76
func (s *SNMP) collectSysUptime(mx map[string]int64) error {
src/go/plugin/go.d/modules/snmp/entnum/lookup.go
+19
-2
@@ -15,8 +15,8 @@ import (
15
//go:embed "enterprise-numbers.txt"
16
var enterpriseNumberTxt []byte
17
18
-func Lookup(number string) string {
19
- return numbers[number]
18
+func LookupBySysObject(sysObject string) string {
19
+ return numbers[extractEntNumber(sysObject)]
20
}
21
22
var numbers = func() map[string]string {
@@ -63,3 +63,20 @@ var numbers = func() map[string]string {
63
64
return mapping
65
}()
66
+
67
+func extractEntNumber(sysObject string) string {
68
+ const rootOidIanaPEN = "1.3.6.1.4.1"
69
+
70
+ // .1.3.6.1.4.1.14988.1 => 14988
71
+
72
+ sysObject = strings.TrimPrefix(sysObject, ".")
73
+
74
+ s := strings.TrimPrefix(sysObject, rootOidIanaPEN+".")
75
+
76
+ num, _, ok := strings.Cut(s, ".")
77
+ if !ok {
78
+ return ""
79
+ }
80
+
81
+ return num
82
+}
src/go/plugin/go.d/modules/snmp/snmp_test.go
+1
@@ -582,6 +582,7 @@ func setMockClientInitExpect(m *snmpmock.MockHandler) {
582
func setMockClientSysExpect(m *snmpmock.MockHandler) {
583
m.EXPECT().WalkAll(rootOidMibSystem).Return([]gosnmp.SnmpPDU{
584
{Name: oidSysDescr, Value: []uint8("mock sysDescr"), Type: gosnmp.OctetString},
585
+ {Name: oidSysObject, Value: ".1.3.6.1.4.1.14988.1", Type: gosnmp.ObjectIdentifier},
586
{Name: oidSysContact, Value: []uint8("mock sysContact"), Type: gosnmp.OctetString},
587
{Name: oidSysName, Value: []uint8("mock sysName"), Type: gosnmp.OctetString},
588
{Name: oidSysLocation, Value: []uint8("mock sysLocation"), Type: gosnmp.OctetString},