From 16decd17f60fb0e7749a692f398df8fcd1cc303c Mon Sep 17 00:00:00 2001 From: Albert Teoh Date: Sun, 3 Dec 2023 20:53:55 +1100 Subject: [PATCH] Add test for no data case Signed-off-by: Albert Teoh --- .../prometheus/metricsstore/reader_test.go | 59 ++++++++++++++++++- ...{empty_errors.json => empty_response.json} | 0 2 files changed, 56 insertions(+), 3 deletions(-) rename plugin/metrics/prometheus/metricsstore/testdata/{empty_errors.json => empty_response.json} (100%) diff --git a/plugin/metrics/prometheus/metricsstore/reader_test.go b/plugin/metrics/prometheus/metricsstore/reader_test.go index 6b252bfd012..576df191566 100644 --- a/plugin/metrics/prometheus/metricsstore/reader_test.go +++ b/plugin/metrics/prometheus/metricsstore/reader_test.go @@ -487,7 +487,7 @@ func TestGetErrorRates(t *testing.T) { } } -func TestGetErrorRatesEmpty(t *testing.T) { +func TestGetErrorRatesZero(t *testing.T) { params := metricsstore.ErrorRateQueryParameters{ BaseQueryParameters: buildTestBaseQueryParametersFrom(metricsTestCase{ serviceNames: []string{"emailservice"}, @@ -505,7 +505,7 @@ func TestGetErrorRatesEmpty(t *testing.T) { `span_kind =~ "SPAN_KIND_SERVER"}[10m])) by (service_name)` ) wantPromQLQueries := []string{queryErrorRate, queryCallRate} - responses := []string{"testdata/empty_errors.json", "testdata/service_datapoint_response.json"} + responses := []string{"testdata/empty_response.json", "testdata/service_datapoint_response.json"} var callCount int mockPrometheus := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -550,6 +550,59 @@ func TestGetErrorRatesEmpty(t *testing.T) { assert.Len(t, exp.GetSpans(), 2, "expected an error rate query and a call rate query to be made") } +func TestGetErrorRatesNull(t *testing.T) { + params := metricsstore.ErrorRateQueryParameters{ + BaseQueryParameters: buildTestBaseQueryParametersFrom(metricsTestCase{ + serviceNames: []string{"emailservice"}, + spanKinds: []string{"SPAN_KIND_SERVER"}, + }), + } + tracer, exp, closer := tracerProvider(t) + defer closer() + + const ( + queryErrorRate = `sum(rate(calls{service_name =~ "emailservice", status_code = "STATUS_CODE_ERROR", ` + + `span_kind =~ "SPAN_KIND_SERVER"}[10m])) by (service_name) / ` + + `sum(rate(calls{service_name =~ "emailservice", span_kind =~ "SPAN_KIND_SERVER"}[10m])) by (service_name)` + queryCallRate = `sum(rate(calls{service_name =~ "emailservice", ` + + `span_kind =~ "SPAN_KIND_SERVER"}[10m])) by (service_name)` + ) + wantPromQLQueries := []string{queryErrorRate, queryCallRate} + responses := []string{"testdata/empty_response.json", "testdata/empty_response.json"} + var callCount int + + mockPrometheus := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, _ := io.ReadAll(r.Body) + defer r.Body.Close() + + u, err := url.Parse("http://" + r.Host + r.RequestURI + "?" + string(body)) + require.NoError(t, err) + + q := u.Query() + promQuery := q.Get("query") + assert.Equal(t, wantPromQLQueries[callCount], promQuery) + sendResponse(t, w, responses[callCount]) + callCount++ + })) + + logger := zap.NewNop() + address := mockPrometheus.Listener.Addr().String() + + cfg := defaultConfig + cfg.ServerURL = "http://" + address + cfg.ConnectTimeout = defaultTimeout + + reader, err := NewMetricsReader(cfg, logger, tracer) + require.NoError(t, err) + + defer mockPrometheus.Close() + + m, err := reader.GetErrorRates(context.Background(), ¶ms) + require.NoError(t, err) + assert.Empty(t, m.Metrics, "expect no error data available") + assert.Len(t, exp.GetSpans(), 2, "expected an error rate query and a call rate query to be made") +} + func TestGetErrorRatesErrors(t *testing.T) { for _, tc := range []struct { name string @@ -586,7 +639,7 @@ func TestGetErrorRatesErrors(t *testing.T) { `span_kind =~ "SPAN_KIND_SERVER"}[10m])) by (service_name)` ) wantPromQLQueries := []string{queryErrorRate, queryCallRate} - responses := []string{"testdata/empty_errors.json", "testdata/service_datapoint_response.json"} + responses := []string{"testdata/empty_response.json", "testdata/service_datapoint_response.json"} var callCount int mockPrometheus := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/plugin/metrics/prometheus/metricsstore/testdata/empty_errors.json b/plugin/metrics/prometheus/metricsstore/testdata/empty_response.json similarity index 100% rename from plugin/metrics/prometheus/metricsstore/testdata/empty_errors.json rename to plugin/metrics/prometheus/metricsstore/testdata/empty_response.json