github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/writer.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 "io" 14 "sort" 15 "time" 16 ) 17 18 //写入排序定期将给定注册表中的每个指标写入 19 //给定IO.WRITER。 20 func Write(r Registry, d time.Duration, w io.Writer) { 21 for range time.Tick(d) { 22 WriteOnce(r, w) 23 } 24 } 25 26 //WriteOnce将给定注册表中的度量值排序并写入给定的 27 //作者。 28 func WriteOnce(r Registry, w io.Writer) { 29 var namedMetrics namedMetricSlice 30 r.Each(func(name string, i interface{}) { 31 namedMetrics = append(namedMetrics, namedMetric{name, i}) 32 }) 33 34 sort.Sort(namedMetrics) 35 for _, namedMetric := range namedMetrics { 36 switch metric := namedMetric.m.(type) { 37 case Counter: 38 fmt.Fprintf(w, "counter %s\n", namedMetric.name) 39 fmt.Fprintf(w, " count: %9d\n", metric.Count()) 40 case Gauge: 41 fmt.Fprintf(w, "gauge %s\n", namedMetric.name) 42 fmt.Fprintf(w, " value: %9d\n", metric.Value()) 43 case GaugeFloat64: 44 fmt.Fprintf(w, "gauge %s\n", namedMetric.name) 45 fmt.Fprintf(w, " value: %f\n", metric.Value()) 46 case Healthcheck: 47 metric.Check() 48 fmt.Fprintf(w, "healthcheck %s\n", namedMetric.name) 49 fmt.Fprintf(w, " error: %v\n", metric.Error()) 50 case Histogram: 51 h := metric.Snapshot() 52 ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) 53 fmt.Fprintf(w, "histogram %s\n", namedMetric.name) 54 fmt.Fprintf(w, " count: %9d\n", h.Count()) 55 fmt.Fprintf(w, " min: %9d\n", h.Min()) 56 fmt.Fprintf(w, " max: %9d\n", h.Max()) 57 fmt.Fprintf(w, " mean: %12.2f\n", h.Mean()) 58 fmt.Fprintf(w, " stddev: %12.2f\n", h.StdDev()) 59 fmt.Fprintf(w, " median: %12.2f\n", ps[0]) 60 fmt.Fprintf(w, " 75%%: %12.2f\n", ps[1]) 61 fmt.Fprintf(w, " 95%%: %12.2f\n", ps[2]) 62 fmt.Fprintf(w, " 99%%: %12.2f\n", ps[3]) 63 fmt.Fprintf(w, " 99.9%%: %12.2f\n", ps[4]) 64 case Meter: 65 m := metric.Snapshot() 66 fmt.Fprintf(w, "meter %s\n", namedMetric.name) 67 fmt.Fprintf(w, " count: %9d\n", m.Count()) 68 fmt.Fprintf(w, " 1-min rate: %12.2f\n", m.Rate1()) 69 fmt.Fprintf(w, " 5-min rate: %12.2f\n", m.Rate5()) 70 fmt.Fprintf(w, " 15-min rate: %12.2f\n", m.Rate15()) 71 fmt.Fprintf(w, " mean rate: %12.2f\n", m.RateMean()) 72 case Timer: 73 t := metric.Snapshot() 74 ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) 75 fmt.Fprintf(w, "timer %s\n", namedMetric.name) 76 fmt.Fprintf(w, " count: %9d\n", t.Count()) 77 fmt.Fprintf(w, " min: %9d\n", t.Min()) 78 fmt.Fprintf(w, " max: %9d\n", t.Max()) 79 fmt.Fprintf(w, " mean: %12.2f\n", t.Mean()) 80 fmt.Fprintf(w, " stddev: %12.2f\n", t.StdDev()) 81 fmt.Fprintf(w, " median: %12.2f\n", ps[0]) 82 fmt.Fprintf(w, " 75%%: %12.2f\n", ps[1]) 83 fmt.Fprintf(w, " 95%%: %12.2f\n", ps[2]) 84 fmt.Fprintf(w, " 99%%: %12.2f\n", ps[3]) 85 fmt.Fprintf(w, " 99.9%%: %12.2f\n", ps[4]) 86 fmt.Fprintf(w, " 1-min rate: %12.2f\n", t.Rate1()) 87 fmt.Fprintf(w, " 5-min rate: %12.2f\n", t.Rate5()) 88 fmt.Fprintf(w, " 15-min rate: %12.2f\n", t.Rate15()) 89 fmt.Fprintf(w, " mean rate: %12.2f\n", t.RateMean()) 90 } 91 } 92 } 93 94 type namedMetric struct { 95 name string 96 m interface{} 97 } 98 99 //namedmetricslice是实现sort.interface的namedmetrics切片。 100 type namedMetricSlice []namedMetric 101 102 func (nms namedMetricSlice) Len() int { return len(nms) } 103 104 func (nms namedMetricSlice) Swap(i, j int) { nms[i], nms[j] = nms[j], nms[i] } 105 106 func (nms namedMetricSlice) Less(i, j int) bool { 107 return nms[i].name < nms[j].name 108 }