parent
							
								
									17dd058308
								
							
						
					
					
						commit
						d394003739
					
				|  | @ -14,6 +14,7 @@ | ||||||
| - Logging: additional logging for each collection interval, track the number | - Logging: additional logging for each collection interval, track the number | ||||||
| of metrics collected and from how many plugins. | of metrics collected and from how many plugins. | ||||||
| - [#240](https://github.com/influxdb/telegraf/pull/240): procstat plugin, thanks @ranjib! | - [#240](https://github.com/influxdb/telegraf/pull/240): procstat plugin, thanks @ranjib! | ||||||
|  | - [#244](https://github.com/influxdb/telegraf/pull/244): netstat plugin, thanks @shirou! | ||||||
| 
 | 
 | ||||||
| ### Bugfixes | ### Bugfixes | ||||||
| - [#228](https://github.com/influxdb/telegraf/pull/228): New version of package will replace old one. Thanks @ekini! | - [#228](https://github.com/influxdb/telegraf/pull/228): New version of package will replace old one. Thanks @ekini! | ||||||
|  |  | ||||||
|  | @ -0,0 +1,52 @@ | ||||||
|  | Telegraf plugin: NETSTAT | ||||||
|  | 
 | ||||||
|  | #### Description | ||||||
|  | 
 | ||||||
|  | The NETSTAT plugin collects TCP connections state and UDP socket counts by using `lsof`. | ||||||
|  | 
 | ||||||
|  | Supported TCP Connection states are follows.  | ||||||
|  | 
 | ||||||
|  | - established | ||||||
|  | - syn_sent | ||||||
|  | - syn_recv | ||||||
|  | - fin_wait1 | ||||||
|  | - fin_wait2 | ||||||
|  | - time_wait | ||||||
|  | - close | ||||||
|  | - close_wait | ||||||
|  | - last_ack | ||||||
|  | - listen | ||||||
|  | - closing | ||||||
|  | - none | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | # Measurements: | ||||||
|  | ### TCP Connection State measurements: | ||||||
|  | 
 | ||||||
|  | Meta: | ||||||
|  | - units: counts | ||||||
|  | 
 | ||||||
|  | Measurement names: | ||||||
|  | - tcp_established | ||||||
|  | - tcp_syn_sent | ||||||
|  | - tcp_syn_recv | ||||||
|  | - tcp_fin_wait1 | ||||||
|  | - tcp_fin_wait2 | ||||||
|  | - tcp_time_wait | ||||||
|  | - tcp_close | ||||||
|  | - tcp_close_wait | ||||||
|  | - tcp_last_ack | ||||||
|  | - tcp_listen | ||||||
|  | - tcp_closing | ||||||
|  | - tcp_none | ||||||
|  | 
 | ||||||
|  | If there are no connection on the state, the metric is not counted. | ||||||
|  | 
 | ||||||
|  | ### UDP socket counts measurements: | ||||||
|  | 
 | ||||||
|  | Meta: | ||||||
|  | - units: counts | ||||||
|  | 
 | ||||||
|  | Measurement names: | ||||||
|  | - udp_socket | ||||||
|  | 
 | ||||||
|  | @ -1,43 +0,0 @@ | ||||||
| Telegraf plugin: TCPCONN |  | ||||||
| 
 |  | ||||||
| #### Description |  | ||||||
| 
 |  | ||||||
| The TCPCONN plugin collects TCP connections state by using `lsof`.  |  | ||||||
| 
 |  | ||||||
| Supported TCP Connection states are follows.  |  | ||||||
| 
 |  | ||||||
| - established |  | ||||||
| - syn_sent |  | ||||||
| - syn_recv |  | ||||||
| - fin_wait1 |  | ||||||
| - fin_wait2 |  | ||||||
| - time_wait |  | ||||||
| - close |  | ||||||
| - close_wait |  | ||||||
| - last_ack |  | ||||||
| - listen |  | ||||||
| - closing |  | ||||||
| - none |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # Measurements: |  | ||||||
| ### TCP Connections measurements: |  | ||||||
| 
 |  | ||||||
| Meta: |  | ||||||
| - units: counts |  | ||||||
| 
 |  | ||||||
| Measurement names: |  | ||||||
| - established |  | ||||||
| - syn_sent |  | ||||||
| - syn_recv |  | ||||||
| - fin_wait1 |  | ||||||
| - fin_wait2 |  | ||||||
| - time_wait |  | ||||||
| - close |  | ||||||
| - close_wait |  | ||||||
| - last_ack |  | ||||||
| - listen |  | ||||||
| - closing |  | ||||||
| - none |  | ||||||
| 
 |  | ||||||
| If there are no connection on the state, the metric is not counted. |  | ||||||
|  | @ -0,0 +1,66 @@ | ||||||
|  | package system | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"syscall" | ||||||
|  | 
 | ||||||
|  | 	"github.com/influxdb/telegraf/plugins" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type NetStats struct { | ||||||
|  | 	ps PS | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (_ *NetStats) Description() string { | ||||||
|  | 	return "Read metrics about TCP status such as established, time wait etc and UDP sockets counts." | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var tcpstatSampleConfig = "" | ||||||
|  | 
 | ||||||
|  | func (_ *NetStats) SampleConfig() string { | ||||||
|  | 	return tcpstatSampleConfig | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (s *NetStats) Gather(acc plugins.Accumulator) error { | ||||||
|  | 	netconns, err := s.ps.NetConnections() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("error getting net connections info: %s", err) | ||||||
|  | 	} | ||||||
|  | 	counts := make(map[string]int) | ||||||
|  | 	counts["UDP"] = 0 | ||||||
|  | 
 | ||||||
|  | 	// TODO: add family to tags or else
 | ||||||
|  | 	tags := map[string]string{} | ||||||
|  | 	for _, netcon := range netconns { | ||||||
|  | 		if netcon.Type == syscall.SOCK_DGRAM { | ||||||
|  | 			counts["UDP"] += 1 | ||||||
|  | 			continue // UDP has no status
 | ||||||
|  | 		} | ||||||
|  | 		c, ok := counts[netcon.Status] | ||||||
|  | 		if !ok { | ||||||
|  | 			counts[netcon.Status] = 0 | ||||||
|  | 		} | ||||||
|  | 		counts[netcon.Status] = c + 1 | ||||||
|  | 	} | ||||||
|  | 	acc.Add("tcp_established", counts["ESTABLISHED"], tags) | ||||||
|  | 	acc.Add("tcp_syn_sent", counts["SYN_SENT"], tags) | ||||||
|  | 	acc.Add("tcp_syn_recv", counts["SYN_RECV"], tags) | ||||||
|  | 	acc.Add("tcp_fin_wait1", counts["FIN_WAIT1"], tags) | ||||||
|  | 	acc.Add("tcp_fin_wait2", counts["FIN_WAIT2"], tags) | ||||||
|  | 	acc.Add("tcp_time_wait", counts["TIME_WAIT"], tags) | ||||||
|  | 	acc.Add("tcp_close", counts["CLOSE"], tags) | ||||||
|  | 	acc.Add("tcp_close_wait", counts["CLOSE_WAIT"], tags) | ||||||
|  | 	acc.Add("tcp_last_ack", counts["LAST_ACK"], tags) | ||||||
|  | 	acc.Add("tcp_listen", counts["LISTEN"], tags) | ||||||
|  | 	acc.Add("tcp_closing", counts["CLOSING"], tags) | ||||||
|  | 	acc.Add("tcp_none", counts["NONE"], tags) | ||||||
|  | 	acc.Add("udp_socket", counts["UDP"], tags) | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	plugins.Add("netstat", func() plugins.Plugin { | ||||||
|  | 		return &NetStats{ps: &systemPS{}} | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | @ -3,6 +3,7 @@ package system | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"reflect" | 	"reflect" | ||||||
|  | 	"syscall" | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"github.com/influxdb/telegraf/testutil" | 	"github.com/influxdb/telegraf/testutil" | ||||||
|  | @ -126,6 +127,23 @@ func TestSystemStats_GenerateStats(t *testing.T) { | ||||||
| 
 | 
 | ||||||
| 	mps.On("SwapStat").Return(sms, nil) | 	mps.On("SwapStat").Return(sms, nil) | ||||||
| 
 | 
 | ||||||
|  | 	netstats := []net.NetConnectionStat{ | ||||||
|  | 		net.NetConnectionStat{ | ||||||
|  | 			Type: syscall.SOCK_DGRAM, | ||||||
|  | 		}, | ||||||
|  | 		net.NetConnectionStat{ | ||||||
|  | 			Status: "ESTABLISHED", | ||||||
|  | 		}, | ||||||
|  | 		net.NetConnectionStat{ | ||||||
|  | 			Status: "ESTABLISHED", | ||||||
|  | 		}, | ||||||
|  | 		net.NetConnectionStat{ | ||||||
|  | 			Status: "CLOSE", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	mps.On("NetConnections").Return(netstats, nil) | ||||||
|  | 
 | ||||||
| 	cs := NewCPUStats(&mps) | 	cs := NewCPUStats(&mps) | ||||||
| 
 | 
 | ||||||
| 	cputags := map[string]string{ | 	cputags := map[string]string{ | ||||||
|  | @ -289,6 +307,17 @@ func TestSystemStats_GenerateStats(t *testing.T) { | ||||||
| 	assert.NoError(t, acc.ValidateTaggedValue("free", uint64(6412), swaptags)) | 	assert.NoError(t, acc.ValidateTaggedValue("free", uint64(6412), swaptags)) | ||||||
| 	assert.NoError(t, acc.ValidateTaggedValue("in", uint64(7), swaptags)) | 	assert.NoError(t, acc.ValidateTaggedValue("in", uint64(7), swaptags)) | ||||||
| 	assert.NoError(t, acc.ValidateTaggedValue("out", uint64(830), swaptags)) | 	assert.NoError(t, acc.ValidateTaggedValue("out", uint64(830), swaptags)) | ||||||
|  | 
 | ||||||
|  | 	acc.Points = nil | ||||||
|  | 
 | ||||||
|  | 	err = (&NetStats{&mps}).Gather(&acc) | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 	netstattags := map[string]string(nil) | ||||||
|  | 
 | ||||||
|  | 	assert.NoError(t, acc.ValidateTaggedValue("tcp_established", 2, netstattags)) | ||||||
|  | 	assert.NoError(t, acc.ValidateTaggedValue("tcp_close", 1, netstattags)) | ||||||
|  | 	assert.NoError(t, acc.ValidateTaggedValue("udp_socket", 1, netstattags)) | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Asserts that a given accumulator contains a measurment of type float64 with
 | // Asserts that a given accumulator contains a measurment of type float64 with
 | ||||||
|  |  | ||||||
|  | @ -1,60 +0,0 @@ | ||||||
| package system |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 
 |  | ||||||
| 	"github.com/influxdb/telegraf/plugins" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type TCPConnectionStats struct { |  | ||||||
| 	ps PS |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (_ *TCPConnectionStats) Description() string { |  | ||||||
| 	return "Read metrics about TCP status such as established, time wait etc" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var tcpstatSampleConfig = "" |  | ||||||
| 
 |  | ||||||
| func (_ *TCPConnectionStats) SampleConfig() string { |  | ||||||
| 	return tcpstatSampleConfig |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (s *TCPConnectionStats) Gather(acc plugins.Accumulator) error { |  | ||||||
| 	netconns, err := s.ps.NetConnections() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("error getting net connections info: %s", err) |  | ||||||
| 	} |  | ||||||
| 	counts := make(map[string]int) |  | ||||||
| 
 |  | ||||||
| 	// TODO: add family to tags or else
 |  | ||||||
| 	tags := map[string]string{} |  | ||||||
| 	for _, netcon := range netconns { |  | ||||||
| 		c, ok := counts[netcon.Status] |  | ||||||
| 		if !ok { |  | ||||||
| 			counts[netcon.Status] = 0 |  | ||||||
| 		} |  | ||||||
| 		counts[netcon.Status] = c + 1 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	acc.Add("established", counts["ESTABLISHED"], tags) |  | ||||||
| 	acc.Add("syn_sent", counts["SYN_SENT"], tags) |  | ||||||
| 	acc.Add("syn_recv", counts["SYN_RECV"], tags) |  | ||||||
| 	acc.Add("fin_wait1", counts["FIN_WAIT1"], tags) |  | ||||||
| 	acc.Add("fin_wait2", counts["FIN_WAIT2"], tags) |  | ||||||
| 	acc.Add("time_wait", counts["TIME_WAIT"], tags) |  | ||||||
| 	acc.Add("close", counts["CLOSE"], tags) |  | ||||||
| 	acc.Add("close_wait", counts["CLOSE_WAIT"], tags) |  | ||||||
| 	acc.Add("last_ack", counts["LAST_ACK"], tags) |  | ||||||
| 	acc.Add("listen", counts["LISTEN"], tags) |  | ||||||
| 	acc.Add("closing", counts["CLOSING"], tags) |  | ||||||
| 	acc.Add("none", counts["NONE"], tags) |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func init() { |  | ||||||
| 	plugins.Add("tcpconn", func() plugins.Plugin { |  | ||||||
| 		return &TCPConnectionStats{ps: &systemPS{}} |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue