github.com/netdata/go.d.plugin@v0.58.1/modules/snmp/collect.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package snmp
     4  
     5  import (
     6  	"github.com/gosnmp/gosnmp"
     7  )
     8  
     9  func (s *SNMP) collect() (map[string]int64, error) {
    10  	collected := make(map[string]int64)
    11  
    12  	if err := s.collectOIDs(collected); err != nil {
    13  		return nil, err
    14  	}
    15  
    16  	return collected, nil
    17  }
    18  
    19  func (s *SNMP) collectOIDs(collected map[string]int64) error {
    20  	for i, end := 0, 0; i < len(s.oids); i += s.Options.MaxOIDs {
    21  		if end = i + s.Options.MaxOIDs; end > len(s.oids) {
    22  			end = len(s.oids)
    23  		}
    24  
    25  		oids := s.oids[i:end]
    26  		resp, err := s.snmpClient.Get(oids)
    27  		if err != nil {
    28  			s.Errorf("cannot get SNMP data: %v", err)
    29  			return err
    30  		}
    31  
    32  		for i, oid := range oids {
    33  			if i >= len(resp.Variables) {
    34  				continue
    35  			}
    36  
    37  			switch v := resp.Variables[i]; v.Type {
    38  			case gosnmp.Boolean,
    39  				gosnmp.Counter32,
    40  				gosnmp.Counter64,
    41  				gosnmp.Gauge32,
    42  				gosnmp.TimeTicks,
    43  				gosnmp.Uinteger32,
    44  				gosnmp.OpaqueFloat,
    45  				gosnmp.OpaqueDouble,
    46  				gosnmp.Integer:
    47  				collected[oid] = gosnmp.ToBigInt(v.Value).Int64()
    48  			default:
    49  				s.Debugf("skipping OID '%s' (unsupported type '%s')", oid, v.Type)
    50  			}
    51  		}
    52  	}
    53  
    54  	return nil
    55  }