meter: rework labels
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		| @@ -3,6 +3,7 @@ package meter | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" | 	"io" | ||||||
|  | 	"reflect" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
| @@ -76,66 +77,36 @@ type Summary interface { | |||||||
| 	UpdateDuration(time.Time) | 	UpdateDuration(time.Time) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Labels holds the metrics labels with k, v | type byKey []string | ||||||
| type Labels struct { |  | ||||||
| 	keys []string | func (k byKey) Len() int           { return len(k) / 2 } | ||||||
| 	vals []string | func (k byKey) Less(i, j int) bool { return k[i*2] < k[j*2] } | ||||||
|  | func (k byKey) Swap(i, j int) { | ||||||
|  | 	k[i*2], k[i*2+1], k[j*2], k[j*2+1] = k[j*2], k[j*2+1], k[i*2], k[i*2+1] | ||||||
| } | } | ||||||
|  |  | ||||||
| // Append adds labels to label set | func Sort(slice *[]string) { | ||||||
| func (ls Labels) Append(nls Labels) Labels { | 	bk := byKey(*slice) | ||||||
| 	for n := range nls.keys { | 	if bk.Len() <= 1 { | ||||||
| 		ls.keys = append(ls.keys, nls.keys[n]) | 		return | ||||||
| 		ls.vals = append(ls.vals, nls.vals[n]) |  | ||||||
| 	} | 	} | ||||||
| 	return ls | 	sort.Sort(bk) | ||||||
|  | 	v := reflect.ValueOf(slice).Elem() | ||||||
|  | 	cnt := 0 | ||||||
|  | 	key := 0 | ||||||
|  | 	val := 1 | ||||||
|  | 	for key < v.Len() { | ||||||
|  | 		if len(bk) > key+2 && bk[key] == bk[key+2] { | ||||||
|  | 			key += 2 | ||||||
|  | 			val += 2 | ||||||
|  | 			continue | ||||||
| 		} | 		} | ||||||
|  | 		v.Index(cnt).Set(v.Index(key)) | ||||||
| // Len returns number of labels | 		cnt++ | ||||||
| func (ls Labels) Len() int { | 		v.Index(cnt).Set(v.Index(val)) | ||||||
| 	return len(ls.keys) | 		cnt++ | ||||||
|  | 		key += 2 | ||||||
|  | 		val += 2 | ||||||
| 	} | 	} | ||||||
|  | 	v.SetLen(cnt) | ||||||
| type labels Labels |  | ||||||
|  |  | ||||||
| func (ls labels) Len() int { |  | ||||||
| 	return len(ls.keys) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ls labels) Sort() { |  | ||||||
| 	sort.Sort(ls) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ls labels) Swap(i, j int) { |  | ||||||
| 	ls.keys[i], ls.keys[j] = ls.keys[j], ls.keys[i] |  | ||||||
| 	ls.vals[i], ls.vals[j] = ls.vals[j], ls.vals[i] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (ls labels) Less(i, j int) bool { |  | ||||||
| 	return ls.keys[i] < ls.keys[j] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // LabelIter holds the |  | ||||||
| type LabelIter struct { |  | ||||||
| 	labels Labels |  | ||||||
| 	cnt    int |  | ||||||
| 	cur    int |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Iter returns labels iterator |  | ||||||
| func (ls Labels) Iter() *LabelIter { |  | ||||||
| 	labels(ls).Sort() |  | ||||||
| 	return &LabelIter{labels: ls, cnt: len(ls.keys)} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Next advance itarator to new pos |  | ||||||
| func (iter *LabelIter) Next(k, v *string) bool { |  | ||||||
| 	if iter.cur+1 > iter.cnt { |  | ||||||
| 		return false |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	*k = iter.labels.keys[iter.cur] |  | ||||||
| 	*v = iter.labels.vals[iter.cur] |  | ||||||
| 	iter.cur++ |  | ||||||
| 	return true |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,46 +10,15 @@ func TestNoopMeter(t *testing.T) { | |||||||
| 		t.Fatalf("invalid options parsing: %v", m.Options()) | 		t.Fatalf("invalid options parsing: %v", m.Options()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cnt := m.Counter("counter", Label("server", "noop")) | 	cnt := m.Counter("counter", Labels("server", "noop")) | ||||||
| 	cnt.Inc() | 	cnt.Inc() | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestLabelsAppend(t *testing.T) { | func TestLabelsSort(t *testing.T) { | ||||||
| 	var ls Labels | 	ls := []string{"server", "http", "register", "mdns", "broker", "broker1", "broker", "broker2", "server", "tcp"} | ||||||
| 	ls.keys = []string{"type", "server"} | 	Sort(&ls) | ||||||
| 	ls.vals = []string{"noop", "http"} |  | ||||||
|  |  | ||||||
| 	var nls Labels | 	if ls[0] != "broker" || ls[1] != "broker2" { | ||||||
| 	nls.keys = []string{"register"} | 		t.Fatalf("sort error: %v", ls) | ||||||
| 	nls.vals = []string{"gossip"} |  | ||||||
| 	ls = ls.Append(nls) |  | ||||||
|  |  | ||||||
| 	//ls.Sort() |  | ||||||
|  |  | ||||||
| 	if ls.keys[0] != "type" || ls.vals[0] != "noop" { |  | ||||||
| 		t.Fatalf("append error: %v", ls) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestIterator(t *testing.T) { |  | ||||||
| 	options := NewOptions( |  | ||||||
| 		Label("name", "svc1"), |  | ||||||
| 		Label("version", "0.0.1"), |  | ||||||
| 		Label("id", "12345"), |  | ||||||
| 		Label("type", "noop"), |  | ||||||
| 		Label("server", "http"), |  | ||||||
| 		Label("register", "gossip"), |  | ||||||
| 		Label("aa", "kk"), |  | ||||||
| 		Label("zz", "kk"), |  | ||||||
| 	) |  | ||||||
|  |  | ||||||
| 	iter := options.Labels.Iter() |  | ||||||
| 	var k, v string |  | ||||||
| 	cnt := 0 |  | ||||||
| 	for iter.Next(&k, &v) { |  | ||||||
| 		if cnt == 4 && (k != "server" || v != "http") { |  | ||||||
| 			t.Fatalf("iter error: %s != %s || %s != %s", k, "server", v, "http") |  | ||||||
| 		} |  | ||||||
| 		cnt++ |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -107,7 +107,7 @@ func (r *noopMeter) String() string { | |||||||
| } | } | ||||||
|  |  | ||||||
| type noopCounter struct { | type noopCounter struct { | ||||||
| 	labels Labels | 	labels []string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *noopCounter) Add(int) { | func (r *noopCounter) Add(int) { | ||||||
| @@ -131,7 +131,7 @@ func (r *noopCounter) Set(uint64) { | |||||||
| } | } | ||||||
|  |  | ||||||
| type noopFloatCounter struct { | type noopFloatCounter struct { | ||||||
| 	labels Labels | 	labels []string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *noopFloatCounter) Add(float64) { | func (r *noopFloatCounter) Add(float64) { | ||||||
| @@ -151,7 +151,7 @@ func (r *noopFloatCounter) Sub(float64) { | |||||||
| } | } | ||||||
|  |  | ||||||
| type noopGauge struct { | type noopGauge struct { | ||||||
| 	labels Labels | 	labels []string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *noopGauge) Get() float64 { | func (r *noopGauge) Get() float64 { | ||||||
| @@ -159,7 +159,7 @@ func (r *noopGauge) Get() float64 { | |||||||
| } | } | ||||||
|  |  | ||||||
| type noopSummary struct { | type noopSummary struct { | ||||||
| 	labels Labels | 	labels []string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *noopSummary) Update(float64) { | func (r *noopSummary) Update(float64) { | ||||||
| @@ -171,7 +171,7 @@ func (r *noopSummary) UpdateDuration(time.Time) { | |||||||
| } | } | ||||||
|  |  | ||||||
| type noopHistogram struct { | type noopHistogram struct { | ||||||
| 	labels Labels | 	labels []string | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *noopHistogram) Reset() { | func (r *noopHistogram) Reset() { | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ type Options struct { | |||||||
| 	// LabelPrefix holds the prefix for all labels | 	// LabelPrefix holds the prefix for all labels | ||||||
| 	LabelPrefix string | 	LabelPrefix string | ||||||
| 	// Labels holds the default labels | 	// Labels holds the default labels | ||||||
| 	Labels Labels | 	Labels []string | ||||||
| 	// WriteProcessMetrics flag to write process metrics | 	// WriteProcessMetrics flag to write process metrics | ||||||
| 	WriteProcessMetrics bool | 	WriteProcessMetrics bool | ||||||
| 	// WriteFDMetrics flag to write fd metrics | 	// WriteFDMetrics flag to write fd metrics | ||||||
| @@ -88,11 +88,9 @@ func Logger(l logger.Logger) Option { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Label sets the label | func Labels(ls ...string) Option { | ||||||
| func Label(key, val string) Option { |  | ||||||
| 	return func(o *Options) { | 	return func(o *Options) { | ||||||
| 		o.Labels.keys = append(o.Labels.keys, key) | 		o.Labels = ls | ||||||
| 		o.Labels.vals = append(o.Labels.vals, val) |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user