@cryptotaxi247 / netdata-1 / commits / f0f3d4708

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},