| 
 | 1 | +//go:build requires_docker  | 
 | 2 | +// +build requires_docker  | 
 | 3 | + | 
 | 4 | +package integration  | 
 | 5 | + | 
 | 6 | +import (  | 
 | 7 | +	"compress/gzip"  | 
 | 8 | +	"fmt"  | 
 | 9 | +	"net/http"  | 
 | 10 | +	"testing"  | 
 | 11 | +	"time"  | 
 | 12 | + | 
 | 13 | +	"github.com/stretchr/testify/require"  | 
 | 14 | + | 
 | 15 | +	"github.com/cortexproject/cortex/integration/e2e"  | 
 | 16 | +	e2edb "github.com/cortexproject/cortex/integration/e2e/db"  | 
 | 17 | +	"github.com/cortexproject/cortex/integration/e2ecortex"  | 
 | 18 | +)  | 
 | 19 | + | 
 | 20 | +func TestQueryResponseCompression(t *testing.T) {  | 
 | 21 | +	s, err := e2e.NewScenario(networkName)  | 
 | 22 | +	require.NoError(t, err)  | 
 | 23 | +	defer s.Close()  | 
 | 24 | + | 
 | 25 | +	// Start dependencies.  | 
 | 26 | +	consul := e2edb.NewConsul()  | 
 | 27 | +	minio := e2edb.NewMinio(9000, bucketName)  | 
 | 28 | +	require.NoError(t, s.StartAndWaitReady(consul, minio))  | 
 | 29 | + | 
 | 30 | +	flags := mergeFlags(BlocksStorageFlags(), map[string]string{  | 
 | 31 | +		"-api.response-compression-enabled": "true",  | 
 | 32 | +	})  | 
 | 33 | + | 
 | 34 | +	distributor := e2ecortex.NewDistributor("distributor", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")  | 
 | 35 | +	ingester := e2ecortex.NewIngester("ingester", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")  | 
 | 36 | +	require.NoError(t, s.StartAndWaitReady(distributor, ingester))  | 
 | 37 | + | 
 | 38 | +	// Wait until the distributor has updated the ring.  | 
 | 39 | +	require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))  | 
 | 40 | + | 
 | 41 | +	// Push series to Cortex.  | 
 | 42 | +	now := time.Now()  | 
 | 43 | +	c, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), "", "", "", "user-1")  | 
 | 44 | +	require.NoError(t, err)  | 
 | 45 | + | 
 | 46 | +	series, _ := generateSeries("series_1", now)  | 
 | 47 | +	res, err := c.Push(series)  | 
 | 48 | +	require.NoError(t, err)  | 
 | 49 | +	require.Equal(t, 200, res.StatusCode)  | 
 | 50 | + | 
 | 51 | +	querier := e2ecortex.NewQuerier("querier", e2ecortex.RingStoreConsul, consul.NetworkHTTPEndpoint(), flags, "")  | 
 | 52 | +	require.NoError(t, s.StartAndWaitReady(querier))  | 
 | 53 | + | 
 | 54 | +	// Wait until the querier has updated the ring.  | 
 | 55 | +	require.NoError(t, querier.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))  | 
 | 56 | + | 
 | 57 | +	endpoint := fmt.Sprintf("http://%s/api/prom/api/v1/query?query=series_1", querier.HTTPEndpoint())  | 
 | 58 | + | 
 | 59 | +	t.Run("Compressed", func(t *testing.T) {  | 
 | 60 | +		req, err := http.NewRequest("GET", endpoint, nil)  | 
 | 61 | +		require.NoError(t, err)  | 
 | 62 | +		req.Header.Set("X-Scope-OrgID", "user-1")  | 
 | 63 | +		req.Header.Set("Accept-Encoding", "gzip")  | 
 | 64 | + | 
 | 65 | +		resp, err := http.DefaultClient.Do(req)  | 
 | 66 | +		require.NoError(t, err)  | 
 | 67 | +		defer resp.Body.Close()  | 
 | 68 | + | 
 | 69 | +		require.Equal(t, http.StatusOK, resp.StatusCode)  | 
 | 70 | +		require.Equal(t, "gzip", resp.Header.Get("Content-Encoding"))  | 
 | 71 | + | 
 | 72 | +		gzipReader, err := gzip.NewReader(resp.Body)  | 
 | 73 | +		require.NoError(t, err)  | 
 | 74 | +		defer gzipReader.Close()  | 
 | 75 | +	})  | 
 | 76 | + | 
 | 77 | +	t.Run("Uncompressed", func(t *testing.T) {  | 
 | 78 | +		req, err := http.NewRequest("GET", endpoint, nil)  | 
 | 79 | +		require.NoError(t, err)  | 
 | 80 | +		req.Header.Set("X-Scope-OrgID", "user-1")  | 
 | 81 | + | 
 | 82 | +		resp, err := http.DefaultClient.Do(req)  | 
 | 83 | +		require.NoError(t, err)  | 
 | 84 | +		defer resp.Body.Close()  | 
 | 85 | + | 
 | 86 | +		require.Equal(t, http.StatusOK, resp.StatusCode)  | 
 | 87 | +		require.Empty(t, resp.Header.Get("Content-Encoding"))  | 
 | 88 | +	})  | 
 | 89 | +}  | 
0 commit comments