From a8bcebcc9be7840d97dde31b1a4308489e2aa316 Mon Sep 17 00:00:00 2001 From: Andrej Ocenas Date: Mon, 4 Jul 2022 14:07:04 +0200 Subject: [PATCH 1/2] Add suggestions --- pkg/tsdb/prometheus/client/client.go | 7 +++++-- pkg/tsdb/prometheus/resource/resource.go | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/tsdb/prometheus/client/client.go b/pkg/tsdb/prometheus/client/client.go index 73d8d096273c..21e847afe0fa 100644 --- a/pkg/tsdb/prometheus/client/client.go +++ b/pkg/tsdb/prometheus/client/client.go @@ -138,10 +138,13 @@ func createRequest(ctx context.Context, method string, u *url.URL, body []byte, if header != nil { request.Header = header } - // This may not be true but right now we don't have more information here and seems like we send just this type - // of encoding right now if it is a POST if strings.ToUpper(method) == http.MethodPost { + // This may not be true but right now we don't have more information here and seems like we send just this type + // of encoding right now if it is a POST request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + // This allows transport to retry request. See https://github.com/prometheus/client_golang/pull/1022 + // It's set to nil so it is not actually sent over the wire, just used in Go http lib to retry requests. + request.Header["Idempotency-Key"] = nil } return request, nil } diff --git a/pkg/tsdb/prometheus/resource/resource.go b/pkg/tsdb/prometheus/resource/resource.go index 6526e9ca9601..bf69cd5d8c17 100644 --- a/pkg/tsdb/prometheus/resource/resource.go +++ b/pkg/tsdb/prometheus/resource/resource.go @@ -1,9 +1,9 @@ package resource import ( + "bytes" "context" "fmt" - "io/ioutil" "net/http" "github.com/grafana/grafana-plugin-sdk-go/backend" @@ -83,14 +83,17 @@ func (r *Resource) Execute(ctx context.Context, req *backend.CallResourceRequest } }() - data, err := ioutil.ReadAll(resp.Body) + var buf bytes.Buffer + // Should be more efficient than ReadAll. See https://github.com/prometheus/client_golang/pull/976 + _, err = buf.ReadFrom(resp.Body) + body := buf.Bytes() if err != nil { return nil, err } callResponse := &backend.CallResourceResponse{ Status: resp.StatusCode, Headers: resp.Header, - Body: data, + Body: body, } return callResponse, err From 3caae45420e642c2a99f70eb3a6c252e1bd79bff Mon Sep 17 00:00:00 2001 From: Andrej Ocenas Date: Mon, 4 Jul 2022 16:54:43 +0200 Subject: [PATCH 2/2] Fix tests --- pkg/tsdb/prometheus/prometheus_test.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/tsdb/prometheus/prometheus_test.go b/pkg/tsdb/prometheus/prometheus_test.go index 94ed8acf208f..4cca2bacb95f 100644 --- a/pkg/tsdb/prometheus/prometheus_test.go +++ b/pkg/tsdb/prometheus/prometheus_test.go @@ -95,7 +95,14 @@ func TestService(t *testing.T) { sender := &fakeSender{} err := service.CallResource(context.Background(), req, sender) require.NoError(t, err) - require.Equal(t, http.Header{"Content-Type": {"application/x-www-form-urlencoded"}, "foo": {"bar"}}, httpProvider.Roundtripper.Req.Header) + require.Equal( + t, + http.Header{ + "Content-Type": {"application/x-www-form-urlencoded"}, + "Idempotency-Key": []string(nil), + "foo": {"bar"}, + }, + httpProvider.Roundtripper.Req.Header) require.Equal(t, http.MethodPost, httpProvider.Roundtripper.Req.Method) body, err := io.ReadAll(httpProvider.Roundtripper.Req.Body) require.NoError(t, err)