fix(inputs/snmp): Reconnect TCP agents if needed (#11163)
This commit is contained in:
parent
22efc25daa
commit
885444ab3e
|
|
@ -167,3 +167,11 @@ func (gs *GosnmpWrapper) SetAgent(agent string) error {
|
||||||
gs.Port = uint16(port)
|
gs.Port = uint16(port)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gs *GosnmpWrapper) Reconnect() error {
|
||||||
|
if gs.Conn == nil {
|
||||||
|
return gs.Connect()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -560,6 +560,7 @@ type snmpConnection interface {
|
||||||
//BulkWalkAll(string) ([]gosnmp.SnmpPDU, error)
|
//BulkWalkAll(string) ([]gosnmp.SnmpPDU, error)
|
||||||
Walk(string, gosnmp.WalkFunc) error
|
Walk(string, gosnmp.WalkFunc) error
|
||||||
Get(oids []string) (*gosnmp.SnmpPacket, error)
|
Get(oids []string) (*gosnmp.SnmpPacket, error)
|
||||||
|
Reconnect() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// getConnection creates a snmpConnection (*gosnmp.GoSNMP) object and caches the
|
// getConnection creates a snmpConnection (*gosnmp.GoSNMP) object and caches the
|
||||||
|
|
@ -568,6 +569,10 @@ type snmpConnection interface {
|
||||||
// more than one goroutine.
|
// more than one goroutine.
|
||||||
func (s *Snmp) getConnection(idx int) (snmpConnection, error) {
|
func (s *Snmp) getConnection(idx int) (snmpConnection, error) {
|
||||||
if gs := s.connectionCache[idx]; gs != nil {
|
if gs := s.connectionCache[idx]; gs != nil {
|
||||||
|
if err := gs.Reconnect(); err != nil {
|
||||||
|
return gs, fmt.Errorf("reconnecting: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return gs, nil
|
return gs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -585,13 +590,13 @@ func (s *Snmp) getConnection(idx int) (snmpConnection, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.connectionCache[idx] = gs
|
s.connectionCache[idx] = &gs
|
||||||
|
|
||||||
if err := gs.Connect(); err != nil {
|
if err := gs.Connect(); err != nil {
|
||||||
return nil, fmt.Errorf("setting up connection: %w", err)
|
return nil, fmt.Errorf("setting up connection: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return gs, nil
|
return &gs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// fieldConvert converts from any type according to the conv specification
|
// fieldConvert converts from any type according to the conv specification
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,9 @@ func (tsc *testSNMPConnection) Walk(oid string, wf gosnmp.WalkFunc) error {
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func (tsc *testSNMPConnection) Reconnect() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
var tsc = &testSNMPConnection{
|
var tsc = &testSNMPConnection{
|
||||||
host: "tsc",
|
host: "tsc",
|
||||||
|
|
@ -261,7 +264,7 @@ func TestGetSNMPConnection_v2(t *testing.T) {
|
||||||
|
|
||||||
gsc, err := s.getConnection(0)
|
gsc, err := s.getConnection(0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs := gsc.(snmp.GosnmpWrapper)
|
gs := gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, "1.2.3.4", gs.Target)
|
assert.Equal(t, "1.2.3.4", gs.Target)
|
||||||
assert.EqualValues(t, 567, gs.Port)
|
assert.EqualValues(t, 567, gs.Port)
|
||||||
assert.Equal(t, gosnmp.Version2c, gs.Version)
|
assert.Equal(t, gosnmp.Version2c, gs.Version)
|
||||||
|
|
@ -270,14 +273,14 @@ func TestGetSNMPConnection_v2(t *testing.T) {
|
||||||
|
|
||||||
gsc, err = s.getConnection(1)
|
gsc, err = s.getConnection(1)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs = gsc.(snmp.GosnmpWrapper)
|
gs = gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, "1.2.3.4", gs.Target)
|
assert.Equal(t, "1.2.3.4", gs.Target)
|
||||||
assert.EqualValues(t, 161, gs.Port)
|
assert.EqualValues(t, 161, gs.Port)
|
||||||
assert.Equal(t, "udp", gs.Transport)
|
assert.Equal(t, "udp", gs.Transport)
|
||||||
|
|
||||||
gsc, err = s.getConnection(2)
|
gsc, err = s.getConnection(2)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs = gsc.(snmp.GosnmpWrapper)
|
gs = gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, "127.0.0.1", gs.Target)
|
assert.Equal(t, "127.0.0.1", gs.Target)
|
||||||
assert.EqualValues(t, 161, gs.Port)
|
assert.EqualValues(t, 161, gs.Port)
|
||||||
assert.Equal(t, "udp", gs.Transport)
|
assert.Equal(t, "udp", gs.Transport)
|
||||||
|
|
@ -301,7 +304,7 @@ func TestGetSNMPConnectionTCP(t *testing.T) {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
gsc, err := s.getConnection(0)
|
gsc, err := s.getConnection(0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs := gsc.(snmp.GosnmpWrapper)
|
gs := gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, "127.0.0.1", gs.Target)
|
assert.Equal(t, "127.0.0.1", gs.Target)
|
||||||
assert.EqualValues(t, 56789, gs.Port)
|
assert.EqualValues(t, 56789, gs.Port)
|
||||||
assert.Equal(t, "tcp", gs.Transport)
|
assert.Equal(t, "tcp", gs.Transport)
|
||||||
|
|
@ -348,7 +351,7 @@ func TestGetSNMPConnection_v3(t *testing.T) {
|
||||||
|
|
||||||
gsc, err := s.getConnection(0)
|
gsc, err := s.getConnection(0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs := gsc.(snmp.GosnmpWrapper)
|
gs := gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, gs.Version, gosnmp.Version3)
|
assert.Equal(t, gs.Version, gosnmp.Version3)
|
||||||
sp := gs.SecurityParameters.(*gosnmp.UsmSecurityParameters)
|
sp := gs.SecurityParameters.(*gosnmp.UsmSecurityParameters)
|
||||||
assert.Equal(t, "1.2.3.4", gsc.Host())
|
assert.Equal(t, "1.2.3.4", gsc.Host())
|
||||||
|
|
@ -469,7 +472,7 @@ func TestGetSNMPConnection_v3_blumenthal(t *testing.T) {
|
||||||
|
|
||||||
gsc, err := s.getConnection(0)
|
gsc, err := s.getConnection(0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
gs := gsc.(snmp.GosnmpWrapper)
|
gs := gsc.(*snmp.GosnmpWrapper)
|
||||||
assert.Equal(t, gs.Version, gosnmp.Version3)
|
assert.Equal(t, gs.Version, gosnmp.Version3)
|
||||||
sp := gs.SecurityParameters.(*gosnmp.UsmSecurityParameters)
|
sp := gs.SecurityParameters.(*gosnmp.UsmSecurityParameters)
|
||||||
assert.Equal(t, "1.2.3.4", gsc.Host())
|
assert.Equal(t, "1.2.3.4", gsc.Host())
|
||||||
|
|
|
||||||
|
|
@ -258,11 +258,11 @@ func (d *IfName) getMapRemoteNoMock(agent string) (nameMap, error) {
|
||||||
//try ifXtable and ifName first. if that fails, fall back to
|
//try ifXtable and ifName first. if that fails, fall back to
|
||||||
//ifTable and ifDescr
|
//ifTable and ifDescr
|
||||||
var m nameMap
|
var m nameMap
|
||||||
if m, err = d.buildMap(gs, d.ifXTable); err == nil {
|
if m, err = d.buildMap(&gs, d.ifXTable); err == nil {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, err = d.buildMap(gs, d.ifTable); err == nil {
|
if m, err = d.buildMap(&gs, d.ifTable); err == nil {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -308,7 +308,7 @@ func (d *IfName) makeTableNoMock(oid string) (*si.Table, error) {
|
||||||
return &tab, nil
|
return &tab, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *IfName) buildMap(gs snmp.GosnmpWrapper, tab *si.Table) (nameMap, error) {
|
func (d *IfName) buildMap(gs *snmp.GosnmpWrapper, tab *si.Table) (nameMap, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
rtab, err := tab.Build(gs, true, d.translator)
|
rtab, err := tab.Build(gs, true, d.translator)
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ func TestTable(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Could use ifIndex but oid index is always the same
|
// Could use ifIndex but oid index is always the same
|
||||||
m, err := d.buildMap(gs, tab)
|
m, err := d.buildMap(&gs, tab)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotEmpty(t, m)
|
require.NotEmpty(t, m)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue