add missing stats/counter.go file
parent
1ae42f8345
commit
a89633414c
|
@ -0,0 +1,86 @@
|
||||||
|
package stats
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ElementCount struct {
|
||||||
|
Current int64
|
||||||
|
Total int64
|
||||||
|
Rps float64
|
||||||
|
LastRps float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRpsCounter() *RpsCounter {
|
||||||
|
return &RpsCounter{
|
||||||
|
mu: &sync.Mutex{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type RpsCounter struct {
|
||||||
|
counter int64
|
||||||
|
lastAdd int64
|
||||||
|
start time.Time
|
||||||
|
stop time.Time
|
||||||
|
updated bool
|
||||||
|
mu *sync.Mutex
|
||||||
|
total int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Add(n int) {
|
||||||
|
atomic.AddInt64(&r.counter, int64(n))
|
||||||
|
atomic.AddInt64(&r.lastAdd, int64(n))
|
||||||
|
if n > 0 {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
if r.start.IsZero() {
|
||||||
|
r.start = time.Now()
|
||||||
|
}
|
||||||
|
r.updated = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Value() int64 {
|
||||||
|
return atomic.LoadInt64(&r.counter)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Rps() float64 {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
return float64(atomic.LoadInt64(&r.counter)) / float64(r.stop.Sub(r.start).Seconds())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) LastRps() float64 {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
return float64(atomic.LoadInt64(&r.lastAdd)) / float64(time.Since(r.stop).Seconds())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Progress() float64 {
|
||||||
|
if r.total == 0 {
|
||||||
|
return -1.0
|
||||||
|
}
|
||||||
|
|
||||||
|
return float64(atomic.LoadInt64(&r.counter)) / float64(r.total)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Count() ElementCount {
|
||||||
|
return ElementCount{
|
||||||
|
Current: r.Value(),
|
||||||
|
Total: r.total,
|
||||||
|
Rps: r.Rps(),
|
||||||
|
LastRps: r.LastRps(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RpsCounter) Tick() {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
if r.updated {
|
||||||
|
r.stop = time.Now()
|
||||||
|
r.updated = false
|
||||||
|
}
|
||||||
|
atomic.StoreInt64(&r.lastAdd, 0)
|
||||||
|
}
|
Loading…
Reference in New Issue