github.com/grafana/pyroscope@v1.18.0/pkg/phlaredb/querier_test.go (about)

     1  package phlaredb
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sort"
     7  	"testing"
     8  
     9  	"github.com/google/uuid"
    10  	"github.com/prometheus/client_golang/prometheus"
    11  	"github.com/prometheus/common/model"
    12  	"github.com/prometheus/prometheus/model/labels"
    13  	"github.com/stretchr/testify/require"
    14  
    15  	typesv1 "github.com/grafana/pyroscope/api/gen/proto/go/types/v1"
    16  	phlaremodel "github.com/grafana/pyroscope/pkg/model"
    17  	v1 "github.com/grafana/pyroscope/pkg/phlaredb/schemas/v1"
    18  	"github.com/grafana/pyroscope/pkg/phlaredb/tsdb/index"
    19  )
    20  
    21  func TestQueryIndex(t *testing.T) {
    22  	a, err := newProfileIndex(32, newHeadMetrics(prometheus.NewRegistry()))
    23  	require.NoError(t, err)
    24  
    25  	for j := 0; j < 10; j++ {
    26  		lb1 := phlaremodel.Labels([]*typesv1.LabelPair{
    27  			{Name: "__name__", Value: "memory"},
    28  			{Name: "__sample__type__", Value: "bytes"},
    29  			{Name: "bar", Value: fmt.Sprint(j)},
    30  		})
    31  		sort.Sort(lb1)
    32  		lb2 := phlaremodel.Labels([]*typesv1.LabelPair{
    33  			{Name: "__name__", Value: "memory"},
    34  			{Name: "__sample__type__", Value: "count"},
    35  			{Name: "bar", Value: fmt.Sprint(j)},
    36  		})
    37  		sort.Sort(lb2)
    38  
    39  		for k := int64(0); k < 10; k++ {
    40  			id := uuid.New()
    41  			a.Add(&v1.InMemoryProfile{
    42  				ID:                id,
    43  				TimeNanos:         k,
    44  				SeriesFingerprint: model.Fingerprint(lb1.Hash()),
    45  			}, lb1, "memory")
    46  			a.Add(&v1.InMemoryProfile{
    47  				ID:                id,
    48  				TimeNanos:         k,
    49  				SeriesFingerprint: model.Fingerprint(lb2.Hash()),
    50  			}, lb2, "memory")
    51  		}
    52  	}
    53  
    54  	tmpFile := t.TempDir() + "/test.db"
    55  	_, err = a.writeTo(context.Background(), tmpFile)
    56  	require.NoError(t, err)
    57  
    58  	r, err := index.NewFileReader(tmpFile)
    59  	require.NoError(t, err)
    60  
    61  	p, err := PostingsForMatchers(r, nil, labels.MustNewMatcher(labels.MatchRegexp, "bar", "(1|2)"))
    62  	require.NoError(t, err)
    63  
    64  	lbls := make(phlaremodel.Labels, 3)
    65  	chks := make([]index.ChunkMeta, 1)
    66  	for p.Next() {
    67  		fp, err := r.Series(p.At(), &lbls, &chks)
    68  		require.NoError(t, err)
    69  		require.Equal(t, lbls.Hash(), fp)
    70  		require.Equal(t, 3, len(lbls))
    71  
    72  		require.Equal(t, "memory", lbls.Get("__name__"))
    73  		require.True(t, lbls.Get("bar") == "1" || lbls.Get("bar") == "2")
    74  
    75  		require.Equal(t, 1, len(chks))
    76  		require.Equal(t, int64(0), chks[0].MinTime)
    77  		require.Equal(t, int64(9), chks[0].MaxTime)
    78  	}
    79  }