Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
e393c3af3f
commit
4978089aab
4963 changed files with 677545 additions and 0 deletions
104
plugins/inputs/bond/README.md
Normal file
104
plugins/inputs/bond/README.md
Normal file
|
@ -0,0 +1,104 @@
|
|||
# Bond Input Plugin
|
||||
|
||||
This plugin collects metrics for both the network bond interface as well as its
|
||||
slave interfaces using `/proc/net/bonding/*` files.
|
||||
|
||||
⭐ Telegraf v1.5.0
|
||||
🏷️ system
|
||||
💻 all
|
||||
|
||||
## Global configuration options <!-- @/docs/includes/plugin_config.md -->
|
||||
|
||||
In addition to the plugin-specific configuration settings, plugins support
|
||||
additional global and plugin configuration settings. These settings are used to
|
||||
modify metrics, tags, and field or create aliases and configure ordering, etc.
|
||||
See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||
|
||||
[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins
|
||||
|
||||
## Configuration
|
||||
|
||||
```toml @sample.conf
|
||||
# Collect bond interface status, slaves statuses and failures count
|
||||
[[inputs.bond]]
|
||||
## Sets 'proc' directory path
|
||||
## If not specified, then default is /proc
|
||||
# host_proc = "/proc"
|
||||
|
||||
## Sets 'sys' directory path
|
||||
## If not specified, then default is /sys
|
||||
# host_sys = "/sys"
|
||||
|
||||
## By default, telegraf gather stats for all bond interfaces
|
||||
## Setting interfaces will restrict the stats to the specified
|
||||
## bond interfaces.
|
||||
# bond_interfaces = ["bond0"]
|
||||
|
||||
## Tries to collect additional bond details from /sys/class/net/{bond}
|
||||
## currently only useful for LACP (mode 4) bonds
|
||||
# collect_sys_details = false
|
||||
```
|
||||
|
||||
## Metrics
|
||||
|
||||
- bond
|
||||
- tags:
|
||||
- `bond`: name of the bond
|
||||
- fields:
|
||||
- `active_slave`: currently active slave interface for active-backup mode
|
||||
- `status`: status of the interface (0: down , 1: up)
|
||||
|
||||
- bond_slave
|
||||
- tags:
|
||||
- `bond`: name of the bond
|
||||
- `interface`: name of the network interface
|
||||
- fields:
|
||||
- `failures`: amount of failures for bond's slave interface
|
||||
- `status`: status of the interface (0: down , 1: up)
|
||||
- `count`: number of slaves attached to bond
|
||||
- `actor_churned (for LACP bonds)`: count for local end of LACP bond flapped
|
||||
- `partner_churned (for LACP bonds)`: count for remote end of LACP bond flapped
|
||||
- `total_churned (for LACP bonds)`: full count of all churn events
|
||||
|
||||
- bond_sys
|
||||
- tags:
|
||||
- `bond`: name of the bond
|
||||
- `mode`: name of the bonding mode
|
||||
- fields:
|
||||
- `slave_count`: number of slaves
|
||||
- `ad_port_count`: number of ports
|
||||
|
||||
## Example Output
|
||||
|
||||
Configuration:
|
||||
|
||||
```toml
|
||||
[[inputs.bond]]
|
||||
## Sets 'proc' directory path
|
||||
## If not specified, then default is /proc
|
||||
host_proc = "/proc"
|
||||
|
||||
## By default, telegraf gather stats for all bond interfaces
|
||||
## Setting interfaces will restrict the stats to the specified
|
||||
## bond interfaces.
|
||||
bond_interfaces = ["bond0", "bond1"]
|
||||
```
|
||||
|
||||
Run:
|
||||
|
||||
```bash
|
||||
telegraf --config telegraf.conf --input-filter bond --test
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```text
|
||||
bond,bond=bond1,host=local active_slave="eth0",status=1i 1509704525000000000
|
||||
bond_slave,bond=bond1,interface=eth0,host=local status=1i,failures=0i 1509704525000000000
|
||||
bond_slave,host=local,bond=bond1,interface=eth1 status=1i,failures=0i 1509704525000000000
|
||||
bond_slave,host=local,bond=bond1 count=2i 1509704525000000000
|
||||
bond,bond=bond0,host=isvetlov-mac.local status=1i 1509704525000000000
|
||||
bond_slave,bond=bond0,interface=eth1,host=local status=1i,failures=0i 1509704525000000000
|
||||
bond_slave,bond=bond0,interface=eth2,host=local status=1i,failures=0i 1509704525000000000
|
||||
bond_slave,bond=bond0,host=local count=2i 1509704525000000000
|
||||
```
|
310
plugins/inputs/bond/bond.go
Normal file
310
plugins/inputs/bond/bond.go
Normal file
|
@ -0,0 +1,310 @@
|
|||
//go:generate ../../../tools/readme_config_includer/generator
|
||||
package bond
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
"github.com/influxdata/telegraf/internal"
|
||||
"github.com/influxdata/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
//go:embed sample.conf
|
||||
var sampleConfig string
|
||||
|
||||
type Bond struct {
|
||||
HostProc string `toml:"host_proc"`
|
||||
HostSys string `toml:"host_sys"`
|
||||
SysDetails bool `toml:"collect_sys_details"`
|
||||
BondInterfaces []string `toml:"bond_interfaces"`
|
||||
BondType string
|
||||
}
|
||||
|
||||
type sysFiles struct {
|
||||
ModeFile string
|
||||
SlaveFile string
|
||||
ADPortsFile string
|
||||
}
|
||||
|
||||
func (*Bond) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
func (bond *Bond) Gather(acc telegraf.Accumulator) error {
|
||||
// load proc path, get default value if config value and env variable are empty
|
||||
bond.loadPaths()
|
||||
// list bond interfaces from bonding directory or gather all interfaces.
|
||||
bondNames, err := bond.listInterfaces()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, bondName := range bondNames {
|
||||
bondAbsPath := bond.HostProc + "/net/bonding/" + bondName
|
||||
file, err := os.ReadFile(bondAbsPath)
|
||||
if err != nil {
|
||||
acc.AddError(fmt.Errorf("error inspecting %q interface: %w", bondAbsPath, err))
|
||||
continue
|
||||
}
|
||||
rawProcFile := strings.TrimSpace(string(file))
|
||||
err = bond.gatherBondInterface(bondName, rawProcFile, acc)
|
||||
if err != nil {
|
||||
acc.AddError(fmt.Errorf("error inspecting %q interface: %w", bondName, err))
|
||||
}
|
||||
|
||||
/*
|
||||
Some details about bonds only exist in /sys/class/net/
|
||||
In particular, LACP bonds track upstream port state here
|
||||
*/
|
||||
if bond.SysDetails {
|
||||
files, err := bond.readSysFiles(bond.HostSys + "/class/net/" + bondName)
|
||||
if err != nil {
|
||||
acc.AddError(err)
|
||||
}
|
||||
gatherSysDetails(bondName, files, acc)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (bond *Bond) gatherBondInterface(bondName, rawFile string, acc telegraf.Accumulator) error {
|
||||
splitIndex := strings.Index(rawFile, "Slave Interface:")
|
||||
if splitIndex == -1 {
|
||||
splitIndex = len(rawFile)
|
||||
}
|
||||
bondPart := rawFile[:splitIndex]
|
||||
slavePart := rawFile[splitIndex:]
|
||||
|
||||
err := bond.gatherBondPart(bondName, bondPart, acc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = bond.gatherSlavePart(bondName, slavePart, acc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (bond *Bond) gatherBondPart(bondName, rawFile string, acc telegraf.Accumulator) error {
|
||||
fields := make(map[string]interface{})
|
||||
tags := map[string]string{
|
||||
"bond": bondName,
|
||||
}
|
||||
scanner := bufio.NewScanner(strings.NewReader(rawFile))
|
||||
/*
|
||||
/proc/bond/... files are formatted in a way that is difficult
|
||||
to use regexes to parse. Because of that, we scan through
|
||||
the file one line at a time and rely on specific lines to
|
||||
mark "ends" of blocks. It's a hack that should be resolved,
|
||||
but for now, it works.
|
||||
*/
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
stats := strings.Split(line, ":")
|
||||
if len(stats) < 2 {
|
||||
continue
|
||||
}
|
||||
name := strings.TrimSpace(stats[0])
|
||||
value := strings.TrimSpace(stats[1])
|
||||
if name == "Bonding Mode" {
|
||||
bond.BondType = value
|
||||
}
|
||||
if strings.Contains(name, "Currently Active Slave") {
|
||||
fields["active_slave"] = value
|
||||
}
|
||||
if strings.Contains(name, "MII Status") {
|
||||
fields["status"] = 0
|
||||
if value == "up" {
|
||||
fields["status"] = 1
|
||||
}
|
||||
acc.AddFields("bond", fields, tags)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
return fmt.Errorf("couldn't find status info for %q", bondName)
|
||||
}
|
||||
|
||||
func (bond *Bond) readSysFiles(bondDir string) (sysFiles, error) {
|
||||
/*
|
||||
Files we may need
|
||||
bonding/mode
|
||||
bonding/slaves
|
||||
bonding/ad_num_ports
|
||||
|
||||
We load files here first to allow for easier testing
|
||||
*/
|
||||
var output sysFiles
|
||||
|
||||
file, err := os.ReadFile(bondDir + "/bonding/mode")
|
||||
if err != nil {
|
||||
return sysFiles{}, fmt.Errorf("error inspecting %q interface: %w", bondDir+"/bonding/mode", err)
|
||||
}
|
||||
output.ModeFile = strings.TrimSpace(string(file))
|
||||
file, err = os.ReadFile(bondDir + "/bonding/slaves")
|
||||
if err != nil {
|
||||
return sysFiles{}, fmt.Errorf("error inspecting %q interface: %w", bondDir+"/bonding/slaves", err)
|
||||
}
|
||||
output.SlaveFile = strings.TrimSpace(string(file))
|
||||
if bond.BondType == "IEEE 802.3ad Dynamic link aggregation" {
|
||||
file, err = os.ReadFile(bondDir + "/bonding/ad_num_ports")
|
||||
if err != nil {
|
||||
return sysFiles{}, fmt.Errorf("error inspecting %q interface: %w", bondDir+"/bonding/ad_num_ports", err)
|
||||
}
|
||||
output.ADPortsFile = strings.TrimSpace(string(file))
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
|
||||
func gatherSysDetails(bondName string, files sysFiles, acc telegraf.Accumulator) {
|
||||
var slaves []string
|
||||
var adPortCount int
|
||||
|
||||
// To start with, we get the bond operating mode
|
||||
mode := strings.TrimSpace(strings.Split(files.ModeFile, " ")[0])
|
||||
|
||||
tags := map[string]string{
|
||||
"bond": bondName,
|
||||
"mode": mode,
|
||||
}
|
||||
|
||||
// Next we collect the number of bond slaves the system expects
|
||||
slavesTmp := strings.Split(files.SlaveFile, " ")
|
||||
for _, slave := range slavesTmp {
|
||||
if slave != "" {
|
||||
slaves = append(slaves, slave)
|
||||
}
|
||||
}
|
||||
if mode == "802.3ad" {
|
||||
/*
|
||||
If we're in LACP mode, we should check on how the bond ports are
|
||||
interacting with the upstream switch ports
|
||||
a failed conversion can be treated as 0 ports
|
||||
*/
|
||||
if pc, err := strconv.Atoi(strings.TrimSpace(files.ADPortsFile)); err == nil {
|
||||
adPortCount = pc
|
||||
}
|
||||
} else {
|
||||
adPortCount = len(slaves)
|
||||
}
|
||||
|
||||
fields := map[string]interface{}{
|
||||
"slave_count": len(slaves),
|
||||
"ad_port_count": adPortCount,
|
||||
}
|
||||
acc.AddFields("bond_sys", fields, tags)
|
||||
}
|
||||
|
||||
func (bond *Bond) gatherSlavePart(bondName, rawFile string, acc telegraf.Accumulator) error {
|
||||
var slaveCount int
|
||||
tags := map[string]string{
|
||||
"bond": bondName,
|
||||
}
|
||||
fields := map[string]interface{}{
|
||||
"status": 0,
|
||||
}
|
||||
var scanPast bool
|
||||
if bond.BondType == "IEEE 802.3ad Dynamic link aggregation" {
|
||||
scanPast = true
|
||||
}
|
||||
|
||||
scanner := bufio.NewScanner(strings.NewReader(rawFile))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
stats := strings.Split(line, ":")
|
||||
if len(stats) < 2 {
|
||||
continue
|
||||
}
|
||||
name := strings.TrimSpace(stats[0])
|
||||
value := strings.TrimSpace(stats[1])
|
||||
if strings.Contains(name, "Slave Interface") {
|
||||
tags["interface"] = value
|
||||
slaveCount++
|
||||
}
|
||||
if strings.Contains(name, "MII Status") && value == "up" {
|
||||
fields["status"] = 1
|
||||
}
|
||||
if strings.Contains(name, "Link Failure Count") {
|
||||
count, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["failures"] = count
|
||||
if !scanPast {
|
||||
acc.AddFields("bond_slave", fields, tags)
|
||||
fields = map[string]interface{}{
|
||||
"status": 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
if strings.Contains(name, "Actor Churned Count") {
|
||||
count, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["actor_churned"] = count
|
||||
}
|
||||
if strings.Contains(name, "Partner Churned Count") {
|
||||
count, err := strconv.Atoi(value)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields["partner_churned"] = count
|
||||
fields["total_churned"] = fields["actor_churned"].(int) + fields["partner_churned"].(int)
|
||||
acc.AddFields("bond_slave", fields, tags)
|
||||
fields = map[string]interface{}{
|
||||
"status": 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
tags = map[string]string{
|
||||
"bond": bondName,
|
||||
}
|
||||
fields = map[string]interface{}{
|
||||
"count": slaveCount,
|
||||
}
|
||||
acc.AddFields("bond_slave", fields, tags)
|
||||
|
||||
return scanner.Err()
|
||||
}
|
||||
|
||||
// loadPaths can be used to read path firstly from config
|
||||
// if it is empty then try read from env variable
|
||||
func (bond *Bond) loadPaths() {
|
||||
if bond.HostProc == "" {
|
||||
bond.HostProc = internal.GetProcPath()
|
||||
}
|
||||
if bond.HostSys == "" {
|
||||
bond.HostSys = internal.GetSysPath()
|
||||
}
|
||||
}
|
||||
|
||||
func (bond *Bond) listInterfaces() ([]string, error) {
|
||||
var interfaces []string
|
||||
if len(bond.BondInterfaces) > 0 {
|
||||
interfaces = bond.BondInterfaces
|
||||
} else {
|
||||
paths, err := filepath.Glob(bond.HostProc + "/net/bonding/*")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, p := range paths {
|
||||
interfaces = append(interfaces, filepath.Base(p))
|
||||
}
|
||||
}
|
||||
return interfaces, nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
inputs.Add("bond", func() telegraf.Input {
|
||||
return &Bond{}
|
||||
})
|
||||
}
|
193
plugins/inputs/bond/bond_test.go
Normal file
193
plugins/inputs/bond/bond_test.go
Normal file
|
@ -0,0 +1,193 @@
|
|||
package bond
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
)
|
||||
|
||||
const sampleTestAB = `
|
||||
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
|
||||
|
||||
Bonding Mode: fault-tolerance (active-backup)
|
||||
Primary Slave: eth2 (primary_reselect always)
|
||||
Currently Active Slave: eth2
|
||||
MII Status: up
|
||||
MII Polling Interval (ms): 100
|
||||
Up Delay (ms): 0
|
||||
Down Delay (ms): 0
|
||||
|
||||
Slave Interface: eth3
|
||||
MII Status: down
|
||||
Speed: 1000 Mbps
|
||||
Duplex: full
|
||||
Link Failure Count: 2
|
||||
Permanent HW addr:
|
||||
Slave queue ID: 0
|
||||
|
||||
Slave Interface: eth2
|
||||
MII Status: up
|
||||
Speed: 100 Mbps
|
||||
Duplex: full
|
||||
Link Failure Count: 0
|
||||
Permanent HW addr:
|
||||
`
|
||||
|
||||
const sampleTestLACP = `
|
||||
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
|
||||
|
||||
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
|
||||
Transmit Hash Policy: layer2 (0)
|
||||
MII Status: up
|
||||
MII Polling Interval (ms): 100
|
||||
Up Delay (ms): 0
|
||||
Down Delay (ms): 0
|
||||
|
||||
802.3ad info
|
||||
LACP rate: fast
|
||||
Min links: 0
|
||||
Aggregator selection policy (ad_select): stable
|
||||
|
||||
Slave Interface: eth0
|
||||
MII Status: up
|
||||
Speed: 10000 Mbps
|
||||
Duplex: full
|
||||
Link Failure Count: 2
|
||||
Permanent HW addr: 3c:ec:ef:5e:71:58
|
||||
Slave queue ID: 0
|
||||
Aggregator ID: 2
|
||||
Actor Churn State: none
|
||||
Partner Churn State: none
|
||||
Actor Churned Count: 2
|
||||
Partner Churned Count: 0
|
||||
|
||||
Slave Interface: eth1
|
||||
MII Status: up
|
||||
Speed: 10000 Mbps
|
||||
Duplex: full
|
||||
Link Failure Count: 1
|
||||
Permanent HW addr: 3c:ec:ef:5e:71:59
|
||||
Slave queue ID: 0
|
||||
Aggregator ID: 2
|
||||
Actor Churn State: none
|
||||
Partner Churn State: none
|
||||
Actor Churned Count: 0
|
||||
Partner Churned Count: 0
|
||||
`
|
||||
|
||||
const sampleTestLACPFirstUpSecondDown = `
|
||||
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
|
||||
|
||||
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
|
||||
Transmit Hash Policy: layer2 (0)
|
||||
MII Status: up
|
||||
MII Polling Interval (ms): 100
|
||||
Up Delay (ms): 0
|
||||
Down Delay (ms): 0
|
||||
|
||||
802.3ad info
|
||||
LACP rate: fast
|
||||
Min links: 0
|
||||
Aggregator selection policy (ad_select): stable
|
||||
|
||||
Slave Interface: eth0
|
||||
MII Status: up
|
||||
Speed: 10000 Mbps
|
||||
Duplex: full
|
||||
Link Failure Count: 2
|
||||
Permanent HW addr: 3c:ec:ef:5e:71:58
|
||||
Slave queue ID: 0
|
||||
Aggregator ID: 2
|
||||
Actor Churn State: none
|
||||
Partner Churn State: none
|
||||
Actor Churned Count: 2
|
||||
Partner Churned Count: 0
|
||||
|
||||
Slave Interface: eth1
|
||||
MII Status: down
|
||||
Speed: Unknown
|
||||
Duplex: Unknown
|
||||
Link Failure Count: 1
|
||||
Permanent HW addr: 3c:ec:ef:5e:71:59
|
||||
Slave queue ID: 0
|
||||
Aggregator ID: 2
|
||||
Actor Churn State: none
|
||||
Partner Churn State: none
|
||||
Actor Churned Count: 0
|
||||
Partner Churned Count: 0
|
||||
`
|
||||
|
||||
const sampleSysMode = "802.3ad 5"
|
||||
const sampleSysSlaves = "eth0 eth1 "
|
||||
const sampleSysAdPorts = " 2 "
|
||||
|
||||
func TestGatherBondInterface(t *testing.T) {
|
||||
var acc testutil.Accumulator
|
||||
bond := &Bond{}
|
||||
|
||||
require.NoError(t, bond.gatherBondInterface("bondAB", sampleTestAB, &acc))
|
||||
acc.AssertContainsTaggedFields(t, "bond", map[string]interface{}{"active_slave": "eth2", "status": 1}, map[string]string{"bond": "bondAB"})
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 2, "status": 0},
|
||||
map[string]string{"bond": "bondAB", "interface": "eth3"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 0, "status": 1},
|
||||
map[string]string{"bond": "bondAB", "interface": "eth2"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(t, "bond_slave", map[string]interface{}{"count": 2}, map[string]string{"bond": "bondAB"})
|
||||
|
||||
acc = testutil.Accumulator{}
|
||||
require.NoError(t, bond.gatherBondInterface("bondLACP", sampleTestLACP, &acc))
|
||||
gatherSysDetails("bondLACP", sysFiles{ModeFile: sampleSysMode, SlaveFile: sampleSysSlaves, ADPortsFile: sampleSysAdPorts}, &acc)
|
||||
acc.AssertContainsTaggedFields(t, "bond", map[string]interface{}{"status": 1}, map[string]string{"bond": "bondLACP"})
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 2, "status": 1, "actor_churned": 2, "partner_churned": 0, "total_churned": 2},
|
||||
map[string]string{"bond": "bondLACP", "interface": "eth0"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 1, "status": 1, "actor_churned": 0, "partner_churned": 0, "total_churned": 0},
|
||||
map[string]string{"bond": "bondLACP", "interface": "eth1"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(t, "bond_slave", map[string]interface{}{"count": 2}, map[string]string{"bond": "bondLACP"})
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_sys",
|
||||
map[string]interface{}{"slave_count": 2, "ad_port_count": 2},
|
||||
map[string]string{"bond": "bondLACP", "mode": "802.3ad"},
|
||||
)
|
||||
|
||||
acc = testutil.Accumulator{}
|
||||
require.NoError(t, bond.gatherBondInterface("bondLACPUpDown", sampleTestLACPFirstUpSecondDown, &acc))
|
||||
gatherSysDetails("bondLACPUpDown", sysFiles{ModeFile: sampleSysMode, SlaveFile: sampleSysSlaves, ADPortsFile: sampleSysAdPorts}, &acc)
|
||||
acc.AssertContainsTaggedFields(t, "bond", map[string]interface{}{"status": 1}, map[string]string{"bond": "bondLACPUpDown"})
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 2, "status": 1, "actor_churned": 2, "partner_churned": 0, "total_churned": 2},
|
||||
map[string]string{"bond": "bondLACPUpDown", "interface": "eth0"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_slave",
|
||||
map[string]interface{}{"failures": 1, "status": 0, "actor_churned": 0, "partner_churned": 0, "total_churned": 0},
|
||||
map[string]string{"bond": "bondLACPUpDown", "interface": "eth1"},
|
||||
)
|
||||
acc.AssertContainsTaggedFields(t, "bond_slave", map[string]interface{}{"count": 2}, map[string]string{"bond": "bondLACPUpDown"})
|
||||
acc.AssertContainsTaggedFields(
|
||||
t,
|
||||
"bond_sys",
|
||||
map[string]interface{}{"slave_count": 2, "ad_port_count": 2},
|
||||
map[string]string{"bond": "bondLACPUpDown", "mode": "802.3ad"},
|
||||
)
|
||||
}
|
18
plugins/inputs/bond/sample.conf
Normal file
18
plugins/inputs/bond/sample.conf
Normal file
|
@ -0,0 +1,18 @@
|
|||
# Collect bond interface status, slaves statuses and failures count
|
||||
[[inputs.bond]]
|
||||
## Sets 'proc' directory path
|
||||
## If not specified, then default is /proc
|
||||
# host_proc = "/proc"
|
||||
|
||||
## Sets 'sys' directory path
|
||||
## If not specified, then default is /sys
|
||||
# host_sys = "/sys"
|
||||
|
||||
## By default, telegraf gather stats for all bond interfaces
|
||||
## Setting interfaces will restrict the stats to the specified
|
||||
## bond interfaces.
|
||||
# bond_interfaces = ["bond0"]
|
||||
|
||||
## Tries to collect additional bond details from /sys/class/net/{bond}
|
||||
## currently only useful for LACP (mode 4) bonds
|
||||
# collect_sys_details = false
|
Loading…
Add table
Add a link
Reference in a new issue