github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/querier/queryrange/queryrangebase/marshaling_test.go (about) 1 package queryrangebase 2 3 import ( 4 "bytes" 5 "context" 6 "io/ioutil" 7 "math/rand" 8 "net/http" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 13 "github.com/grafana/loki/pkg/logproto" 14 ) 15 16 func BenchmarkPrometheusCodec_DecodeResponse(b *testing.B) { 17 const ( 18 numSeries = 1000 19 numSamplesPerSeries = 1000 20 ) 21 22 // Generate a mocked response and marshal it. 23 res := mockPrometheusResponse(numSeries, numSamplesPerSeries) 24 encodedRes, err := json.Marshal(res) 25 require.NoError(b, err) 26 b.Log("test prometheus response size:", len(encodedRes)) 27 28 b.ResetTimer() 29 b.ReportAllocs() 30 31 for n := 0; n < b.N; n++ { 32 _, err := PrometheusCodec.DecodeResponse(context.Background(), &http.Response{ 33 StatusCode: 200, 34 Body: ioutil.NopCloser(bytes.NewReader(encodedRes)), 35 ContentLength: int64(len(encodedRes)), 36 }, nil) 37 require.NoError(b, err) 38 } 39 } 40 41 func BenchmarkPrometheusCodec_EncodeResponse(b *testing.B) { 42 const ( 43 numSeries = 1000 44 numSamplesPerSeries = 1000 45 ) 46 47 // Generate a mocked response and marshal it. 48 res := mockPrometheusResponse(numSeries, numSamplesPerSeries) 49 50 b.ResetTimer() 51 b.ReportAllocs() 52 53 for n := 0; n < b.N; n++ { 54 _, err := PrometheusCodec.EncodeResponse(context.Background(), res) 55 require.NoError(b, err) 56 } 57 } 58 59 func mockPrometheusResponse(numSeries, numSamplesPerSeries int) *PrometheusResponse { 60 stream := make([]SampleStream, numSeries) 61 for s := 0; s < numSeries; s++ { 62 // Generate random samples. 63 samples := make([]logproto.LegacySample, numSamplesPerSeries) 64 for i := 0; i < numSamplesPerSeries; i++ { 65 samples[i] = logproto.LegacySample{ 66 Value: rand.Float64(), 67 TimestampMs: int64(i), 68 } 69 } 70 71 // Generate random labels. 72 lbls := make([]logproto.LabelAdapter, 10) 73 for i := range lbls { 74 lbls[i].Name = "a_medium_size_label_name" 75 lbls[i].Value = "a_medium_size_label_value_that_is_used_to_benchmark_marshalling" 76 } 77 78 stream[s] = SampleStream{ 79 Labels: lbls, 80 Samples: samples, 81 } 82 } 83 84 return &PrometheusResponse{ 85 Status: "success", 86 Data: PrometheusData{ 87 ResultType: "vector", 88 Result: stream, 89 }, 90 } 91 }