@@ -29,13 +29,13 @@ import (
29
29
"github.com/prometheus/common/version"
30
30
"github.com/prometheus/prometheus/pkg/labels"
31
31
"github.com/prometheus/prometheus/pkg/timestamp"
32
- "github.com/prometheus/prometheus/prompb"
33
32
"github.com/prometheus/prometheus/storage/remote"
34
33
"github.com/prometheus/prometheus/tsdb/chunkenc"
35
34
"github.com/thanos-io/thanos/pkg/component"
36
35
"github.com/thanos-io/thanos/pkg/exthttp"
37
36
"github.com/thanos-io/thanos/pkg/runutil"
38
37
"github.com/thanos-io/thanos/pkg/store/storepb"
38
+ "github.com/thanos-io/thanos/pkg/store/storepb/prompb"
39
39
"github.com/thanos-io/thanos/pkg/tracing"
40
40
"google.golang.org/grpc/codes"
41
41
"google.golang.org/grpc/status"
@@ -178,12 +178,7 @@ func (p *PrometheusStore) Series(r *storepb.SeriesRequest, s storepb.Store_Serie
178
178
for k , v := range lbm {
179
179
lset = append (lset , storepb.Label {Name : k , Value : v })
180
180
}
181
- for _ , l := range externalLabels {
182
- lset = append (lset , storepb.Label {
183
- Name : l .Name ,
184
- Value : l .Value ,
185
- })
186
- }
181
+ lset = append (lset , storepb .PromLabelsToLabelsUnsafe (externalLabels )... )
187
182
sort .Slice (lset , func (i , j int ) bool {
188
183
return lset [i ].Name < lset [j ].Name
189
184
})
@@ -518,32 +513,34 @@ func (p *PrometheusStore) encodeChunk(ss []prompb.Sample) (storepb.Chunk_Encodin
518
513
519
514
// translateAndExtendLabels transforms a metrics into a protobuf label set. It additionally
520
515
// attaches the given labels to it, overwriting existing ones on collision.
516
+ // Both input labels are expected to be sorted.
517
+ //
518
+ // NOTE(bwplotka): Don't use modify passed slices as we reuse underlying memory.
521
519
func (p * PrometheusStore ) translateAndExtendLabels (m []prompb.Label , extend labels.Labels ) []storepb.Label {
520
+ pbLabels := storepb .PrompbLabelsToLabelsUnsafe (m )
521
+ pbExtend := storepb .PromLabelsToLabelsUnsafe (extend )
522
+
522
523
lset := make ([]storepb.Label , 0 , len (m )+ len (extend ))
524
+ ei := 0
523
525
524
- for _ , l := range m {
525
- if extend .Get (l .Name ) != "" {
526
- continue
526
+ Outer:
527
+ for _ , l := range pbLabels {
528
+ for ei < len (pbExtend ) {
529
+ if l .Name < pbExtend [ei ].Name {
530
+ break
531
+ }
532
+ lset = append (lset , pbExtend [ei ])
533
+ ei ++
534
+ if l .Name == pbExtend [ei - 1 ].Name {
535
+ continue Outer
536
+ }
527
537
}
528
- lset = append (lset , storepb.Label {
529
- Name : l .Name ,
530
- Value : l .Value ,
531
- })
538
+ lset = append (lset , l )
532
539
}
533
-
534
- return extendLset (lset , extend )
535
- }
536
-
537
- func extendLset (lset []storepb.Label , extend labels.Labels ) []storepb.Label {
538
- for _ , l := range extend {
539
- lset = append (lset , storepb.Label {
540
- Name : l .Name ,
541
- Value : l .Value ,
542
- })
540
+ for ei < len (pbExtend ) {
541
+ lset = append (lset , pbExtend [ei ])
542
+ ei ++
543
543
}
544
- sort .Slice (lset , func (i , j int ) bool {
545
- return lset [i ].Name < lset [j ].Name
546
- })
547
544
return lset
548
545
}
549
546
0 commit comments