Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add snmp_trap input plugin #6629

Merged
merged 27 commits into from
Nov 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
bdda6a1
Add snmp trap receiving using gosnmp library
reimda Oct 30, 2019
de1d648
Improve translation of traps to metrics.
reimda Nov 6, 2019
0f16d1b
gofmt
reimda Nov 6, 2019
0f95669
add space after //
reimda Nov 11, 2019
0faad80
log error instead of panic
reimda Nov 11, 2019
b058179
change port setting to service_address to allow user to specify which…
reimda Nov 11, 2019
9b8e72d
add trap_oid, trap_mib, source tags
reimda Nov 12, 2019
c7f22e3
don't return from Start() until gosnmp TrapListener is ready
reimda Nov 12, 2019
d7fa50d
clean up comments
reimda Nov 12, 2019
35cc6c3
update readme example output
reimda Nov 12, 2019
38a1ffd
preload oid cache in unit test so snmptranslate doesn't need to be in…
reimda Nov 12, 2019
4353fb3
gofmt
reimda Nov 12, 2019
1e87815
merge from master
reimda Nov 13, 2019
789c7b1
make handler function type to simplify definition of makeWrapperHandler
reimda Nov 14, 2019
1dd9157
make Log unsettable from toml
reimda Nov 14, 2019
a718872
make handler function type to simplify definition of makeWrapperHandler
reimda Nov 14, 2019
5ba2f55
require udp:// on service address. Log when listening
reimda Nov 15, 2019
dadcaa0
remove trap_ prefix from tags. Don't add field for snmp type.
reimda Nov 15, 2019
cfdeaad
If trap listening returns an error, return it from Start
reimda Nov 18, 2019
3f12b32
update example output
reimda Nov 18, 2019
eff6493
log an error and skip the trap if we can't resolve an oid name
reimda Nov 20, 2019
3760a78
don't use snmp plugin's oid lookup because it doesn't return errors w…
reimda Nov 21, 2019
8fe0fe3
update sample config
reimda Nov 21, 2019
b8a25b5
update readme's trap and field names and descriptions
reimda Nov 22, 2019
e951627
add timeout for running snmptranslate, remove stray comment
reimda Nov 25, 2019
b3b3132
log if there's an error in Stop()
reimda Nov 25, 2019
8cec5a0
more cleanup
reimda Nov 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions plugins/inputs/all/all.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ import (
_ "github.com/influxdata/telegraf/plugins/inputs/smart"
_ "github.com/influxdata/telegraf/plugins/inputs/snmp"
_ "github.com/influxdata/telegraf/plugins/inputs/snmp_legacy"
_ "github.com/influxdata/telegraf/plugins/inputs/snmp_trap"
_ "github.com/influxdata/telegraf/plugins/inputs/socket_listener"
_ "github.com/influxdata/telegraf/plugins/inputs/solr"
_ "github.com/influxdata/telegraf/plugins/inputs/sqlserver"
Expand Down
28 changes: 25 additions & 3 deletions plugins/inputs/snmp/snmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ func (f *Field) init() error {
return nil
}

_, oidNum, oidText, conversion, err := snmpTranslate(f.Oid)
_, oidNum, oidText, conversion, err := SnmpTranslate(f.Oid)
if err != nil {
return Errorf(err, "translating")
}
Expand Down Expand Up @@ -882,7 +882,7 @@ func snmpTable(oid string) (mibName string, oidNum string, oidText string, field
}

func snmpTableCall(oid string) (mibName string, oidNum string, oidText string, fields []Field, err error) {
mibName, oidNum, oidText, _, err = snmpTranslate(oid)
mibName, oidNum, oidText, _, err = SnmpTranslate(oid)
if err != nil {
return "", "", "", nil, Errorf(err, "translating")
}
Expand Down Expand Up @@ -952,7 +952,7 @@ var snmpTranslateCachesLock sync.Mutex
var snmpTranslateCaches map[string]snmpTranslateCache

// snmpTranslate resolves the given OID.
func snmpTranslate(oid string) (mibName string, oidNum string, oidText string, conversion string, err error) {
func SnmpTranslate(oid string) (mibName string, oidNum string, oidText string, conversion string, err error) {
danielnelson marked this conversation as resolved.
Show resolved Hide resolved
snmpTranslateCachesLock.Lock()
if snmpTranslateCaches == nil {
snmpTranslateCaches = map[string]snmpTranslateCache{}
Expand All @@ -978,6 +978,28 @@ func snmpTranslate(oid string) (mibName string, oidNum string, oidText string, c
return stc.mibName, stc.oidNum, stc.oidText, stc.conversion, stc.err
}

func SnmpTranslateForce(oid string, mibName string, oidNum string, oidText string, conversion string) {
snmpTranslateCachesLock.Lock()
defer snmpTranslateCachesLock.Unlock()
if snmpTranslateCaches == nil {
snmpTranslateCaches = map[string]snmpTranslateCache{}
}

var stc snmpTranslateCache
stc.mibName = mibName
stc.oidNum = oidNum
stc.oidText = oidText
stc.conversion = conversion
stc.err = nil
snmpTranslateCaches[oid] = stc
}

func SnmpTranslateClear() {
snmpTranslateCachesLock.Lock()
defer snmpTranslateCachesLock.Unlock()
snmpTranslateCaches = map[string]snmpTranslateCache{}
}

func snmpTranslateCall(oid string) (mibName string, oidNum string, oidText string, conversion string, err error) {
var out []byte
if strings.ContainsAny(oid, ":abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") {
Expand Down
4 changes: 2 additions & 2 deletions plugins/inputs/snmp/snmp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -742,7 +742,7 @@ func TestFieldConvert(t *testing.T) {
func TestSnmpTranslateCache_miss(t *testing.T) {
snmpTranslateCaches = nil
oid := "IF-MIB::ifPhysAddress.1"
mibName, oidNum, oidText, conversion, err := snmpTranslate(oid)
mibName, oidNum, oidText, conversion, err := SnmpTranslate(oid)
assert.Len(t, snmpTranslateCaches, 1)
stc := snmpTranslateCaches[oid]
require.NotNil(t, stc)
Expand All @@ -763,7 +763,7 @@ func TestSnmpTranslateCache_hit(t *testing.T) {
err: fmt.Errorf("e"),
},
}
mibName, oidNum, oidText, conversion, err := snmpTranslate("foo")
mibName, oidNum, oidText, conversion, err := SnmpTranslate("foo")
assert.Equal(t, "a", mibName)
assert.Equal(t, "b", oidNum)
assert.Equal(t, "c", oidText)
Expand Down
43 changes: 43 additions & 0 deletions plugins/inputs/snmp_trap/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# SNMP Trap Input Plugin

The SNMP Trap plugin is a service input plugin that receives SNMP
notifications (traps and inform requests).

Notifications are received on plain UDP. The port to listen is
configurable.

OIDs can be resolved to strings using system MIB files. This is done
in same way as the SNMP input plugin. See the section "MIB Lookups" in
the SNMP [README.md](../snmp/README.md) for details.

### Configuration
```toml
# Snmp trap listener
[[inputs.snmp_trap]]
## Transport, local address, and port to listen on. Transport must
## be "udp://". Omit local address to listen on all interfaces.
## example: "udp://127.0.0.1:1234"
# service_address = udp://:162
## Timeout running snmptranslate command
# timeout = "5s"
```

### Metrics

- snmp_trap
- tags:
- source (string, IP address of trap source)
- name (string, value from SNMPv2-MIB::snmpTrapOID.0 PDU)
- mib (string, MIB from SNMPv2-MIB::snmpTrapOID.0 PDU)
- oid (string, OID string from SNMPv2-MIB::snmpTrapOID.0 PDU)
- version (string, "1" or "2c" or "3")
- fields:
- Fields are mapped from variables in the trap. Field names are
the trap variable names after MIB lookup. Field values are trap
variable values.

### Example Output
```
snmp_trap,mib=SNMPv2-MIB,name=coldStart,oid=.1.3.6.1.6.3.1.1.5.1,source=192.168.122.102,version=2c snmpTrapEnterprise.0="linux",sysUpTimeInstance=1i 1574109187723429814
snmp_trap,mib=NET-SNMP-AGENT-MIB,name=nsNotifyShutdown,oid=.1.3.6.1.4.1.8072.4.0.2,source=192.168.122.102,version=2c sysUpTimeInstance=5803i,snmpTrapEnterprise.0="netSnmpNotificationPrefix" 1574109186555115459
```
Loading