From b6a8f5eb606c9fc86d2832c70266dc22932a256b Mon Sep 17 00:00:00 2001 From: Cyril Tovena Date: Tue, 12 Nov 2019 15:14:43 -0500 Subject: [PATCH 1/2] Pass Request to DecodeResponse in case it is required. Loki has the concept of log Direction which is essential to know when merging responses. This change allows Loki to inject the direction in the response which can be then used when merging multiple responses. Signed-off-by: Cyril Tovena --- pkg/querier/queryrange/marshaling_test.go | 2 +- pkg/querier/queryrange/query_range.go | 4 ++-- pkg/querier/queryrange/query_range_test.go | 2 +- pkg/querier/queryrange/roundtrip.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/querier/queryrange/marshaling_test.go b/pkg/querier/queryrange/marshaling_test.go index 5f355bee7a5..9e58f35edc3 100644 --- a/pkg/querier/queryrange/marshaling_test.go +++ b/pkg/querier/queryrange/marshaling_test.go @@ -19,7 +19,7 @@ func BenchmarkMarshalling(b *testing.B) { apiResp, err := PrometheusCodec.DecodeResponse(context.Background(), &http.Response{ StatusCode: 200, Body: ioutil.NopCloser(bytes.NewReader(buf)), - }) + }, nil) require.NoError(b, err) resp, err := PrometheusCodec.EncodeResponse(context.Background(), apiResp) diff --git a/pkg/querier/queryrange/query_range.go b/pkg/querier/queryrange/query_range.go index e1691c74033..6f7911937c8 100644 --- a/pkg/querier/queryrange/query_range.go +++ b/pkg/querier/queryrange/query_range.go @@ -41,7 +41,7 @@ type Codec interface { // DecodeRequest decodes a Request from an http request. DecodeRequest(context.Context, *http.Request) (Request, error) // DecodeResponse decodes a Response from an http response.. - DecodeResponse(context.Context, *http.Response) (Response, error) + DecodeResponse(context.Context, *http.Response, Request) (Response, error) // EncodeRequest encodes a Request into an http request. EncodeRequest(context.Context, Request) (*http.Request, error) // EncodeResponse encodes a Response into an http response. @@ -198,7 +198,7 @@ func (prometheusCodec) EncodeRequest(ctx context.Context, r Request) (*http.Requ return req.WithContext(ctx), nil } -func (prometheusCodec) DecodeResponse(ctx context.Context, r *http.Response) (Response, error) { +func (prometheusCodec) DecodeResponse(ctx context.Context, r *http.Response, _ Request) (Response, error) { if r.StatusCode/100 != 2 { body, _ := ioutil.ReadAll(r.Body) return nil, httpgrpc.Errorf(r.StatusCode, string(body)) diff --git a/pkg/querier/queryrange/query_range_test.go b/pkg/querier/queryrange/query_range_test.go index f9649d27907..543dd01a71f 100644 --- a/pkg/querier/queryrange/query_range_test.go +++ b/pkg/querier/queryrange/query_range_test.go @@ -89,7 +89,7 @@ func TestResponse(t *testing.T) { Header: http.Header{"Content-Type": []string{"application/json"}}, Body: ioutil.NopCloser(bytes.NewBuffer([]byte(tc.body))), } - resp, err := PrometheusCodec.DecodeResponse(context.Background(), response) + resp, err := PrometheusCodec.DecodeResponse(context.Background(), response, nil) require.NoError(t, err) assert.Equal(t, tc.expected, resp) diff --git a/pkg/querier/queryrange/roundtrip.go b/pkg/querier/queryrange/roundtrip.go index 2f1dc6e2487..c2339eb934d 100644 --- a/pkg/querier/queryrange/roundtrip.go +++ b/pkg/querier/queryrange/roundtrip.go @@ -176,5 +176,5 @@ func (q roundTripper) Do(ctx context.Context, r Request) (Response, error) { } defer func() { _ = response.Body.Close() }() - return q.codec.DecodeResponse(ctx, response) + return q.codec.DecodeResponse(ctx, response, r) } From cca981befc8ccf9ada0b89028ee8150e22e56da2 Mon Sep 17 00:00:00 2001 From: Cyril Tovena Date: Wed, 11 Dec 2019 12:24:16 -0500 Subject: [PATCH 2/2] Add more information about the change of the Decode function Signed-off-by: Cyril Tovena --- pkg/querier/queryrange/query_range.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/querier/queryrange/query_range.go b/pkg/querier/queryrange/query_range.go index 6f7911937c8..2dfde812df4 100644 --- a/pkg/querier/queryrange/query_range.go +++ b/pkg/querier/queryrange/query_range.go @@ -40,7 +40,9 @@ type Codec interface { Merger // DecodeRequest decodes a Request from an http request. DecodeRequest(context.Context, *http.Request) (Request, error) - // DecodeResponse decodes a Response from an http response.. + // DecodeResponse decodes a Response from an http response. + // The original request is also passed as a parameter this is useful for implementation that needs the request + // to merge result or build the result correctly. DecodeResponse(context.Context, *http.Response, Request) (Response, error) // EncodeRequest encodes a Request into an http request. EncodeRequest(context.Context, Request) (*http.Request, error)