github.com/annchain/OG@v0.0.9/metrics/metrics.go (about) 1 // Go port of Coda Hale's Metrics library 2 // 3 // <https://github.com/rcrowley/go-metrics> 4 // 5 // Coda Hale's original work: <https://github.com/codahale/metrics> 6 package metrics 7 8 import ( 9 "os" 10 "runtime" 11 "strings" 12 "time" 13 14 log "github.com/sirupsen/logrus" 15 ) 16 17 // Enabled is checked by the constructor functions for all of the 18 // standard metrics. If it is true, the metric returned is a stub. 19 // 20 // This global kill-switch helps quantify the observer effect and makes 21 // for less cluttered pprof profiles. 22 var Enabled bool = false 23 24 // MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. 25 const MetricsEnabledFlag = "metrics" 26 const DashboardEnabledFlag = "dashboard" 27 28 // init enables or disables the metrics system. Since we need this to run before 29 // any other code gets to create meters and timers, we'll actually do an ugly hack 30 // and peek into the command line args for the metrics flag. 31 func init() { 32 for _, arg := range os.Args { 33 if flag := strings.TrimLeft(arg, "-"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag { 34 log.Info("Enabling metrics collection") 35 Enabled = true 36 } 37 } 38 } 39 40 // CollectProcessMetrics periodically collects various metrics about the running 41 // process. 42 func CollectProcessMetrics(refresh time.Duration) { 43 // Short circuit if the metrics system is disabled 44 if !Enabled { 45 return 46 } 47 // Create the various data collectors 48 memstats := make([]*runtime.MemStats, 2) 49 diskstats := make([]*DiskStats, 2) 50 for i := 0; i < len(memstats); i++ { 51 memstats[i] = new(runtime.MemStats) 52 diskstats[i] = new(DiskStats) 53 } 54 // Define the various metrics to collect 55 memAllocs := GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) 56 memFrees := GetOrRegisterMeter("system/memory/frees", DefaultRegistry) 57 memInuse := GetOrRegisterMeter("system/memory/inuse", DefaultRegistry) 58 memPauses := GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) 59 60 var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter 61 if err := ReadDiskStats(diskstats[0]); err == nil { 62 diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) 63 diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) 64 diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) 65 diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) 66 } else { 67 log.Debug("Failed to read disk metrics", "err", err) 68 } 69 // Iterate loading the different stats and updating the meters 70 for i := 1; ; i++ { 71 location1 := i % 2 72 location2 := (i - 1) % 2 73 74 runtime.ReadMemStats(memstats[location1]) 75 memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) 76 memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) 77 memInuse.Mark(int64(memstats[location1].Alloc - memstats[location2].Alloc)) 78 memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) 79 80 if ReadDiskStats(diskstats[location1]) == nil { 81 diskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount) 82 diskReadBytes.Mark(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) 83 diskWrites.Mark(diskstats[location1].WriteCount - diskstats[location2].WriteCount) 84 diskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) 85 } 86 time.Sleep(refresh) 87 } 88 }