Fix handling of invalid/empty json response (#209)

Signed-off-by: Mikkel Oscar Lyderik Larsen <mikkel.larsen@zalando.de>
This commit is contained in:
Mikkel Oscar Lyderik Larsen
2020-10-02 10:57:53 +02:00
committed by GitHub
parent b677e814be
commit be7567efea
2 changed files with 20 additions and 1 deletions

View File

@ -72,7 +72,7 @@ func (g *JSONPathMetricsGetter) GetMetric(metricsURL url.URL) (float64, error) {
return 0, err
}
if len(nodes) > 1 {
if len(nodes) != 1 {
return 0, fmt.Errorf("unexpected json: expected single numeric or array value")
}

View File

@ -1,6 +1,7 @@
package httpmetrics
import (
"errors"
"fmt"
"net/http"
"net/http/httptest"
@ -27,6 +28,7 @@ func TestJSONPathMetricsGetter(t *testing.T) {
jsonPath string
result float64
aggregator AggregatorFunc
err error
}{
{
name: "basic single value",
@ -49,6 +51,18 @@ func TestJSONPathMetricsGetter(t *testing.T) {
result: 5,
aggregator: Average,
},
{
name: "json path not resulting in array or number should lead to error",
jsonResponse: []byte(`{"metric.value":5}`),
jsonPath: "$['invalid.metric.values']",
err: errors.New("unexpected json: expected single numeric or array value"),
},
{
name: "invalid json should error",
jsonResponse: []byte(`{`),
jsonPath: "$['invalid.metric.values']",
err: errors.New("unexpected end of file"),
},
} {
t.Run(tc.name, func(t *testing.T) {
server := makeTestHTTPServer(t, tc.jsonResponse)
@ -58,6 +72,11 @@ func TestJSONPathMetricsGetter(t *testing.T) {
url, err := url.Parse(fmt.Sprintf("%s/metrics", server.URL))
require.NoError(t, err)
metric, err := getter.GetMetric(*url)
if tc.err != nil {
require.Error(t, err)
require.Equal(t, tc.err.Error(), err.Error())
return
}
require.NoError(t, err)
require.Equal(t, tc.result, metric)
})