parent
							
								
									17dd058308
								
							
						
					
					
						commit
						d394003739
					
				|  | @ -14,6 +14,7 @@ | |||
| - Logging: additional logging for each collection interval, track the number | ||||
| of metrics collected and from how many plugins. | ||||
| - [#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 | ||||
| - [#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 ( | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"syscall" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/influxdb/telegraf/testutil" | ||||
|  | @ -126,6 +127,23 @@ func TestSystemStats_GenerateStats(t *testing.T) { | |||
| 
 | ||||
| 	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) | ||||
| 
 | ||||
| 	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("in", uint64(7), 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
 | ||||
|  |  | |||
|  | @ -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