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  }