github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/metrics.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 //</624450099468046336> 11 12 //Coda Hale度量库的Go端口 13 // 14 //<https://github.com/rcrowley/go-metrics> 15 // 16 //Coda Hale的原创作品:<https://github.com/coda hale/metrics> 17 package metrics 18 19 import ( 20 "os" 21 "runtime" 22 "strings" 23 "time" 24 25 "github.com/ethereum/go-ethereum/log" 26 ) 27 28 //对于所有的 29 //标准度量。如果为真,则返回的度量是存根。 30 // 31 //这种全局杀伤开关有助于量化观察者效应,并使 32 //以减少混乱的PPROF配置文件。 33 var Enabled bool = false 34 35 //MetricsEnabledFlag是用于启用度量集合的CLI标志名。 36 const MetricsEnabledFlag = "metrics" 37 const DashboardEnabledFlag = "dashboard" 38 39 //init启用或禁用度量系统。因为我们以前需要这个 40 //任何其他代码都可以创建仪表和计时器,实际上我们会做一个丑陋的黑客。 41 //并查看命令行参数中的度量标志。 42 func init() { 43 for _, arg := range os.Args { 44 if flag := strings.TrimLeft(arg, "-"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag { 45 log.Info("Enabling metrics collection") 46 Enabled = true 47 } 48 } 49 } 50 51 //CollectProcessMetrics定期收集有关运行的各种指标 52 //过程。 53 func CollectProcessMetrics(refresh time.Duration) { 54 //如果禁用度量系统,则短路 55 if !Enabled { 56 return 57 } 58 //创建各种数据收集器 59 memstats := make([]*runtime.MemStats, 2) 60 diskstats := make([]*DiskStats, 2) 61 for i := 0; i < len(memstats); i++ { 62 memstats[i] = new(runtime.MemStats) 63 diskstats[i] = new(DiskStats) 64 } 65 //定义要收集的各种指标 66 memAllocs := GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) 67 memFrees := GetOrRegisterMeter("system/memory/frees", DefaultRegistry) 68 memInuse := GetOrRegisterMeter("system/memory/inuse", DefaultRegistry) 69 memPauses := GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) 70 71 var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter 72 var diskReadBytesCounter, diskWriteBytesCounter Counter 73 if err := ReadDiskStats(diskstats[0]); err == nil { 74 diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) 75 diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) 76 diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) 77 diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) 78 diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) 79 diskWriteBytesCounter = GetOrRegisterCounter("system/disk/writebytes", DefaultRegistry) 80 } else { 81 log.Debug("Failed to read disk metrics", "err", err) 82 } 83 //重复加载不同的统计数据并更新仪表 84 for i := 1; ; i++ { 85 location1 := i % 2 86 location2 := (i - 1) % 2 87 88 runtime.ReadMemStats(memstats[location1]) 89 memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) 90 memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) 91 memInuse.Mark(int64(memstats[location1].Alloc - memstats[location2].Alloc)) 92 memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) 93 94 if ReadDiskStats(diskstats[location1]) == nil { 95 diskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount) 96 diskReadBytes.Mark(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) 97 diskWrites.Mark(diskstats[location1].WriteCount - diskstats[location2].WriteCount) 98 diskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) 99 100 diskReadBytesCounter.Inc(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) 101 diskWriteBytesCounter.Inc(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) 102 } 103 time.Sleep(refresh) 104 } 105 } 106