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 }