github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/metrics/log.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 12:09:42</date>
    10  //</624342649914003456>
    11  
    12  package metrics
    13  
    14  import (
    15  	"time"
    16  )
    17  
    18  type Logger interface {
    19  	Printf(format string, v ...interface{})
    20  }
    21  
    22  func Log(r Registry, freq time.Duration, l Logger) {
    23  	LogScaled(r, freq, time.Nanosecond, l)
    24  }
    25  
    26  //使用给定的
    27  //记录器。以“刻度”单位(如时间.毫秒)而不是纳秒打印计时。
    28  func LogScaled(r Registry, freq time.Duration, scale time.Duration, l Logger) {
    29  	du := float64(scale)
    30  	duSuffix := scale.String()[1:]
    31  
    32  	for range time.Tick(freq) {
    33  		r.Each(func(name string, i interface{}) {
    34  			switch metric := i.(type) {
    35  			case Counter:
    36  				l.Printf("counter %s\n", name)
    37  				l.Printf("  count:       %9d\n", metric.Count())
    38  			case Gauge:
    39  				l.Printf("gauge %s\n", name)
    40  				l.Printf("  value:       %9d\n", metric.Value())
    41  			case GaugeFloat64:
    42  				l.Printf("gauge %s\n", name)
    43  				l.Printf("  value:       %f\n", metric.Value())
    44  			case Healthcheck:
    45  				metric.Check()
    46  				l.Printf("healthcheck %s\n", name)
    47  				l.Printf("  error:       %v\n", metric.Error())
    48  			case Histogram:
    49  				h := metric.Snapshot()
    50  				ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
    51  				l.Printf("histogram %s\n", name)
    52  				l.Printf("  count:       %9d\n", h.Count())
    53  				l.Printf("  min:         %9d\n", h.Min())
    54  				l.Printf("  max:         %9d\n", h.Max())
    55  				l.Printf("  mean:        %12.2f\n", h.Mean())
    56  				l.Printf("  stddev:      %12.2f\n", h.StdDev())
    57  				l.Printf("  median:      %12.2f\n", ps[0])
    58  				l.Printf("  75%%:         %12.2f\n", ps[1])
    59  				l.Printf("  95%%:         %12.2f\n", ps[2])
    60  				l.Printf("  99%%:         %12.2f\n", ps[3])
    61  				l.Printf("  99.9%%:       %12.2f\n", ps[4])
    62  			case Meter:
    63  				m := metric.Snapshot()
    64  				l.Printf("meter %s\n", name)
    65  				l.Printf("  count:       %9d\n", m.Count())
    66  				l.Printf("  1-min rate:  %12.2f\n", m.Rate1())
    67  				l.Printf("  5-min rate:  %12.2f\n", m.Rate5())
    68  				l.Printf("  15-min rate: %12.2f\n", m.Rate15())
    69  				l.Printf("  mean rate:   %12.2f\n", m.RateMean())
    70  			case Timer:
    71  				t := metric.Snapshot()
    72  				ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
    73  				l.Printf("timer %s\n", name)
    74  				l.Printf("  count:       %9d\n", t.Count())
    75  				l.Printf("  min:         %12.2f%s\n", float64(t.Min())/du, duSuffix)
    76  				l.Printf("  max:         %12.2f%s\n", float64(t.Max())/du, duSuffix)
    77  				l.Printf("  mean:        %12.2f%s\n", t.Mean()/du, duSuffix)
    78  				l.Printf("  stddev:      %12.2f%s\n", t.StdDev()/du, duSuffix)
    79  				l.Printf("  median:      %12.2f%s\n", ps[0]/du, duSuffix)
    80  				l.Printf("  75%%:         %12.2f%s\n", ps[1]/du, duSuffix)
    81  				l.Printf("  95%%:         %12.2f%s\n", ps[2]/du, duSuffix)
    82  				l.Printf("  99%%:         %12.2f%s\n", ps[3]/du, duSuffix)
    83  				l.Printf("  99.9%%:       %12.2f%s\n", ps[4]/du, duSuffix)
    84  				l.Printf("  1-min rate:  %12.2f\n", t.Rate1())
    85  				l.Printf("  5-min rate:  %12.2f\n", t.Rate5())
    86  				l.Printf("  15-min rate: %12.2f\n", t.Rate15())
    87  				l.Printf("  mean rate:   %12.2f\n", t.RateMean())
    88  			}
    89  		})
    90  	}
    91  }
    92