github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/metrics/rps.go (about) 1 package metrics 2 3 import "sync" 4 5 // IQPS count events to produce exponentially-weighted moving average rates 6 // at one-, five-, and fifteen-minutes and a mean rate. 7 type IQPS interface { 8 Mark(int32) 9 M1() int32 10 M5() int32 11 M15() int32 12 } 13 14 // GetOrRegisterQPS returns an existing Meter or constructs and registers a 15 // new StandardMeter. 16 func GetOrRegisterQPS(name string, r Registry) IQPS { 17 if nil == r { 18 r = DefaultRegistry 19 } 20 return r.GetOrRegister(name, newStandardQPS).(IQPS) 21 } 22 23 // StandardRPS is the standard implementation of a Meter. 24 type StandardRPS struct { 25 lock sync.RWMutex 26 m1 *QPSC 27 m5 *QPSC 28 m15 *QPSC 29 } 30 31 func newStandardQPS() IQPS { 32 return &StandardRPS{ 33 m1: NewQPSC(60, 70), 34 m5: NewQPSC(300, 350), 35 m15: NewQPSC(900, 910), 36 } 37 } 38 39 func (s *StandardRPS) Mark(i int32) { 40 s.lock.Lock() 41 s.m1.Mark(i) 42 s.m5.Mark(i) 43 s.m15.Mark(i) 44 s.lock.Unlock() 45 } 46 func (s *StandardRPS) M1() int32 { 47 return s.m1.counter 48 } 49 func (s *StandardRPS) M5() int32 { 50 return s.m5.counter 51 } 52 func (s *StandardRPS) M15() int32 { 53 return s.m15.counter 54 }