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