github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/registry.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  package metrics
    10  
    11  import (
    12  	"fmt"
    13  	"reflect"
    14  	"strings"
    15  	"sync"
    16  )
    17  
    18  //Duplicatemetric是注册表返回的错误。当度量
    19  //已经存在。如果要注册该度量,必须首先
    20  //注销现有度量。
    21  type DuplicateMetric string
    22  
    23  func (err DuplicateMetric) Error() string {
    24  	return fmt.Sprintf("duplicate metric: %s", string(err))
    25  }
    26  
    27  //注册表按名称保存对一组度量的引用,并且可以迭代
    28  //通过它们,调用用户提供的回调函数。
    29  //
    30  //这是一个接口,以鼓励其他结构实现
    31  //注册表API(视情况而定)。
    32  type Registry interface {
    33  
    34  //为每个注册的度量调用给定的函数。
    35  	Each(func(string, interface{}))
    36  
    37  //按给定的名称获取度量,如果未注册,则为零。
    38  	Get(string) interface{}
    39  
    40  //获取注册表中的所有指标。
    41  	GetAll() map[string]map[string]interface{}
    42  
    43  //获取现有度量或注册给定的度量。
    44  //如果在注册表中找不到接口,则该接口可以是要注册的度量。
    45  //或者返回延迟实例化度量的函数。
    46  	GetOrRegister(string, interface{}) interface{}
    47  
    48  //在给定的名称下注册给定的度量。
    49  	Register(string, interface{}) error
    50  
    51  //运行所有已注册的运行状况检查。
    52  	RunHealthchecks()
    53  
    54  //用给定的名称注销度量。
    55  	Unregister(string)
    56  
    57  //注销所有度量。(主要用于测试。)
    58  	UnregisterAll()
    59  }
    60  
    61  //注册表的标准实现是一个互斥保护映射
    62  //从名称到度量。
    63  type StandardRegistry struct {
    64  	metrics map[string]interface{}
    65  	mutex   sync.Mutex
    66  }
    67  
    68  //创建新注册表。
    69  func NewRegistry() Registry {
    70  	return &StandardRegistry{metrics: make(map[string]interface{})}
    71  }
    72  
    73  //为每个注册的度量调用给定的函数。
    74  func (r *StandardRegistry) Each(f func(string, interface{})) {
    75  	for name, i := range r.registered() {
    76  		f(name, i)
    77  	}
    78  }
    79  
    80  //按给定的名称获取度量,如果未注册,则为零。
    81  func (r *StandardRegistry) Get(name string) interface{} {
    82  	r.mutex.Lock()
    83  	defer r.mutex.Unlock()
    84  	return r.metrics[name]
    85  }
    86  
    87  //获取现有度量或创建并注册新度量。线程安全的
    88  //在失败时调用get和register的替代方法。
    89  //如果在注册表中找不到接口,则该接口可以是要注册的度量。
    90  //或者返回延迟实例化度量的函数。
    91  func (r *StandardRegistry) GetOrRegister(name string, i interface{}) interface{} {
    92  	r.mutex.Lock()
    93  	defer r.mutex.Unlock()
    94  	if metric, ok := r.metrics[name]; ok {
    95  		return metric
    96  	}
    97  	if v := reflect.ValueOf(i); v.Kind() == reflect.Func {
    98  		i = v.Call(nil)[0].Interface()
    99  	}
   100  	r.register(name, i)
   101  	return i
   102  }
   103  
   104  //在给定的名称下注册给定的度量。返回重复度量值
   105  //如果已注册给定名称的度量值。
   106  func (r *StandardRegistry) Register(name string, i interface{}) error {
   107  	r.mutex.Lock()
   108  	defer r.mutex.Unlock()
   109  	return r.register(name, i)
   110  }
   111  
   112  //运行所有已注册的运行状况检查。
   113  func (r *StandardRegistry) RunHealthchecks() {
   114  	r.mutex.Lock()
   115  	defer r.mutex.Unlock()
   116  	for _, i := range r.metrics {
   117  		if h, ok := i.(Healthcheck); ok {
   118  			h.Check()
   119  		}
   120  	}
   121  }
   122  
   123  //获取注册表中的所有指标
   124  func (r *StandardRegistry) GetAll() map[string]map[string]interface{} {
   125  	data := make(map[string]map[string]interface{})
   126  	r.Each(func(name string, i interface{}) {
   127  		values := make(map[string]interface{})
   128  		switch metric := i.(type) {
   129  		case Counter:
   130  			values["count"] = metric.Count()
   131  		case Gauge:
   132  			values["value"] = metric.Value()
   133  		case GaugeFloat64:
   134  			values["value"] = metric.Value()
   135  		case Healthcheck:
   136  			values["error"] = nil
   137  			metric.Check()
   138  			if err := metric.Error(); nil != err {
   139  				values["error"] = metric.Error().Error()
   140  			}
   141  		case Histogram:
   142  			h := metric.Snapshot()
   143  			ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
   144  			values["count"] = h.Count()
   145  			values["min"] = h.Min()
   146  			values["max"] = h.Max()
   147  			values["mean"] = h.Mean()
   148  			values["stddev"] = h.StdDev()
   149  			values["median"] = ps[0]
   150  			values["75%"] = ps[1]
   151  			values["95%"] = ps[2]
   152  			values["99%"] = ps[3]
   153  			values["99.9%"] = ps[4]
   154  		case Meter:
   155  			m := metric.Snapshot()
   156  			values["count"] = m.Count()
   157  			values["1m.rate"] = m.Rate1()
   158  			values["5m.rate"] = m.Rate5()
   159  			values["15m.rate"] = m.Rate15()
   160  			values["mean.rate"] = m.RateMean()
   161  		case Timer:
   162  			t := metric.Snapshot()
   163  			ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
   164  			values["count"] = t.Count()
   165  			values["min"] = t.Min()
   166  			values["max"] = t.Max()
   167  			values["mean"] = t.Mean()
   168  			values["stddev"] = t.StdDev()
   169  			values["median"] = ps[0]
   170  			values["75%"] = ps[1]
   171  			values["95%"] = ps[2]
   172  			values["99%"] = ps[3]
   173  			values["99.9%"] = ps[4]
   174  			values["1m.rate"] = t.Rate1()
   175  			values["5m.rate"] = t.Rate5()
   176  			values["15m.rate"] = t.Rate15()
   177  			values["mean.rate"] = t.RateMean()
   178  		}
   179  		data[name] = values
   180  	})
   181  	return data
   182  }
   183  
   184  //用给定的名称注销度量。
   185  func (r *StandardRegistry) Unregister(name string) {
   186  	r.mutex.Lock()
   187  	defer r.mutex.Unlock()
   188  	r.stop(name)
   189  	delete(r.metrics, name)
   190  }
   191  
   192  //注销所有度量。(主要用于测试。)
   193  func (r *StandardRegistry) UnregisterAll() {
   194  	r.mutex.Lock()
   195  	defer r.mutex.Unlock()
   196  	for name := range r.metrics {
   197  		r.stop(name)
   198  		delete(r.metrics, name)
   199  	}
   200  }
   201  
   202  func (r *StandardRegistry) register(name string, i interface{}) error {
   203  	if _, ok := r.metrics[name]; ok {
   204  		return DuplicateMetric(name)
   205  	}
   206  	switch i.(type) {
   207  	case Counter, Gauge, GaugeFloat64, Healthcheck, Histogram, Meter, Timer, ResettingTimer:
   208  		r.metrics[name] = i
   209  	}
   210  	return nil
   211  }
   212  
   213  func (r *StandardRegistry) registered() map[string]interface{} {
   214  	r.mutex.Lock()
   215  	defer r.mutex.Unlock()
   216  	metrics := make(map[string]interface{}, len(r.metrics))
   217  	for name, i := range r.metrics {
   218  		metrics[name] = i
   219  	}
   220  	return metrics
   221  }
   222  
   223  func (r *StandardRegistry) stop(name string) {
   224  	if i, ok := r.metrics[name]; ok {
   225  		if s, ok := i.(Stoppable); ok {
   226  			s.Stop()
   227  		}
   228  	}
   229  }
   230  
   231  //stoppable定义必须停止的度量。
   232  type Stoppable interface {
   233  	Stop()
   234  }
   235  
   236  type PrefixedRegistry struct {
   237  	underlying Registry
   238  	prefix     string
   239  }
   240  
   241  func NewPrefixedRegistry(prefix string) Registry {
   242  	return &PrefixedRegistry{
   243  		underlying: NewRegistry(),
   244  		prefix:     prefix,
   245  	}
   246  }
   247  
   248  func NewPrefixedChildRegistry(parent Registry, prefix string) Registry {
   249  	return &PrefixedRegistry{
   250  		underlying: parent,
   251  		prefix:     prefix,
   252  	}
   253  }
   254  
   255  //为每个注册的度量调用给定的函数。
   256  func (r *PrefixedRegistry) Each(fn func(string, interface{})) {
   257  	wrappedFn := func(prefix string) func(string, interface{}) {
   258  		return func(name string, iface interface{}) {
   259  			if strings.HasPrefix(name, prefix) {
   260  				fn(name, iface)
   261  			} else {
   262  				return
   263  			}
   264  		}
   265  	}
   266  
   267  	baseRegistry, prefix := findPrefix(r, "")
   268  	baseRegistry.Each(wrappedFn(prefix))
   269  }
   270  
   271  func findPrefix(registry Registry, prefix string) (Registry, string) {
   272  	switch r := registry.(type) {
   273  	case *PrefixedRegistry:
   274  		return findPrefix(r.underlying, r.prefix+prefix)
   275  	case *StandardRegistry:
   276  		return r, prefix
   277  	}
   278  	return nil, ""
   279  }
   280  
   281  //按给定的名称获取度量,如果未注册,则为零。
   282  func (r *PrefixedRegistry) Get(name string) interface{} {
   283  	realName := r.prefix + name
   284  	return r.underlying.Get(realName)
   285  }
   286  
   287  //获取现有度量或注册给定的度量。
   288  //如果在注册表中找不到接口,则该接口可以是要注册的度量。
   289  //或者返回延迟实例化度量的函数。
   290  func (r *PrefixedRegistry) GetOrRegister(name string, metric interface{}) interface{} {
   291  	realName := r.prefix + name
   292  	return r.underlying.GetOrRegister(realName, metric)
   293  }
   294  
   295  //在给定的名称下注册给定的度量。名称将以前缀形式出现。
   296  func (r *PrefixedRegistry) Register(name string, metric interface{}) error {
   297  	realName := r.prefix + name
   298  	return r.underlying.Register(realName, metric)
   299  }
   300  
   301  //运行所有已注册的运行状况检查。
   302  func (r *PrefixedRegistry) RunHealthchecks() {
   303  	r.underlying.RunHealthchecks()
   304  }
   305  
   306  //获取注册表中的所有指标
   307  func (r *PrefixedRegistry) GetAll() map[string]map[string]interface{} {
   308  	return r.underlying.GetAll()
   309  }
   310  
   311  //用给定的名称注销度量。名称将以前缀形式出现。
   312  func (r *PrefixedRegistry) Unregister(name string) {
   313  	realName := r.prefix + name
   314  	r.underlying.Unregister(realName)
   315  }
   316  
   317  //注销所有度量。(主要用于测试。)
   318  func (r *PrefixedRegistry) UnregisterAll() {
   319  	r.underlying.UnregisterAll()
   320  }
   321  
   322  var DefaultRegistry Registry = NewRegistry()
   323  
   324  //为每个注册的度量调用给定的函数。
   325  func Each(f func(string, interface{})) {
   326  	DefaultRegistry.Each(f)
   327  }
   328  
   329  //按给定的名称获取度量,如果未注册,则为零。
   330  func Get(name string) interface{} {
   331  	return DefaultRegistry.Get(name)
   332  }
   333  
   334  //获取现有度量或创建并注册新度量。线程安全的
   335  //在失败时调用get和register的替代方法。
   336  func GetOrRegister(name string, i interface{}) interface{} {
   337  	return DefaultRegistry.GetOrRegister(name, i)
   338  }
   339  
   340  //在给定的名称下注册给定的度量。返回重复度量值
   341  //如果已注册给定名称的度量值。
   342  func Register(name string, i interface{}) error {
   343  	return DefaultRegistry.Register(name, i)
   344  }
   345  
   346  //在给定的名称下注册给定的度量。如果一个度量由
   347  //给定的名称已注册。
   348  func MustRegister(name string, i interface{}) {
   349  	if err := Register(name, i); err != nil {
   350  		panic(err)
   351  	}
   352  }
   353  
   354  //运行所有已注册的运行状况检查。
   355  func RunHealthchecks() {
   356  	DefaultRegistry.RunHealthchecks()
   357  }
   358  
   359  //用给定的名称注销度量。
   360  func Unregister(name string) {
   361  	DefaultRegistry.Unregister(name)
   362  }