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  }