tracer: add missing UniqLabels function

Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
Василий Толстов 2023-09-01 15:48:27 +03:00
parent 54b13bbded
commit f890f1d8b4

View File

@ -3,6 +3,8 @@ package tracer // import "go.unistack.org/micro/v4/tracer"
import ( import (
"context" "context"
"fmt"
"sort"
"go.unistack.org/micro/v4/options" "go.unistack.org/micro/v4/options"
) )
@ -44,3 +46,36 @@ type Span interface {
// Kind returns span kind // Kind returns span kind
Kind() SpanKind Kind() SpanKind
} }
// sort labels alphabeticaly by label name
type byKey []interface{}
func (k byKey) Len() int { return len(k) / 2 }
func (k byKey) Less(i, j int) bool { return fmt.Sprintf("%s", k[i*2]) < fmt.Sprintf("%s", k[j*2]) }
func (k byKey) Swap(i, j int) {
k[i*2], k[j*2] = k[j*2], k[i*2]
k[i*2+1], k[j*2+1] = k[j*2+1], k[i*2+1]
}
func UniqLabels(labels []interface{}) []interface{} {
if len(labels)%2 == 1 {
labels = labels[:len(labels)-1]
}
if len(labels) > 2 {
sort.Sort(byKey(labels))
idx := 0
for {
if labels[idx] == labels[idx+2] {
copy(labels[idx:], labels[idx+2:])
labels = labels[:len(labels)-2]
} else {
idx += 2
}
if idx+2 >= len(labels) {
break
}
}
}
return labels
}