From 25cc56d1e3f591f43a6c1ef4eab5d49d4bc8cab1 Mon Sep 17 00:00:00 2001 From: Chris Ottinger Date: Wed, 14 Mar 2018 15:08:21 +1100 Subject: [PATCH] Added config flag to skip collection of network protocol metrics (#3880) --- plugins/inputs/system/NET_README.md | 5 +++++ plugins/inputs/system/net.go | 35 ++++++++++++++++++----------- plugins/inputs/system/net_test.go | 6 +++++ 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/plugins/inputs/system/NET_README.md b/plugins/inputs/system/NET_README.md index 771cabb48..f265e2448 100644 --- a/plugins/inputs/system/NET_README.md +++ b/plugins/inputs/system/NET_README.md @@ -14,6 +14,11 @@ This plugin gathers metrics about network interface and protocol usage (Linux on ## # interfaces = ["eth*", "enp0s[0-1]", "lo"] ## + ## On linux systems telegraf also collects protocol stats. + ## Setting ignore_protocol_stats to true will skip reporting of protocol metrics. + ## + # ignore_protocol_stats = false + ## ``` ### Measurements & Fields: diff --git a/plugins/inputs/system/net.go b/plugins/inputs/system/net.go index cfb712dfb..a7ba5c63d 100644 --- a/plugins/inputs/system/net.go +++ b/plugins/inputs/system/net.go @@ -14,8 +14,9 @@ type NetIOStats struct { filter filter.Filter ps PS - skipChecks bool - Interfaces []string + skipChecks bool + IgnoreProtocolStats bool + Interfaces []string } func (_ *NetIOStats) Description() string { @@ -28,6 +29,12 @@ var netSampleConfig = ` ## regardless of status. ## # interfaces = ["eth0"] + ## + ## On linux systems telegraf also collects protocol stats. + ## Setting ignore_protocol_stats to true will skip reporting of protocol metrics. + ## + # ignore_protocol_stats = false + ## ` func (_ *NetIOStats) SampleConfig() string { @@ -91,19 +98,21 @@ func (s *NetIOStats) Gather(acc telegraf.Accumulator) error { // Get system wide stats for different network protocols // (ignore these stats if the call fails) - netprotos, _ := s.ps.NetProto() - fields := make(map[string]interface{}) - for _, proto := range netprotos { - for stat, value := range proto.Stats { - name := fmt.Sprintf("%s_%s", strings.ToLower(proto.Protocol), - strings.ToLower(stat)) - fields[name] = value + if !s.IgnoreProtocolStats { + netprotos, _ := s.ps.NetProto() + fields := make(map[string]interface{}) + for _, proto := range netprotos { + for stat, value := range proto.Stats { + name := fmt.Sprintf("%s_%s", strings.ToLower(proto.Protocol), + strings.ToLower(stat)) + fields[name] = value + } } + tags := map[string]string{ + "interface": "all", + } + acc.AddFields("net", fields, tags) } - tags := map[string]string{ - "interface": "all", - } - acc.AddFields("net", fields, tags) return nil } diff --git a/plugins/inputs/system/net_test.go b/plugins/inputs/system/net_test.go index 5eb30fe4f..83b9bd460 100644 --- a/plugins/inputs/system/net_test.go +++ b/plugins/inputs/system/net_test.go @@ -106,4 +106,10 @@ func TestNetStats(t *testing.T) { "udp_socket": 1, } acc.AssertContainsTaggedFields(t, "netstat", fields3, make(map[string]string)) + + acc.Metrics = nil + err = (&NetIOStats{ps: &mps, IgnoreProtocolStats: true}).Gather(&acc) + require.NoError(t, err) + + acc.AssertDoesNotContainsTaggedFields(t, "netstat", fields3, make(map[string]string)) }