| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package stats |
| |
| import ( |
| "time" |
| |
| "v.io/x/ref/lib/stats/counter" |
| ) |
| |
| // NewCounter creates a new Counter StatsObject with the given name and |
| // returns a pointer to it. |
| func NewCounter(name string) *counter.Counter { |
| lock.Lock() |
| defer lock.Unlock() |
| |
| node := findNodeLocked(name, true) |
| c := counter.New() |
| cw := &counterWrapper{c} |
| node.object = cw |
| |
| addCounterChild(node, name+"/delta1h", cw, time.Hour, cw.Delta1h) |
| addCounterChild(node, name+"/delta10m", cw, 10*time.Minute, cw.Delta10m) |
| addCounterChild(node, name+"/delta1m", cw, time.Minute, cw.Delta1m) |
| addCounterChild(node, name+"/rate1h", cw, time.Hour, cw.Rate1h) |
| addCounterChild(node, name+"/rate10m", cw, 10*time.Minute, cw.Rate10m) |
| addCounterChild(node, name+"/rate1m", cw, time.Minute, cw.Rate1m) |
| return c |
| } |
| |
| type counterWrapper struct { |
| c *counter.Counter |
| } |
| |
| func (cw counterWrapper) LastUpdate() time.Time { |
| return cw.c.LastUpdate() |
| } |
| |
| func (cw counterWrapper) Value() interface{} { |
| return cw.c.Value() |
| } |
| |
| func (cw counterWrapper) Delta1h() interface{} { |
| return cw.c.Delta1h() |
| } |
| func (cw counterWrapper) Delta10m() interface{} { |
| return cw.c.Delta10m() |
| } |
| func (cw counterWrapper) Delta1m() interface{} { |
| return cw.c.Delta1m() |
| } |
| func (cw counterWrapper) Rate1h() interface{} { |
| return cw.c.Rate1h() |
| } |
| func (cw counterWrapper) Rate10m() interface{} { |
| return cw.c.Rate10m() |
| } |
| func (cw counterWrapper) Rate1m() interface{} { |
| return cw.c.Rate1m() |
| } |
| |
| type counterChild struct { |
| c *counterWrapper |
| period time.Duration |
| value func() interface{} |
| } |
| |
| func (cc counterChild) LastUpdate() time.Time { |
| now := time.Now() |
| if t := cc.c.LastUpdate().Add(cc.period); t.Before(now) { |
| return t |
| } |
| return now |
| } |
| |
| func (cc counterChild) Value() interface{} { |
| return cc.value() |
| } |
| |
| func addCounterChild(parent *node, name string, c *counterWrapper, period time.Duration, value func() interface{}) { |
| child := findNodeLocked(name, true) |
| child.object = &counterChild{c, period, value} |
| } |