2020-04-23 08:34:04 +00:00
|
|
|
package discoveryutils
|
|
|
|
|
|
|
|
import (
|
2020-04-24 14:50:21 +00:00
|
|
|
"encoding/json"
|
2020-04-23 08:34:04 +00:00
|
|
|
"net"
|
|
|
|
"regexp"
|
2020-04-24 14:50:21 +00:00
|
|
|
"sort"
|
2020-04-23 08:34:04 +00:00
|
|
|
"strconv"
|
2020-04-24 14:50:21 +00:00
|
|
|
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
|
2020-04-23 08:34:04 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// SanitizeLabelName replaces anything that doesn't match
|
|
|
|
// client_label.LabelNameRE with an underscore.
|
|
|
|
//
|
|
|
|
// This has been copied from Prometheus sources at util/strutil/strconv.go
|
|
|
|
func SanitizeLabelName(name string) string {
|
|
|
|
return invalidLabelCharRE.ReplaceAllString(name, "_")
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
invalidLabelCharRE = regexp.MustCompile(`[^a-zA-Z0-9_]`)
|
|
|
|
)
|
|
|
|
|
|
|
|
// JoinHostPort returns host:port.
|
|
|
|
//
|
|
|
|
// Host may be dns name, ipv4 or ipv6 address.
|
|
|
|
func JoinHostPort(host string, port int) string {
|
|
|
|
portStr := strconv.Itoa(port)
|
|
|
|
return net.JoinHostPort(host, portStr)
|
|
|
|
}
|
2020-04-24 14:50:21 +00:00
|
|
|
|
|
|
|
// SortedLabels represents sorted labels.
|
|
|
|
type SortedLabels []prompbmarshal.Label
|
|
|
|
|
|
|
|
// UnmarshalJSON unmarshals JSON from data.
|
|
|
|
func (sls *SortedLabels) UnmarshalJSON(data []byte) error {
|
|
|
|
var m map[string]string
|
|
|
|
if err := json.Unmarshal(data, &m); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
*sls = GetSortedLabels(m)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetSortedLabels returns SortedLabels built from m.
|
|
|
|
func GetSortedLabels(m map[string]string) SortedLabels {
|
|
|
|
a := make([]prompbmarshal.Label, 0, len(m))
|
|
|
|
for k, v := range m {
|
|
|
|
a = append(a, prompbmarshal.Label{
|
|
|
|
Name: k,
|
|
|
|
Value: v,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
sort.Slice(a, func(i, j int) bool {
|
|
|
|
return a[i].Name < a[j].Name
|
|
|
|
})
|
|
|
|
return a
|
|
|
|
}
|