Skip to content

Commit

Permalink
Add result_type field to net_response input plugin
Browse files Browse the repository at this point in the history
Fix test
  • Loading branch information
Bobby Shannon committed Jul 6, 2017
1 parent 2740a3b commit ad0470f
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 20 deletions.
2 changes: 1 addition & 1 deletion plugins/inputs/net_response/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ It can also check response text.

- net_response
- response_time (float, seconds)
- string_found (bool) # Only if "expected: option is set
- result_type (string) # success, timeout, connection_failed, send_failed, read_failed, string_mismatch

### Tags:

Expand Down
31 changes: 21 additions & 10 deletions plugins/inputs/net_response/net_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,12 @@ func (n *NetResponse) TcpGather() (map[string]interface{}, error) {
responseTime := time.Since(start).Seconds()
// Handle error
if err != nil {
return nil, err
if e, ok := err.(net.Error); ok && e.Timeout() {
fields["result_type"] = "timeout"
} else {
fields["result_type"] = "connection_failed"
}
return fields, nil
}
defer conn.Close()
// Send string if needed
Expand All @@ -87,18 +92,19 @@ func (n *NetResponse) TcpGather() (map[string]interface{}, error) {
responseTime = time.Since(start).Seconds()
// Handle error
if err != nil {
fields["string_found"] = false
fields["result_type"] = "read_failed"
} else {
// Looking for string in answer
RegEx := regexp.MustCompile(`.*` + n.Expect + `.*`)
find := RegEx.FindString(string(data))
if find != "" {
fields["string_found"] = true
fields["result_type"] = "success"
} else {
fields["string_found"] = false
fields["result_type"] = "string_mismatch"
}
}

} else {
fields["result_type"] = "success"
}
fields["response_time"] = responseTime
return fields, nil
Expand All @@ -114,11 +120,16 @@ func (n *NetResponse) UdpGather() (map[string]interface{}, error) {
LocalAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
// Connecting
conn, err := net.DialUDP("udp", LocalAddr, udpAddr)
defer conn.Close()
// Handle error
if err != nil {
return nil, err
if e, ok := err.(net.Error); ok && e.Timeout() {
fields["result_type"] = "timeout"
} else {
fields["result_type"] = "send_failed"
}
return fields, nil
}
defer conn.Close()
// Send string
msg := []byte(n.Send)
conn.Write(msg)
Expand All @@ -132,15 +143,15 @@ func (n *NetResponse) UdpGather() (map[string]interface{}, error) {
responseTime := time.Since(start).Seconds()
// Handle error
if err != nil {
return nil, err
fields["result_type"] = "read_failed"
} else {
// Looking for string in answer
RegEx := regexp.MustCompile(`.*` + n.Expect + `.*`)
find := RegEx.FindString(string(buf))
if find != "" {
fields["string_found"] = true
fields["result_type"] = "success"
} else {
fields["string_found"] = false
fields["result_type"] = "string_mismatch"
}
}
fields["response_time"] = responseTime
Expand Down
43 changes: 34 additions & 9 deletions plugins/inputs/net_response/net_response_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package net_response

import (
"net"
"regexp"
"sync"
"testing"
"time"
Expand Down Expand Up @@ -36,8 +35,18 @@ func TestTCPError(t *testing.T) {
}
// Error
err1 := c.Gather(&acc)
require.Error(t, err1)
assert.Contains(t, err1.Error(), "getsockopt: connection refused")
require.NoError(t, err1)
acc.AssertContainsTaggedFields(t,
"net_response",
map[string]interface{}{
"result_type": "connection_failed",
},
map[string]string{
"server": "",
"port": "9999",
"protocol": "tcp",
},
)
}

func TestTCPOK1(t *testing.T) {
Expand Down Expand Up @@ -68,7 +77,7 @@ func TestTCPOK1(t *testing.T) {
acc.AssertContainsTaggedFields(t,
"net_response",
map[string]interface{}{
"string_found": true,
"result_type": "success",
"response_time": 1.0,
},
map[string]string{"server": "127.0.0.1",
Expand Down Expand Up @@ -108,7 +117,7 @@ func TestTCPOK2(t *testing.T) {
acc.AssertContainsTaggedFields(t,
"net_response",
map[string]interface{}{
"string_found": false,
"result_type": "string_mismatch",
"response_time": 1.0,
},
map[string]string{"server": "127.0.0.1",
Expand All @@ -129,10 +138,26 @@ func TestUDPrror(t *testing.T) {
Expect: "test",
Protocol: "udp",
}
// Error
// Gather
err1 := c.Gather(&acc)
require.Error(t, err1)
assert.Regexp(t, regexp.MustCompile(`read udp 127.0.0.1:[0-9]*->127.0.0.1:9999: recvfrom: connection refused`), err1.Error())
// Override response time
for _, p := range acc.Metrics {
p.Fields["response_time"] = 1.0
}
// Error
require.NoError(t, err1)
acc.AssertContainsTaggedFields(t,
"net_response",
map[string]interface{}{
"result_type": "read_failed",
"response_time": 1.0,
},
map[string]string{
"server": "",
"port": "9999",
"protocol": "udp",
},
)
}

func TestUDPOK1(t *testing.T) {
Expand Down Expand Up @@ -163,7 +188,7 @@ func TestUDPOK1(t *testing.T) {
acc.AssertContainsTaggedFields(t,
"net_response",
map[string]interface{}{
"string_found": true,
"result_type": "success",
"response_time": 1.0,
},
map[string]string{"server": "127.0.0.1",
Expand Down

0 comments on commit ad0470f

Please sign in to comment.