Skip to content

Commit b44644b

Browse files
titilambertsparrc
authored andcommitted
Add response time to httpjson plugin
closes influxdata#475
1 parent 7bfb429 commit b44644b

File tree

3 files changed

+31
-13
lines changed

3 files changed

+31
-13
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Features
44
- [#509](https://github.com/influxdb/telegraf/pull/509): Flatten JSON arrays with indices. Thanks @psilva261!
55
- [#512](https://github.com/influxdata/telegraf/pull/512): Python 3 build script, add lsof dep to package. Thanks @Ormod!
6+
- [#475](https://github.com/influxdata/telegraf/pull/475): Add response time to httpjson plugin. Thanks @titilambert!
67

78
### Bugfixes
89
- [#506](https://github.com/influxdb/telegraf/pull/506): Ping input doesn't return response time metric when timeout. Thanks @titilambert!

plugins/inputs/httpjson/httpjson.go

+16-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net/url"
1010
"strings"
1111
"sync"
12+
"time"
1213

1314
"github.com/influxdb/telegraf/internal"
1415
"github.com/influxdb/telegraf/plugins/inputs"
@@ -119,7 +120,8 @@ func (h *HttpJson) gatherServer(
119120
acc inputs.Accumulator,
120121
serverURL string,
121122
) error {
122-
resp, err := h.sendRequest(serverURL)
123+
resp, responseTime, err := h.sendRequest(serverURL)
124+
123125
if err != nil {
124126
return err
125127
}
@@ -141,6 +143,9 @@ func (h *HttpJson) gatherServer(
141143
delete(jsonOut, tag)
142144
}
143145

146+
if responseTime >= 0 {
147+
jsonOut["response_time"] = responseTime
148+
}
144149
f := internal.JSONFlattener{}
145150
err = f.FlattenJSON("", jsonOut)
146151
if err != nil {
@@ -164,11 +169,11 @@ func (h *HttpJson) gatherServer(
164169
// Returns:
165170
// string: body of the response
166171
// error : Any error that may have occurred
167-
func (h *HttpJson) sendRequest(serverURL string) (string, error) {
172+
func (h *HttpJson) sendRequest(serverURL string) (string, float64, error) {
168173
// Prepare URL
169174
requestURL, err := url.Parse(serverURL)
170175
if err != nil {
171-
return "", fmt.Errorf("Invalid server URL \"%s\"", serverURL)
176+
return "", -1, fmt.Errorf("Invalid server URL \"%s\"", serverURL)
172177
}
173178

174179
params := url.Values{}
@@ -180,19 +185,21 @@ func (h *HttpJson) sendRequest(serverURL string) (string, error) {
180185
// Create + send request
181186
req, err := http.NewRequest(h.Method, requestURL.String(), nil)
182187
if err != nil {
183-
return "", err
188+
return "", -1, err
184189
}
185190

191+
start := time.Now()
186192
resp, err := h.client.MakeRequest(req)
187193
if err != nil {
188-
return "", err
194+
return "", -1, err
189195
}
190-
defer resp.Body.Close()
191196

192197
defer resp.Body.Close()
198+
responseTime := time.Since(start).Seconds()
199+
193200
body, err := ioutil.ReadAll(resp.Body)
194201
if err != nil {
195-
return string(body), err
202+
return string(body), responseTime, err
196203
}
197204

198205
// Process response
@@ -203,10 +210,10 @@ func (h *HttpJson) sendRequest(serverURL string) (string, error) {
203210
http.StatusText(resp.StatusCode),
204211
http.StatusOK,
205212
http.StatusText(http.StatusOK))
206-
return string(body), err
213+
return string(body), responseTime, err
207214
}
208215

209-
return string(body), err
216+
return string(body), responseTime, err
210217
}
211218

212219
func init() {

plugins/inputs/httpjson/httpjson_test.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
const validJSON = `
1515
{
1616
"parent": {
17-
"child": 3,
17+
"child": 3.0,
1818
"ignored_child": "hi"
1919
},
2020
"ignored_null": null,
@@ -126,10 +126,16 @@ func TestHttpJson200(t *testing.T) {
126126
var acc testutil.Accumulator
127127
err := service.Gather(&acc)
128128
require.NoError(t, err)
129-
assert.Equal(t, 10, acc.NFields())
129+
assert.Equal(t, 12, acc.NFields())
130+
// Set responsetime
131+
for _, p := range acc.Points {
132+
p.Fields["response_time"] = 1.0
133+
}
134+
130135
for _, srv := range service.Servers {
131136
tags := map[string]string{"server": srv}
132137
mname := "httpjson_" + service.Name
138+
expectedFields["response_time"] = 1.0
133139
acc.AssertContainsTaggedFields(t, mname, expectedFields, tags)
134140
}
135141
}
@@ -188,11 +194,15 @@ func TestHttpJson200Tags(t *testing.T) {
188194
if service.Name == "other_webapp" {
189195
var acc testutil.Accumulator
190196
err := service.Gather(&acc)
197+
// Set responsetime
198+
for _, p := range acc.Points {
199+
p.Fields["response_time"] = 1.0
200+
}
191201
require.NoError(t, err)
192-
assert.Equal(t, 2, acc.NFields())
202+
assert.Equal(t, 4, acc.NFields())
193203
for _, srv := range service.Servers {
194204
tags := map[string]string{"server": srv, "role": "master", "build": "123"}
195-
fields := map[string]interface{}{"value": float64(15)}
205+
fields := map[string]interface{}{"value": float64(15), "response_time": float64(1)}
196206
mname := "httpjson_" + service.Name
197207
acc.AssertContainsTaggedFields(t, mname, fields, tags)
198208
}

0 commit comments

Comments
 (0)