package main import ( "runtime" "strconv" "time" ) type GorStat struct { statName string rateMs int latest int mean int max int count int } func NewGorStat(statName string, rateMs int) (s *GorStat) { s = new(GorStat) s.statName = statName s.rateMs = rateMs s.latest = 0 s.mean = 0 s.max = 0 s.count = 0 if Settings.Stats { go s.reportStats() } return } func (s *GorStat) Write(latest int) { if Settings.Stats { if latest > s.max { s.max = latest } if latest != 0 { s.mean = ((s.mean * s.count) + latest) / (s.count + 1) } s.latest = latest s.count = s.count + 1 } } func (s *GorStat) Reset() { s.latest = 0 s.max = 0 s.mean = 0 s.count = 0 } func (s *GorStat) String() string { return s.statName + ":" + strconv.Itoa(s.latest) + "," + strconv.Itoa(s.mean) + "," + strconv.Itoa(s.max) + "," + strconv.Itoa(s.count) + "," + strconv.Itoa(s.count/(s.rateMs/1000.0)) + "," + strconv.Itoa(runtime.NumGoroutine()) } func (s *GorStat) reportStats() { Debug(0, "\n", s.statName+":latest,mean,max,count,count/second,gcount") for { Debug(0, "\n", s) s.Reset() time.Sleep(time.Duration(s.rateMs) * time.Millisecond) } }