in spectator/meter/id.go [31:78]
func (id *Id) MapKey() string {
id.keyOnce.Do(func() {
// if the key was set directly during Id construction, then do not
// compute a value.
if id.key != "" {
return
}
buf := builderPool.Get().(*strings.Builder)
buf.Reset()
defer builderPool.Put(buf)
const errKey = "ERR"
id.key = func() string {
_, err := buf.WriteString(id.name)
if err != nil {
return errKey
}
keys := make([]string, 0, len(id.tags))
for k := range id.tags {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
v := id.tags[k]
_, err = buf.WriteRune('|')
if err != nil {
return errKey
}
_, err = buf.WriteString(k)
if err != nil {
return errKey
}
_, err = buf.WriteRune('|')
if err != nil {
return errKey
}
_, err = buf.WriteString(v)
if err != nil {
return errKey
}
}
return buf.String()
}()
})
return id.key
}