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

     1  package labels
     2  
     3  import (
     4  	"sort"
     5  	"strings"
     6  
     7  	"github.com/prometheus/common/model"
     8  
     9  	profilev1 "github.com/grafana/pyroscope/api/gen/proto/go/google/v1"
    10  	typesv1 "github.com/grafana/pyroscope/api/gen/proto/go/types/v1"
    11  	phlaremodel "github.com/grafana/pyroscope/pkg/model"
    12  )
    13  
    14  func CreateProfileLabels(enforceOrder bool, p *profilev1.Profile, externalLabels ...*typesv1.LabelPair) ([]phlaremodel.Labels, []model.Fingerprint) {
    15  	// build label set per sample type before references are rewritten
    16  	var (
    17  		sb                                             strings.Builder
    18  		lbls                                           = phlaremodel.NewLabelsBuilder(externalLabels)
    19  		sampleType, sampleUnit, periodType, periodUnit string
    20  		metricName                                     = phlaremodel.Labels(externalLabels).Get(model.MetricNameLabel)
    21  	)
    22  
    23  	// Inject into labels the __service_name__ label if it exists
    24  	// This allows better locality of the data in parquet files (row group are sorted by).
    25  	if serviceName := phlaremodel.Labels(externalLabels).Get(phlaremodel.LabelNameServiceName); serviceName != "" {
    26  		lbls.Set(phlaremodel.LabelNameServiceNamePrivate, serviceName)
    27  	}
    28  
    29  	// set common labels
    30  	if p.PeriodType != nil {
    31  		periodType = p.StringTable[p.PeriodType.Type]
    32  		lbls.Set(phlaremodel.LabelNamePeriodType, periodType)
    33  		periodUnit = p.StringTable[p.PeriodType.Unit]
    34  		lbls.Set(phlaremodel.LabelNamePeriodUnit, periodUnit)
    35  	}
    36  
    37  	profilesLabels := make([]phlaremodel.Labels, len(p.SampleType))
    38  	seriesRefs := make([]model.Fingerprint, len(p.SampleType))
    39  	for pos := range p.SampleType {
    40  		sampleType = p.StringTable[p.SampleType[pos].Type]
    41  		lbls.Set(phlaremodel.LabelNameType, sampleType)
    42  		sampleUnit = p.StringTable[p.SampleType[pos].Unit]
    43  		lbls.Set(phlaremodel.LabelNameUnit, sampleUnit)
    44  
    45  		sb.Reset()
    46  		_, _ = sb.WriteString(metricName)
    47  		_, _ = sb.WriteRune(':')
    48  		_, _ = sb.WriteString(sampleType)
    49  		_, _ = sb.WriteRune(':')
    50  		_, _ = sb.WriteString(sampleUnit)
    51  		_, _ = sb.WriteRune(':')
    52  		_, _ = sb.WriteString(periodType)
    53  		_, _ = sb.WriteRune(':')
    54  		_, _ = sb.WriteString(periodUnit)
    55  		t := sb.String()
    56  		lbls.Set(phlaremodel.LabelNameProfileType, t)
    57  		lbs := lbls.LabelsUnsorted().Clone()
    58  		if enforceOrder {
    59  			sort.Sort(phlaremodel.LabelsEnforcedOrder(lbs))
    60  		} else {
    61  			sort.Sort(lbs)
    62  		}
    63  		lbs = lbs.Unique()
    64  		profilesLabels[pos] = lbs
    65  		seriesRefs[pos] = model.Fingerprint(lbs.Hash())
    66  
    67  	}
    68  	return profilesLabels, seriesRefs
    69  }