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 }