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