Move signature.go and related tests to the model package.
The LabelsToSignature function is now used outside of the prometheus package, too. Leaving it in the prometheuos package is misleading design and will lead to circulat import chains soon. Change-Id: If1ca442d4023b33b138cf79fee68e82ff2a355be
This commit is contained in:
parent
ad3452a46c
commit
e5dc0421cd
|
@ -4,13 +4,11 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package prometheus
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/model"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// cache the signature of an empty label set.
|
// cache the signature of an empty label set.
|
||||||
|
@ -23,18 +21,18 @@ func LabelsToSignature(labels map[string]string) uint64 {
|
||||||
return emptyLabelSignature
|
return emptyLabelSignature
|
||||||
}
|
}
|
||||||
|
|
||||||
names := make(model.LabelNames, 0, len(labels))
|
names := make([]string, 0, len(labels))
|
||||||
for name := range labels {
|
for name := range labels {
|
||||||
names = append(names, model.LabelName(name))
|
names = append(names, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Sort(names)
|
sort.Strings(names)
|
||||||
|
|
||||||
hasher := fnv.New64a()
|
hasher := fnv.New64a()
|
||||||
|
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
hasher.Write([]byte(name))
|
hasher.Write([]byte(name))
|
||||||
hasher.Write([]byte(labels[string(name)]))
|
hasher.Write([]byte(labels[name]))
|
||||||
}
|
}
|
||||||
|
|
||||||
return hasher.Sum64()
|
return hasher.Sum64()
|
||||||
|
@ -42,22 +40,22 @@ func LabelsToSignature(labels map[string]string) uint64 {
|
||||||
|
|
||||||
// LabelValuesToSignature provides a way of building a unique signature
|
// LabelValuesToSignature provides a way of building a unique signature
|
||||||
// (i.e., fingerprint) for a given set of label's values.
|
// (i.e., fingerprint) for a given set of label's values.
|
||||||
func labelValuesToSignature(labels map[string]string) uint64 {
|
func LabelValuesToSignature(labels map[string]string) uint64 {
|
||||||
if len(labels) == 0 {
|
if len(labels) == 0 {
|
||||||
return emptyLabelSignature
|
return emptyLabelSignature
|
||||||
}
|
}
|
||||||
|
|
||||||
names := make(model.LabelNames, 0, len(labels))
|
names := make([]string, 0, len(labels))
|
||||||
for name := range labels {
|
for name := range labels {
|
||||||
names = append(names, model.LabelName(name))
|
names = append(names, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
sort.Sort(names)
|
sort.Strings(names)
|
||||||
|
|
||||||
hasher := fnv.New64a()
|
hasher := fnv.New64a()
|
||||||
|
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
hasher.Write([]byte(labels[string(name)]))
|
hasher.Write([]byte(labels[name]))
|
||||||
}
|
}
|
||||||
|
|
||||||
return hasher.Sum64()
|
return hasher.Sum64()
|
|
@ -4,14 +4,16 @@
|
||||||
// Use of this source code is governed by a BSD-style
|
// Use of this source code is governed by a BSD-style
|
||||||
// license that can be found in the LICENSE file.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
package prometheus
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testLabelsToSignature(t tester) {
|
func testLabelsToSignature(t test.Tester) {
|
||||||
var scenarios = []struct {
|
var scenarios = []struct {
|
||||||
in map[string]string
|
in map[string]string
|
||||||
out uint64
|
out uint64
|
||||||
|
@ -66,7 +68,7 @@ func BenchmarkLabelToSignature(b *testing.B) {
|
||||||
|
|
||||||
func benchmarkLabelValuesToSignature(b *testing.B, l map[string]string, e uint64) {
|
func benchmarkLabelValuesToSignature(b *testing.B, l map[string]string, e uint64) {
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
if a := labelValuesToSignature(l); a != e {
|
if a := LabelValuesToSignature(l); a != e {
|
||||||
b.Fatalf("expected signature of %d for %s, got %d", e, l, a)
|
b.Fatalf("expected signature of %d for %s, got %d", e, l, a)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -14,6 +14,8 @@ import (
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
|
||||||
"code.google.com/p/goprotobuf/proto"
|
"code.google.com/p/goprotobuf/proto"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(matt): Refactor to de-duplicate behaviors.
|
// TODO(matt): Refactor to de-duplicate behaviors.
|
||||||
|
@ -49,7 +51,7 @@ func (metric *counter) Set(labels map[string]string, value float64) float64 {
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
@ -67,7 +69,7 @@ func (metric *counter) Set(labels map[string]string, value float64) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (metric *counter) Reset(labels map[string]string) {
|
func (metric *counter) Reset(labels map[string]string) {
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
@ -100,7 +102,7 @@ func (metric *counter) IncrementBy(labels map[string]string, value float64) floa
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
@ -126,7 +128,7 @@ func (metric *counter) DecrementBy(labels map[string]string, value float64) floa
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
|
|
@ -14,6 +14,8 @@ import (
|
||||||
"code.google.com/p/goprotobuf/proto"
|
"code.google.com/p/goprotobuf/proto"
|
||||||
|
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A gauge metric merely provides an instantaneous representation of a scalar
|
// A gauge metric merely provides an instantaneous representation of a scalar
|
||||||
|
@ -55,7 +57,7 @@ func (metric *gauge) Set(labels map[string]string, value float64) float64 {
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
@ -73,7 +75,7 @@ func (metric *gauge) Set(labels map[string]string, value float64) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (metric *gauge) Reset(labels map[string]string) {
|
func (metric *gauge) Reset(labels map[string]string) {
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
|
|
@ -18,6 +18,8 @@ import (
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
|
||||||
"code.google.com/p/goprotobuf/proto"
|
"code.google.com/p/goprotobuf/proto"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// This generates count-buckets of equal size distributed along the open
|
// This generates count-buckets of equal size distributed along the open
|
||||||
|
@ -101,7 +103,7 @@ func (h *histogram) Add(labels map[string]string, value float64) {
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
var histogram *histogramVector = nil
|
var histogram *histogramVector = nil
|
||||||
|
|
||||||
h.mutex.Lock()
|
h.mutex.Lock()
|
||||||
|
@ -298,7 +300,7 @@ func (h *histogram) Purge() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *histogram) Reset(labels map[string]string) {
|
func (h *histogram) Reset(labels map[string]string) {
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
h.mutex.Lock()
|
h.mutex.Lock()
|
||||||
defer h.mutex.Unlock()
|
defer h.mutex.Unlock()
|
||||||
|
|
|
@ -158,7 +158,7 @@ func (r *registry) isValidCandidate(name string, baseLabels map[string]string) (
|
||||||
}
|
}
|
||||||
|
|
||||||
baseLabels[string(model.MetricNameLabel)] = name
|
baseLabels[string(model.MetricNameLabel)] = name
|
||||||
signature = LabelsToSignature(baseLabels)
|
signature = model.LabelsToSignature(baseLabels)
|
||||||
|
|
||||||
if _, contains := r.signatureContainers[signature]; contains {
|
if _, contains := r.signatureContainers[signature]; contains {
|
||||||
err = fmt.Errorf("metric named %s with baseLabels %s is already registered", name, baseLabels)
|
err = fmt.Errorf("metric named %s with baseLabels %s is already registered", name, baseLabels)
|
||||||
|
|
|
@ -14,6 +14,8 @@ import (
|
||||||
"code.google.com/p/goprotobuf/proto"
|
"code.google.com/p/goprotobuf/proto"
|
||||||
|
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
// An Untyped metric represents scalar values without any type implications
|
// An Untyped metric represents scalar values without any type implications
|
||||||
|
@ -56,7 +58,7 @@ func (metric *untyped) Set(labels map[string]string, value float64) float64 {
|
||||||
labels = blankLabelsSingleton
|
labels = blankLabelsSingleton
|
||||||
}
|
}
|
||||||
|
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
@ -74,7 +76,7 @@ func (metric *untyped) Set(labels map[string]string, value float64) float64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (metric *untyped) Reset(labels map[string]string) {
|
func (metric *untyped) Reset(labels map[string]string) {
|
||||||
signature := labelValuesToSignature(labels)
|
signature := model.LabelValuesToSignature(labels)
|
||||||
|
|
||||||
metric.mutex.Lock()
|
metric.mutex.Lock()
|
||||||
defer metric.mutex.Unlock()
|
defer metric.mutex.Unlock()
|
||||||
|
|
|
@ -26,7 +26,6 @@ import (
|
||||||
|
|
||||||
"code.google.com/p/goprotobuf/proto"
|
"code.google.com/p/goprotobuf/proto"
|
||||||
"github.com/prometheus/client_golang/model"
|
"github.com/prometheus/client_golang/model"
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// A stateFn is a function that represents a state in a state machine. By
|
// A stateFn is a function that represents a state in a state machine. By
|
||||||
|
@ -332,7 +331,7 @@ func (p *Parser) readingValue() stateFn {
|
||||||
// infamous special case of a summary, we can finally find out
|
// infamous special case of a summary, we can finally find out
|
||||||
// if the metric already exists.
|
// if the metric already exists.
|
||||||
if p.currentMF.GetType() == dto.MetricType_SUMMARY {
|
if p.currentMF.GetType() == dto.MetricType_SUMMARY {
|
||||||
signature := prometheus.LabelsToSignature(p.currentLabels)
|
signature := model.LabelsToSignature(p.currentLabels)
|
||||||
if summary := p.summaries[signature]; summary != nil {
|
if summary := p.summaries[signature]; summary != nil {
|
||||||
p.currentMetric = summary
|
p.currentMetric = summary
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue