Add gauges for allocated memory for queued UDP and TCP packages (#1503)
* Two new states will be added to the tcpstat collector called rx_queued_bytes and tx_queued_bytes. For UDP datagrams an additional collector 'udp_queues' can be used to expose the total lengths of the tx_queue and rx_queue. @SuperQ and @discordianfish this changes gives us the option to check for overloaded UDP + TCP processing. The names of the new TCP states and the UDP metric can be discussed. The current reasons are just: I don't want to add another collector for the same exposed file, so I just added the new states to the tcpstat collector. I chose the name 'udp_queue' instead of 'udpstat' as UDP has no state. Signed-off-by: Peter Bueschel <peter.bueschel@logmein.com>
This commit is contained in:
parent
4891b01b6c
commit
da5972b539
9 changed files with 189 additions and 4 deletions
|
|
@ -28,8 +28,27 @@ func Test_parseTCPStatsError(t *testing.T) {
|
|||
name: "too few fields",
|
||||
in: "sl local_address\n 0: 00000000:0016",
|
||||
},
|
||||
{
|
||||
name: "missing colon in tx-rx field",
|
||||
in: "sl local_address rem_address st tx_queue rx_queue\n" +
|
||||
" 1: 0F02000A:0016 0202000A:8B6B 01 0000000000000001",
|
||||
},
|
||||
{
|
||||
name: "tx parsing issue",
|
||||
in: "sl local_address rem_address st tx_queue rx_queue\n" +
|
||||
" 1: 0F02000A:0016 0202000A:8B6B 01 0000000x:00000001",
|
||||
},
|
||||
{
|
||||
name: "rx parsing issue",
|
||||
in: "sl local_address rem_address st tx_queue rx_queue\n" +
|
||||
" 1: 0F02000A:0016 0202000A:8B6B 01 00000000:0000000x",
|
||||
},
|
||||
{
|
||||
name: "state parsing issue",
|
||||
in: "sl local_address rem_address st tx_queue rx_queue\n" +
|
||||
" 1: 0F02000A:0016 0202000A:8B6B 0H 00000000:00000001",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if _, err := parseTCPStats(strings.NewReader(tt.in)); err == nil {
|
||||
|
|
@ -40,6 +59,14 @@ func Test_parseTCPStatsError(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestTCPStat(t *testing.T) {
|
||||
|
||||
noFile, _ := os.Open("follow the white rabbit")
|
||||
defer noFile.Close()
|
||||
|
||||
if _, err := parseTCPStats(noFile); err == nil {
|
||||
t.Fatal("expected an error, but none occurred")
|
||||
}
|
||||
|
||||
file, err := os.Open("fixtures/proc/net/tcpstat")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
@ -58,4 +85,39 @@ func TestTCPStat(t *testing.T) {
|
|||
if want, got := 1, int(tcpStats[tcpListen]); want != got {
|
||||
t.Errorf("want tcpstat number of listen state %d, got %d", want, got)
|
||||
}
|
||||
|
||||
if want, got := 42, int(tcpStats[tcpTxQueuedBytes]); want != got {
|
||||
t.Errorf("want tcpstat number of bytes in tx queue %d, got %d", want, got)
|
||||
}
|
||||
if want, got := 1, int(tcpStats[tcpRxQueuedBytes]); want != got {
|
||||
t.Errorf("want tcpstat number of bytes in rx queue %d, got %d", want, got)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func Test_getTCPStats(t *testing.T) {
|
||||
type args struct {
|
||||
statsFile string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "file not found",
|
||||
args: args{statsFile: "somewhere over the rainbow"},
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
_, err := getTCPStats(tt.args.statsFile)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("getTCPStats() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
// other cases are covered by TestTCPStat()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue