Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/pkg/querier/queryrange/queryrangebase/marshaling_test.go

91 lines
2.1 KiB

package queryrangebase
import (
"bytes"
"context"
"io/ioutil"
"math/rand"
"net/http"
"testing"
"github.com/stretchr/testify/require"
"github.com/grafana/loki/pkg/logproto"
)
func BenchmarkPrometheusCodec_DecodeResponse(b *testing.B) {
const (
numSeries = 1000
numSamplesPerSeries = 1000
)
// Generate a mocked response and marshal it.
res := mockPrometheusResponse(numSeries, numSamplesPerSeries)
encodedRes, err := json.Marshal(res)
require.NoError(b, err)
b.Log("test prometheus response size:", len(encodedRes))
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
_, err := PrometheusCodec.DecodeResponse(context.Background(), &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewReader(encodedRes)),
ContentLength: int64(len(encodedRes)),
}, nil)
require.NoError(b, err)
}
}
func BenchmarkPrometheusCodec_EncodeResponse(b *testing.B) {
const (
numSeries = 1000
numSamplesPerSeries = 1000
)
// Generate a mocked response and marshal it.
res := mockPrometheusResponse(numSeries, numSamplesPerSeries)
b.ResetTimer()
b.ReportAllocs()
for n := 0; n < b.N; n++ {
_, err := PrometheusCodec.EncodeResponse(context.Background(), res)
require.NoError(b, err)
}
}
func mockPrometheusResponse(numSeries, numSamplesPerSeries int) *PrometheusResponse {
stream := make([]SampleStream, numSeries)
for s := 0; s < numSeries; s++ {
// Generate random samples.
samples := make([]logproto.Sample, numSamplesPerSeries)
for i := 0; i < numSamplesPerSeries; i++ {
samples[i] = logproto.Sample{
Value: rand.Float64(),
Timestamp: int64(i),
}
}
// Generate random labels.
lbls := make([]logproto.LabelAdapter, 10)
for i := range lbls {
lbls[i].Name = "a_medium_size_label_name"
lbls[i].Value = "a_medium_size_label_value_that_is_used_to_benchmark_marshalling"
}
stream[s] = SampleStream{
Labels: lbls,
Samples: samples,
}
}
return &PrometheusResponse{
Status: "success",
Data: PrometheusData{
ResultType: "vector",
Result: stream,
},
}
}