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  }