From 7eb6d030dced7421162c6863aeacac17072b6b9e Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Thu, 18 Feb 2021 15:57:42 +0300 Subject: [PATCH] meter: fix internal labels sorting Signed-off-by: Vasiliy Tolstov --- client/noop.go | 2 +- meter/meter.go | 41 ++++++++++++++++++++-------------------- meter/meter_test.go | 25 +++++++++++++++--------- meter/wrapper/wrapper.go | 26 ++++++++++++------------- 4 files changed, 50 insertions(+), 44 deletions(-) diff --git a/client/noop.go b/client/noop.go index a0c6028b..6b5ef2b0 100644 --- a/client/noop.go +++ b/client/noop.go @@ -175,7 +175,7 @@ func (n *noopClient) Call(ctx context.Context, req Request, rsp interface{}, opt } func (n *noopClient) NewRequest(service, endpoint string, req interface{}, opts ...RequestOption) Request { - return &noopRequest{} + return &noopRequest{service: service, endpoint: endpoint} } func (n *noopClient) NewMessage(topic string, msg interface{}, opts ...MessageOption) Message { diff --git a/meter/meter.go b/meter/meter.go index 2d5944c0..d296db34 100644 --- a/meter/meter.go +++ b/meter/meter.go @@ -82,25 +82,6 @@ type Labels struct { vals []string } -type labels Labels - -func (ls labels) sort() { - sort.Sort(ls) -} - -func (ls labels) Len() int { - return len(ls.keys) -} - -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.vals[i] < ls.vals[j] -} - // Append adds labels to label set func (ls Labels) Append(nls Labels) Labels { for n := range nls.keys { @@ -110,10 +91,30 @@ func (ls Labels) Append(nls Labels) Labels { return ls } +// Len returns number of labels func (ls Labels) Len() int { return len(ls.keys) } +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 @@ -123,7 +124,7 @@ type LabelIter struct { // Iter returns labels iterator func (ls Labels) Iter() *LabelIter { - labels(ls).sort() + labels(ls).Sort() return &LabelIter{labels: ls, cnt: len(ls.keys)} } diff --git a/meter/meter_test.go b/meter/meter_test.go index f9ba8554..4c6cc583 100644 --- a/meter/meter_test.go +++ b/meter/meter_test.go @@ -5,12 +5,12 @@ import ( ) func TestNoopMeter(t *testing.T) { - meter := NewMeter(Path("/noop")) - if "/noop" != meter.Options().Path { - t.Fatalf("invalid options parsing: %v", meter.Options()) + m := NewMeter(Path("/noop")) + if "/noop" != m.Options().Path { + t.Fatalf("invalid options parsing: %v", m.Options()) } - cnt := meter.Counter("counter", Label("server", "noop")) + cnt := m.Counter("counter", Label("server", "noop")) cnt.Inc() } @@ -32,15 +32,22 @@ func TestLabelsAppend(t *testing.T) { } func TestIterator(t *testing.T) { - var ls Labels - ls.keys = []string{"type", "server", "register"} - ls.vals = []string{"noop", "http", "gossip"} + 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 := ls.Iter() + iter := options.Labels.Iter() var k, v string cnt := 0 for iter.Next(&k, &v) { - if cnt == 1 && (k != "server" || v != "http") { + if cnt == 4 && (k != "server" || v != "http") { t.Fatalf("iter error: %s != %s || %s != %s", k, "server", v, "http") } cnt++ diff --git a/meter/wrapper/wrapper.go b/meter/wrapper/wrapper.go index e38d86da..8a6e066b 100644 --- a/meter/wrapper/wrapper.go +++ b/meter/wrapper/wrapper.go @@ -31,16 +31,14 @@ var ( ) type Options struct { - Meter meter.Meter - Name string - Version string - ID string + Meter meter.Meter + lopts []meter.Option } type Option func(*Options) func NewOptions(opts ...Option) Options { - options := Options{} + options := Options{lopts: make([]meter.Option, 0, 5)} for _, o := range opts { o(&options) } @@ -49,19 +47,19 @@ func NewOptions(opts ...Option) Options { func ServiceName(name string) Option { return func(o *Options) { - o.Name = name + o.lopts = append(o.lopts, meter.Label("name", name)) } } func ServiceVersion(version string) Option { return func(o *Options) { - o.Version = version + o.lopts = append(o.lopts, meter.Label("version", version)) } } func ServiceID(id string) Option { return func(o *Options) { - o.ID = id + o.lopts = append(o.lopts, meter.Label("id", id)) } } @@ -104,7 +102,7 @@ func (w *wrapper) CallFunc(ctx context.Context, addr string, req client.Request, err := w.callFunc(ctx, addr, req, rsp, opts) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(ClientRequestLatencyMicroseconds, lopts...).Update(float64(te.Seconds())) @@ -127,7 +125,7 @@ func (w *wrapper) Call(ctx context.Context, req client.Request, rsp interface{}, err := w.Client.Call(ctx, req, rsp, opts...) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(ClientRequestLatencyMicroseconds, lopts...).Update(float64(te.Seconds())) @@ -150,7 +148,7 @@ func (w *wrapper) Stream(ctx context.Context, req client.Request, opts ...client stream, err := w.Client.Stream(ctx, req, opts...) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(ClientRequestLatencyMicroseconds, lopts...).Update(float64(te.Seconds())) @@ -173,7 +171,7 @@ func (w *wrapper) Publish(ctx context.Context, p client.Message, opts ...client. err := w.Client.Publish(ctx, p, opts...) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(PublishMessageLatencyMicroseconds, lopts...).Update(float64(te.Seconds())) @@ -204,7 +202,7 @@ func (w *wrapper) HandlerFunc(fn server.HandlerFunc) server.HandlerFunc { err := fn(ctx, req, rsp) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(ServerRequestLatencyMicroseconds, lopts...).Update(float64(te.Seconds())) @@ -236,7 +234,7 @@ func (w *wrapper) SubscriberFunc(fn server.SubscriberFunc) server.SubscriberFunc err := fn(ctx, msg) te := time.Since(ts) - lopts := make([]meter.Option, 0, 2) + lopts := w.opts.lopts lopts = append(lopts, meter.Label(labelEndpoint, endpoint)) w.opts.Meter.Summary(SubscribeMessageLatencyMicroseconds, lopts...).Update(float64(te.Seconds()))