From be7567efea48e7d6706d57a0bad116e6c6a0d8c2 Mon Sep 17 00:00:00 2001 From: Mikkel Oscar Lyderik Larsen Date: Fri, 2 Oct 2020 10:57:53 +0200 Subject: [PATCH] Fix handling of invalid/empty json response (#209) Signed-off-by: Mikkel Oscar Lyderik Larsen --- pkg/collector/httpmetrics/json_path.go | 2 +- pkg/collector/httpmetrics/json_path_test.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/collector/httpmetrics/json_path.go b/pkg/collector/httpmetrics/json_path.go index fdaf634..871565f 100644 --- a/pkg/collector/httpmetrics/json_path.go +++ b/pkg/collector/httpmetrics/json_path.go @@ -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") } diff --git a/pkg/collector/httpmetrics/json_path_test.go b/pkg/collector/httpmetrics/json_path_test.go index 88c5990..716f283 100644 --- a/pkg/collector/httpmetrics/json_path_test.go +++ b/pkg/collector/httpmetrics/json_path_test.go @@ -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) })