New snmp plugin and snmp_legacy rename
closes #1371 closes #808 closes #1361 closes #1151 closes #997 closes #1163 closes #856 closes #1043 closes #961 closes #1389
This commit is contained in:
@@ -1,549 +1,130 @@
|
||||
# SNMP Input Plugin
|
||||
# SNMP Plugin
|
||||
|
||||
The SNMP input plugin gathers metrics from SNMP agents
|
||||
The SNMP input plugin gathers metrics from SNMP agents.
|
||||
It is an alternative to the SNMP plugin with significantly different configuration & behavior.
|
||||
|
||||
### Configuration:
|
||||
## Configuration:
|
||||
|
||||
### Example:
|
||||
|
||||
#### Very simple example
|
||||
|
||||
In this example, the plugin will gather value of OIDS:
|
||||
|
||||
- `.1.3.6.1.2.1.2.2.1.4.1`
|
||||
|
||||
```toml
|
||||
# Very Simple Example
|
||||
[[inputs.snmp]]
|
||||
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Simple list of OIDs to get, in addition to "collect"
|
||||
get_oids = [".1.3.6.1.2.1.2.2.1.4.1"]
|
||||
SNMP data:
|
||||
```
|
||||
.1.2.3.0.0.1.0 octet_str "foo"
|
||||
.1.2.3.0.0.1.1 octet_str "bar"
|
||||
.1.2.3.0.0.102 octet_str "bad"
|
||||
.1.2.3.0.0.2.0 integer 1
|
||||
.1.2.3.0.0.2.1 integer 2
|
||||
.1.2.3.0.0.3.0 octet_str "0.123"
|
||||
.1.2.3.0.0.3.1 octet_str "0.456"
|
||||
.1.2.3.0.0.3.2 octet_str "9.999"
|
||||
.1.2.3.0.1 octet_str "baz"
|
||||
.1.2.3.0.2 uinteger 54321
|
||||
.1.2.3.0.3 uinteger 234
|
||||
```
|
||||
|
||||
|
||||
#### Simple example
|
||||
|
||||
In this example, Telegraf gathers value of OIDS:
|
||||
|
||||
- named **ifnumber**
|
||||
- named **interface_speed**
|
||||
|
||||
With **inputs.snmp.get** section the plugin gets the oid number:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed*
|
||||
|
||||
As you can see *ifSpeed* is not a valid OID. In order to get
|
||||
the valid OID, the plugin uses `snmptranslate_file` to match the OID:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed* => `.1.3.6.1.2.1.2.2.1.5`
|
||||
|
||||
Also as the plugin will append `instance` to the corresponding OID:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed* => `.1.3.6.1.2.1.2.2.1.5.1`
|
||||
|
||||
In this example, the plugin will gather value of OIDS:
|
||||
|
||||
- `.1.3.6.1.2.1.2.1.0`
|
||||
- `.1.3.6.1.2.1.2.2.1.5.1`
|
||||
|
||||
|
||||
Telegraf config:
|
||||
```toml
|
||||
# Simple example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which get/bulk do you want to collect for this host
|
||||
collect = ["ifnumber", "interface_speed"]
|
||||
agents = [ "127.0.0.1:161" ]
|
||||
version = 2
|
||||
community = "public"
|
||||
|
||||
[[inputs.snmp.get]]
|
||||
name = "ifnumber"
|
||||
oid = ".1.3.6.1.2.1.2.1.0"
|
||||
name = "system"
|
||||
[[inputs.snmp.field]]
|
||||
name = "hostname"
|
||||
oid = ".1.2.3.0.1"
|
||||
is_tag = true
|
||||
[[inputs.snmp.field]]
|
||||
name = "uptime"
|
||||
oid = ".1.2.3.0.2"
|
||||
[[inputs.snmp.field]]
|
||||
name = "loadavg"
|
||||
oid = ".1.2.3.0.3"
|
||||
conversion = "float(2)"
|
||||
|
||||
[[inputs.snmp.get]]
|
||||
name = "interface_speed"
|
||||
oid = "ifSpeed"
|
||||
instance = "1"
|
||||
|
||||
```
|
||||
|
||||
|
||||
#### Simple bulk example
|
||||
|
||||
In this example, Telegraf gathers value of OIDS:
|
||||
|
||||
- named **ifnumber**
|
||||
- named **interface_speed**
|
||||
- named **if_out_octets**
|
||||
|
||||
With **inputs.snmp.get** section the plugin gets oid number:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed*
|
||||
|
||||
With **inputs.snmp.bulk** section the plugin gets the oid number:
|
||||
|
||||
- **if_out_octets** => *ifOutOctets*
|
||||
|
||||
As you can see *ifSpeed* and *ifOutOctets* are not a valid OID.
|
||||
In order to get the valid OID, the plugin uses `snmptranslate_file`
|
||||
to match the OID:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed* => `.1.3.6.1.2.1.2.2.1.5`
|
||||
- **if_out_octets** => *ifOutOctets* => `.1.3.6.1.2.1.2.2.1.16`
|
||||
|
||||
Also, the plugin will append `instance` to the corresponding OID:
|
||||
|
||||
- **ifnumber** => `.1.3.6.1.2.1.2.1.0`
|
||||
- **interface_speed** => *ifSpeed* => `.1.3.6.1.2.1.2.2.1.5.1`
|
||||
|
||||
And **if_out_octets** is a bulk request, the plugin will gathers all
|
||||
OIDS in the table.
|
||||
|
||||
- `.1.3.6.1.2.1.2.2.1.16.1`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.2`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.3`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.4`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.5`
|
||||
- `...`
|
||||
|
||||
In this example, the plugin will gather value of OIDS:
|
||||
|
||||
- `.1.3.6.1.2.1.2.1.0`
|
||||
- `.1.3.6.1.2.1.2.2.1.5.1`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.1`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.2`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.3`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.4`
|
||||
- `.1.3.6.1.2.1.2.2.1.16.5`
|
||||
- `...`
|
||||
|
||||
|
||||
```toml
|
||||
# Simple bulk example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which get/bulk do you want to collect for this host
|
||||
collect = ["interface_speed", "if_number", "if_out_octets"]
|
||||
|
||||
[[inputs.snmp.get]]
|
||||
name = "interface_speed"
|
||||
oid = "ifSpeed"
|
||||
instance = "1"
|
||||
|
||||
[[inputs.snmp.get]]
|
||||
name = "if_number"
|
||||
oid = "ifNumber"
|
||||
|
||||
[[inputs.snmp.bulk]]
|
||||
name = "if_out_octets"
|
||||
oid = "ifOutOctets"
|
||||
```
|
||||
|
||||
|
||||
#### Table example
|
||||
|
||||
In this example, we remove collect attribute to the host section,
|
||||
but you can still use it in combination of the following part.
|
||||
|
||||
Note: This example is like a bulk request a but using an
|
||||
other configuration
|
||||
|
||||
Telegraf gathers value of OIDS of the table:
|
||||
|
||||
- named **iftable1**
|
||||
|
||||
With **inputs.snmp.table** section the plugin gets oid number:
|
||||
|
||||
- **iftable1** => `.1.3.6.1.2.1.31.1.1.1`
|
||||
|
||||
Also **iftable1** is a table, the plugin will gathers all
|
||||
OIDS in the table and in the subtables
|
||||
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6....`
|
||||
- `...`
|
||||
|
||||
```toml
|
||||
# Table example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which get/bulk do you want to collect for this host
|
||||
# Which table do you want to collect
|
||||
[[inputs.snmp.host.table]]
|
||||
name = "iftable1"
|
||||
|
||||
# table without mapping neither subtables
|
||||
# This is like bulk request
|
||||
[[inputs.snmp.table]]
|
||||
name = "iftable1"
|
||||
oid = ".1.3.6.1.2.1.31.1.1.1"
|
||||
name = "remote_servers"
|
||||
inherit_tags = [ "hostname" ]
|
||||
[[inputs.snmp.table.field]]
|
||||
name = "server"
|
||||
oid = ".1.2.3.0.0.1"
|
||||
is_tag = true
|
||||
[[inputs.snmp.table.field]]
|
||||
name = "connections"
|
||||
oid = ".1.2.3.0.0.2"
|
||||
[[inputs.snmp.table.field]]
|
||||
name = "latency"
|
||||
oid = ".1.2.3.0.0.3"
|
||||
conversion = "float"
|
||||
```
|
||||
|
||||
|
||||
#### Table with subtable example
|
||||
|
||||
In this example, we remove collect attribute to the host section,
|
||||
but you can still use it in combination of the following part.
|
||||
|
||||
Note: This example is like a bulk request a but using an
|
||||
other configuration
|
||||
|
||||
Telegraf gathers value of OIDS of the table:
|
||||
|
||||
- named **iftable2**
|
||||
|
||||
With **inputs.snmp.table** section *AND* **sub_tables** attribute,
|
||||
the plugin will get OIDS from subtables:
|
||||
|
||||
- **iftable2** => `.1.3.6.1.2.1.2.2.1.13`
|
||||
|
||||
Also **iftable2** is a table, the plugin will gathers all
|
||||
OIDS in subtables:
|
||||
|
||||
- `.1.3.6.1.2.1.2.2.1.13.1`
|
||||
- `.1.3.6.1.2.1.2.2.1.13.2`
|
||||
- `.1.3.6.1.2.1.2.2.1.13.3`
|
||||
- `.1.3.6.1.2.1.2.2.1.13.4`
|
||||
- `.1.3.6.1.2.1.2.2.1.13....`
|
||||
|
||||
|
||||
```toml
|
||||
# Table with subtable example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which table do you want to collect
|
||||
[[inputs.snmp.host.table]]
|
||||
name = "iftable2"
|
||||
|
||||
# table without mapping but with subtables
|
||||
[[inputs.snmp.table]]
|
||||
name = "iftable2"
|
||||
sub_tables = [".1.3.6.1.2.1.2.2.1.13"]
|
||||
# note
|
||||
# oid attribute is useless
|
||||
Resulting output:
|
||||
```
|
||||
* Plugin: snmp, Collection 1
|
||||
> system,agent_host=127.0.0.1,host=mylocalhost,hostname=baz loadavg=2.34,uptime=54321i 1468953135000000000
|
||||
> remote_servers,agent_host=127.0.0.1,host=mylocalhost,hostname=baz,server=foo connections=1i,latency=0.123 1468953135000000000
|
||||
> remote_servers,agent_host=127.0.0.1,host=mylocalhost,hostname=baz,server=bar connections=2i,latency=0.456 1468953135000000000
|
||||
```
|
||||
|
||||
### Config parameters
|
||||
|
||||
#### Table with mapping example
|
||||
* `agents`: Default: `[]`
|
||||
List of SNMP agents to connect to in the form of `IP[:PORT]`. If `:PORT` is unspecified, it defaults to `161`.
|
||||
|
||||
In this example, we remove collect attribute to the host section,
|
||||
but you can still use it in combination of the following part.
|
||||
* `version`: Default: `2`
|
||||
SNMP protocol version to use.
|
||||
|
||||
Telegraf gathers value of OIDS of the table:
|
||||
* `community`: Default: `"public"`
|
||||
SNMP community to use.
|
||||
|
||||
- named **iftable3**
|
||||
* `max_repetitions`: Default: `50`
|
||||
Maximum number of iterations for repeating variables.
|
||||
|
||||
With **inputs.snmp.table** section the plugin gets oid number:
|
||||
* `sec_name`:
|
||||
Security name for authenticated SNMPv3 requests.
|
||||
|
||||
- **iftable3** => `.1.3.6.1.2.1.31.1.1.1`
|
||||
* `auth_protocol`: Values: `"MD5"`,`"SHA"`,`""`. Default: `""`
|
||||
Authentication protocol for authenticated SNMPv3 requests.
|
||||
|
||||
Also **iftable2** is a table, the plugin will gathers all
|
||||
OIDS in the table and in the subtables
|
||||
* `auth_password`:
|
||||
Authentication password for authenticated SNMPv3 requests.
|
||||
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6....`
|
||||
- `...`
|
||||
* `sec_level`: Values: `"noAuthNoPriv"`,`"authNoPriv"`,`"authPriv"`. Default: `"noAuthNoPriv"`
|
||||
Security level used for SNMPv3 messages.
|
||||
|
||||
But the **include_instances** attribute will filter which OIDS
|
||||
will be gathered; As you see, there is an other attribute, `mapping_table`.
|
||||
`include_instances` and `mapping_table` permit to build a hash table
|
||||
to filter only OIDS you want.
|
||||
Let's say, we have the following data on SNMP server:
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.1` has as value: `enp5s0`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.2` has as value: `enp5s1`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.3` has as value: `enp5s2`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.4` has as value: `eth0`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.5` has as value: `eth1`
|
||||
* `context_name`:
|
||||
Context name used for SNMPv3 requests.
|
||||
|
||||
The plugin will build the following hash table:
|
||||
* `priv_protocol`: Values: `"DES"`,`"AES"`,`""`. Default: `""`
|
||||
Privacy protocol used for encrypted SNMPv3 messages.
|
||||
|
||||
| instance name | instance id |
|
||||
|---------------|-------------|
|
||||
| `enp5s0` | `1` |
|
||||
| `enp5s1` | `2` |
|
||||
| `enp5s2` | `3` |
|
||||
| `eth0` | `4` |
|
||||
| `eth1` | `5` |
|
||||
|
||||
With the **include_instances** attribute, the plugin will gather
|
||||
the following OIDS:
|
||||
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.1.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.2.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.3.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.4.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.5.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.5`
|
||||
- `...`
|
||||
|
||||
Note: the plugin will add instance name as tag *instance*
|
||||
|
||||
```toml
|
||||
# Simple table with mapping example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which table do you want to collect
|
||||
[[inputs.snmp.host.table]]
|
||||
name = "iftable3"
|
||||
include_instances = ["enp5s0", "eth1"]
|
||||
|
||||
# table with mapping but without subtables
|
||||
[[inputs.snmp.table]]
|
||||
name = "iftable3"
|
||||
oid = ".1.3.6.1.2.1.31.1.1.1"
|
||||
# if empty. get all instances
|
||||
mapping_table = ".1.3.6.1.2.1.31.1.1.1.1"
|
||||
# if empty, get all subtables
|
||||
```
|
||||
* `priv_password`:
|
||||
Privacy password used for encrypted SNMPv3 messages.
|
||||
|
||||
|
||||
#### Table with both mapping and subtable example
|
||||
* `name`:
|
||||
Output measurement name.
|
||||
|
||||
In this example, we remove collect attribute to the host section,
|
||||
but you can still use it in combination of the following part.
|
||||
#### Field parameters:
|
||||
* `name`:
|
||||
Output field/tag name.
|
||||
|
||||
Telegraf gathers value of OIDS of the table:
|
||||
* `oid`:
|
||||
OID to get. Must be in dotted notation, not textual.
|
||||
|
||||
- named **iftable4**
|
||||
* `is_tag`:
|
||||
Output this field as a tag.
|
||||
|
||||
With **inputs.snmp.table** section *AND* **sub_tables** attribute,
|
||||
the plugin will get OIDS from subtables:
|
||||
* `conversion`: Values: `"float(X)"`,`"float"`,`"int"`,`""`. Default: `""`
|
||||
Converts the value according to the given specification.
|
||||
|
||||
- **iftable4** => `.1.3.6.1.2.1.31.1.1.1`
|
||||
- `float(X)`: Converts the input value into a float and divides by the Xth power of 10. Efficively just moves the decimal left X places. For example a value of `123` with `float(2)` will result in `1.23`.
|
||||
- `float`: Converts the value into a float with no adjustment. Same as `float(0)`.
|
||||
- `int`: Convertes the value into an integer.
|
||||
|
||||
Also **iftable2** is a table, the plugin will gathers all
|
||||
OIDS in the table and in the subtables
|
||||
#### Table parameters:
|
||||
* `name`:
|
||||
Output measurement name.
|
||||
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.1
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6....`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.2`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.3`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.4`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10....`
|
||||
|
||||
But the **include_instances** attribute will filter which OIDS
|
||||
will be gathered; As you see, there is an other attribute, `mapping_table`.
|
||||
`include_instances` and `mapping_table` permit to build a hash table
|
||||
to filter only OIDS you want.
|
||||
Let's say, we have the following data on SNMP server:
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.1` has as value: `enp5s0`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.2` has as value: `enp5s1`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.3` has as value: `enp5s2`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.4` has as value: `eth0`
|
||||
- OID: `.1.3.6.1.2.1.31.1.1.1.1.5` has as value: `eth1`
|
||||
|
||||
The plugin will build the following hash table:
|
||||
|
||||
| instance name | instance id |
|
||||
|---------------|-------------|
|
||||
| `enp5s0` | `1` |
|
||||
| `enp5s1` | `2` |
|
||||
| `enp5s2` | `3` |
|
||||
| `eth0` | `4` |
|
||||
| `eth1` | `5` |
|
||||
|
||||
With the **include_instances** attribute, the plugin will gather
|
||||
the following OIDS:
|
||||
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.6.5`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.1`
|
||||
- `.1.3.6.1.2.1.31.1.1.1.10.5`
|
||||
|
||||
Note: the plugin will add instance name as tag *instance*
|
||||
|
||||
|
||||
|
||||
```toml
|
||||
# Table with both mapping and subtable example
|
||||
[[inputs.snmp]]
|
||||
## Use 'oids.txt' file to translate oids to names
|
||||
## To generate 'oids.txt' you need to run:
|
||||
## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt
|
||||
## Or if you have an other MIB folder with custom MIBs
|
||||
## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt
|
||||
snmptranslate_file = "/tmp/oids.txt"
|
||||
[[inputs.snmp.host]]
|
||||
address = "127.0.0.1:161"
|
||||
# SNMP community
|
||||
community = "public" # default public
|
||||
# SNMP version (1, 2 or 3)
|
||||
# Version 3 not supported yet
|
||||
version = 2 # default 2
|
||||
# Which table do you want to collect
|
||||
[[inputs.snmp.host.table]]
|
||||
name = "iftable4"
|
||||
include_instances = ["enp5s0", "eth1"]
|
||||
|
||||
# table with both mapping and subtables
|
||||
[[inputs.snmp.table]]
|
||||
name = "iftable4"
|
||||
# if empty get all instances
|
||||
mapping_table = ".1.3.6.1.2.1.31.1.1.1.1"
|
||||
# if empty get all subtables
|
||||
# sub_tables could be not "real subtables"
|
||||
sub_tables=[".1.3.6.1.2.1.2.2.1.13", "bytes_recv", "bytes_send"]
|
||||
# note
|
||||
# oid attribute is useless
|
||||
|
||||
# SNMP SUBTABLES
|
||||
[[inputs.snmp.subtable]]
|
||||
name = "bytes_recv"
|
||||
oid = ".1.3.6.1.2.1.31.1.1.1.6"
|
||||
unit = "octets"
|
||||
|
||||
[[inputs.snmp.subtable]]
|
||||
name = "bytes_send"
|
||||
oid = ".1.3.6.1.2.1.31.1.1.1.10"
|
||||
unit = "octets"
|
||||
```
|
||||
|
||||
#### Configuration notes
|
||||
|
||||
- In **inputs.snmp.table** section, the `oid` attribute is useless if
|
||||
the `sub_tables` attributes is defined
|
||||
|
||||
- In **inputs.snmp.subtable** section, you can put a name from `snmptranslate_file`
|
||||
as `oid` attribute instead of a valid OID
|
||||
|
||||
### Measurements & Fields:
|
||||
|
||||
With the last example (Table with both mapping and subtable example):
|
||||
|
||||
- ifHCOutOctets
|
||||
- ifHCOutOctets
|
||||
- ifInDiscards
|
||||
- ifInDiscards
|
||||
- ifHCInOctets
|
||||
- ifHCInOctets
|
||||
|
||||
### Tags:
|
||||
|
||||
With the last example (Table with both mapping and subtable example):
|
||||
|
||||
- ifHCOutOctets
|
||||
- host
|
||||
- instance
|
||||
- unit
|
||||
- ifInDiscards
|
||||
- host
|
||||
- instance
|
||||
- ifHCInOctets
|
||||
- host
|
||||
- instance
|
||||
- unit
|
||||
|
||||
### Example Output:
|
||||
|
||||
With the last example (Table with both mapping and subtable example):
|
||||
|
||||
```
|
||||
ifHCOutOctets,host=127.0.0.1,instance=enp5s0,unit=octets ifHCOutOctets=10565628i 1456878706044462901
|
||||
ifInDiscards,host=127.0.0.1,instance=enp5s0 ifInDiscards=0i 1456878706044510264
|
||||
ifHCInOctets,host=127.0.0.1,instance=enp5s0,unit=octets ifHCInOctets=76351777i 1456878706044531312
|
||||
```
|
||||
* `inherit_tags`:
|
||||
Which tags to inherit from the top-level config and to use in the output of this table's measurement.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,482 +1,494 @@
|
||||
package snmp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
|
||||
"github.com/influxdata/toml"
|
||||
"github.com/soniah/gosnmp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestSNMPErrorGet1(t *testing.T) {
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: ".1.3.6.1.2.1.2.2.1.16.1",
|
||||
type testSNMPConnection struct {
|
||||
host string
|
||||
values map[string]interface{}
|
||||
}
|
||||
|
||||
func (tsc *testSNMPConnection) Host() string {
|
||||
return tsc.host
|
||||
}
|
||||
|
||||
func (tsc *testSNMPConnection) Get(oids []string) (*gosnmp.SnmpPacket, error) {
|
||||
sp := &gosnmp.SnmpPacket{}
|
||||
for _, oid := range oids {
|
||||
v, ok := tsc.values[oid]
|
||||
if !ok {
|
||||
sp.Variables = append(sp.Variables, gosnmp.SnmpPDU{
|
||||
Name: oid,
|
||||
Type: gosnmp.NoSuchObject,
|
||||
})
|
||||
continue
|
||||
}
|
||||
sp.Variables = append(sp.Variables, gosnmp.SnmpPDU{
|
||||
Name: oid,
|
||||
Value: v,
|
||||
})
|
||||
}
|
||||
h := Host{
|
||||
Collect: []string{"oid1"},
|
||||
return sp, nil
|
||||
}
|
||||
|
||||
func (tsc *testSNMPConnection) Walk(oid string, wf gosnmp.WalkFunc) error {
|
||||
for void, v := range tsc.values {
|
||||
if void == oid || (len(void) > len(oid) && void[:len(oid)+1] == oid+".") {
|
||||
if err := wf(gosnmp.SnmpPDU{
|
||||
Name: void,
|
||||
Value: v,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var tsc = &testSNMPConnection{
|
||||
host: "tsc",
|
||||
values: map[string]interface{}{
|
||||
".1.2.3.0.0.1.0": "foo",
|
||||
".1.2.3.0.0.1.1": []byte("bar"),
|
||||
".1.2.3.0.0.102": "bad",
|
||||
".1.2.3.0.0.2.0": 1,
|
||||
".1.2.3.0.0.2.1": 2,
|
||||
".1.2.3.0.0.3.0": "0.123",
|
||||
".1.2.3.0.0.3.1": "0.456",
|
||||
".1.2.3.0.0.3.2": "9.999",
|
||||
".1.2.3.0.0.4.0": 123456,
|
||||
".1.2.3.0.1": "baz",
|
||||
".1.2.3.0.2": 234,
|
||||
".1.2.3.0.3": []byte("byte slice"),
|
||||
},
|
||||
}
|
||||
|
||||
func TestSampleConfig(t *testing.T) {
|
||||
conf := struct {
|
||||
Inputs struct {
|
||||
Snmp []*Snmp
|
||||
}
|
||||
}{}
|
||||
err := toml.Unmarshal([]byte("[[inputs.snmp]]\n"+(*Snmp)(nil).SampleConfig()), &conf)
|
||||
assert.NoError(t, err)
|
||||
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "bad_oid.txt",
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
Agents: []string{"127.0.0.1:161"},
|
||||
Version: 2,
|
||||
Community: "public",
|
||||
MaxRepetitions: 50,
|
||||
|
||||
Name: "system",
|
||||
Fields: []Field{
|
||||
{Name: "hostname", Oid: ".1.2.3.0.1.1"},
|
||||
{Name: "uptime", Oid: ".1.2.3.0.1.200"},
|
||||
{Name: "load", Oid: ".1.2.3.0.1.201"},
|
||||
},
|
||||
Tables: []Table{
|
||||
{
|
||||
Name: "remote_servers",
|
||||
InheritTags: []string{"hostname"},
|
||||
Fields: []Field{
|
||||
{Name: "server", Oid: ".1.2.3.0.0.0", IsTag: true},
|
||||
{Name: "connections", Oid: ".1.2.3.0.0.1"},
|
||||
{Name: "latency", Oid: ".1.2.3.0.0.2"},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
assert.Equal(t, s, *conf.Inputs.Snmp[0])
|
||||
}
|
||||
|
||||
func TestGetSNMPConnection_v2(t *testing.T) {
|
||||
s := &Snmp{
|
||||
Timeout: "3s",
|
||||
Retries: 4,
|
||||
Version: 2,
|
||||
Community: "foo",
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
gsc, err := s.getConnection("1.2.3.4:567")
|
||||
require.NoError(t, err)
|
||||
gs := gsc.(gosnmpWrapper)
|
||||
assert.Equal(t, "1.2.3.4", gs.Target)
|
||||
assert.EqualValues(t, 567, gs.Port)
|
||||
assert.Equal(t, gosnmp.Version2c, gs.Version)
|
||||
assert.Equal(t, "foo", gs.Community)
|
||||
|
||||
gsc, err = s.getConnection("1.2.3.4")
|
||||
require.NoError(t, err)
|
||||
gs = gsc.(gosnmpWrapper)
|
||||
assert.Equal(t, "1.2.3.4", gs.Target)
|
||||
assert.EqualValues(t, 161, gs.Port)
|
||||
}
|
||||
|
||||
func TestGetSNMPConnection_v3(t *testing.T) {
|
||||
s := &Snmp{
|
||||
Version: 3,
|
||||
MaxRepetitions: 20,
|
||||
ContextName: "mycontext",
|
||||
SecLevel: "authPriv",
|
||||
SecName: "myuser",
|
||||
AuthProtocol: "md5",
|
||||
AuthPassword: "password123",
|
||||
PrivProtocol: "des",
|
||||
PrivPassword: "321drowssap",
|
||||
EngineID: "myengineid",
|
||||
EngineBoots: 1,
|
||||
EngineTime: 2,
|
||||
}
|
||||
|
||||
gsc, err := s.getConnection("1.2.3.4")
|
||||
require.NoError(t, err)
|
||||
gs := gsc.(gosnmpWrapper)
|
||||
assert.Equal(t, gs.Version, gosnmp.Version3)
|
||||
sp := gs.SecurityParameters.(*gosnmp.UsmSecurityParameters)
|
||||
assert.Equal(t, "1.2.3.4", gsc.Host())
|
||||
assert.Equal(t, 20, gs.MaxRepetitions)
|
||||
assert.Equal(t, "mycontext", gs.ContextName)
|
||||
assert.Equal(t, gosnmp.AuthPriv, gs.MsgFlags&gosnmp.AuthPriv)
|
||||
assert.Equal(t, "myuser", sp.UserName)
|
||||
assert.Equal(t, gosnmp.MD5, sp.AuthenticationProtocol)
|
||||
assert.Equal(t, "password123", sp.AuthenticationPassphrase)
|
||||
assert.Equal(t, gosnmp.DES, sp.PrivacyProtocol)
|
||||
assert.Equal(t, "321drowssap", sp.PrivacyPassphrase)
|
||||
assert.Equal(t, "myengineid", sp.AuthoritativeEngineID)
|
||||
assert.EqualValues(t, 1, sp.AuthoritativeEngineBoots)
|
||||
assert.EqualValues(t, 2, sp.AuthoritativeEngineTime)
|
||||
}
|
||||
|
||||
func TestGetSNMPConnection_caching(t *testing.T) {
|
||||
s := &Snmp{}
|
||||
gs1, err := s.getConnection("1.2.3.4")
|
||||
require.NoError(t, err)
|
||||
gs2, err := s.getConnection("1.2.3.4")
|
||||
require.NoError(t, err)
|
||||
gs3, err := s.getConnection("1.2.3.5")
|
||||
require.NoError(t, err)
|
||||
assert.True(t, gs1 == gs2)
|
||||
assert.False(t, gs2 == gs3)
|
||||
}
|
||||
|
||||
func TestGosnmpWrapper_walk_retry(t *testing.T) {
|
||||
srvr, err := net.ListenUDP("udp4", &net.UDPAddr{})
|
||||
defer srvr.Close()
|
||||
require.NoError(t, err)
|
||||
reqCount := 0
|
||||
// Set up a WaitGroup to wait for the server goroutine to exit and protect
|
||||
// reqCount.
|
||||
// Even though simultaneous access is impossible because the server will be
|
||||
// blocked on ReadFrom, without this the race detector gets unhappy.
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
buf := make([]byte, 256)
|
||||
for {
|
||||
_, addr, err := srvr.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
reqCount++
|
||||
|
||||
srvr.WriteTo([]byte{'X'}, addr) // will cause decoding error
|
||||
}
|
||||
}()
|
||||
|
||||
gs := &gosnmp.GoSNMP{
|
||||
Target: srvr.LocalAddr().(*net.UDPAddr).IP.String(),
|
||||
Port: uint16(srvr.LocalAddr().(*net.UDPAddr).Port),
|
||||
Version: gosnmp.Version2c,
|
||||
Community: "public",
|
||||
Timeout: time.Millisecond * 10,
|
||||
Retries: 1,
|
||||
}
|
||||
err = gs.Connect()
|
||||
require.NoError(t, err)
|
||||
conn := gs.Conn
|
||||
|
||||
gsw := gosnmpWrapper{gs}
|
||||
err = gsw.Walk(".1.2.3", func(_ gosnmp.SnmpPDU) error { return nil })
|
||||
srvr.Close()
|
||||
wg.Wait()
|
||||
assert.Error(t, err)
|
||||
assert.False(t, gs.Conn == conn)
|
||||
assert.Equal(t, (gs.Retries+1)*2, reqCount)
|
||||
}
|
||||
|
||||
func TestGosnmpWrapper_get_retry(t *testing.T) {
|
||||
srvr, err := net.ListenUDP("udp4", &net.UDPAddr{})
|
||||
defer srvr.Close()
|
||||
require.NoError(t, err)
|
||||
reqCount := 0
|
||||
// Set up a WaitGroup to wait for the server goroutine to exit and protect
|
||||
// reqCount.
|
||||
// Even though simultaneous access is impossible because the server will be
|
||||
// blocked on ReadFrom, without this the race detector gets unhappy.
|
||||
wg := sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
buf := make([]byte, 256)
|
||||
for {
|
||||
_, addr, err := srvr.ReadFrom(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
reqCount++
|
||||
|
||||
srvr.WriteTo([]byte{'X'}, addr) // will cause decoding error
|
||||
}
|
||||
}()
|
||||
|
||||
gs := &gosnmp.GoSNMP{
|
||||
Target: srvr.LocalAddr().(*net.UDPAddr).IP.String(),
|
||||
Port: uint16(srvr.LocalAddr().(*net.UDPAddr).Port),
|
||||
Version: gosnmp.Version2c,
|
||||
Community: "public",
|
||||
Timeout: time.Millisecond * 10,
|
||||
Retries: 1,
|
||||
}
|
||||
err = gs.Connect()
|
||||
require.NoError(t, err)
|
||||
conn := gs.Conn
|
||||
|
||||
gsw := gosnmpWrapper{gs}
|
||||
_, err = gsw.Get([]string{".1.2.3"})
|
||||
srvr.Close()
|
||||
wg.Wait()
|
||||
assert.Error(t, err)
|
||||
assert.False(t, gs.Conn == conn)
|
||||
assert.Equal(t, (gs.Retries+1)*2, reqCount)
|
||||
}
|
||||
|
||||
func TestTableBuild_walk(t *testing.T) {
|
||||
tbl := Table{
|
||||
Name: "mytable",
|
||||
Fields: []Field{
|
||||
{
|
||||
Name: "myfield1",
|
||||
Oid: ".1.2.3.0.0.1",
|
||||
IsTag: true,
|
||||
},
|
||||
{
|
||||
Name: "myfield2",
|
||||
Oid: ".1.2.3.0.0.2",
|
||||
},
|
||||
{
|
||||
Name: "myfield3",
|
||||
Oid: ".1.2.3.0.0.3",
|
||||
Conversion: "float",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
tb, err := tbl.Build(tsc, true)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, tb.Name, "mytable")
|
||||
rtr1 := RTableRow{
|
||||
Tags: map[string]string{"myfield1": "foo"},
|
||||
Fields: map[string]interface{}{"myfield2": 1, "myfield3": float64(0.123)},
|
||||
}
|
||||
rtr2 := RTableRow{
|
||||
Tags: map[string]string{"myfield1": "bar"},
|
||||
Fields: map[string]interface{}{"myfield2": 2, "myfield3": float64(0.456)},
|
||||
}
|
||||
assert.Len(t, tb.Rows, 2)
|
||||
assert.Contains(t, tb.Rows, rtr1)
|
||||
assert.Contains(t, tb.Rows, rtr2)
|
||||
}
|
||||
|
||||
func TestTableBuild_noWalk(t *testing.T) {
|
||||
tbl := Table{
|
||||
Name: "mytable",
|
||||
Fields: []Field{
|
||||
{
|
||||
Name: "myfield1",
|
||||
Oid: ".1.2.3.0.1",
|
||||
IsTag: true,
|
||||
},
|
||||
{
|
||||
Name: "myfield2",
|
||||
Oid: ".1.2.3.0.2",
|
||||
},
|
||||
{
|
||||
Name: "myfield3",
|
||||
Oid: ".1.2.3.0.2",
|
||||
IsTag: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
tb, err := tbl.Build(tsc, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
rtr := RTableRow{
|
||||
Tags: map[string]string{"myfield1": "baz", "myfield3": "234"},
|
||||
Fields: map[string]interface{}{"myfield2": 234},
|
||||
}
|
||||
assert.Len(t, tb.Rows, 1)
|
||||
assert.Contains(t, tb.Rows, rtr)
|
||||
}
|
||||
|
||||
func TestGather(t *testing.T) {
|
||||
s := &Snmp{
|
||||
Agents: []string{"TestGather"},
|
||||
Name: "mytable",
|
||||
Fields: []Field{
|
||||
{
|
||||
Name: "myfield1",
|
||||
Oid: ".1.2.3.0.1",
|
||||
IsTag: true,
|
||||
},
|
||||
{
|
||||
Name: "myfield2",
|
||||
Oid: ".1.2.3.0.2",
|
||||
},
|
||||
{
|
||||
Name: "myfield3",
|
||||
Oid: "1.2.3.0.1",
|
||||
},
|
||||
},
|
||||
Tables: []Table{
|
||||
{
|
||||
Name: "myOtherTable",
|
||||
InheritTags: []string{"myfield1"},
|
||||
Fields: []Field{
|
||||
{
|
||||
Name: "myOtherField",
|
||||
Oid: ".1.2.3.0.0.4",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
connectionCache: map[string]snmpConnection{
|
||||
"TestGather": tsc,
|
||||
},
|
||||
}
|
||||
|
||||
acc := &testutil.Accumulator{}
|
||||
|
||||
tstart := time.Now()
|
||||
s.Gather(acc)
|
||||
tstop := time.Now()
|
||||
|
||||
require.Len(t, acc.Metrics, 2)
|
||||
|
||||
m := acc.Metrics[0]
|
||||
assert.Equal(t, "mytable", m.Measurement)
|
||||
assert.Equal(t, "tsc", m.Tags["agent_host"])
|
||||
assert.Equal(t, "baz", m.Tags["myfield1"])
|
||||
assert.Len(t, m.Fields, 2)
|
||||
assert.Equal(t, 234, m.Fields["myfield2"])
|
||||
assert.Equal(t, "baz", m.Fields["myfield3"])
|
||||
assert.True(t, tstart.Before(m.Time))
|
||||
assert.True(t, tstop.After(m.Time))
|
||||
|
||||
m2 := acc.Metrics[1]
|
||||
assert.Equal(t, "myOtherTable", m2.Measurement)
|
||||
assert.Equal(t, "tsc", m2.Tags["agent_host"])
|
||||
assert.Equal(t, "baz", m2.Tags["myfield1"])
|
||||
assert.Len(t, m2.Fields, 1)
|
||||
assert.Equal(t, 123456, m2.Fields["myOtherField"])
|
||||
}
|
||||
|
||||
func TestGather_host(t *testing.T) {
|
||||
s := &Snmp{
|
||||
Agents: []string{"TestGather"},
|
||||
Name: "mytable",
|
||||
Fields: []Field{
|
||||
{
|
||||
Name: "host",
|
||||
Oid: ".1.2.3.0.1",
|
||||
IsTag: true,
|
||||
},
|
||||
{
|
||||
Name: "myfield2",
|
||||
Oid: ".1.2.3.0.2",
|
||||
},
|
||||
},
|
||||
|
||||
connectionCache: map[string]snmpConnection{
|
||||
"TestGather": tsc,
|
||||
},
|
||||
}
|
||||
|
||||
acc := &testutil.Accumulator{}
|
||||
|
||||
s.Gather(acc)
|
||||
|
||||
require.Len(t, acc.Metrics, 1)
|
||||
m := acc.Metrics[0]
|
||||
assert.Equal(t, "baz", m.Tags["host"])
|
||||
}
|
||||
|
||||
func TestFieldConvert(t *testing.T) {
|
||||
testTable := []struct {
|
||||
input interface{}
|
||||
conv string
|
||||
expected interface{}
|
||||
}{
|
||||
{[]byte("foo"), "", string("foo")},
|
||||
{"0.123", "float", float64(0.123)},
|
||||
{[]byte("0.123"), "float", float64(0.123)},
|
||||
{float32(0.123), "float", float64(float32(0.123))},
|
||||
{float64(0.123), "float", float64(0.123)},
|
||||
{123, "float", float64(123)},
|
||||
{123, "float(0)", float64(123)},
|
||||
{123, "float(4)", float64(0.0123)},
|
||||
{int8(123), "float(3)", float64(0.123)},
|
||||
{int16(123), "float(3)", float64(0.123)},
|
||||
{int32(123), "float(3)", float64(0.123)},
|
||||
{int64(123), "float(3)", float64(0.123)},
|
||||
{uint(123), "float(3)", float64(0.123)},
|
||||
{uint8(123), "float(3)", float64(0.123)},
|
||||
{uint16(123), "float(3)", float64(0.123)},
|
||||
{uint32(123), "float(3)", float64(0.123)},
|
||||
{uint64(123), "float(3)", float64(0.123)},
|
||||
{"123", "int", int64(123)},
|
||||
{[]byte("123"), "int", int64(123)},
|
||||
{float32(12.3), "int", int64(12)},
|
||||
{float64(12.3), "int", int64(12)},
|
||||
{int(123), "int", int64(123)},
|
||||
{int8(123), "int", int64(123)},
|
||||
{int16(123), "int", int64(123)},
|
||||
{int32(123), "int", int64(123)},
|
||||
{int64(123), "int", int64(123)},
|
||||
{uint(123), "int", int64(123)},
|
||||
{uint8(123), "int", int64(123)},
|
||||
{uint16(123), "int", int64(123)},
|
||||
{uint32(123), "int", int64(123)},
|
||||
{uint64(123), "int", int64(123)},
|
||||
}
|
||||
|
||||
for _, tc := range testTable {
|
||||
act := fieldConvert(tc.conv, tc.input)
|
||||
assert.EqualValues(t, tc.expected, act, "input=%T(%v) conv=%s expected=%T(%v)", tc.input, tc.input, tc.conv, tc.expected, tc.expected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestError(t *testing.T) {
|
||||
e := fmt.Errorf("nested error")
|
||||
err := Errorf(e, "top error %d", 123)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestSNMPErrorGet2(t *testing.T) {
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: ".1.3.6.1.2.1.2.2.1.16.1",
|
||||
}
|
||||
h := Host{
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, len(acc.Metrics))
|
||||
}
|
||||
|
||||
func TestSNMPErrorBulk(t *testing.T) {
|
||||
bulk1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: ".1.3.6.1.2.1.2.2.1.16",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost(),
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
Host: []Host{h},
|
||||
Bulk: []Data{bulk1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, 0, len(acc.Metrics))
|
||||
}
|
||||
|
||||
func TestSNMPGet1(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: ".1.3.6.1.2.1.2.2.1.16.1",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"oid1",
|
||||
map[string]interface{}{
|
||||
"oid1": uint(543846),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPGet2(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Oid: "ifNumber",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifNumber",
|
||||
map[string]interface{}{
|
||||
"ifNumber": int(4),
|
||||
},
|
||||
map[string]string{
|
||||
"instance": "0",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPGet3(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: "ifSpeed",
|
||||
Instance: "1",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifSpeed",
|
||||
map[string]interface{}{
|
||||
"ifSpeed": uint(10000000),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "1",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPEasyGet4(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: "ifSpeed",
|
||||
Instance: "1",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
GetOids: []string{"ifNumber"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifSpeed",
|
||||
map[string]interface{}{
|
||||
"ifSpeed": uint(10000000),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "1",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifNumber",
|
||||
map[string]interface{}{
|
||||
"ifNumber": int(4),
|
||||
},
|
||||
map[string]string{
|
||||
"instance": "0",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPEasyGet5(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
get1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: "ifSpeed",
|
||||
Instance: "1",
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
GetOids: []string{".1.3.6.1.2.1.2.1.0"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Get: []Data{get1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifSpeed",
|
||||
map[string]interface{}{
|
||||
"ifSpeed": uint(10000000),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "1",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifNumber",
|
||||
map[string]interface{}{
|
||||
"ifNumber": int(4),
|
||||
},
|
||||
map[string]string{
|
||||
"instance": "0",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPEasyGet6(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
GetOids: []string{"1.3.6.1.2.1.2.1.0"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifNumber",
|
||||
map[string]interface{}{
|
||||
"ifNumber": int(4),
|
||||
},
|
||||
map[string]string{
|
||||
"instance": "0",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func TestSNMPBulk1(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
bulk1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: ".1.3.6.1.2.1.2.2.1.16",
|
||||
MaxRepetition: 2,
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Bulk: []Data{bulk1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(543846),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "1",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(26475179),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "2",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(108963968),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "3",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(12991453),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "36",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
// TODO find why, if this test is active
|
||||
// Circle CI stops with the following error...
|
||||
// bash scripts/circle-test.sh died unexpectedly
|
||||
// Maybe the test is too long ??
|
||||
func dTestSNMPBulk2(t *testing.T) {
|
||||
bulk1 := Data{
|
||||
Name: "oid1",
|
||||
Unit: "octets",
|
||||
Oid: "ifOutOctets",
|
||||
MaxRepetition: 2,
|
||||
}
|
||||
h := Host{
|
||||
Address: testutil.GetLocalHost() + ":31161",
|
||||
Community: "telegraf",
|
||||
Version: 2,
|
||||
Timeout: 2.0,
|
||||
Retries: 2,
|
||||
Collect: []string{"oid1"},
|
||||
}
|
||||
s := Snmp{
|
||||
SnmptranslateFile: "./testdata/oids.txt",
|
||||
Host: []Host{h},
|
||||
Bulk: []Data{bulk1},
|
||||
}
|
||||
|
||||
var acc testutil.Accumulator
|
||||
err := s.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(543846),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "1",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(26475179),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "2",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(108963968),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "3",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
acc.AssertContainsTaggedFields(t,
|
||||
"ifOutOctets",
|
||||
map[string]interface{}{
|
||||
"ifOutOctets": uint(12991453),
|
||||
},
|
||||
map[string]string{
|
||||
"unit": "octets",
|
||||
"instance": "36",
|
||||
"snmp_host": testutil.GetLocalHost(),
|
||||
},
|
||||
)
|
||||
|
||||
ne, ok := err.(NestedError)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, e, ne.NestedErr)
|
||||
|
||||
assert.Contains(t, err.Error(), "top error 123")
|
||||
assert.Contains(t, err.Error(), "nested error")
|
||||
}
|
||||
|
||||
32
plugins/inputs/snmp/testdata/oids.txt
vendored
32
plugins/inputs/snmp/testdata/oids.txt
vendored
@@ -1,32 +0,0 @@
|
||||
org 1.3
|
||||
dod 1.3.6
|
||||
internet 1.3.6.1
|
||||
directory 1.3.6.1.1
|
||||
mgmt 1.3.6.1.2
|
||||
mib-2 1.3.6.1.2.1
|
||||
interfaces 1.3.6.1.2.1.2
|
||||
ifNumber 1.3.6.1.2.1.2.1
|
||||
ifTable 1.3.6.1.2.1.2.2
|
||||
ifEntry 1.3.6.1.2.1.2.2.1
|
||||
ifIndex 1.3.6.1.2.1.2.2.1.1
|
||||
ifDescr 1.3.6.1.2.1.2.2.1.2
|
||||
ifType 1.3.6.1.2.1.2.2.1.3
|
||||
ifMtu 1.3.6.1.2.1.2.2.1.4
|
||||
ifSpeed 1.3.6.1.2.1.2.2.1.5
|
||||
ifPhysAddress 1.3.6.1.2.1.2.2.1.6
|
||||
ifAdminStatus 1.3.6.1.2.1.2.2.1.7
|
||||
ifOperStatus 1.3.6.1.2.1.2.2.1.8
|
||||
ifLastChange 1.3.6.1.2.1.2.2.1.9
|
||||
ifInOctets 1.3.6.1.2.1.2.2.1.10
|
||||
ifInUcastPkts 1.3.6.1.2.1.2.2.1.11
|
||||
ifInNUcastPkts 1.3.6.1.2.1.2.2.1.12
|
||||
ifInDiscards 1.3.6.1.2.1.2.2.1.13
|
||||
ifInErrors 1.3.6.1.2.1.2.2.1.14
|
||||
ifInUnknownProtos 1.3.6.1.2.1.2.2.1.15
|
||||
ifOutOctets 1.3.6.1.2.1.2.2.1.16
|
||||
ifOutUcastPkts 1.3.6.1.2.1.2.2.1.17
|
||||
ifOutNUcastPkts 1.3.6.1.2.1.2.2.1.18
|
||||
ifOutDiscards 1.3.6.1.2.1.2.2.1.19
|
||||
ifOutErrors 1.3.6.1.2.1.2.2.1.20
|
||||
ifOutQLen 1.3.6.1.2.1.2.2.1.21
|
||||
ifSpecific 1.3.6.1.2.1.2.2.1.22
|
||||
Reference in New Issue
Block a user