From d0a98290024cb277330d9c11abe480839b888f0e Mon Sep 17 00:00:00 2001 From: Gregory Eremin Date: Thu, 29 Oct 2015 02:21:34 +0300 Subject: [PATCH] Make stats snapshot a server entity --- stats/base.go | 35 ----------------------------------- stats/server.go | 48 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/stats/base.go b/stats/base.go index 47ec501..977fb53 100644 --- a/stats/base.go +++ b/stats/base.go @@ -150,41 +150,6 @@ func (s *baseStats) String() string { ) } -func (s *baseStats) snapshot() *baseSnapshot { - return &baseSnapshot{ - timestamp: time.Now().UTC().Unix(), - processed: s.time.Count(), - errors: s.errors.Count(), - min: round(float64(s.time.Min())/1000000, 6), - mean: round(s.time.Mean()/1000000, 6), - p95: round(s.time.Percentile(0.95)/1000000, 6), - max: round(float64(s.time.Max())/1000000, 6), - stddev: round(s.time.StdDev()/1000000, 6), - } -} - -// -// baseSnapshot -// - -type baseSnapshot struct { - timestamp int64 - processed int64 - errors int64 - min float64 - mean float64 - p95 float64 - max float64 - stddev float64 -} - -// Implements json.Marshaler -func (s *baseSnapshot) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf("[%d,%d,%d,%.6f,%.6f,%.6f,%.6f,%.6f]", - s.timestamp, s.processed, s.errors, s.min, - s.mean, s.p95, s.max, s.stddev)), nil -} - // // Helpers // diff --git a/stats/server.go b/stats/server.go index 3c848da..1cd4d22 100644 --- a/stats/server.go +++ b/stats/server.go @@ -10,18 +10,18 @@ import ( type Server struct { base - history map[string][]*baseSnapshot + history map[string][]*serverStatsSnapshot } const ( - serverSnapshotIntervl = 5 * time.Second - serverHistorySize = 360 // 30 minutes of 5 second snapshots + serverSnapshotIntervl = 3 * time.Second + serverHistorySize = 30 ) func NewServer() *Server { s := &Server{} s.init() - s.history = make(map[string][]*baseSnapshot) + s.history = make(map[string][]*serverStatsSnapshot) go s.takeSnapshots() return s @@ -45,9 +45,47 @@ func (s *Server) takeSnapshots() { if len(s.history[name]) >= serverHistorySize { s.history[name] = s.history[name][1:] } - s.history[name] = append(s.history[name], stat.snapshot()) + s.history[name] = append(s.history[name], makeServerStatsSnapshot(stat)) } s.Reset() s.Unlock() } } + +// +// Stats +// + +func makeServerStatsSnapshot(s *baseStats) *serverStatsSnapshot { + ps := s.time.Percentiles([]float64{0.25, 0.5, 0.75}) + return &serverStatsSnapshot{ + timestamp: time.Now().UTC().Unix(), + processed: s.time.Count(), + errors: s.errors.Count(), + min: round(float64(s.time.Min())/1000000, 6), + p25: round(ps[0]/1000000, 6), + mean: round(s.time.Mean()/1000000, 6), + median: round(ps[1]/1000000, 6), + p75: round(ps[2]/1000000, 6), + max: round(float64(s.time.Max())/1000000, 6), + } +} + +type serverStatsSnapshot struct { + timestamp int64 + processed int64 + errors int64 + min float64 + p25 float64 + mean float64 + median float64 + p75 float64 + max float64 +} + +// Implements json.Marshaler +func (s *serverStatsSnapshot) MarshalJSON() ([]byte, error) { + return []byte(fmt.Sprintf("[%d,%d,%d,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f]", + s.timestamp, s.processed, s.errors, s.min, s.p25, + s.mean, s.median, s.p75, s.max)), nil +}